Backups y Actualizaciones
Backups y Actualizaciones
Un backup correcto de Forgejo incluye la base de datos, los repositorios Git y la configuracion. Un proceso de actualizacion ordenado reduce el riesgo de perder datos o dejar la instancia inoperable.
forgejo dump: que incluye
El comando forgejo dump genera un archivo ZIP o TAR con todo lo necesario para restaurar la instancia:
| Contenido | Descripcion |
|---|---|
forgejo-db.sql | Dump completo de la base de datos |
repos/ | Todos los repositorios Git (objetos, ramas, tags) |
custom/ | Configuracion personalizada y plantillas |
data/ | Archivos subidos, avatares, attachments |
log/ | Logs recientes (opcional) |
app.ini | Archivo de configuracion principal |
Ejecutar el dump
docker exec -u git forgejo \
forgejo dump \
-c /data/gitea/conf/app.ini \
--type zip \
-f /tmp/backup-$(date +%Y%m%d).zip
Copiar el archivo fuera del contenedor:
docker cp forgejo:/tmp/backup-$(date +%Y%m%d).zip /ruta/backups/
Backup de volumenes Docker
Si usas volumenes con nombre, otra opcion es hacer backup directamente del directorio del volumen en el host:
# Encontrar la ruta del volumen
docker volume inspect forgejo_data --format '{{ .Mountpoint }}'
# Hacer backup comprimido
VOLUMEN=$(docker volume inspect forgejo_data --format '{{ .Mountpoint }}')
tar -czf /ruta/backups/forgejo-vol-$(date +%Y%m%d).tar.gz -C "$VOLUMEN" .
Este metodo es mas rapido para volumenes grandes, pero requiere detener Forgejo o asegurar consistencia de la base de datos con un lock previo.
Para bases de datos PostgreSQL en contenedor separado, agrega un dump de Postgres:
docker exec forgejo_db pg_dump -U forgejo forgejo > \
/ruta/backups/forgejo-pg-$(date +%Y%m%d).sql
Estrategia de backup
Una estrategia practica para una instancia de tamano mediano:
- Frecuencia: backup diario automatico a las 03:00
- Retencion local: 7 dias
- Retencion remota: 30 dias (enviar a S3, Backblaze B2 o servidor secundario)
- Verificacion: probar restauracion completa una vez al mes en entorno de staging
Script de backup automatico con cron
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/var/backups/forgejo"
REMOTE_BUCKET="s3://mi-bucket/forgejo-backups"
RETENTION_DAYS=7
FECHA=$(date +%Y%m%d_%H%M%S)
ARCHIVO="$BACKUP_DIR/backup-$FECHA.zip"
mkdir -p "$BACKUP_DIR"
# Crear dump
docker exec -u git forgejo \
forgejo dump \
-c /data/gitea/conf/app.ini \
--type zip \
-f "/tmp/backup-$FECHA.zip"
docker cp "forgejo:/tmp/backup-$FECHA.zip" "$ARCHIVO"
docker exec forgejo rm "/tmp/backup-$FECHA.zip"
# Enviar a almacenamiento remoto (requiere aws-cli configurado)
aws s3 cp "$ARCHIVO" "$REMOTE_BUCKET/"
# Limpiar backups locales antiguos
find "$BACKUP_DIR" -name "backup-*.zip" -mtime "+$RETENTION_DAYS" -delete
echo "Backup completado: $ARCHIVO"
Agregar al crontab del root:
crontab -e
# Agregar la linea:
0 3 * * * /opt/scripts/backup-forgejo.sh >> /var/log/forgejo-backup.log 2>&1
Restauracion desde un dump
Paso 1: preparar el entorno
# Detener Forgejo
docker stop forgejo
# Crear directorio temporal
mkdir -p /tmp/forgejo-restore
unzip /ruta/backups/backup-20260228.zip -d /tmp/forgejo-restore/
Paso 2: restaurar la base de datos
Para SQLite:
# El dump incluye el archivo .db directamente
docker cp /tmp/forgejo-restore/forgejo.db forgejo:/data/gitea/forgejo.db
Para PostgreSQL:
docker exec -i forgejo_db psql -U forgejo forgejo < /tmp/forgejo-restore/forgejo-db.sql
Paso 3: restaurar repositorios y datos
VOLUMEN=$(docker volume inspect forgejo_data --format '{{ .Mountpoint }}')
rsync -av /tmp/forgejo-restore/repos/ "$VOLUMEN/gitea/repositories/"
rsync -av /tmp/forgejo-restore/data/ "$VOLUMEN/gitea/data/"
Paso 4: restaurar configuracion y reiniciar
docker cp /tmp/forgejo-restore/app.ini forgejo:/data/gitea/conf/app.ini
docker start forgejo
docker logs -f forgejo
Verificar que la instancia arranca sin errores y que los repositorios estan accesibles.
Actualizaciones de version
Forgejo sigue versionado semantico. El proceso de actualizacion con Docker es:
Paso 1: leer las release notes
Antes de actualizar, revisa el changelog en https://codeberg.org/forgejo/forgejo/releases. Presta atencion a:
- Cambios que rompen compatibilidad (breaking changes)
- Migraciones de base de datos automaticas
- Cambios en la configuracion de
app.ini
Paso 2: crear un backup previo
Siempre hacer backup antes de actualizar:
/opt/scripts/backup-forgejo.sh
Paso 3: actualizar la imagen
En docker-compose.yml, cambia el tag de la imagen:
# Antes
image: codeberg.org/forgejo/forgejo:9.0
# Despues
image: codeberg.org/forgejo/forgejo:9.1
Paso 4: aplicar el cambio
docker compose pull forgejo
docker compose up -d forgejo
docker logs -f forgejo
Forgejo ejecuta las migraciones de base de datos automaticamente al iniciar. Los logs mostraran algo como:
[I] Forgejo v9.1.0 built with ...
[I] Run migration: 369
[I] Migration finished
Rollback a version anterior
Si la nueva version tiene problemas:
# Detener la instancia nueva
docker compose down
# Restaurar el backup de base de datos
# (ver seccion de restauracion)
# Cambiar el tag en docker-compose.yml a la version anterior
# Iniciar
docker compose up -d
Nota: no siempre es posible hacer downgrade si la migracion de base de datos introdujo cambios irreversibles. Por eso el backup previo es obligatorio.
Siguiente: Capitulo 22: Seguridad y Hardening