feat: rollback automático do banco quando o deploy falha #26

Closed
jhony75 wants to merge 1 commit from feature/deploy-db-rollback into develop
Owner

A pipeline vira a guardiã do status, não a memória de quem faz o deploy — zero contato humano no caso comum.

  • deploy-remote.sh: no rollback (mesmo trigger que já existia pra containers/imagens), agora também restaura o backup do SQLite feito antes do deploy, por cima do banco vivo, e remove -wal/-shm da tentativa quebrada antes de trocar o arquivo base — sem isso, WAL de um schema mais novo aplicado sobre o backup mais antigo corromperia o restore (o banco roda em journal_mode=wal). Só sobra log de WARNING pedindo intervenção manual se o próprio restore falhar.
  • 2 cenários novos em test-deploy-remote.sh (com e sem backup disponível) cobrindo o restore de arquivo de verdade (não só o rollback de compose que já era testado).
  • scripts/generate-synthetic-data.py: gera banco sintético de qualquer tamanho — usei pra medir esse mecanismo sem precisar de acesso à VPS. Com ~43 MB (banco de produção real hoje é ~40 MB): drill estrutural em 0,66s, restore de arquivo em ~60ms. Camada de banco não é o gargalo de um rollback real.
  • Docs atualizadas: docs/DATABASE.md (mecanismo + números medidos) e docs/DEPLOYMENT.md.
A pipeline vira a guardiã do status, não a memória de quem faz o deploy — zero contato humano no caso comum. - `deploy-remote.sh`: no rollback (mesmo trigger que já existia pra containers/imagens), agora também restaura o backup do SQLite feito antes do deploy, por cima do banco vivo, e remove `-wal`/`-shm` da tentativa quebrada antes de trocar o arquivo base — sem isso, WAL de um schema mais novo aplicado sobre o backup mais antigo corromperia o restore (o banco roda em `journal_mode=wal`). Só sobra log de `WARNING` pedindo intervenção manual se o próprio restore falhar. - 2 cenários novos em `test-deploy-remote.sh` (com e sem backup disponível) cobrindo o restore de arquivo de verdade (não só o rollback de compose que já era testado). - `scripts/generate-synthetic-data.py`: gera banco sintético de qualquer tamanho — usei pra medir esse mecanismo sem precisar de acesso à VPS. Com ~43 MB (banco de produção real hoje é ~40 MB): drill estrutural em 0,66s, restore de arquivo em ~60ms. Camada de banco não é o gargalo de um rollback real. - Docs atualizadas: `docs/DATABASE.md` (mecanismo + números medidos) e `docs/DEPLOYMENT.md`.
feat: rollback automático do banco quando o deploy falha (migration interrompida)
All checks were successful
EEG QA CI / validate-and-build (pull_request) Successful in 2m12s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped
2e8241ee84
O objetivo é zero contato humano no caso comum: a pipeline vira a guardiã
do status, não a memória de quem fez o deploy. Complementa o rollback de
containers/imagens que já existia.

- deploy-remote.sh: no rollback, restaura o backup do SQLite feito antes
  do deploy (por cima do live db) e remove -wal/-shm da tentativa quebrada
  antes de trocar o arquivo base — sem isso, WAL de um schema mais novo
  aplicado sobre o backup mais antigo corrompe o restore (banco roda em
  journal_mode=wal). Só sobra log de WARNING pedindo intervenção manual se
  o próprio restore falhar.
- DATA_DIR lido direto do env file (sem `source`), com fallback silencioso
  pra fixtures antigas sem essa variável.
- 2 cenários novos em test-deploy-remote.sh (com e sem backup disponível).
- scripts/generate-synthetic-data.py: gera banco sintético de qualquer
  tamanho pra medir esse tipo de operação sem precisar de acesso à VPS.
  RTO medido com ~43 MB (banco de produção real é ~40 MB): drill
  estrutural em 0,66s, restore de arquivo em ~60ms — camada de banco não
  é o gargalo de um rollback real.
jhony75 closed this pull request 2026-09-05 02:46:20 -03:00
All checks were successful
EEG QA CI / validate-and-build (pull_request) Successful in 2m12s
EEG QA CI / Deploy production (pull_request) Has been skipped
EEG QA CI / Deploy development (pull_request) Has been skipped

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
jhony75/eeg-qa!26
No description provided.