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-resticInicialicé el repositorio restic:
restic init --repo /mnt/backups/docker-resticEsto 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-envUsé 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.logGuardé el script en /opt/backup-docker.sh y le di permisos:
chmod 755 /opt/backup-docker.shPaso 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.shPaso 5: Verificar cifrado y conectividad#
Ejecuté el backup manualmente la primera vez:
/opt/backup-docker.shVerifiqué que los datos llegaron cifrados al almacenamiento remoto:
ls -lah /mnt/backups/docker-restic/Comprobé la conectividad Wireguard durante el backup:
wg show
restic snapshotsConsideraciones 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/testResultado#
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.