Миграция со strfry

Перенесите события существующего strfry-релея в nostrfy одной командой — подготовка, пробный запуск, миграция, проверка и откат.

Кратко

nostrfy migrate-strfry читает собственный формат экспорта strfry (JSONL, одно NIP-01 событие на строку), поэтому работает с разными версиями базы strfry и не зависит от внутренней LMDB-схемы strfry. В базу strfry ничего не записывается.

МигрируетсяНе мигрируется
Каждое сохранённое событие (с применением семантики заменяемых/адресуемых)Настройки strfry без эквивалента в nostrfy (отчёт о слиянии перечисляет каждую с причиной)
Истечение срока NIP-40 — уже истёкшие события пропускаютсяBlossom-медиа и сопоставления владельцев (в strfry нет Blossom-сервера)
NIP-09 удаления, включая блоки повторной публикации для событий, уже удалённых strfryСписки доступа (NIP-86 баны, списки pubkey релея, список разрешённых Blossom)
Побочные эффекты модерации NIP-29 9005/9008NIP-43 инвайт-коды (выпустите новые через createclaim)
Метки первого появления (когда настроен фильтр новых ключей)NIP-62 запросы vanish, если не указан --apply-vanish
NIP-29 группы, NIP-43 роли и их подписанные релеем метаданные, пересоздаваемые при первом запускеСобственная идентичность/ключи релея (они хранятся в nostrfy.toml)
Эквивалентные настройки strfry, предлагаемые для слияния в nostrfy.toml (опционально)

Ожидаемые пропуски в сводке: эфемерные события (kinds 20000-29999, которые nostrfy никогда не хранит) и уже истёкшие события.

Быстрый старт

sh
# 1. остановите релей nostrfy (миграции нужен каталог базы данных)
nostrfy --config /etc/nostrfy/nostrfy.toml stop

# 2. dry-run — разбирает и проверяет каждое событие, ничего не записывает
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db --dry-run

# 3. импорт
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db

# 4. запуск — группы NIP-29 и роли NIP-43 пересоздаются из импортированных событий
nostrfy --config /etc/nostrfy/nostrfy.toml start
Миграция выполняется офлайн
Она пишет напрямую в database.path и отказывается работать, пока демон nostrfy (или другая миграция) удерживает каталог базы. Сначала остановите релей. Сам strfry может продолжать работать — strfry export читает консистентный снапшот.

Требования

  • Исполняемый файл strfry (для --strfry-db) или JSONL-файл, экспортированный вами вручную.
  • nostrfy v0.1.15 или новее (подкоманда migrate-strfry).
  • Конфигурация nostrfy для целевого релея с заданными database.path, public_url и private_key.
  • Свободное место: примерно размер экспорта strfry плюс индексы. Словный индекс NIP-50 добавляет ещё; при очень тесном диске можно отключить его (database.search_index = false), выполнить миграцию и включить позже (индекс пересоздаётся при запуске).
  • Нет запущенного экземпляра nostrfy на целевом database.path.

Подготовка конфигурации

toml
[relay]
name = "My Relay"
public_url = "wss://relay.example.com"   # нужен для NIP-42/62/98 и метаданных NIP-29
private_key = "..."                       # нужен для подписанных релеем метаданных NIP-29/43

[server]
host = "0.0.0.0"
port = 8080

[database]
path = "/var/lib/nostrfy"
map_size = 1073741824

Сгенерируйте ключ релея через nostrfy genkey, если его нет, затем проверьте:

sh
nostrfy --config /etc/nostrfy/nostrfy.toml check

Слияние настроек strfry (опционально)

Перед открытием базы migrate-strfry ищет файл конфигурации strfry (--strfry-config, затем $STRFRY_CONFIG, /etc/strfry.conf, ./strfry.conf), выводит настройки, имеющие эквивалент в nostrfy и отличающиеся от вашего nostrfy.toml, и спрашивает, объединять ли их. Перезаписываются только перечисленные ключи — комментарии и все остальные строки сохраняются, а значение, делающее конфигурацию невалидной, пропускается с причиной, остальные всё равно объединяются.

  • --merge-config применяет без вопроса (для скриптов); --no-merge-config пропускает шаг.
  • Без терминала предложения печатаются, а слияние пропускается, если не указан --merge-config.
  • --dry-run выводит предложения, но ничего не записывает.

Пробный запуск

Сначала проверьте, потом запускайте — пробный запуск парсит и проверяет весь экспорт, не трогая базу:

sh
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db --dry-run

Ненулевое число bad signature означает, что экспорт содержит события, принятые strfry без проверки; они будут пропущены. Если вы им доверяете, передайте --no-verify, чтобы всё равно импортировать.

Миграция

Выберите один из трёх режимов ввода — все дают одинаковый результат:

sh
# Вариант A — nostrfy сам запускает `strfry export` (strfry в PATH)
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db

# Вариант B — вы выгрузили данные в файл
strfry export > /tmp/strfry-export.jsonl
nostrfy migrate-strfry --input /tmp/strfry-export.jsonl

# Вариант C — pipe (stdin — ввод по умолчанию)
strfry export | nostrfy migrate-strfry
ФлагЗачем
--strfry-bin <PATH>strfry нет в PATH
--since <UNIX>Продолжение/догон: события с этим created_at и новее (включительно)
--apply-vanishУчитывать NIP-62 запросы vanish из экспорта (по умолчанию выкл)
--no-verifyПропустить проверку подписей для доверенных дампов (быстрее)
--batch <N>Событий на транзакцию базы (по умолчанию 512)
--dry-runТолько разбор и проверка

Миграцию безопасно запускать повторно: дубликаты пропускаются, а побочные эффекты удалений применяются заново, так что прерванный запуск можно просто повторить (или продолжить с --since).

Запуск и проверка

Первый запуск пересоздаёт хранилище NIP-29 групп и хранилище NIP-43 ролей из импортированных событий и перепубликует подписанные релеем метаданные (39000/39001/39002/39005 на группу, список участников 13534). На большой базе это может занять время; следите за журналом.

sh
R=wss://relay.example.com      # для nak (WebSocket)
H=https://relay.example.com    # для curl (HTTP)

nak relay "$R"                              # релей отвечает и объявляет свои NIP
curl -s "$H/api/v1/query?limit=1"           # события отдаются
nak req -i <deleted-event-id> "$R"          # удалённое событие остаётся удалённым
nak req -k 39000 "$R"                       # метаданные групп NIP-29 (если мигрированы)
nak req --auth --force-pre-auth --sec <nsec> -k 13534 "$R"   # членство NIP-43 (AUTH)

Для точного сравнения чисел strfry scan '{}' | wc -l минус эфемерные/истёкшие события из сводки миграции должно равняться тому, что могут получить клиенты.

Продолжение прерванной миграции

Не запускайте релей до повторного запуска миграции
Побочные эффекты групп NIP-29 (9005/9008) применяются после импорта; прерванный запуск уже сохранил эти события, но ещё не выполнил их удаления, поэтому первый запуск мог бы отдать историю групп, которую удаление должно было убрать. Сначала повторно запустите миграцию — она завершит побочные эффекты (очистка идемпотентна) — затем запускайте релей.
  • Экспорт в файл / pipe: повторно выполните ту же команду. Дубликаты пропускаются, а блоки удалений применяются заново.
  • Использовали --strfry-db: сводка выводит подсказку продолжения; повторите с тем --since (включительно, граничная секунда переимпортируется и дедуплицируется).
  • Если запуск упал с database writer unavailable, проверьте свободное место и database.map_size, затем повторите.

Откат

Миграция пишет только в базу nostrfy. Для отката остановите релей и восстановите базу до миграции или удалите её:

sh
nostrfy --config /etc/nostrfy/nostrfy.toml stop
rm -rf /var/lib/nostrfy            # или восстановите резервную копию до миграции

Устранение неполадок

СообщениеПричина / исправление
cannot lock the database directory ...; stop the relay before migratingДемон nostrfy (или другая миграция) удерживает каталог: сначала nostrfy stop
strfry database directory ... does not exist--strfry-db должен указывать каталог, содержащий data.mdb
cannot run 'strfry': ...Установите strfry, задайте --strfry-bin или используйте --input
database writer unavailable; the migration did not completeПоток записи остановился или очередь перегружена: проверьте диск/размер карты, повторите (безопасно)
group purge for <id> did not completeОчистка была прервана: повторите миграцию
Высокое число bad signatureБД strfry содержит непроверенные события: изучите их; импортируйте с --no-verify, только если доверяете источнику
После запуска нет метаданных NIP-29Нет relay.private_key: выполните nostrfy genkey и перезапустите
Слияние настроек не предлагаетсяФайл конфигурации strfry не найден: передайте --strfry-config /etc/strfry.conf

Чек-лист

  • Релей nostrfy остановлен
  • База strfry и конфигурация nostrfy сохранены в резервной копии
  • nostrfy check проходит
  • Настройки strfry объединены (или отчёт просмотрен)
  • Пробный запуск просмотрен (нет неожиданных bad signature)
  • Миграция завершена без ошибок
  • Релей запускается; пересоздание групп/ролей записано в журнал
  • Числа событий совпадают (минус эфемерные/истёкшие)
  • Удалённые события остаются удалёнными (повторная публикация отклоняется)
  • Видимость приватных групп проверена анонимно и как участник
  • Обратный прокси / DNS / списки релеев клиентов обновлены
strfry всё ещё работает?
Если strfry продолжал работать во время экспорта, сделайте догоняющий запуск, когда будете готовы переключиться: остановите nostrfy, повторите миграцию с --since <last created_at>, затем запустите снова.