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
keyIDyapplicationKey.
Notala CLI de Duplicacy es gratuita para uso personal. Para uso comercial requiere licencia; consulta las condiciones en duplicacy.com antes de usarla en producción en una empresa.
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
Importanteguarda la contraseña de cifrado fuera del servidor, por ejemplo en un gestor de contraseñas. Si pierdes el servidor y la contraseña, las copias no se pueden descifrar.
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
-ecifra el almacenamiento con la contraseña deDUPLICACY_PASSWORD.www-serveres 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.
