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:
- OPS:
/opt/forgejo-backup/dumps/forgejo-dump-YYYYMMDD.zip→ retención 7 días (purga automática) - STAGE:
/opt/dr-backups/forgejo/→ retención 14 días, copia vía rsync (llave restringida solo-escritura) - Google Drive:
CreaRackSL/backups/workspace/forgejo/→ retención 60 días, viaja congdrive-syncsemanal 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
- ✅
fsckdel 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]]