Развёртывание на Fly.io

Разверните nostrfy на Fly.io за несколько минут с помощью готового шаблона — тома, машины, TLS-терминация и простые обновления.

Что входит в репозиторий

ФайлНазначение
DockerfileОбраз контейнера — скачивает готовый бинарник релиза из GitHub release assets (x86_64 / aarch64, выбирается архитектурой сборки) и проверяет его sha256-контрольную сумму. Компиляция на Fly не выполняется
fly.tomlКонфигурация приложения Fly: HTTP-сервис на порту 8080, проверки работоспособности, монтирование тома /data, всегда включённые машины
deploy/nostrfy.container.tomlКонфигурация релея, встроенная в образ по пути /etc/nostrfy/nostrfy.toml

Предварительные требования

  • Аккаунт Fly.io
  • CLI flyctl (fly version)
  • Выполнен вход: fly auth login

Развёртывание в четыре шага

1. Создайте приложение (пока без развёртывания)

sh
cd /path/to/nostrfy
fly launch --no-deploy --name <your-app-name> --region <region>
  • <your-app-name> должен быть уникальным на Fly (он станет частью URL релея: wss://<your-app-name>.fly.dev)
  • <region>: например nrt (Токио), fra, iad, sjc — выберите регион, ближайший к вашим пользователям
  • Это может перезаписать значения fly.toml из шаблона (имя приложения, регион) — это нормально

2. Создайте постоянный том

База данных LMDB находится на томе Fly, смонтированном в /data:

sh
fly volumes create data --size 1 --region <region>

Для начала достаточно 1 ГБ (база растёт по мере использования). Позже можно изменить размер или сразу создать том большего размера.

3. Настройте релей

Отредактируйте deploy/nostrfy.container.toml перед развёртыванием:

toml
[relay]
name = "My Relay"                              # показывается в клиентах через NIP-11
description = "A friendly relay for everyone"
private_key = "..."                            # обязательно для групп NIP-29
public_url = "wss://<your-app-name>.fly.dev"   # обязательно для NIP-42/62/98
  • private_key: сгенерируйте локально командой nostrfy genkey (с временной конфигурацией) и вставьте ключ, либо сгенерируйте любым Nostr-инструментом
  • public_url обязан совпадать с именем приложения — без него не будут работать NIP-42 AUTH, NIP-62 vanish и NIP-86 management API
  • Всё остальное можно оставить по умолчанию

4. Развёртывание

sh
fly deploy

Fly собирает образ (несколько минут — скачивание бинарника быстрое, образ небольшой), создаёт машину и выполняет проверку работоспособности к /health.

Проверка

sh
# строка в журнале: "relay listening on ws://0.0.0.0:8080"
fly logs

# документ информации NIP-11 по публичному адресу
curl https://<your-app-name>.fly.dev/

# направьте ваш Nostr-клиент на wss://<your-app-name>.fly.dev

Масштабирование и обновления

  • Обновление релея: отредактируйте deploy/nostrfy.container.toml и снова выполните fly deploy — образ всегда скачивает последний бинарник релиза GitHub, поэтому обновление — это простое повторное развёртывание
  • Фиксация версии: docker build --build-arg NOSTRFY_VERSION=v0.1.16 ... или измените ARG в Dockerfile
  • Масштаб: по умолчанию релей — одна машина. fly machines clone <id> создаёт вторую машину; обе используют общий том (тома Fly поддерживают несколько машин в одном регионе)
  • Метрики: Fly собирает конечную точку /metrics (см. [metrics] в fly.toml) и показывает её в дашборде Fly в разделе Metrics

Настройка конфигурации

Образ читает /etc/nostrfy/nostrfy.toml, встроенный из deploy/nostrfy.container.toml. Два способа настройки:

  1. Отредактируйте deploy/nostrfy.container.toml в репозитории и повторно разверните (проще всего)
  2. Подключите свой файл конфигурации: соберите форк образа, копирующий ваш файл конфигурации поверх /etc/nostrfy/nostrfy.toml

Все опции описаны в справочнике по конфигурации.

Примечания

  • Всегда включён по дизайну: auto_stop_machines = false в fly.toml — релей никогда не должен останавливаться в простое
  • Контейнер запускает релей в режиме переднего плана (nostrfy start --foreground); журналы идут в stdout/stderr и собираются Fly
  • TLS терминируется на Fly; сам релей отдаёт обычный WebSocket на порту 8080
  • Хост медиа Blossom: чтобы отдавать и сервер Blossom, задайте blossom.host = "media.example.com" в конфигурации, добавьте media.example.com как дополнительное имя хоста того же приложения Fly (fly.toml [[services]] http_options.allowed_http_hostnames или fly hostnames), и добавьте TLS-сертификат media. в дашборде Fly — релей разделяет хосты внутри (как server.api_host)
TLS терминируется на Fly
Сам релей отдаёт обычный WebSocket на порту 8080.