Automatizar backups incrementales de volúmenes Docker a almacenamiento remoto con restic y verificar integridad desde el móvil vía Wireguard
Etiquetas: docker,backups,restic,almacenamiento-remoto,wireguard,automatizaciónEl problema
Tenía contenedores Docker corriendo en el servidor doméstico con datos que no podía perder. Los backups manuales no escalan y dejar todo en el almacenamiento local es arriesgado. Necesitaba automatizar backups incrementales a un NAS remoto y poder verificar que todo estuviera bien desde el móvil sin exponer el servidor directamente a Internet.
La solución: restic + cron + Wireguard
Restic es perfecto para esto. Hace backups incrementales comprimidos, verifica integridad automáticamente y soporta múltiples backends remotos. Lo configuré así:
1. Instalación y preparación
sudo apt install restic
Cré un repositorio restic en el NAS remoto accesible vía Wireguard:
restic -r sftp:usuario@nas-interno:/backups/docker init
Generé una contraseña fuerte y la guardé en /root/.restic/password:
mkdir -p /root/.restic
echo "tu_contraseña_super_segura" > /root/.restic/password
chmod 600 /root/.restic/password
2. Script de backup de volúmenes
Creé /usr/local/bin/backup-docker-volumes.sh:
#!/bin/bash
export RESTIC_REPOSITORY="sftp:usuario@nas-interno:/backups/docker"
export RESTIC_PASSWORD_FILE="/root/.restic/password"
# Array con los volúmenes a respaldar
VOLUMES=("postgres_data" "mongodb_data" "app_config")
for volume in "${VOLUMES[@]}"; do
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Respaldando volumen: $volume"
# Obtener la ruta de montaje del volumen
VOLUME_PATH=$(docker volume inspect "$volume" \
--format='{{.Mountpoint}}')
# Realizar backup con restic
restic backup "$VOLUME_PATH" \
--tag "docker_$volume" \
--exclude="/lost+found" \
--exclude="*.tmp"
if [ $? -eq 0 ]; then
echo "✓ Backup de $volume completado"
else
echo "✗ Error en backup de $volume"
# Aquí puedes agregar notificación por email
fi
done
# Limpiar snapshots antiguos (mantener 7 días)
restic forget --keep-daily 7 --prune
Permisos:
chmod +x /usr/local/bin/backup-docker-volumes.sh
3. Automatización con cron
En el crontab del root (crontab -e):
# Backup diario a las 2:00 AM
0 2 * * * /usr/local/bin/backup-docker-volumes.sh >> /var/log/docker-backups.log 2>&1
4. Verificación desde el móvil vía Wireguard
Instalé la app de Wireguard en el móvil y configuré acceso al servidor doméstico. Una vez conectado a la VPN:
Creé un script de verificación en /usr/local/bin/check-backups.sh:
#!/bin/bash
export RESTIC_REPOSITORY="sftp:usuario@nas-interno:/backups/docker"
export RESTIC_PASSWORD_FILE="/root/.restic/password"
echo "=== Estado de Backups ==="
echo "Snapshots disponibles:"
restic snapshots --json | jq -r '.[] |
"\(.time | split("T")[0]) - \(.paths[0] | split("/")[-1]) (\(.id[0:8]))"'
echo ""
echo "Verificando integridad..."
restic check --with-cache
echo ""
echo "Estadísticas:"
restic stats
Accesible vía SSH desde cualquier cliente Wireguard:
ssh usuario@servidor-local '/usr/local/bin/check-backups.sh'
5. Monitoreo básico
Agregué un pequeño endpoint HTTP para monitoreo remoto. Script Python simple en /opt/backup-monitor.py:
#!/usr/bin/env python3
from flask import Flask
import subprocess
import os
app = Flask(__name__)
@app.route('/status')
def status():
try:
result = subprocess.run(
['restic', 'snapshots', '--json'],
env={**os.environ,
'RESTIC_REPOSITORY': 'sftp:...',
'RESTIC_PASSWORD_FILE': '/root/.restic/password'},
capture_output=True
)
return {'status': 'ok', 'backups': len(result.stdout.decode().split('\n'))}
except:
return {'status': 'error'}, 500
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000)
Lo ejecuto como servicio systemd accesible solo vía Wireguard.
Resultados en producción
Después de 3 meses:
- Backups consistentes: Sin fallos. Los logs están limpios.
- Espacio optimizado: La deduplicación de restic mantiene el almacenamiento en ~200GB para 6 meses de datos.
- Verificación desde móvil: Tardo 15 segundos en confirmar que todo está bien, desde cualquier lugar.
- Tranquilidad: Sé exactamente qué respaldar y no dejo nada a la improvisación.
La combinación restic + Wireguard es muy potente. Sin exponer el servidor, tengo backups automatizados y verificables desde cualquier dispositivo. Vale la pena configurarlo bien desde el principio.