Migration von strfry

Events eines bestehenden strfry-Relays mit einem Befehl nach nostrfy umziehen — Vorbereitung, Dry-Run, Migration, Verifizierung und Rollback.

Überblick

nostrfy migrate-strfry liest das eigene Exportformat von strfry (JSONL, ein NIP-01-Event pro Zeile), funktioniert daher über strfry-Datenbankversionen hinweg und hängt nicht vom internen LMDB-Schema von strfry ab. Es schreibt niemals in die strfry-Datenbank.

MigriertNicht migriert
Jedes gespeicherte Event (Replaceable/Addressable-Semantik angewendet)strfry-Einstellungen ohne nostrfy-Entsprechung (der Merge-Bericht listet jede mit Grund)
NIP-40-Ablauf — bereits abgelaufene Events werden übersprungenBlossom-Medien und Owner-Mappings (strfry hat keinen Blossom-Server)
NIP-09-Löschungen, inkl. Re-Publish-Sperren für bereits von strfry gelöschte EventsZugriffslisten (NIP-86-Bans, Relay-Pubkey-Listen, Blossom-Allowlist)
NIP-29 9005/9008-ModerationsnebeneffekteNIP-43-Einladungscodes (neue mit createclaim ausstellen)
First-Seen-Zeitstempel (wenn das New-Pubkey-Gate konfiguriert ist)NIP-62-Vanish-Requests, außer mit --apply-vanish
NIP-29-Gruppen, NIP-43-Rollen und ihre Relay-signierten Metadaten, beim ersten Start neu aufgebautEigene Identität/Schlüssel des Relays (liegen in nostrfy.toml)
Die äquivalenten strfry-Einstellungen, zum Merge in nostrfy.toml angeboten (optional)

Erwartete Skips in der Zusammenfassung: ephemere Events (Kinds 20000-29999, die nostrfy nie speichert) und bereits abgelaufene Events.

Schnellstart

sh
# 1. nostrfy-Relay stoppen (die Migration benötigt das Datenbankverzeichnis)
nostrfy --config /etc/nostrfy/nostrfy.toml stop

# 2. Dry-Run — parst und verifiziert jedes Event, schreibt nichts
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db --dry-run

# 3. Import
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db

# 4. Start — NIP-29-Gruppen und NIP-43-Rollen werden aus den importierten Events neu aufgebaut
nostrfy --config /etc/nostrfy/nostrfy.toml start
Die Migration ist offline
Sie schreibt direkt in database.path und verweigert die Ausführung, solange ein nostrfy-Daemon (oder eine andere Migration) das Datenbankverzeichnis hält. Stoppen Sie zuerst das Relay. strfry selbst darf weiterlaufen — strfry export liest einen konsistenten Snapshot.

Voraussetzungen

  • Das strfry-Binary (für --strfry-db) oder eine selbst exportierte JSONL-Datei.
  • nostrfy v0.1.15 oder neuer (das Unterkommando migrate-strfry).
  • Die nostrfy-Konfiguration für das Ziel-Relay mit gesetztem database.path, public_url und private_key.
  • Freier Plattenplatz: etwa Größe des strfry-Exports plus Indizes. Der NIP-50-Wortindex kommt hinzu; bei sehr knappem Platz deaktivieren (database.search_index = false), migrieren und später wieder aktivieren (der Index wird beim Start neu aufgebaut).
  • Keine laufende nostrfy-Instanz auf dem Ziel-database.path.

Konfiguration vorbereiten

toml
[relay]
name = "My Relay"
public_url = "wss://relay.example.com"   # benötigt für NIP-42/62/98 und NIP-29-Metadaten
private_key = "..."                       # benötigt für relay-signierte NIP-29/43-Metadaten

[server]
host = "0.0.0.0"
port = 8080

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

Erzeugen Sie den Relay-Schlüssel mit nostrfy genkey, falls keiner vorhanden ist, dann validieren:

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

strfry-Einstellungen zusammenführen (optional)

Vor dem Öffnen der Datenbank sucht migrate-strfry nach der strfry-Konfiguration (--strfry-config, dann $STRFRY_CONFIG, /etc/strfry.conf, ./strfry.conf), zeigt Einstellungen mit nostrfy-Entsprechung, die von Ihrer nostrfy.toml abweichen, und fragt, ob sie zusammengeführt werden sollen. Nur die gelisteten Schlüssel werden neu geschrieben — Kommentare und alle anderen Zeilen bleiben erhalten; ein Wert, der die Konfiguration ungültig machen würde, wird mit Grund übersprungen, der Rest wird trotzdem zusammengeführt.

  • --merge-config wendet ohne Nachfrage an (für Skripte); --no-merge-config überspringt den Schritt.
  • Ohne Terminal werden Vorschläge gedruckt und der Merge übersprungen, außer --merge-config ist angegeben.
  • --dry-run zeigt Vorschläge, schreibt aber nie.

Dry-Run

Erst schauen, dann springen — ein Dry-Run parst und verifiziert den gesamten Export, ohne die Datenbank zu berühren:

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

Eine bad signature-Zahl ungleich null bedeutet, dass der Export Events enthält, die strfry ohne Verifizierung akzeptiert hat; sie werden übersprungen. Wenn Sie ihnen vertrauen, mit --no-verify trotzdem importieren.

Migrieren

Einen von drei Eingabemodi wählen — alle liefern dasselbe Ergebnis:

sh
# Option A — nostrfy führt `strfry export` selbst aus (strfry im PATH)
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db

# Option B — Sie haben in eine Datei exportiert
strfry export > /tmp/strfry-export.jsonl
nostrfy migrate-strfry --input /tmp/strfry-export.jsonl

# Option C — Pipe (stdin ist die Standardeingabe)
strfry export | nostrfy migrate-strfry
FlagWarum
--strfry-bin <PATH>strfry ist nicht im PATH
--since <UNIX>Fortsetzen/Aufholen: Events mit diesem created_at oder neuer (inklusive)
--apply-vanishNIP-62-Vanish-Requests aus dem Export beachten (standardmäßig aus)
--no-verifySignaturprüfung für vertrauenswürdige Dumps überspringen (schneller)
--batch <N>Events pro DB-Transaktion (Standard 512)
--dry-runNur parsen und verifizieren

Die Migration ist sicher erneut ausführbar: Duplikate werden übersprungen und die Lösch-Nebeneffekte neu angewendet, sodass ein unterbrochener Lauf einfach wiederholt werden kann (oder mit --since fortgesetzt).

Starten und verifizieren

Der erste Start baut den NIP-29-Gruppenstore und den NIP-43-Rollenstore aus den importierten Events neu auf und republiziert die Relay-signierten Metadaten (39000/39001/39002/39005 pro Gruppe, die 13534-Mitgliedsliste). Bei großer Datenbank kann das dauern; Log beachten.

sh
R=wss://relay.example.com      # für nak (WebSocket)
H=https://relay.example.com    # für curl (HTTP)

nak relay "$R"                              # Relay antwortet und kündigt seine NIPs an
curl -s "$H/api/v1/query?limit=1"           # Events werden ausgeliefert
nak req -i <deleted-event-id> "$R"          # ein gelöschtes Event bleibt gelöscht
nak req -k 39000 "$R"                       # NIP-29-Gruppenmetadaten (falls migriert)
nak req --auth --force-pre-auth --sec <nsec> -k 13534 "$R"   # NIP-43-Mitgliedschaft (AUTH)

Für exakten Zahlenvergleich sollte strfry scan '{}' | wc -l minus die in der Migrationszusammenfassung gemeldeten ephemeren/abgelaufenen Events dem entsprechen, was Clients abrufen können.

Unterbrochene Migration fortsetzen

Relay vor erneutem Ausführen nicht starten
Die NIP-29-Gruppennebeneffekte (9005/9008) werden nach dem Import angewendet; ein unterbrochener Lauf hat diese Events gespeichert, aber ihre Löschungen noch nicht, sodass der erste Start Gruppenhistorie ausliefern könnte, die die Löschung entfernen sollte. Erst die Migration erneut ausführen — sie schließt die Nebeneffekte ab (der Purge ist idempotent) — dann das Relay starten.
  • In Datei exportiert / gepiped: denselben Befehl erneut ausführen. Duplikate werden übersprungen und die Löschsperren neu angewendet.
  • --strfry-db verwendet: die Zusammenfassung druckt einen Resume-Hinweis; mit diesem --since erneut ausführen (inklusive, die Grenzsekunde wird reimportiert und dedupliziert).
  • Bei Fehler database writer unavailable freien Platz und database.map_size prüfen, dann erneut ausführen.

Rollback

Die Migration schreibt nur in die nostrfy-Datenbank. Für Rollback Relay stoppen und die Pre-Migrations-Datenbank wiederherstellen oder entfernen:

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

Fehlerbehebung

MeldungUrsache / Fix
cannot lock the database directory ...; stop the relay before migratingEin nostrfy-Daemon (oder eine andere Migration) hält das Verzeichnis: zuerst nostrfy stop
strfry database directory ... does not exist--strfry-db muss das Verzeichnis mit data.mdb benennen
cannot run 'strfry': ...strfry installieren, --strfry-bin setzen oder --input nutzen
database writer unavailable; the migration did not completeWriter-Thread gestoppt oder Queue überlastet: Platte/Map-Größe prüfen, erneut ausführen (sicher)
group purge for <id> did not completeDer Purge wurde unterbrochen: Migration erneut ausführen
Hohe bad signature-ZahlDie strfry-DB enthält unverifizierte Events: prüfen; nur bei vertrauenswürdiger Quelle mit --no-verify importieren
NIP-29-Metadaten fehlen nach dem StartKein relay.private_key: nostrfy genkey ausführen und neu starten
Der Einstellungs-Merge wird nicht angebotenstrfry-Konfiguration nicht gefunden: --strfry-config /etc/strfry.conf übergeben

Checkliste

  • nostrfy-Relay gestoppt
  • strfry-Datenbank und nostrfy-Konfiguration gesichert
  • nostrfy check besteht
  • strfry-Einstellungen zusammengeführt (oder Bericht geprüft)
  • Dry-Run geprüft (keine unerwarteten Bad Signatures)
  • Migration fehlerfrei abgeschlossen
  • Relay startet; Gruppen-/Rollen-Rebuild geloggt
  • Event-Zahlen stimmen (minus ephemer/abgelaufen)
  • Gelöschte Events bleiben weg (Re-Publish abgelehnt)
  • Private-Gruppen-Sichtbarkeit anonym und als Mitglied geprüft
  • Reverse-Proxy / DNS / Client-Relay-Listen aktualisiert
Läuft strfry noch?
Falls strfry während des Exports live blieb, bei Wechselbereitschaft einen Catch-up-Lauf machen: nostrfy stoppen, Migration mit --since <last created_at> erneut ausführen, dann wieder starten.