Migrando do strfry

Mova os eventos de um relay strfry existente para o nostrfy com um comando — preparação, simulação, migração, verificação e reversão.

Visão geral

nostrfy migrate-strfry lê o formato de exportação próprio do strfry (JSONL, um evento NIP-01 por linha), por isso funciona entre versões do banco strfry e não depende do esquema LMDB interno do strfry. Nunca escreve no banco do strfry.

MigradoNão migrado
Cada evento armazenado (semântica substituível/endereçável aplicada)Configurações do strfry sem equivalente no nostrfy (o relatório de merge lista cada uma com motivo)
Expiração NIP-40 — eventos já expirados são ignoradosMídias Blossom e mapeamentos de donos (strfry não tem servidor Blossom)
Deleções NIP-09, incluindo bloqueios de republicação para eventos já deletados pelo strfryListas de acesso (bans NIP-86, listas de pubkeys do relay, allowlist Blossom)
Efeitos de moderação NIP-29 9005/9008Códigos de convite NIP-43 (emita novos com createclaim)
Timestamps first-seen (quando o gate de novas pubkeys está configurado)Pedidos vanish NIP-62 a menos que --apply-vanish seja dado
Grupos NIP-29, papéis NIP-43 e seus metadados assinados pelo relay, reconstruídos na primeira inicializaçãoIdentidade/chaves próprias do relay (ficam em nostrfy.toml)
As configurações equivalentes do strfry, oferecidas para merge em nostrfy.toml (opcional)

Ignorados esperados no resumo: eventos efêmeros (kinds 20000-29999, que o nostrfy nunca armazena) e eventos já expirados.

Início rápido

sh
# 1. pare o relay nostrfy (a migração precisa do diretório do banco)
nostrfy --config /etc/nostrfy/nostrfy.toml stop

# 2. simulação — analisa e verifica cada evento, não grava nada
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db --dry-run

# 3. importação
nostrfy --config /etc/nostrfy/nostrfy.toml migrate-strfry \
    --strfry-db /var/lib/strfry-db

# 4. inicialização — grupos NIP-29 e papéis NIP-43 são reconstruídos a partir dos eventos importados
nostrfy --config /etc/nostrfy/nostrfy.toml start
A migração é offline
Ela escreve diretamente em database.path e recusa-se a rodar enquanto um daemon nostrfy (ou outra migração) mantiver o diretório do banco. Pare o relay primeiro. O strfry pode continuar rodando — strfry export lê um snapshot consistente.

Requisitos

  • O binário strfry (para --strfry-db), ou um arquivo JSONL exportado por você.
  • nostrfy v0.1.15 ou mais novo (subcomando migrate-strfry).
  • A config nostrfy do relay de destino, com database.path, public_url e private_key definidos.
  • Espaço livre: cerca do tamanho do export do strfry mais seus índices. O índice de palavras NIP-50 soma um pouco mais; em disco muito apertado você pode desativá-lo (database.search_index = false), migrar e reativá-lo depois (o índice é reconstruído na inicialização).
  • Nenhuma instância nostrfy rodando no database.path de destino.

Preparar a config

toml
[relay]
name = "My Relay"
public_url = "wss://relay.example.com"   # necessário para NIP-42/62/98 e metadados NIP-29
private_key = "..."                       # necessário para metadados NIP-29/43 assinados pelo relay

[server]
host = "0.0.0.0"
port = 8080

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

Gere a chave do relay com nostrfy genkey se não tiver uma, depois valide:

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

Fundir as configurações do strfry (opcional)

Antes de abrir o banco, migrate-strfry procura a config do strfry (--strfry-config, depois $STRFRY_CONFIG, /etc/strfry.conf, ./strfry.conf), mostra as configurações que têm equivalente no nostrfy e diferem do seu nostrfy.toml, e pergunta se deve fundi-las. Só as chaves listadas são reescritas — comentários e todas as outras linhas são preservados, e um valor que invalidaria a config é ignorado com seu motivo enquanto o resto ainda funde.

  • --merge-config aplica sem perguntar (para scripts); --no-merge-config pula a etapa.
  • Sem terminal, as propostas são impressas e o merge é pulado a menos que --merge-config seja dado.
  • --dry-run mostra as propostas mas nunca escreve.

Simulação

Olhe antes de pular — uma simulação analisa e verifica todo o export sem tocar no banco:

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

Uma contagem bad signature diferente de zero significa que o export contém eventos que o strfry aceitou sem verificação; eles serão ignorados. Se você confia neles, passe --no-verify para importar mesmo assim.

Migrar

Escolha um dos três modos de entrada — todos produzem o mesmo resultado:

sh
# Opção A — o próprio nostrfy executa `strfry export` (strfry no PATH)
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db

# Opção B — você exportou para um arquivo
strfry export > /tmp/strfry-export.jsonl
nostrfy migrate-strfry --input /tmp/strfry-export.jsonl

# Opção C — pipe (stdin é a entrada padrão)
strfry export | nostrfy migrate-strfry
FlagPor quê
--strfry-bin <PATH>strfry não está no PATH
--since <UNIX>Retomar/alcançar: eventos com este created_at ou mais novos (inclusivo)
--apply-vanishRespeitar pedidos vanish NIP-62 do export (desligado por padrão)
--no-verifyPular verificação de assinatura para dumps confiáveis (mais rápido)
--batch <N>Eventos por transação do banco (padrão 512)
--dry-runApenas analisar e verificar

A migração é segura para reexecutar: duplicatas são ignoradas e os efeitos de deleção são reaplicados, então uma execução interrompida pode simplesmente ser repetida (ou retomada com --since).

Iniciar e verificar

A primeira inicialização reconstrói o store de grupos NIP-29 e o store de papéis NIP-43 a partir dos eventos importados e republica os metadados assinados pelo relay (39000/39001/39002/39005 por grupo, a lista de membros 13534). Num banco grande pode demorar; observe o log.

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

nak relay "$R"                              # o relay responde e anuncia seus NIPs
curl -s "$H/api/v1/query?limit=1"           # os eventos são servidos
nak req -i <deleted-event-id> "$R"          # um evento excluído continua fora
nak req -k 39000 "$R"                       # metadados de grupo NIP-29 (se migrados)
nak req --auth --force-pre-auth --sec <nsec> -k 13534 "$R"   # participação NIP-43 (AUTH)

Para comparação exata, strfry scan '{}' | wc -l menos os eventos efêmeros/expirados reportados pelo resumo deve igualar o que os clientes conseguem recuperar.

Retomando uma migração interrompida

Não inicie o relay antes de reexecutar
Os efeitos de grupo NIP-29 (9005/9008) são aplicados após a importação; uma execução interrompida armazenou esses eventos mas ainda não suas deleções, então a primeira inicialização poderia servir histórico que a deleção deveria remover. Reexecute primeiro a migração — ela completa os efeitos (a purga é idempotente) — depois inicie o relay.
  • Exportado para arquivo / via pipe: reexecute o mesmo comando. Duplicatas são ignoradas e os bloqueios de deleção são reaplicados.
  • Usou --strfry-db: o resumo imprime uma dica de retomada; reexecute com aquele --since (inclusivo, o segundo limite é reimportado e deduplicado).
  • Se falhou com database writer unavailable, verifique espaço livre e database.map_size, depois reexecute.

Reversão

A migração só escreve no banco nostrfy. Para reverter, pare o relay e restaure o banco pré-migração ou remova-o:

sh
nostrfy --config /etc/nostrfy/nostrfy.toml stop
rm -rf /var/lib/nostrfy            # ou restaure o backup pré-migração

Solução de problemas

MensagemCausa / correção
cannot lock the database directory ...; stop the relay before migratingUm daemon nostrfy (ou outra migração) mantém o diretório: primeiro nostrfy stop
strfry database directory ... does not exist--strfry-db deve nomear o diretório que contém data.mdb
cannot run 'strfry': ...Instale o strfry, defina --strfry-bin, ou use --input
database writer unavailable; the migration did not completeA thread de escrita parou ou a fila sobrecarregou: verifique disco/tamanho map, reexecute (seguro)
group purge for <id> did not completeA purga foi interrompida: reexecute a migração
Contagem bad signature altaO BD strfry contém eventos não verificados: inspecione-os; importe com --no-verify só se confiar na fonte
Metadados NIP-29 ausentes após iniciarSem relay.private_key: rode nostrfy genkey e reinicie
O merge de configurações não é oferecidoConfig do strfry não encontrada: passe --strfry-config /etc/strfry.conf

Checklist

  • Relay nostrfy parado
  • Banco strfry e config nostrfy com backup
  • nostrfy check passa
  • Configurações strfry fundidas (ou relatório revisado)
  • Simulação revisada (sem bad signatures inesperadas)
  • Migração concluída sem erros
  • Relay inicia; reconstrução grupos/papéis logada
  • Contagens batem (menos efêmeros/expirados)
  • Eventos deletados continuam fora (republicação rejeitada)
  • Visibilidade de grupos privados checada anonimamente e como membro
  • Proxy reverso / DNS / listas de relays dos clientes atualizados
strfry ainda rodando?
Se o strfry ficou live durante o export, faça uma passada de catch-up quando estiver pronto para trocar: pare o nostrfy, reexecute a migração com --since <last created_at>, depois inicie de novo.