Pular para conteúdo

Backup & Disaster Recovery

Estratégia

flowchart LR
    DB[(PostgreSQL)] -->|pg_dump diário| Local[backup/local/<br/>7 dias]
    Local -->|03:00 BRT| B2[Backblaze B2<br/>us-east-005]
    Models[/opt/quantfx/models/<br/>3.080 PKLs] -->|sync| B2
    Datasets[data/datasets/<br/>parquet] -->|sync| B2
    Configs[/opt/quantfx/configs/<br/>+ .env redigido] -->|tar| B2

Estrutura no B2

Prefixo Conteúdo Tamanho Retenção
pg/forex_YYYYMMDD.dump DB completo (candles, predictions, executions, api_keys) ~137 MB 30d rotating
artifacts/artifacts_YYYYMMDD.tar.gz Champions + meta.json + configs + .env.template ~447 MB 30d rotating
models-history/lgbm_*.pkl + .meta.json Histórico permanente (auto-rollback CUSUM) ~15 GB total ♾️ sticky
data/datasets/**/*.parquet Datasets pré-processados ~1 GB ♾️ sticky

Sync incremental: após seed inicial, sobem só os deltas (50-200 MB/dia).

Scheduled task

QuantFX-Backup-Diario roda às 03:00 BRT diário:

schtasks /query /tn "QuantFX-Backup-Diario" /v /fo LIST

Script: scripts/backup_to_b2.py --full

RTO/RPO

  • RTO (tempo para voltar): 30 minutos
  • RPO (perda máxima): 24 horas

Procedimentos de DR

1. Inspecionar backup remoto

.venv\Scripts\python.exe scripts\restore_from_b2.py --list

Output:

pg/forex_20260527.dump (137 MB) - 2026-05-27T03:14
pg/forex_20260526.dump (137 MB) - 2026-05-26T03:14
artifacts/artifacts_20260527.tar.gz (447 MB) - ...

2. Baixar sem restaurar (seguro)

.venv\Scripts\python.exe scripts\restore_from_b2.py --download-latest

Arquivos baixados em backup/restored/.

3. Restaurar em DB temporário (validação)

.venv\Scripts\python.exe scripts\restore_from_b2.py --restore-db 20260527

Cria DB temporário forex_restore. Para validar:

docker exec forex_db psql -U forex -d forex_restore -c "SELECT COUNT(*) FROM predictions;"

4. Restore destrutivo (CUIDADO)

PERIGO: substitui forex atual

Só faça isso em DR real. Confirme tendo o backup do estado atual antes.

.venv\Scripts\python.exe scripts\restore_from_b2.py --restore-db-prod 20260527 --confirm

5. Restaurar models/configs

.venv\Scripts\python.exe scripts\restore_from_b2.py --restore-artifacts 20260527

Faz backup do models/ atual em backup/restored/PRE_RESTORE_TIMESTAMP/.

Manutenção mensal (manual)

Dia 1 de cada mês:

  1. Testar --restore-db 20260XXX em DB temporário
  2. Validar SELECT COUNT(*) FROM predictions ≈ esperado
  3. schtasks /Query /TN QuantFX-Backup-Diario ainda ATIVO?
  4. Verificar último alerta Telegram "backup OK"
  5. Conferir crescimento do bucket no B2 dashboard

Configuração de credenciais

.env:

B2_KEY_ID=0056e7156fc3a670000000001
B2_APP_KEY=K005ZZSwcsqgqrlUEOr08n1xXrKSL1Y
B2_BUCKET_NAME=quantfx-backups-prod
B2_ENDPOINT=https://s3.us-east-005.backblazeb2.com
B2_UPLOAD_THREADS=8

.env nunca vai pro B2

scripts/backup_to_b2.py exclui .env explicitamente e gera .env.template no lugar.

Disaster Recovery: VPS perdida

Cenário pior: VPS Hostinger sumiu (ataque, suspensão, etc.).

Passos (estimado 2-4h)

  1. Provisionar nova VPS (Hostinger Cloud Hosting M, Ubuntu 24.04)
  2. Configurar WireGuard (mesmo /etc/wireguard/wg0.conf se backup)
  3. Instalar Docker (curl -fsSL https://get.docker.com | sh)
  4. Clonar repo (git clone https://github.com/...quantfx)
  5. Restaurar .env (do password manager — não está em backup!)
  6. Restaurar DB:
    docker compose -f docker-compose.vps.yml up -d db
    python scripts/restore_from_b2.py --restore-db-prod 20260527 --confirm
    
  7. Restaurar artifacts:
    python scripts/restore_from_b2.py --restore-artifacts 20260527
    
  8. Subir todos os serviços:
    docker compose -f docker-compose.vps.yml up -d
    
  9. Atualizar Cloudflare apontar api.quantfx.com.br pra novo IP
  10. Smoke test: curl https://api.quantfx.com.br/api/health

Backup local (extra)

Se quiser ter cópia local além do B2:

robocopy "C:\Users\henri\Documents\PROJETOS\ML-Forex\backup\local\" `
         "D:\Backups\QuantFX\" /MIR /R:3 /W:5 /LOG:robocopy.log

Custo: 0 (já tem o HD). Vantagem: independente do B2.