Files
FRASA-CAS/scripts/backup.sh
Consult AS Technology 0fb92364d8 feat: infraestructura de produccion (docker-compose, nginx, backup)
- docker-compose: 4 apps + api + postgres/redis (red interna, sin puertos
  expuestos), healthchecks, restart policies, volumenes
- nginx: client_max_body_size 10m, headers X-Forwarded, webroot certbot,
  certs montados desde /etc/letsencrypt (renovacion sin copiar)
- scripts/backup.sh: sqlite/pg_dump + uploads con retencion 30 dias
- README con instrucciones de deploy y pendientes
2026-08-21 23:42:24 +00:00

27 lines
1.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Backup diario FRASA — cron: 17 2 * * * /opt/frasa-ecosystem/scripts/backup.sh
set -euo pipefail
BACKUP_DIR="/backups"
FECHA=$(date +%Y%m%d)
RETENCION_DIAS=30
mkdir -p "$BACKUP_DIR"
cd "$(dirname "$0")/.."
# 1. Base de datos SQLite del API (mientras no se migre a Postgres)
docker compose exec -T api sh -c 'cat /data/dev.db' > "$BACKUP_DIR/frasa_db_$FECHA.sqlite" || true
# 2. Postgres (cuando el API migre; hoy falla en silencio si no hay datos)
docker compose exec -T postgres pg_dump -U "${POSTGRES_USER:-frasa_user}" "${POSTGRES_DB:-frasa_db}" \
> "$BACKUP_DIR/frasa_pg_$FECHA.sql" 2>/dev/null || rm -f "$BACKUP_DIR/frasa_pg_$FECHA.sql"
# 3. Expedientes subidos (INE, firmas, comprobantes)
docker compose exec -T api sh -c 'cd /data && tar czf - uploads' > "$BACKUP_DIR/uploads_$FECHA.tar.gz" || true
# 4. Retención
find "$BACKUP_DIR" -name "frasa_*" -mtime +$RETENCION_DIAS -delete
find "$BACKUP_DIR" -name "uploads_*" -mtime +$RETENCION_DIAS -delete
echo "[$(date -Is)] backup completo en $BACKUP_DIR"