Backups de Base de Dades
Context
La BD PostgreSQL conté dades que han requerit hores de processat ETL (cançons, balls, coreògrafs, links cross-platform). Perdre-les significaria repetir tot el pipeline d'importació. Els backups protegeixen contra:
- Migracions Flyway defectuoses que corromprien dades
- Errors humans (
DELETEsenseWHERE,DROP TABLEaccidental) - Corrupció de volum Docker (
db_datavolume) - Canvis de branca Git amb migracions incompatibles
Mida i impacte en disc
| Mètrica | Valor actual (2026-04-01) |
|---|---|
| BD en PostgreSQL | 30 MB |
| Dump comprimit (pg_dump custom) | 1.3 MB |
| 10 backups (rotació) | ~13 MB |
Conclusió: fins i tot amb backups diaris, l'impacte en disc és negligible. Amb la rotació a 10 fitxers, mai superarem els ~15-20 MB.
Script de backup
Ubicació: scripts/db/backup.sh
Ús
# Backup manual
./scripts/db/backup.sh
# Backup amb motiu (recomanat abans de migracions)
./scripts/db/backup.sh --reason "pre-migration V71"
# Backup intel·ligent — només si hi ha canvis
./scripts/db/backup.sh --smart
# Llistar backups existents
./scripts/db/backup.sh --list
# Restaurar un backup
./scripts/db/backup.sh --restore ldp_20260401_113700.dump
Què fa l'script
- Verifica que el container
ldp-postgresestà actiu - Crea el dump dins el container (
pg_dump --format=custom) i el copia abackups/ - Guarda metadades (
.meta): timestamp, motiu, mida BD, files totals, branca Git, commit - Rota automàticament: manté els últims 10 backups, esborra els més antics
Mode --smart
Compara un checksum lleuger (basat en comptatge de files per taula) amb l'últim backup. Si no hi ha canvis substancials, no fa res. Útil per automatitzar sense omplir el disc.
Procediment recomanat (entorn local)
Quan fer backup
| Situació | Comanda | Prioritat |
|---|---|---|
| Abans de migració Flyway | ./scripts/db/backup.sh --reason "pre-migration VXX" | Obligatòria |
| Abans de canviar de branca amb migracions | ./scripts/db/backup.sh --reason "pre-branch-switch" | Alta |
| Després d'ETL massiu (import cançons, enrichment) | ./scripts/db/backup.sh --reason "post-etl-enrichment" | Alta |
| Abans de DELETE/UPDATE massiu | ./scripts/db/backup.sh --reason "pre-bulk-delete" | Obligatòria |
| Setmanalment (si hi treballes activament) | ./scripts/db/backup.sh --smart | Normal |
Quan NO cal backup
- Canvis de codi que no afecten la BD
- Canvis de frontend
- Operacions de lectura (SELECT, exports)
Restauració
# 1. Llistar backups disponibles
./scripts/db/backup.sh --list
# 2. Restaurar (fa un safety backup automàtic abans)
./scripts/db/backup.sh --restore ldp_20260401_113700.dump
L'script fa un backup de seguretat automàtic abans de restaurar, per si la restauració no és la que volies.
Restauració manual (sense script)
# Copiar dump al container i restaurar
docker cp backups/ldp_20260401_113700.dump ldp-postgres:/tmp/restore.dump
docker exec ldp-postgres pg_restore -U ldp_user -d ldp --clean --if-exists /tmp/restore.dump
Backup del backup (offsite)
Els dumps a backups/ estan dins el projecte però exclosos de Git (.gitignore). Per tenir un backup extern:
# Copiar a una ubicació fora del projecte
cp backups/ldp_*.dump /path/to/external/drive/ldp-backups/
# O comprimir tot el directori
tar czf ~/ldp-backups-$(date +%Y%m%d).tar.gz backups/
Recomanació futura (producció): Quan la plataforma passi a producció, el backup automated es farà via:
- AWS RDS automated backups (retenció 7-35 dies, point-in-time recovery)
- pg_dump cron al servidor amb upload a S3 (si hosting propi amb Hetzner/Fly.io)
- WAL archiving per point-in-time recovery a nivell de transacció
Fitxers
backups/ # Directori de backups (exclòs de Git)
├── ldp_20260401_113700.dump # Dump binari PostgreSQL
├── ldp_20260401_113700.meta # Metadades del backup
├── .last_checksum # Checksum per mode --smart
└── ...
scripts/db/backup.sh # Script de backup