Миграция со 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/9008 | NIP-43 инвайт-коды (выпустите новые через createclaim) |
| Метки первого появления (когда настроен фильтр новых ключей) | NIP-62 запросы vanish, если не указан --apply-vanish |
| NIP-29 группы, NIP-43 роли и их подписанные релеем метаданные, пересоздаваемые при первом запуске | Собственная идентичность/ключи релея (они хранятся в nostrfy.toml) |
Эквивалентные настройки strfry, предлагаемые для слияния в nostrfy.toml (опционально) |
Ожидаемые пропуски в сводке: эфемерные события (kinds 20000-29999, которые nostrfy никогда не хранит) и уже истёкшие события.
Быстрый старт
# 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Требования
- Исполняемый файл
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.
Подготовка конфигурации
[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, если его нет, затем проверьте:
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выводит предложения, но ничего не записывает.
Пробный запуск
Сначала проверьте, потом запускайте — пробный запуск парсит и проверяет весь экспорт, не трогая базу:
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db --dry-runНенулевое число bad signature означает, что экспорт содержит события, принятые strfry без
проверки; они будут пропущены. Если вы им доверяете, передайте --no-verify, чтобы всё равно импортировать.
Миграция
Выберите один из трёх режимов ввода — все дают одинаковый результат:
# Вариант 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). На большой базе это может занять время; следите за журналом.
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 минус эфемерные/истёкшие события
из сводки миграции должно равняться тому, что могут получить клиенты.
Продолжение прерванной миграции
- Экспорт в файл / pipe: повторно выполните ту же команду. Дубликаты пропускаются, а блоки удалений применяются заново.
- Использовали
--strfry-db: сводка выводит подсказку продолжения; повторите с тем--since(включительно, граничная секунда переимпортируется и дедуплицируется). - Если запуск упал с
database writer unavailable, проверьте свободное место иdatabase.map_size, затем повторите.
Откат
Миграция пишет только в базу nostrfy. Для отката остановите релей и восстановите базу до миграции или удалите её:
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 / списки релеев клиентов обновлены