CreaRack-SL

Cron forgejo-backup: Backup diario de Forgejo (OPS)

Descripción funcional

Cron: /etc/cron.d/forgejo-backup (OPS)
Script: /usr/local/bin/forgejo-backup.sh (fuente: scripts/ops/forgejo/forgejo-backup.sh)
Frecuencia: Diariamente 05:15 UTC
Vigilancia: cron-heartbeat (entrada forgejo-backup, ventana 26 h)

Genera un dump completo de Forgejo (forgejo dump de BD + repos + config + adjuntos/paquetes, ~126 MB) y lo encadena a través de tres capas:

  1. OPS: /opt/forgejo-backup/dumps/forgejo-dump-YYYYMMDD.zip → retención 7 días (purga automática)
  2. STAGE: /opt/dr-backups/forgejo/ → retención 14 días, copia vía rsync (llave restringida solo-escritura)
  3. Google Drive: CreaRackSL/backups/workspace/forgejo/ → retención 60 días, viaja con gdrive-sync semanal existente

Lógica (resumen de /usr/local/bin/forgejo-backup.sh)

1. mkdir -p /opt/forgejo-backup/dumps
2. docker exec forgejo (como usuario git, uid 1000):
   - rm /tmp/fj-dump.zip
   - timeout 1800 forgejo dump --skip-log --skip-index
   - genera /tmp/fj-dump.zip
3. docker cp forgejo:/tmp/fj-dump.zip → /opt/forgejo-backup/dumps/forgejo-dump-${YYYYMMDD}.zip
4. Validación ZIP: python3 con zipfile.testzip() — todo el archivo debe abrirse sin errores
5. Purga local: find ... -mtime +7 -delete
6. rsync con llave restringida ($KEY): copia el ZIP a STAGE:/opt/dr-backups/forgejo/
7. Log: /var/log/forgejo-backup.log con timestamps UTC y [OK]/[FAIL]

Flags del dump

  • --skip-log: Logs son reconstruibles, solo engordan (sí se guardan los .log históricos de Forgejo)
  • --skip-index: Índices se regeneran al iniciar Forgejo, omitible

Seguridad de la llave SSH

/root/.ssh/stage_forgejo_backup está restringida con rrsync en STAGE:

  • Solo escritura (put)
  • Destino forzado a /opt/dr-backups/forgejo/ (no puede navegar fuera)
  • Sin ejecución de comandos

Validación y restore

Restore probado: 08-08-2026, mismo día del primer backup.

Verificaciones realizadas:

  • ✅ Descompresión completa del ZIP sin errores
  • ✅ fsck del repo nativo (limpio)
  • ✅ BD integrity: ok
  • ✅ Presencia byte-a-byte del instalador del Agente

Excepciones arquitectónicas

Decisión explícita (Edu, 08-08-2026): El backup de Forgejo es cron de sistema (no Forgejo Actions) porque:

  • No puede depender de que Forgejo esté vivo
  • Es Capa 3 operativa: debe ser independiente de la plataforma que protege

Esto rompe deliberadamente la regla de “todo en Forgejo Actions” del plan de migración.

Purgas

Local (OPS)

Automática en el script: find ... -mtime +7 -delete

STAGE y Drive

Cron forgejo-dumps-purge (sábado 04:45 UTC):

  • STAGE: find /opt/dr-backups/forgejo -name "forgejo-dump-*.zip" -mtime +14 -delete
  • Drive: rclone delete --min-age 60d gdrive:CreaRackSL/backups/workspace/forgejo

Log en STAGE: /opt/dr-backups/cron.log (entradas con [YYYYMMDDTHH:MM:SSZ] forgejo-purge:)

Véase también

  • [[feature—infra—forgejo-f1-automatizaciones-paralelo]]
  • [[concept—infra—ops-server]]
  • [[concept—infra—staging-server]]
  • [[entity—public—forgejo-espejo-releases]]
  • [[decision—20260808—forgejo-backup-cron-excepcion-centralizacion]]