strfry からの移行

既存の strfry リレーのイベントを1つのコマンドで nostrfy に移行 — 準備、ドライラン、移行、検証、ロールバック。

概要

nostrfy migrate-strfry は strfry 独自のエクスポート形式(JSONL、1行に1つの NIP-01 イベント)を読み取るため、strfry のデータベースバージョンを問わず動作し、strfry 内部の LMDB スキーマに依存しません。strfry データベースへの書き込みは一切行いません。

移行されるもの移行されないもの
すべての保存済みイベント(リプレーサブル/アドレス指定可能セマンティクスを適用)nostrfy に相当機能がない strfry 設定(マージ報告に理由付きで一覧表示)
NIP-40 有効期限 — 期限切れイベントはスキップBlossom メディアと所有者マッピング(strfry には Blossom サーバーがない)
NIP-09 削除(strfry が既に削除したイベントの再公開ブロックを含む)アクセスリスト(NIP-86 ban、リレーの公開鍵リスト、Blossom 許可リスト)
NIP-29 9005/9008 モデレーション副作用NIP-43 招待コード(createclaim で新規発行)
初見タイムスタンプ(新規公開鍵ゲート設定時)NIP-62 vanish 要求(--apply-vanish 指定時のみ)
NIP-29 グループ、NIP-43 ロールとリレー署名メタデータ(初回起動時に再構築)リレー自身の識別情報/鍵(nostrfy.toml に格納)
等価の strfry 設定(nostrfy.toml へのマージを提案、任意)

要約で想定されるスキップ:エフェメラルイベント(kind 20000-29999、nostrfy は保存しません)と 期限切れイベントです。

クイックスタート

sh
# 1. nostrfy リレーを停止します(移行にはデータベースディレクトリが必要です)
nostrfy --config /etc/nostrfy/nostrfy.toml stop

# 2. ドライラン — すべてのイベントを解析・検証し、何も書き込みません
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)、移行後に再度有効化できます(インデックスは起動時に再構築されます)。
  • 移行先の database.path 上で実行中の nostrfy インスタンスがないこと。

設定の準備

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 件数が 0 でない場合、エクスポートには strfry が検証なしで受け入れたイベントが含まれており、スキップされます。信頼できる場合は --no-verify を付けてインポートしてください。

移行

3つの入力モードから1つを選択 — 結果はすべて同じです:

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 — パイプ(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)はインポート後に適用されます。中断した実行ではそれらのイベントは保存されていますが削除はまだのため、初回起動時に削除対象のグループ履歴を提供してしまう可能性があります。まず移行を再実行してください — 副作用を完了します(パージは冪等です) — その後リレーを起動してください。
  • ファイルにエクスポート/パイプした場合:同じコマンドを再実行してください。重複はスキップされ、削除ブロックは再適用されます。
  • --strfry-db を使用した場合:サマリーに再開ヒントが出力されます。その --since を付けて再実行してください(含むため、境界秒は再インポートされ重複排除されます)。
  • database writer unavailable で失敗した場合は、空き容量と database.map_size を確認して再実行してください。

ロールバック

移行は nostrfy データベースにのみ書き込みます。ロールバックするには、リレーを停止し、移行前のデータベースを復元するか削除してください:

sh
nostrfy --config /etc/nostrfy/nostrfy.toml stop
rm -rf /var/lib/nostrfy            # or restore the pre-migration backup

トラブルシューティング

メッセージ原因/対処
cannot lock the database directory ...; stop the relay before migratingnostrfy デーモン(または他の移行)がディレクトリを保持しています:先に 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 DB に未検証イベントが含まれています:確認し、送信元を信頼できる場合のみ --no-verify でインポートしてください
起動後に NIP-29 メタデータがありませんrelay.private_key がありません:nostrfy genkey を実行して再起動してください
設定マージが提案されませんstrfry の設定が見つかりませんでした:--strfry-config /etc/strfry.conf を指定してください

チェックリスト

  • nostrfy リレーを停止済み
  • strfry データベースと nostrfy 設定をバックアップ済み
  • nostrfy check が成功
  • strfry 設定をマージ済み(または報告を確認済み)
  • ドライランを確認済み(予期しない不正署名なし)
  • 移行がエラーなく完了
  • リレーが起動し、グループ/ロール再構築がログに記録
  • イベント件数が一致(エフェメラル/期限切れを除く)
  • 削除済みイベントが消えたまま(再公開が拒否される)
  • プライベートグループの可視性を匿名とメンバーとして確認
  • リバースプロキシ/DNS/クライアントのリレーリストを更新
strfry を実行したままですか?
エクスポート中に strfry が稼働していた場合、切り替え準備ができたら追い越し実行を行ってください:nostrfy を停止し、--since <last created_at> 付きで移行を再実行してから、再度起動します。