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
This commit is contained in:
26
scripts/backup.sh
Executable file
26
scripts/backup.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user