Migrar desde strfry

Mueve los eventos de un relé strfry existente a nostrfy con un comando — preparación, simulacro, migración, verificación y reversión.

De un vistazo

nostrfy migrate-strfry lee el formato de exportación propio de strfry (JSONL, un evento NIP-01 por línea), así funciona entre versiones de base de datos de strfry y no depende del esquema LMDB interno de strfry. Nunca escribe en la base de datos de strfry.

MigradoNo migrado
Cada evento almacenado (semántica reemplazable/direccionable aplicada)Ajustes de strfry sin equivalente en nostrfy (el informe de fusión lista cada uno con motivo)
Caducidad NIP-40 — los eventos ya caducados se omitenMedios Blossom y mapeos de propietarios (strfry no tiene servidor Blossom)
Borrados NIP-09, incluidos bloqueos de republicación para eventos ya borrados por strfryListas de acceso (bans NIP-86, listas de pubkeys del relé, allowlist de Blossom)
Efectos secundarios de moderación NIP-29 9005/9008Códigos de invitación NIP-43 (emite nuevos con createclaim)
Marcas first-seen (cuando está configurada la puerta de nuevas pubkeys)Solicitudes vanish NIP-62 a menos que se dé --apply-vanish
Grupos NIP-29, roles NIP-43 y sus metadatos firmados por el relé, reconstruidos en el primer arranqueIdentidad/claves propias del relé (viven en nostrfy.toml)
Los ajustes equivalentes de strfry, ofrecidos para fusionar en nostrfy.toml (opcional)

Omitidos esperados en el resumen: eventos efímeros (kinds 20000-29999, que nostrfy nunca almacena) y eventos ya caducados.

Inicio rápido

sh
# 1. detén el relé nostrfy (la migración necesita el directorio de la base)
nostrfy --config /etc/nostrfy/nostrfy.toml stop

# 2. dry-run — analiza y verifica cada evento, no escribe nada
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db --dry-run

# 3. importación
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db

# 4. arranca — los grupos NIP-29 y los roles NIP-43 se reconstruyen desde los eventos importados
nostrfy --config /etc/nostrfy/nostrfy.toml start
La migración es offline
Escribe directamente en database.path y se niega a ejecutarse mientras un demonio nostrfy (u otra migración) mantenga el directorio de base. Detén primero el relé. strfry puede seguir ejecutándose — strfry export lee una instantánea consistente.

Requisitos

  • El binario strfry (para --strfry-db), o un archivo JSONL exportado por ti.
  • nostrfy v0.1.15 o superior (subcomando migrate-strfry).
  • La config nostrfy del relé destino, con database.path, public_url y private_key definidos.
  • Espacio libre: aproximadamente el tamaño del export de strfry más sus índices. El índice de palabras NIP-50 suma algo más; con disco muy justo puedes desactivarlo (database.search_index = false), migrar y reactivarlo después (el índice se reconstruye al arrancar).
  • Ninguna instancia nostrfy en ejecución sobre el database.path destino.

Preparar la config

toml
[relay]
name = "My Relay"
public_url = "wss://relay.example.com"   # necesario para NIP-42/62/98 y metadatos NIP-29
private_key = "..."                       # necesario para metadatos NIP-29/43 firmados por el relé

[server]
host = "0.0.0.0"
port = 8080

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

Genera la clave del relé con nostrfy genkey si no tienes una, luego valida:

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

Fusionar los ajustes de strfry (opcional)

Antes de abrir la base, migrate-strfry busca la config de strfry (--strfry-config, luego $STRFRY_CONFIG, /etc/strfry.conf, ./strfry.conf), muestra los ajustes que tienen equivalente en nostrfy y difieren de tu nostrfy.toml, y pregunta si fusionarlos. Solo se reescriben las claves listadas — comentarios y demás líneas se preservan, y un valor que invalidaría la config se omite con su motivo mientras el resto sí se fusiona.

  • --merge-config aplica sin preguntar (para scripts); --no-merge-config omite el paso.
  • Sin terminal, las propuestas se imprimen y la fusión se omite salvo que se dé --merge-config.
  • --dry-run muestra las propuestas pero nunca escribe.

Simulacro

Mira antes de saltar — un simulacro analiza y verifica todo el export sin tocar la base:

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

Un conteo bad signature distinto de cero significa que el export contiene eventos que strfry aceptó sin verificación; se omitirán. Si confías en ellos, pasa --no-verify para importarlos igualmente.

Migrar

Elige uno de tres modos de entrada — todos producen el mismo resultado:

sh
# Opción A — nostrfy ejecuta `strfry export` (strfry en PATH)
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db

# Opción B — exportaste a un archivo
strfry export > /tmp/strfry-export.jsonl
nostrfy migrate-strfry --input /tmp/strfry-export.jsonl

# Opción C — pipe (stdin es la entrada por defecto)
strfry export | nostrfy migrate-strfry
FlagPor qué
--strfry-bin <PATH>strfry no está en PATH
--since <UNIX>Reanudar/alcanzar: eventos con este created_at o más nuevos (inclusivo)
--apply-vanishRespetar solicitudes vanish NIP-62 del export (desactivado por defecto)
--no-verifyOmitir verificación de firmas para dumps confiables (más rápido)
--batch <N>Eventos por transacción de base (defecto 512)
--dry-runSolo analizar y verificar

La migración es segura de reejecutar: los duplicados se omiten y los efectos de borrado se reaplican, así una ejecución interrumpida puede simplemente repetirse (o reanudarse con --since).

Iniciar y verificar

El primer arranque reconstruye el almacén de grupos NIP-29 y el almacén de roles NIP-43 desde los eventos importados y republica los metadatos firmados por el relé (39000/39001/39002/39005 por grupo, la lista de miembros 13534). En una base grande puede tardar; observa el log.

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

nak relay "$R"                              # el relé responde y anuncia sus NIPs
curl -s "$H/api/v1/query?limit=1"           # los eventos se sirven
nak req -i <deleted-event-id> "$R"          # un evento borrado sigue fuera
nak req -k 39000 "$R"                       # metadatos de grupo NIP-29 (si se migró)
nak req --auth --force-pre-auth --sec <nsec> -k 13534 "$R"   # membresía NIP-43 (AUTH)

Para comparación exacta, strfry scan '{}' | wc -l menos los eventos efímeros/caducados reportados por el resumen debería igualar lo que los clientes pueden recuperar.

Reanudar una migración interrumpida

No inicies el relé antes de reejecutar
Los efectos de grupo NIP-29 (9005/9008) se aplican tras la importación; una ejecución interrumpida almacenó esos eventos pero aún no sus borrados, así el primer arranque podría servir historial que el borrado debía eliminar. Reejecuta primero la migración — completa los efectos (la purga es idempotente) — luego inicia el relé.
  • Exportado a archivo / por pipe: reejecuta el mismo comando. Los duplicados se omiten y los bloqueos de borrado se reaplican.
  • Usaste --strfry-db: el resumen imprime una pista de reanudación; reejecuta con ese --since (inclusivo, el segundo límite se reimporta y deduplica).
  • Si falló con database writer unavailable, revisa espacio libre y database.map_size, luego reejecuta.

Reversión

La migración solo escribe en la base nostrfy. Para revertir, detén el relé y restaura la base pre-migración o elimínala:

sh
nostrfy --config /etc/nostrfy/nostrfy.toml stop
rm -rf /var/lib/nostrfy            # o restaura la copia pre-migración

Solución de problemas

MensajeCausa / solución
cannot lock the database directory ...; stop the relay before migratingUn demonio nostrfy (u otra migración) mantiene el directorio: primero nostrfy stop
strfry database directory ... does not exist--strfry-db debe nombrar el directorio que contiene data.mdb
cannot run 'strfry': ...Instala strfry, define --strfry-bin, o usa --input
database writer unavailable; the migration did not completeEl hilo escritor se detuvo o la cola está sobrecargada: revisa disco/tamaño map, reejecuta (seguro)
group purge for <id> did not completeLa purga fue interrumpida: reejecuta la migración
Conteo bad signature altoLa BD strfry contiene eventos no verificados: inspecciónalos; importa con --no-verify solo si confías en la fuente
Faltan metadatos NIP-29 tras el arranqueSin relay.private_key: ejecuta nostrfy genkey y reinicia
La fusión de ajustes no se ofreceConfig de strfry no encontrada: pasa --strfry-config /etc/strfry.conf

Lista de verificación

  • Relé nostrfy detenido
  • Base strfry y config nostrfy respaldadas
  • nostrfy check pasa
  • Ajustes strfry fusionados (o informe revisado)
  • Simulacro revisado (sin bad signatures inesperadas)
  • Migración completada sin errores
  • El relé arranca; reconstrucción de grupos/roles registrada
  • Conteos coinciden (menos efímeros/caducados)
  • Eventos borrados siguen fuera (republicación rechazada)
  • Visibilidad de grupos privados comprobada anónimamente y como miembro
  • Proxy inverso, DNS y listas de relés de clientes actualizados
¿strfry sigue en marcha?
Si strfry quedó live durante el export, haz una pasada de alcance cuando estés listo para cambiar: detén nostrfy, reejecuta la migración con --since <last created_at>, luego arranca de nuevo.