Ir al contenido

Backups automáticos y cifrados de Docker con restic hacia almacenamiento remoto vía Wireguard

Rogelio Guerra Riverón
Autor
Rogelio Guerra Riverón
Construyendo mi propia infraestructura web desde cero. Aquí documento cada paso: servidores, redes, contenedores y lo que vaya surgiendo.

El problema
#

Tenía contenedores Docker corriendo servicios críticos en mi servidor doméstico: Nextcloud, bases de datos, aplicaciones personalizadas. Necesitaba backups, pero no quería enviar datos sin cifrar a internet. Tampoco quería instalar agentes adicionales o configuraciones complicadas. Decidí usar restic con Wireguard.

La solución que implementé
#

La idea es simple: restic hace backup del volumen Docker cifrado, lo envía a través de un túnel Wireguard (red privada) hacia un NAS o servidor remoto que también tengo en otra ubicación.

Requisitos
#

  • Docker y Docker Compose funcionando
  • Wireguard ya configurado entre servidor y almacenamiento remoto
  • restic instalado en el servidor principal
  • Acceso SSH o local al almacenamiento remoto

Paso 1: Preparar el almacenamiento remoto
#

En el servidor remoto, cree un directorio para los backups:

mkdir -p /mnt/backups/docker-restic
chmod 700 /mnt/backups/docker-restic

Inicialicé el repositorio restic:

restic init --repo /mnt/backups/docker-restic

Esto me pidió una contraseña. La guardé en un gestor de contraseñas.

Paso 2: Configurar credenciales en el servidor principal
#

En el servidor con Docker, creé un archivo de configuración para restic:

cat > ~/.restic-env << 'EOF'
export RESTIC_REPOSITORY="rest:http://wg-storage.local/backups/docker-restic"
export RESTIC_PASSWORD="tu-contraseña-fuerte-aqui"
export RESTIC_CACHE_DIR="/var/cache/restic"
EOF

chmod 600 ~/.restic-env

Usé rest:http:// porque configuré un servidor REST en el almacenamiento remoto usando rest-server. Si prefieres sftp:

export RESTIC_REPOSITORY="sftp:wg-storage.local:/mnt/backups/docker-restic"

Paso 3: Script de backup
#

Creé un script que backupea los volúmenes de Docker:

#!/bin/bash
set -e

source ~/.restic-env

BACKUP_PATHS=(
    "/var/lib/docker/volumes/nextcloud-data/_data"
    "/var/lib/docker/volumes/postgres-data/_data"
    "/opt/docker-apps"
)

echo "[$(date)] Iniciando backup de Docker..." >> /var/log/docker-backup.log

for path in "${BACKUP_PATHS[@]}"; do
    if [ -d "$path" ]; then
        restic backup "$path" \
            --tag "docker-backup" \
            --tag "$(date +%Y-%m-%d)" \
            >> /var/log/docker-backup.log 2>&1
    fi
done

# Limpiar snapshots antiguos (mantener últimas 30)
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune \
    >> /var/log/docker-backup.log 2>&1

echo "[$(date)] Backup completado" >> /var/log/docker-backup.log

Guardé el script en /opt/backup-docker.sh y le di permisos:

chmod 755 /opt/backup-docker.sh

Paso 4: Automatizar con cron
#

Agregué una entrada a crontab para ejecutar el backup cada día a las 2 AM:

0 2 * * * /opt/backup-docker.sh

Paso 5: Verificar cifrado y conectividad
#

Ejecuté el backup manualmente la primera vez:

/opt/backup-docker.sh

Verifiqué que los datos llegaron cifrados al almacenamiento remoto:

ls -lah /mnt/backups/docker-restic/

Comprobé la conectividad Wireguard durante el backup:

wg show
restic snapshots

Consideraciones importantes
#

  • Cifrado: restic cifra todo por defecto. Los datos viajan encriptados por Wireguard y se almacenan cifrados.
  • Bandwidth: El primer backup es grande. En mi caso tardó horas. Los incrementales son mucho más rápidos.
  • Monitoreo: Agregué alertas en caso de fallos del backup verificando el exit code del script.
  • Recuperación: Probé restaurar un archivo para asegurarme que funciona:
restic restore latest --target /tmp/test

Resultado
#

Ahora tengo backups automáticos cifrados ejecutándose cada noche. Si algo falla en mi servidor, puedo restaurar los contenedores Docker desde el almacenamiento remoto sin preocuparme por datos expuestos. La combinación de restic + Wireguard + Docker es simple, segura y automatizada.