El servicio backup del compose respalda la base todos los días a las 3:00 (hora de Bogotá) y guarda 7 días en el volumen trazo_backups. Cada respaldo se comprime, se cifra con AES-256 y se firma con HMAC-SHA256: un archivo alterado, dañado o cifrado con otra llave se rechaza antes de tocar la base.
Paso a paso
- Servicio backupRevisa cada 5 minutos si toca respaldar
No duerme hasta la hora: si MySQL todavía no aceptaba conexiones o el equipo estuvo suspendido a las 3:00, se reintenta solo en la siguiente vuelta (
BACKUP_CHECK_SECONDS). - Servicio backup¿Pasaron las 3:00 sin respaldo, o no hay uno de 24 h?
- Servicio backupPrepara llave y credenciales en archivos temporales
Nunca en los argumentos de un proceso (se verían con
ps). La llave esBACKUP_ENCRYPTION_KEY(obligatoria en producción) o una generada en el volumentrazo_backup-keyen local. - MySQLVuelca sin bloquear la app
mysqldump --single-transaction --quick --no-tablespaces: una foto consistente mientras la app sigue escribiendo. - Servicio backup¿El volcado terminó bien?
- Volumen de respaldosGuarda .sql.gz.enc y su firma .hmac
gzip →
openssl enc -aes-256-cbc -pbkdf2 -iter 600000. La firma se escribe antes de dar el archivo por bueno: un.encsin su.hmacnunca cuenta. Borra los de más de 7 días. - Servicio backupSigue revisando cada 5 minutos
- OperaciónEjecuta trazo-backup restore archivo base
listmuestra los respaldos. Se recomienda restaurar primero en una base aparte (por ejemplotrazo_test) y comparar. - Servicio backup¿La firma coincide?
- MySQLDescifra, descomprime y carga
Probado: una restauración en trazo_test dio conteos idénticos a la base original, y un archivo alterado se rechazó.
Dónde está en el código
backup.sh:schedule,run,list,checkyrestore.docker-compose.yml: el serviciobackup, su volumen y su healthcheck.- Explicación y comandos: Respaldos.