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.
| Migrado | Nã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 ignorados | Mí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 strfry | Listas de acesso (bans NIP-86, listas de pubkeys do relay, allowlist Blossom) |
Efeitos de moderação NIP-29 9005/9008 | Có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ção | Identidade/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
# 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 startRequisitos
- 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_urleprivate_keydefinidos. - 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.pathde destino.
Preparar a config
[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 = 1073741824Gere a chave do relay com nostrfy genkey se não tiver uma, depois valide:
nostrfy --config /etc/nostrfy/nostrfy.toml checkFundir 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-configaplica sem perguntar (para scripts);--no-merge-configpula a etapa.- Sem terminal, as propostas são impressas e o merge é pulado a menos que
--merge-configseja dado. --dry-runmostra as propostas mas nunca escreve.
Simulação
Olhe antes de pular — uma simulação analisa e verifica todo o export sem tocar no banco:
nostrfy migrate-strfry --strfry-db /var/lib/strfry-db --dry-runUma 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:
# 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| Flag | Por 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-vanish | Respeitar pedidos vanish NIP-62 do export (desligado por padrão) |
--no-verify | Pular verificação de assinatura para dumps confiáveis (mais rápido) |
--batch <N> | Eventos por transação do banco (padrão 512) |
--dry-run | Apenas 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.
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
- 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 edatabase.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:
nostrfy --config /etc/nostrfy/nostrfy.toml stop
rm -rf /var/lib/nostrfy # ou restaure o backup pré-migraçãoSolução de problemas
| Mensagem | Causa / correção |
|---|---|
cannot lock the database directory ...; stop the relay before migrating | Um 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 complete | A thread de escrita parou ou a fila sobrecarregou: verifique disco/tamanho map, reexecute (seguro) |
group purge for <id> did not complete | A purga foi interrompida: reexecute a migração |
Contagem bad signature alta | O 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 iniciar | Sem relay.private_key: rode nostrfy genkey e reinicie |
| O merge de configurações não é oferecido | Config do strfry não encontrada: passe --strfry-config /etc/strfry.conf |
Checklist
- Relay nostrfy parado
- Banco strfry e config nostrfy com backup
nostrfy checkpassa- 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