From 449667fc800ca571fb22e4a693625f22d31155a6 Mon Sep 17 00:00:00 2001 From: Juan Marquez Date: Sun, 19 Jul 2026 16:27:22 +0200 Subject: [PATCH] =?UTF-8?q?a=C3=B1adido=20script=20para=20backup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/backup.sh | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 scripts/backup.sh diff --git a/scripts/backup.sh b/scripts/backup.sh new file mode 100755 index 0000000..3e97bef --- /dev/null +++ b/scripts/backup.sh @@ -0,0 +1,32 @@ +#!/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"