Skip to main content

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 (DELETE sense WHERE, DROP TABLE accidental)
  • Corrupció de volum Docker (db_data volume)
  • Canvis de branca Git amb migracions incompatibles

Mida i impacte en disc

MètricaValor actual (2026-04-01)
BD en PostgreSQL30 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

  1. Verifica que el container ldp-postgres està actiu
  2. Crea el dump dins el container (pg_dump --format=custom) i el copia a backups/
  3. Guarda metadades (.meta): timestamp, motiu, mida BD, files totals, branca Git, commit
  4. 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óComandaPrioritat
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 --smartNormal

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