#!/usr/bin/env bash # Backup diario FRASA — corre en el HOST (el API vive en systemd, no en Docker). # # crontab: 17 2 * * * /root/frasa-ecosystem/scripts/backup.sh >> /var/log/frasa-backup.log 2>&1 # # Copia consistente de la base SQLite (con .backup, no un cat del archivo en # uso), los expedientes subidos y el .env; conserva 30 días. set -euo pipefail RAIZ="/root/frasa-ecosystem" BACKUP_DIR="/root/backups" FECHA=$(date +%Y%m%d) RETENCION_DIAS=30 DB="$RAIZ/api-gateway/prisma/dev.db" mkdir -p "$BACKUP_DIR" # 1. Base de datos SQLite (copia consistente aunque el API esté escribiendo) sqlite3 "$DB" ".backup '$BACKUP_DIR/frasa_db_$FECHA.sqlite'" # 2. Expedientes subidos (INE, firmas, comprobantes) if [ -d "$RAIZ/api-gateway/uploads" ]; then tar czf "$BACKUP_DIR/uploads_$FECHA.tar.gz" -C "$RAIZ/api-gateway" uploads fi # 3. Configuración de entorno (sin la cual el restore no arranca igual) cp "$RAIZ/.env" "$BACKUP_DIR/env_$FECHA" # 4. Retención find "$BACKUP_DIR" \( -name "frasa_db_*" -o -name "uploads_*" -o -name "env_*" \) -mtime +"$RETENCION_DIAS" -delete echo "[$(date -Is)] backup completo: $BACKUP_DIR (db + uploads + env)"