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 は保存しません)と 期限切れイベントです。
クイックスタート
# 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要件
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 インスタンスがないこと。
設定の準備
[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 checkstrfry 設定のマージ(任意)
データベースを開く前に、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-runbad signature 件数が 0 でない場合、エクスポートには strfry が検証なしで受け入れたイベントが含まれており、スキップされます。信頼できる場合は --no-verify を付けてインポートしてください。
移行
3つの入力モードから1つを選択 — 結果はすべて同じです:
# 選択肢 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 メンバーシップリスト)を再公開します。大規模データベースでは時間がかかる場合があります。ログを確認してください。
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 から移行サマリーが報告したエフェメラル/期限切れイベントを差し引いた数が、クライアントが取得できる数と等しくなるはずです。
中断した移行の再開
- ファイルにエクスポート/パイプした場合:同じコマンドを再実行してください。重複はスキップされ、削除ブロックは再適用されます。
--strfry-dbを使用した場合:サマリーに再開ヒントが出力されます。その--sinceを付けて再実行してください(含むため、境界秒は再インポートされ重複排除されます)。database writer unavailableで失敗した場合は、空き容量とdatabase.map_sizeを確認して再実行してください。
ロールバック
移行は nostrfy データベースにのみ書き込みます。ロールバックするには、リレーを停止し、移行前のデータベースを復元するか削除してください:
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 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 DB に未検証イベントが含まれています:確認し、送信元を信頼できる場合のみ --no-verify でインポートしてください |
| 起動後に NIP-29 メタデータがありません | relay.private_key がありません:nostrfy genkey を実行して再起動してください |
| 設定マージが提案されません | strfry の設定が見つかりませんでした:--strfry-config /etc/strfry.conf を指定してください |
チェックリスト
- nostrfy リレーを停止済み
- strfry データベースと nostrfy 設定をバックアップ済み
nostrfy checkが成功- strfry 設定をマージ済み(または報告を確認済み)
- ドライランを確認済み(予期しない不正署名なし)
- 移行がエラーなく完了
- リレーが起動し、グループ/ロール再構築がログに記録
- イベント件数が一致(エフェメラル/期限切れを除く)
- 削除済みイベントが消えたまま(再公開が拒否される)
- プライベートグループの可視性を匿名とメンバーとして確認
- リバースプロキシ/DNS/クライアントのリレーリストを更新