Backups y Actualizaciones

Por: Artiko
forgejobackupactualizaciondockeroperaciones

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:

ContenidoDescripcion
forgejo-db.sqlDump 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.iniArchivo 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:


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:

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