Automatizar backups incrementales de volúmenes Docker a almacenamiento remoto con restic y verificar integridad desde el móvil vía Wireguard

Etiquetas:

El 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *