Duplicati es una de las herramientas libres de copias de seguridad más usadas del mundo, y con Docker la tienes cifrando y subiendo tus datos en cuestión de minutos. En esta guía levantas Duplicati con un solo archivo docker-compose.yml, montas las carpetas que quieres respaldar en modo solo lectura, configuras un destino en la nube (S3, MinIO, Backblaze B2 o SFTP) y programas backups cifrados con AES-256. Al final aprenderás lo más importante de cualquier sistema de copias: cómo restaurar. La misma explicación está disponible en inglés.

Puntos clave

  • Duplicati es un cliente de copias de seguridad libre (licencia MIT desde marzo de 2024) que cifra los datos con AES-256 en tu servidor antes de enviarlos, de modo que el proveedor de almacenamiento nunca ve el contenido.
  • Hace copias incrementales con deduplicación por bloques: solo la primera copia es completa; a partir de ahí sube únicamente los bloques que cambian, lo que ahorra ancho de banda y espacio.
  • Con Docker basta un servicio en docker-compose.yml; la configuración y la base de datos local persisten en el volumen montado en /data, y la interfaz web escucha en el puerto 8200.
  • Guarda las copias en casi cualquier sitio: Amazon S3 y compatibles como MinIO, Backblaze B2, SFTP, WebDAV, Google Drive o Storj.
  • Fija una versión concreta de la imagen (por ejemplo duplicati/duplicati:2.3.0.4) en lugar de :latest, para decidir tú cuándo saltas de versión.

¿Qué es Duplicati y las copias cifradas incrementales?

Duplicati es un programa de copias de seguridad de código abierto, escrito en C# sobre .NET 8, pensado para llevar tus datos a almacenamiento remoto de forma segura. Su propuesta se resume en tres ideas que conviene entender antes de instalarlo.

La primera es el cifrado en origen. Duplicati cifra cada fichero con AES-256 (un puerto en C# del formato abierto AESCrypt) dentro de tu propio servidor, antes de que nada salga por la red. El proveedor de almacenamiento, sea Amazon o un disco ajeno, solo ve bloques cifrados e ilegibles. Si prefieres GPG, también está soportado.

La segunda es la copia incremental con deduplicación por bloques. Duplicati parte tus ficheros en bloques (100 KB por defecto), calcula un hash de cada uno y solo sube los que no ha visto antes. Por eso la primera copia es completa y lenta, pero las siguientes son pequeñas y rápidas: si cambias una línea de un documento de 50 MB, solo viaja el bloque afectado, no el fichero entero.

La tercera es el formato de destino agnóstico. Los datos se agrupan en volúmenes remotos (llamados dblock, de 50 MB por defecto y comprimidos en zip) que se pueden guardar en decenas de backends distintos. Cambiar de proveedor no cambia tu forma de trabajar.

Frente a herramientas de sincronización como Syncthing, que replican una carpeta tal cual, Duplicati mantiene un historial de versiones: puedes recuperar el estado de un fichero de hace una semana aunque lo hayas borrado o dañado. Sincronizar no es respaldar.

El docker-compose.yml de Duplicati

Crea una carpeta para el proyecto y guarda dentro este docker-compose.yml. Usamos la imagen oficial duplicati/duplicati, montamos la configuración en un volumen con nombre y añadimos las carpetas que queremos respaldar en modo solo lectura (:ro), para que Duplicati nunca pueda escribir en tus datos de origen:

services:
  duplicati:
    image: duplicati/duplicati:2.3.0.4
    restart: unless-stopped
    environment:
      TZ: Europe/Madrid
      SETTINGS_ENCRYPTION_KEY: ${SETTINGS_ENCRYPTION_KEY}
      DUPLICATI__WEBSERVICE_PASSWORD: ${DUPLICATI_UI_PASSWORD}
      DUPLICATI__WEBSERVICE_ALLOWED_HOSTNAMES: "*"
    volumes:
      - duplicati_config:/data
      - /srv/appdata:/source/appdata:ro
      - /home/debian/documentos:/source/documentos:ro
    ports:
      - "127.0.0.1:8200:8200"

volumes:
  duplicati_config:

Junto al Compose, crea un archivo .env con los dos secretos que lee el contenedor (Docker Compose lo carga automáticamente). Genera cadenas largas y aleatorias, no palabras del diccionario:

SETTINGS_ENCRYPTION_KEY=cambia_esta_clave_muy_larga_y_aleatoria
DUPLICATI_UI_PASSWORD=otra_clave_distinta_para_la_web

Dos detalles importantes de este Compose. El SETTINGS_ENCRYPTION_KEY cifra la base de datos local de Duplicati en /data, donde se guardan las credenciales de tus destinos; sin él, cualquiera que lea ese volumen vería tus claves de acceso a S3. Y la publicación del puerto se ata a 127.0.0.1, así que la interfaz solo es accesible desde el propio servidor: para llegar desde fuera, ponla detrás de un proxy inverso con HTTPS en lugar de abrir el 8200 al mundo.

Arranca la pila y comprueba los registros:

docker compose up -d
docker compose ps
docker compose logs -f duplicati

Abre http://127.0.0.1:8200 (o un túnel SSH contra tu servidor), introduce la contraseña de la UI y ya estás dentro. Verás la pantalla de inicio de Duplicati, lista para crear tu primera copia.

¿Cómo configurar un backup a S3 o MinIO?

En la interfaz, pulsa Add backup y elige Configure a new backup. El asistente tiene cinco pasos; los que de verdad importan son el destino y las carpetas de origen.

En Destination, elige S3 Compatible si usas MinIO autoalojado o Amazon S3. Rellena el servidor, el nombre del bucket, la ruta y las claves de acceso. Un ejemplo típico contra un MinIO en tu misma red Docker sería:

Server:      http://minio:9000
Bucket:      duplicati-backups
Folder path: servidor1/
Access key:  <tu-access-key>
Secret key:  <tu-secret-key>

Para que Duplicati (en su contenedor) resuelva el nombre minio, ambos servicios deben compartir una red Docker; añade la red externa de tu MinIO al Compose de arriba. Si prefieres Backblaze B2, Storj o SFTP, el asistente ofrece un formulario específico para cada uno.

En Source data, marca las carpetas montadas que quieres respaldar. Como las montaste bajo /source, verás ahí tus documentos y appdata. Elige qué respaldar recordando la regla de oro: haz copia de los datos de tus contenedores (bases de datos volcadas, ficheros subidos), no de imágenes que puedes reconstruir. Si tienes dudas sobre qué es un dato y qué es efímero, repasa la guía de volúmenes y bind mounts en Docker.

Cifrado, programación y retención

En el paso Encryption, Duplicati te pide una contraseña de copia. Apúntala fuera del servidor: esta clave cifra los datos y es distinta de la contraseña de la UI. Si la pierdes, tus copias son irrecuperables, y ese es precisamente el objetivo del cifrado en origen. Por defecto se usa AES-256; déjalo así salvo que tengas un motivo para pasar a GPG.

En Schedule defines cada cuánto se ejecuta la copia. Una cadencia diaria de madrugada es lo habitual para un servidor personal. Duplicati corre el trabajo dentro del contenedor, sin cron externo.

En Options ajustas dos cosas clave. La retención decide cuánto historial guardas: la opción Smart backup retention conserva una copia por día durante una semana, una por semana durante un mes y una por mes durante un año, un equilibrio sensato entre poder volver atrás y no acumular infinito. Y el tamaño de volumen remoto (dblock), 50 MB por defecto: súbelo a 200 MB o 500 MB si respaldas muchos gigabytes a un destino con buena conexión, para reducir el número de ficheros en el bucket.

Guarda y lanza la primera copia con Run now. La inicial tardará según el volumen de datos y tu subida; las siguientes serán mucho más rápidas gracias a la deduplicación.

¿Cómo restaurar una copia de seguridad?

Una copia que no sabes restaurar no es una copia. Duplicati lo pone fácil desde la misma interfaz: pulsa Restore, elige el trabajo, y verás un selector de fecha con todas las versiones disponibles. Marca la que quieras, selecciona ficheros o carpetas concretas y decide si restaurar en la ubicación original o en una carpeta nueva (más seguro para no sobrescribir nada).

El caso importante es el desastre total: has perdido el servidor entero, incluida la configuración de Duplicati. Aquí es donde el diseño agnóstico brilla. Levantas un Duplicati nuevo con el Compose de esta guía, eliges Restore from configuration o Direct restore from backup files, apuntas al mismo bucket de S3/MinIO e introduces la contraseña de cifrado. Duplicati lee los metadatos del destino y reconstruye el árbol de versiones sin necesitar la base de datos original. Practica esta restauración al menos una vez: es la única manera de saber que tu estrategia de copias funciona de verdad.

Preguntas frecuentes

¿Duplicati es realmente gratis y de código abierto?

Sí. Duplicati es software libre bajo licencia MIT desde marzo de 2024, sin edición de pago ni funciones recortadas. Puedes usarlo en tantos servidores como quieras, revisar su código en GitHub y respaldar a cualquier destino compatible sin límites artificiales. El proyecto se financia con donaciones y soporte opcional.

¿Puedo hacer copia de las bases de datos de mis contenedores?

Sí, pero con cuidado. Copiar los ficheros de una base de datos "en caliente" puede dar una copia inconsistente. La práctica correcta es volcar la base de datos a un fichero con pg_dump o mariadb-dump mediante una tarea programada, y respaldar con Duplicati esa carpeta de volcados. Así garantizas que la copia representa un estado coherente al que se puede volver.

¿Qué pasa si pierdo la contraseña de cifrado?

Tus copias quedan inservibles. No hay puerta trasera ni recuperación: el cifrado AES-256 en origen existe justo para que nadie sin la clave pueda leer los datos, y eso te incluye a ti. Guarda esa contraseña en un gestor como Vaultwarden o en papel en un lugar seguro, y sepárala de la clave SETTINGS_ENCRYPTION_KEY del contenedor.

Conclusión

Con un único servicio en docker-compose.yml tienes Duplicati cifrando tus datos con AES-256 y subiéndolos de forma incremental a S3, MinIO o el destino que prefieras, con una interfaz clara para programar y restaurar. Recuerda las tres reglas que separan una copia de un accidente: monta el origen en solo lectura, guarda la contraseña de cifrado fuera del servidor y prueba la restauración antes de necesitarla. El siguiente paso lógico es montar el destino: si aún no tienes almacenamiento de objetos propio, sigue la guía de cómo instalar MinIO con Docker y apunta ahí tus copias.

Fuentes: [1] Documentación oficial de Duplicati[1], [2] Imagen oficial duplicati en Docker Hub[2], [3] Repositorio de Duplicati en GitHub[3].

Fuentes

  1. Documentación oficial de Duplicati
  2. Imagen oficial duplicati en Docker Hub
  3. Repositorio de Duplicati en GitHub

Ruta: Bases de datos y almacenamiento self-hosted con Docker