Duplicacy es una herramienta de copias de seguridad que divide los archivos en fragmentos (chunks), los cifra y los sube a un almacenamiento local o en la nube, subiendo cada fragmento una sola vez aunque aparezca en varias copias. No usa bloqueos, así que varios servidores pueden escribir en el mismo almacenamiento a la vez y compartir la deduplicación. En este tutorial instalarás la CLI de Duplicacy en Ubuntu 24.04, harás copias cifradas de /var/www a un bucket S3, las replicarás en Backblaze B2, aplicarás una política de retención y lo automatizarás con systemd.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Un bucket S3 o compatible con S3, con una clave de acceso (access key y secret key) que pueda leer y escribir en él.
  • Opcional, para la copia secundaria: un bucket de Backblaze B2 con su keyID y applicationKey.

En este tutorial los comandos se ejecutan como root (con sudo -i) porque la copia necesita leer archivos de varios usuarios y las credenciales se guardan en un archivo que solo root puede leer.

Paso 1: Instalar la CLI de Duplicacy

Duplicacy se distribuye como un único binario en las releases de GitHub. Consulta la última versión en https://github.com/gilbertchen/duplicacy/releases y descárgala (en este ejemplo, la 3.2.3 para x86_64):

sudo -i
VERSION=3.2.3
curl -fLo /usr/local/bin/duplicacy "https://github.com/gilbertchen/duplicacy/releases/download/v${VERSION}/duplicacy_linux_x64_${VERSION}"
chmod 755 /usr/local/bin/duplicacy

En servidores ARM64 descarga el archivo duplicacy_linux_arm64_${VERSION}. Comprueba que el binario funciona:

duplicacy -help | head -n 3
NAME:
   duplicacy - A new generation cloud backup tool based on lock-free deduplication

Paso 2: Guardar las credenciales en un archivo protegido

Duplicacy lee las credenciales del almacenamiento y la contraseña de cifrado desde variables de entorno, lo que permite ejecutarlo sin preguntas desde systemd. Crea un archivo de entorno legible solo por root:

mkdir -p /etc/duplicacy
install -m 600 /dev/null /etc/duplicacy/duplicacy.env
nano /etc/duplicacy/duplicacy.env

Añade estas líneas, sustituyendo los valores por los tuyos:

DUPLICACY_PASSWORD=your_strong_encryption_password
DUPLICACY_S3_ID=your_s3_access_key
DUPLICACY_S3_SECRET=your_s3_secret_key

Las variables sin nombre de almacenamiento (DUPLICACY_S3_ID, DUPLICACY_PASSWORD) se aplican al almacenamiento llamado default. Carga el archivo en tu sesión actual:

set -a; source /etc/duplicacy/duplicacy.env; set +a

Paso 3: Inicializar el repositorio

En Duplicacy, el repositorio es el directorio que quieres copiar y el almacenamiento es el destino. Para no dejar el directorio de configuración .duplicacy dentro de /var/www (donde el servidor web podría servirlo), crea un directorio de trabajo aparte y usa -repository para indicar qué ruta se copia:

mkdir -p /root/duplicacy/www
cd /root/duplicacy/www
duplicacy init -e -repository /var/www www-server s3://[email protected]/your-bucket/duplicacy
  • -e cifra el almacenamiento con la contraseña de DUPLICACY_PASSWORD.
  • www-server es el snapshot ID, el nombre que identifica las copias de este directorio. Debe ser único por origen.
  • La URL de S3 tiene el formato s3://region@endpoint/bucket/ruta. Para un proveedor compatible con S3, cambia la región y el endpoint por los del proveedor.
/var/www will be backed up to s3://[email protected]/your-bucket/duplicacy with id www-server

Si quieres excluir rutas, crea el archivo de filtros /root/duplicacy/www/.duplicacy/filters. Cada línea empieza por - (excluir) o + (incluir) y las rutas son relativas a /var/www:

-*.log
-cache/
-node_modules/

Paso 4: Hacer la primera copia

Lanza la copia con estadísticas y varios hilos de subida:

cd /root/duplicacy/www
duplicacy backup -stats -threads 4
Backup for /var/www at revision 1 completed
Files: 1523 total, 84,211K bytes; 1523 new, 84,211K bytes
All chunks: 32 total, 84,301K bytes; 32 new, 71,907K bytes, 23,451K bytes uploaded

La primera copia sube todos los datos. Las siguientes solo suben los fragmentos que han cambiado. Lista las revisiones disponibles:

duplicacy list
Snapshot www-server revision 1 created at 2026-09-25 10:14

Paso 5: Añadir un segundo almacenamiento en Backblaze B2

La regla 3-2-1 recomienda tener una copia en otro proveedor. En lugar de copiar dos veces desde el servidor, Duplicacy puede replicar las revisiones de un almacenamiento a otro con copy. Para ello, el segundo almacenamiento debe crearse compatible con el primero usando -copy.

Añade las credenciales de B2 al archivo de entorno. Para un almacenamiento con nombre, las variables llevan el nombre en mayúsculas después de DUPLICACY_:

nano /etc/duplicacy/duplicacy.env
DUPLICACY_OFFSITE_PASSWORD=your_strong_encryption_password
DUPLICACY_OFFSITE_B2_ID=your_b2_key_id
DUPLICACY_OFFSITE_B2_KEY=your_b2_application_key

Recarga el archivo y añade el almacenamiento offsite:

set -a; source /etc/duplicacy/duplicacy.env; set +a
cd /root/duplicacy/www
duplicacy add -e -copy default -bit-identical offsite www-server b2://your-b2-bucket

-bit-identical hace que los fragmentos sean idénticos en ambos almacenamientos, así podrás copiar los datos entre buckets con otras herramientas si lo necesitas. Copia las revisiones existentes a B2:

duplicacy copy -from default -to offsite

Comprueba que la revisión está en el nuevo almacenamiento:

duplicacy list -storage offsite
Snapshot www-server revision 1 created at 2026-09-25 10:14

Paso 6: Definir la política de retención

prune elimina revisiones antiguas. Cada opción -keep n:m significa "conservar una revisión cada n días para las revisiones con más de m días". n igual a 0 significa borrar todas las revisiones más antiguas que m. Las opciones se escriben de mayor a menor m:

duplicacy prune -keep 0:365 -keep 30:90 -keep 7:30 -keep 1:7

Con esta política se conservan todas las revisiones de la última semana, una diaria hasta los 30 días, una semanal hasta los 90, una mensual hasta el año y nada más antiguo. Aplícala también al almacenamiento de B2:

duplicacy prune -storage offsite -keep 0:365 -keep 30:90 -keep 7:30 -keep 1:7

Paso 7: Automatizar las copias con systemd

Crea un script que haga la copia, la replique y aplique la retención. set -euo pipefail detiene el script en el primer error para que systemd marque el servicio como fallido:

nano /usr/local/bin/duplicacy-backup
#!/usr/bin/env bash
set -euo pipefail

cd /root/duplicacy/www

duplicacy -log backup -stats -threads 4
duplicacy -log copy -from default -to offsite
duplicacy -log prune -keep 0:365 -keep 30:90 -keep 7:30 -keep 1:7
duplicacy -log prune -storage offsite -keep 0:365 -keep 30:90 -keep 7:30 -keep 1:7
chmod 750 /usr/local/bin/duplicacy-backup

Crea el servicio. EnvironmentFile carga las credenciales sin exponerlas en el script:

nano /etc/systemd/system/duplicacy-backup.service
[Unit]
Description=Duplicacy backup of /var/www
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/etc/duplicacy/duplicacy.env
ExecStart=/usr/local/bin/duplicacy-backup
Nice=10
IOSchedulingClass=idle

Crea el temporizador para lanzarlo cada noche a las 03:00:

nano /etc/systemd/system/duplicacy-backup.timer
[Unit]
Description=Nightly Duplicacy backup

[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=15m
Persistent=true

[Install]
WantedBy=timers.target

Recarga systemd, lanza una ejecución manual para probarlo y activa el temporizador:

systemctl daemon-reload
systemctl start duplicacy-backup.service
journalctl -u duplicacy-backup.service -n 20 --no-pager
systemctl enable --now duplicacy-backup.timer

Comprueba la próxima ejecución programada:

systemctl list-timers duplicacy-backup.timer
NEXT                        LEFT     LAST PASSED UNIT                   ACTIVATES
Fri 2026-09-26 03:07:12 UTC 16h left -    -      duplicacy-backup.timer duplicacy-backup.service

Paso 8: Verificar y restaurar

Una copia que no se ha probado no es una copia. check confirma que todos los fragmentos de todas las revisiones existen en el almacenamiento, y -files descarga y verifica el contenido (más lento):

cd /root/duplicacy/www
duplicacy check
All chunks referenced by snapshot www-server at revision 1 exist

Para ver los archivos de una revisión:

duplicacy list -r 1 -files | head

Para restaurar un archivo concreto sobre /var/www, indica la revisión y la ruta relativa al repositorio:

duplicacy restore -r 1 -overwrite -- html/index.php

Para restaurar en otra ubicación sin tocar /var/www (por ejemplo, en un servidor nuevo), inicializa un repositorio nuevo con el mismo snapshot ID y almacenamiento, y restaura allí:

mkdir -p /root/restore-www
cd /root/restore-www
duplicacy init -e www-server s3://[email protected]/your-bucket/duplicacy
duplicacy restore -r 1 -threads 4

Los archivos quedan en /root/restore-www, desde donde puedes compararlos o moverlos.

Solución de problemas

Failed to download the configuration file o errores 403. Las credenciales no se han cargado o no tienen permisos sobre el bucket. Comprueba con env | grep DUPLICACY que las variables están definidas en la sesión y revisa los permisos de la clave en el proveedor.

Duplicacy vuelve a pedir la contraseña. El nombre de la variable no coincide con el del almacenamiento. Para default usa DUPLICACY_PASSWORD; para un almacenamiento llamado offsite usa DUPLICACY_OFFSITE_PASSWORD.

copy falla con un error de compatibilidad. El almacenamiento de destino no se creó con -copy default. Crea un bucket o ruta nueva y vuelve a añadirlo con esa opción.

Una copia interrumpida. Vuelve a lanzar duplicacy backup: los fragmentos ya subidos se reutilizan y la copia continúa donde se quedó.

Conclusión

Has configurado Duplicacy para hacer copias cifradas y deduplicadas de /var/www en S3, replicarlas en Backblaze B2, aplicar una política de retención y ejecutarlo todo cada noche con systemd. Como siguientes pasos, añade otros directorios como repositorios adicionales con su propio snapshot ID, programa un duplicacy check -files semanal y haz una restauración de prueba en otro servidor cada cierto tiempo.