ADR 0256 — A migração do instalador restaura o banco num banco recém-criado e vazio
- Status: aceito
- Data: 2026-11-05
- Tema:
operacao - Referencia: os ADRs 0150 e 0152, a RN-530, a RN-542, a RN-692 e a atividade AT-738. Nenhum deles é editado.
Contexto
A primeira migração real de uma instalação 7.0.0 para o produto 1.0.0 (AT-710, 05/11/2026) subiu uma instalação VAZIA. A cadeia do ADR 0150 (backup → prova → pergunta → down -v → instalação → restore) parava no restore dos repositórios git: o Postgres não voltava. A RN-530 dizia por quê — brabo-restore valida numa database de teste e "nunca sobrescreve a origem" (ADR 0152) —, e a resposta s = restaurar levava a crer que os dados voltavam. Depois do down -v não há origem a proteger: o banco novo nasce vazio, e não restaurá-lo é que perde o dado.
A mesma migração achou o resto que este ADR fecha junto: a migração gerava segredos novos e perdia a chave mestra (as credenciais restauradas ficavam ilegíveis), o backup e a prova não escreviam na pasta do uid de quem roda, a prova restaurava outro backup (o do volume backup_local, que o down -v apaga), o marcador não era gravado quando o restore falhava, e o recomeço das versões em 1.0.0 aparecia como "rebaixamento". Decisões do dono de 05/11/2026.
Decisão
- A migração restaura o Postgres sozinha, num banco recém-criado e vazio. Depois do
down -v, o instalador sobe SÓ opostgres, rodabrabo-restore --banco-vazio(que recusa se houver qualquer tabela empublic,drizzleouengine, restaura numa transação e roda as mesmas validações), e só então sobe o resto — as migrations da versão nova rodam por cima do dump, nunca o contrário. - Esclarece a decisão 5 do ADR 0152: "o restore nunca sobrescreve a origem" vale para banco com dado. Um banco recém-criado e vazio não é origem de nada, e restaurar nele é o fim da migração, não um risco a ela.
- Depois do banco, os repositórios git e a reprojeção. O
brabo-restore-git --restaurarroda como o DONO lido do volumegit_local_repos; o grafo e os artefatos são reprojetados do event log (a decisão 4 do ADR 0152). A falha da reprojeção é pendência nomeada, não recusa: o dado já voltou. - A migração é retomável. O marcador (schema 4) é gravado logo depois do
down -v, comrestauracaoPendente(o destino do backup e as etapas que faltam), e de novo a cada etapa. A execução seguinte que acha a pendência RETOMA a restauração em vez de migrar de novo. - Os segredos que cifram dado restaurado vêm do
.envanterior. No mínimo aCREDENTIALS_MASTER_KEY; e tudo o que o.envnovo não declara volta, salvo o que o instalador decide na hora (profiles, broker, Ollama) e o_PREVIOUSde segredo efêmero. - Linha de versões. O marcador ganha
linha; sem ela, a instalação é da linha anterior, salvo imagens emghcr.io/viralabs-dev/. Entre linhas a relação énova-linha, com frase própria e default sim.
Consequências
- Responder
spassa a trazer de volta o que a pergunta promete: banco, repositórios, grafo e artefatos.zsegue reinstalando do zero com o backup provado na pasta. - O backup provado é o MESMO que fica na pasta e que a restauração usa.
- Uma migração interrompida depois do
down -vnão fica órfã: o próximoinstall.shretoma. Se o banco já tiver tabela, o--banco-vaziorecusa e diz por quê — o instalador nunca restaura por cima de dado. - O dump fica numa pasta
0755declarada: legível por outros usuários da máquina, sem a chave mestra. - O
install-e2eprecisa de um passo de migração com dado semeado para provar isto numa tag; em PR, a prova éscripts/dev/install-migracao.spec.ts.