Ir al contenido

Backups automáticos y cifrados de Docker con Duplicati + notificaciones por email

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
#

Tengo varios contenedores Docker corriendo en mi servidor doméstico con datos que no puedo perder: bases de datos, configuraciones, archivos de usuarios. Un día el disco falla y pierdo todo. No vuelvo a cometer ese error.

Necesitaba una solución que:

  • Fuera automática (sin intervención manual)
  • Cifrara los datos
  • Guardara en almacenamiento externo (USB, NAS)
  • Me avisara si algo fallaba

Duplicati resultó ser la herramienta indicada.

Instalación de Duplicati
#

Ejecuto Duplicati en Docker también (redundancia controlada). Mi docker-compose:

duplicati:
  image: duplicati/duplicati:latest
  container_name: duplicati
  restart: always
  ports:
    - "8200:8200"
  volumes:
    - /var/lib/duplicati:/data
    - /var/lib/docker/volumes:/source:ro
    - /mnt/backup:/destination
  environment:
    - PUID=1000
    - PGID=1000

La clave aquí: monto los volúmenes de Docker como lectura (ro) en /source y el almacenamiento externo en /destination.

Accedo a la interfaz web en http://localhost:8200 y configuro el primer backup.

Configuración del backup
#

Paso 1: Seleccionar origen

En “Agregar backup” → “Configurar nuevo backup”, elijo los volúmenes específicos a respaldar:

/source/mi-database/_data
/source/mi-app/config
/source/wordpress/html

No respaldo todo. Es innecesario y ocupa espacio. Solo lo que importa.

Paso 2: Destino y cifrado

  • Destino: file:///destination/duplicati-backups
  • Algoritmo: AES-256
  • Contraseña: generada con openssl rand -base64 32

Guardo la contraseña en un gestor seguro. Sin ella, nadie accede a los backups.

Paso 3: Planificación

Programo un backup diario a las 3 AM:

Horario: 03:00
Frecuencia: Diaria
Retención: Mantener versiones de los últimos 30 días

Notificaciones por email
#

Aquí está el punto crítico: saber cuándo falla un backup.

En la configuración del backup, voy a “Opciones avanzadas” y añado:

--send-mail-to=miuser@gmail.com
--send-mail-from=servidor@localhost
--send-mail-subject=Duplicati Backup Report
--send-mail-body=Resultado del backup de Docker
--send-mail-level=All

Pero necesito un servicio SMTP funcional. Uso ssmtp en el contenedor:

FROM duplicati/duplicati:latest
RUN apt-get update && apt-get install -y ssmtp
COPY ssmtp.conf /etc/ssmtp/ssmtp.conf
RUN chmod 600 /etc/ssmtp/ssmtp.conf

Archivo ssmtp.conf:

root=miuser@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=miuser@gmail.com
AuthPass=mi-contraseña-app-google
UseSTARTTLS=YES

Genero una contraseña específica de Google (no uso la contraseña real).

Verificación y monitoreo
#

Ejecuto un backup manual para verificar:

docker logs duplicati

Busco:

Email notification sent successfully
Backup completed successfully

Si algo falla, recibo un email inmediatamente. Lo he probado: funciona.

Casos reales donde esto me salvó
#

La semana pasada, el disco USB de destino dejó de responder. Recibí el email a las 3:04 AM. Reemplacé el USB antes del desayuno y re-programé el backup. Sin pérdida de datos.

Antes de esto, había perdido dos años de fotos por un fallo en cascada. Nunca más.

Consideraciones finales
#

  • Espacio: Un backup cifrado ocupa 40-50% del original. Calcula bien.
  • Velocidad: Los primeros backups son lentos (cifrado de 256-bit). Paciencia.
  • Contraseñas: Guarda la del cifrado en dos lugares seguros. La necesitarás.
  • Rotación: No elimines backups automáticamente. Duplicati gestiona la retención.

Duplicati no es perfecto, pero para un servidor doméstico es rock solid. Llevo 18 meses sin un fallo de backup y durmiendo mejor por las noches.