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.
| Migrado | No 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 omiten | Medios Blossom y mapeos de propietarios (strfry no tiene servidor Blossom) |
| Borrados NIP-09, incluidos bloqueos de republicación para eventos ya borrados por strfry | Listas de acceso (bans NIP-86, listas de pubkeys del relé, allowlist de Blossom) |
Efectos secundarios de moderación NIP-29 9005/9008 | Có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 arranque | Identidad/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
# 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 startRequisitos
- 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_urlyprivate_keydefinidos. - 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.pathdestino.
Preparar la config
[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 = 1073741824Genera la clave del relé con nostrfy genkey si no tienes una, luego valida:
nostrfy --config /etc/nostrfy/nostrfy.toml checkFusionar 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-configaplica sin preguntar (para scripts);--no-merge-configomite el paso.- Sin terminal, las propuestas se imprimen y la fusión se omite salvo que se dé
--merge-config. --dry-runmuestra las propuestas pero nunca escribe.
Simulacro
Mira antes de saltar — un simulacro analiza y verifica todo el export sin tocar la base:
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db --dry-runUn 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:
# 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| Flag | Por qué |
|---|---|
--strfry-bin <PATH> | strfry no está en PATH |
--since <UNIX> | Reanudar/alcanzar: eventos con este created_at o más nuevos (inclusivo) |
--apply-vanish | Respetar solicitudes vanish NIP-62 del export (desactivado por defecto) |
--no-verify | Omitir verificación de firmas para dumps confiables (más rápido) |
--batch <N> | Eventos por transacción de base (defecto 512) |
--dry-run | Solo 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.
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
- 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 ydatabase.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:
nostrfy --config /etc/nostrfy/nostrfy.toml stop
rm -rf /var/lib/nostrfy # o restaura la copia pre-migraciónSolución de problemas
| Mensaje | Causa / solución |
|---|---|
cannot lock the database directory ...; stop the relay before migrating | Un 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 complete | El hilo escritor se detuvo o la cola está sobrecargada: revisa disco/tamaño map, reejecuta (seguro) |
group purge for <id> did not complete | La purga fue interrumpida: reejecuta la migración |
Conteo bad signature alto | La 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 arranque | Sin relay.private_key: ejecuta nostrfy genkey y reinicia |
| La fusión de ajustes no se ofrece | Config de strfry no encontrada: pasa --strfry-config /etc/strfry.conf |
Lista de verificación
- Relé nostrfy detenido
- Base strfry y config nostrfy respaldadas
nostrfy checkpasa- 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