#!/usr/bin/env bash # Backup diario. Se ejecuta EN EL SERVIDOR (cron): dump consistente de MySQL # con el contenedor vivo + copia de .env, en /srv/backups/may, que es la # carpeta que zerobyte monta por SSH desde la otra máquina. # Instalación, zerobyte y restauración: SIGUIENTES-PASOS.md → "Backups". set -euo pipefail umask 077 BACKUP_DIR=/srv/backups/may APP_DIR=$(cd "$(dirname "$0")/.." && pwd) STAMP=$(date +%F_%H%M) mkdir -p "$BACKUP_DIR/mysql" "$BACKUP_DIR/config" # --single-transaction: snapshot InnoDB consistente sin bloquear ni parar nada. # MYSQL_PWD se expande DENTRO del contenedor (comillas simples): la contraseña # no pasa por este script ni por la lista de procesos del host. TMP="$BACKUP_DIR/mysql/.easyappointments_$STAMP.part" docker exec may-ea-mysql sh -c \ 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" exec mysqldump --single-transaction --quick \ --routines --triggers --events --databases easyappointments' > "$TMP" grep -q 'Dump completed' "$TMP" # mysqldump lo escribe al final: si falta, quedó truncado mv "$TMP" "$BACKUP_DIR/mysql/easyappointments_$STAMP.sql" # Lo único necesario para restaurar que no está en git. install -m 600 "$APP_DIR/.env" "$BACKUP_DIR/config/env" # Retención local corta; el histórico largo son los snapshots de zerobyte. find "$BACKUP_DIR/mysql" -name '*.sql' -mtime +7 -delete find "$BACKUP_DIR/mysql" -name '.*.part' -mtime +1 -delete echo "$(date -Is) OK easyappointments_$STAMP.sql"