Backup y Restauración
groales edited this page 2025-12-03 16:27:25 +01:00

Backup y Restauración

Protege tus repositorios Git, base de datos y configuración con backups regulares.

⚠️ Importancia de los Backups

Un servidor Git sin backups es un riesgo crítico:

  • 💔 Pérdida de código fuente
  • 💔 Pérdida de historial de commits
  • 💔 Pérdida de issues y pull requests
  • 💔 Pérdida de configuración y usuarios

📦 ¿Qué respaldar?

Gitea almacena datos en dos lugares principales:

  1. Volumen gitea_data: Repositorios, configuración, avatares, LFS
  2. Volumen gitea_db: Base de datos PostgreSQL con metadatos

🔄 Backup Manual

Método Completo (Recomendado)

# 1. Detener Gitea (mantener DB corriendo)
docker compose stop gitea

# 2. Backup de datos de Gitea
docker run --rm \
  -v gitea_data:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/gitea-data-$(date +%Y%m%d-%H%M%S).tar.gz -C /data .

# 3. Backup de PostgreSQL
docker compose exec gitea-db pg_dump -U gitea gitea > gitea-db-$(date +%Y%m%d-%H%M%S).sql

# 4. Reiniciar Gitea
docker compose start gitea

# 5. Verificar backups
ls -lh gitea-*.tar.gz
ls -lh gitea-*.sql

Método Rápido (Sin Downtime)

Para Gitea, si aceptas posibles inconsistencias menores:

# Backup en caliente
docker run --rm \
  -v gitea_data:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/gitea-data-$(date +%Y%m%d-%H%M%S).tar.gz -C /data .

# DB backup (sin detener)
docker compose exec gitea-db pg_dump -U gitea gitea > gitea-db-$(date +%Y%m%d-%H%M%S).sql

🔙 Restauración

Restaurar Completamente

# 1. Detener todos los servicios
docker compose down

# 2. Eliminar volúmenes antiguos (¡CUIDADO!)
docker volume rm gitea_data gitea_db

# 3. Crear nuevos volúmenes
docker volume create gitea_data
docker volume create gitea_db

# 4. Restaurar datos de Gitea
docker run --rm \
  -v gitea_data:/data \
  -v $(pwd):/backup \
  alpine sh -c "cd /data && tar xzf /backup/gitea-data-20241203-120000.tar.gz"

# 5. Iniciar solo PostgreSQL
docker compose up -d gitea-db

# 6. Esperar a que PostgreSQL esté listo
sleep 10

# 7. Restaurar base de datos
docker compose exec -T gitea-db psql -U gitea gitea < gitea-db-20241203-120000.sql

# 8. Iniciar todo
docker compose up -d

# 9. Verificar
docker compose logs -f

Restaurar Solo Repositorios

Si solo necesitas restaurar repositorios específicos:

# Extraer backup a directorio temporal
mkdir temp-restore
tar xzf gitea-data-20241203.tar.gz -C temp-restore

# Copiar repositorios específicos
docker cp temp-restore/git/repositories/usuario/repo.git gitea:/data/git/repositories/usuario/

# Reiniciar Gitea
docker compose restart gitea

🤖 Backup Automático

Opción 1: Cron Job

Crea un script /root/backup-gitea.sh:

#!/bin/bash
BACKUP_DIR="/backups/gitea"
DATE=$(date +%Y%m%d-%H%M%S)

mkdir -p $BACKUP_DIR

cd /path/to/gitea

# Backup Gitea data
docker run --rm \
  -v gitea_data:/data \
  -v $BACKUP_DIR:/backup \
  alpine tar czf /backup/gitea-data-$DATE.tar.gz -C /data .

# Backup PostgreSQL
docker compose exec -T gitea-db pg_dump -U gitea gitea > $BACKUP_DIR/gitea-db-$DATE.sql

# Comprimir SQL
gzip $BACKUP_DIR/gitea-db-$DATE.sql

# Eliminar backups antiguos (más de 30 días)
find $BACKUP_DIR -name "gitea-*" -mtime +30 -delete

echo "Backup completado: $DATE"

Hazlo ejecutable y añade a cron:

chmod +x /root/backup-gitea.sh

# Editar crontab
crontab -e

# Añadir línea (backup diario a las 2 AM)
0 2 * * * /root/backup-gitea.sh >> /var/log/gitea-backup.log 2>&1

Opción 2: docker-volume-backup

Usa offen/docker-volume-backup:

services:
  backup:
    image: offen/docker-volume-backup:latest
    environment:
      BACKUP_CRON_EXPRESSION: "0 2 * * *"  # 2 AM diario
      BACKUP_FILENAME: "gitea-backup-%Y%m%d-%H%M%S.tar.gz"
      BACKUP_RETENTION_DAYS: "30"
    volumes:
      - gitea_data:/backup/gitea_data:ro
      - /backups:/archive

Opción 3: Duplicati

Configura Duplicati para respaldar:

  • /var/lib/docker/volumes/gitea_data/_data
  • Los archivos SQL generados por cron

📤 Backup Remoto

rsync a Servidor Remoto

# En el script de backup, añade:
rsync -avz --delete /backups/gitea/ usuario@servidor-remoto:/backups/gitea/

Subir a Cloud Storage

AWS S3:

aws s3 sync /backups/gitea/ s3://mi-bucket/gitea-backups/

Google Drive (con rclone):

rclone sync /backups/gitea/ gdrive:gitea-backups/

🧪 Probar Restauración

CRÍTICO: Prueba tus backups regularmente:

# 1. Crear entorno de prueba
mkdir /tmp/gitea-test
cd /tmp/gitea-test

# 2. Copiar compose files
cp /path/to/gitea/docker-compose.yml .
cp /path/to/gitea/.env .

# 3. Restaurar y verificar
# (Usa los pasos de restauración anteriores)

# 4. Verificar que todo funciona
docker compose up -d
# Accede a http://localhost:3000 y verifica repos

📋 Checklist de Backup

  • Backup automático configurado
  • Backups se ejecutan regularmente
  • Backups se copian a ubicación remota
  • Rotación de backups antiguos configurada
  • Proceso de restauración documentado
  • Restauración probada al menos una vez
  • Alertas configuradas si falla el backup

🔍 Verificar Integridad

# Verificar archivos tar.gz
tar tzf gitea-data-20241203.tar.gz > /dev/null && echo "OK" || echo "CORRUPTO"

# Verificar SQL
gzip -t gitea-db-20241203.sql.gz && echo "OK" || echo "CORRUPTO"

# Ver tamaño de backups
du -sh gitea-*.tar.gz

🆘 Recuperación de Desastres

Pérdida Completa del Servidor

  1. Instalar Docker y Docker Compose en nuevo servidor
  2. Clonar repositorio de configuración
  3. Restaurar .env desde backup o recrear
  4. Seguir pasos de Restaurar Completamente
  5. Configurar DNS apuntando al nuevo servidor
  6. Verificar SSL y acceso

Corrupción de Base de Datos

Si PostgreSQL falla:

# Detener todo
docker compose down

# Eliminar solo volumen de DB
docker volume rm gitea_db

# Recrear y restaurar solo DB
docker volume create gitea_db
docker compose up -d gitea-db
sleep 10
docker compose exec -T gitea-db psql -U gitea gitea < gitea-db-backup.sql

# Iniciar Gitea
docker compose up -d gitea

Siguiente: Actualización