Duplicacy: Backup con Backends de Almacenamiento Cloud
Duplicacy es una herramienta de backup con deduplicación lock-free que permite hacer backup simultáneo a múltiples destinos cloud (S3, Backblaze B2, SFTP, Google Drive y más de 10 backends más) sin necesidad de bloqueos ni coordinación entre procesos. Su algoritmo de deduplicación a nivel de chunk garantiza eficiencia de almacenamiento incluso con múltiples fuentes de backup, y la arquitectura lock-free permite hacer backups desde varios servidores al mismo repositorio simultáneamente. Esta guía cubre la configuración completa en Linux con backends cloud.
Requisitos Previos
- Linux (Ubuntu/Debian o CentOS/Rocky)
- Cuenta en un proveedor de almacenamiento cloud (AWS S3, Backblaze B2, etc.)
- Acceso root o sudo
- 512 MB RAM mínimo
Instalación de Duplicacy
# Descargar el binario de Duplicacy CLI
DUPLICACY_VERSION="3.2.3"
curl -LO "https://github.com/gilbertchen/duplicacy/releases/download/v${DUPLICACY_VERSION}/duplicacy_linux_x64_${DUPLICACY_VERSION}"
chmod +x duplicacy_linux_x64_${DUPLICACY_VERSION}
sudo mv duplicacy_linux_x64_${DUPLICACY_VERSION} /usr/local/bin/duplicacy
# Verificar la instalación
duplicacy --version
# Para la interfaz web (opcional):
DUPLICACY_WEB_VERSION="1.8.1"
curl -LO "https://github.com/gilbertchen/duplicacy-web/releases/download/v${DUPLICACY_WEB_VERSION}/duplicacy_web_linux_x64_${DUPLICACY_WEB_VERSION}"
chmod +x duplicacy_web_linux_x64_${DUPLICACY_WEB_VERSION}
sudo mv duplicacy_web_linux_x64_${DUPLICACY_WEB_VERSION} /usr/local/bin/duplicacy-web
Inicialización del Repositorio
El repositorio de Duplicacy se inicializa en el directorio a respaldar:
# Ir al directorio que quieres respaldar
cd /var/www
# Inicializar repositorio con backend S3
duplicacy init \
-e \
-storage-name s3-principal \
mi-servidor-backup \
s3://[email protected]/mi-bucket/backups/servidor
# Parámetros:
# -e: cifrar el repositorio
# -storage-name: nombre local para este backend
# mi-servidor-backup: ID único de este snapshot (snapshot ID)
# s3://...: URL del backend de almacenamiento
# Se pedirá la clave de cifrado
# ¡GUARDAR ESTA CLAVE EN UN LUGAR SEGURO!
# Verificar que el repositorio se inicializó correctamente
duplicacy check -storage s3-principal
Guardar credenciales de forma segura
# Duplicacy guarda las credenciales en el archivo de preferencias
# El archivo .duplicacy/preferences contiene la configuración
cat /var/www/.duplicacy/preferences | python3 -m json.tool
# Para credenciales cloud, Duplicacy usa variables de entorno:
# AWS S3
export DUPLICACY_S3_ID=AKIAIOSFODNN7EXAMPLE
export DUPLICACY_S3_SECRET=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Backblaze B2
export DUPLICACY_B2_ID=mi-account-id
export DUPLICACY_B2_KEY=mi-application-key
# Para persistir en un archivo de entorno seguro:
cat > /etc/duplicacy/env.sh << 'EOF'
export DUPLICACY_S3_ID=AKIAIOSFODNN7EXAMPLE
export DUPLICACY_S3_SECRET=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export DUPLICACY_B2_ID=mi-account-id
export DUPLICACY_B2_KEY=mi-application-key
# Clave de cifrado del repositorio
export DUPLICACY_PASSWORD=mi-clave-de-cifrado-muy-segura
EOF
chmod 600 /etc/duplicacy/env.sh
Primer backup
# Cargar credenciales
source /etc/duplicacy/env.sh
# Ejecutar el primer backup
cd /var/www
duplicacy backup -storage s3-principal -stats
# El primer backup puede tardar bastante (sube todos los datos)
# Los siguientes serán incrementales (solo los cambios)
Múltiples Backends de Almacenamiento
Una de las características más potentes de Duplicacy es el backup simultáneo a múltiples destinos:
cd /var/www
source /etc/duplicacy/env.sh
# Agregar un segundo backend (Backblaze B2)
duplicacy add \
-e \
-storage-name b2-secundario \
-copy s3-principal \
mi-servidor-backup \
b2://mi-bucket-b2/backups/servidor
# -copy s3-principal: copiar la configuración y snapshot ID del backend primario
# Agregar un tercer backend (SFTP)
duplicacy add \
-e \
-storage-name sftp-terciario \
mi-servidor-backup \
sftp://[email protected]//var/backups/servidor
# Listar los backends configurados
cat .duplicacy/preferences | jq '.storages[]'
Backup a todos los backends
# Hacer backup a todos los backends configurados
duplicacy backup -all -stats
# O a un backend específico
duplicacy backup -storage s3-principal
duplicacy backup -storage b2-secundario
# Copiar snapshots del backend primario a los secundarios (más eficiente)
duplicacy copy -from s3-principal -to b2-secundario -all
duplicacy copy -from s3-principal -to sftp-terciario -all
Backends soportados
# Formatos de URL para diferentes backends:
# AWS S3
s3://[email protected]/bucket/path
# S3 compatible (MinIO, Wasabi, etc.)
s3://endpoint@host/bucket/path
# Backblaze B2
b2://bucket-name/path
# SFTP
sftp://usuario@host:puerto//ruta/absoluta
# Azure Blob Storage
azure://account/container
# Google Cloud Storage
gcs://bucket/path
# Dropbox (necesita token OAuth)
dropbox://carpeta
# WebDAV
webdav://usuario:password@servidor:puerto/ruta
# OneDrive (necesita token OAuth)
one://carpeta
Programación y Automatización
cat > /usr/local/bin/duplicacy-backup.sh << 'EOF'
#!/bin/bash
# Script de backup automatizado con Duplicacy
set -euo pipefail
# Cargar credenciales
source /etc/duplicacy/env.sh
DIRECTORIO="/var/www"
LOG_FILE="/var/log/duplicacy/backup-$(date +%Y-%m-%d).log"
NTFY_URL="https://ntfy.tudominio.com/backups"
mkdir -p /var/log/duplicacy
log() {
echo "[$(date +%H:%M:%S)] $*" | tee -a "$LOG_FILE"
}
notificar_fallo() {
curl -s -H "Title: Error en backup Duplicacy" \
-H "Priority: urgent" \
-d "$1" "$NTFY_URL" > /dev/null
}
log "=== Iniciando backup Duplicacy ==="
cd "$DIRECTORIO"
# Backup al almacenamiento primario
log "Backup a S3..."
if duplicacy backup -storage s3-principal -stats 2>&1 | tee -a "$LOG_FILE"; then
log "✓ Backup S3 completado"
else
log "✗ Error en backup S3"
notificar_fallo "El backup a S3 falló. Ver logs en $LOG_FILE"
exit 1
fi
# Copiar al almacenamiento secundario
log "Copiando a B2..."
if duplicacy copy -from s3-principal -to b2-secundario -all 2>&1 | tee -a "$LOG_FILE"; then
log "✓ Copia a B2 completada"
else
log "✗ Error al copiar a B2 (no crítico)"
fi
# Pruning en ambos backends
log "Aplicando retención..."
duplicacy prune -storage s3-principal -all \
-keep 0:360 -keep 30:180 -keep 7:30 -keep 1:7 2>&1 | tee -a "$LOG_FILE"
duplicacy prune -storage b2-secundario -all \
-keep 0:180 -keep 30:90 -keep 7:30 -keep 1:7 2>&1 | tee -a "$LOG_FILE"
log "=== Backup completado ==="
# Rotar logs antiguos
find /var/log/duplicacy -name "*.log" -mtime +30 -delete
EOF
chmod +x /usr/local/bin/duplicacy-backup.sh
mkdir -p /var/log/duplicacy
# Agregar al crontab (backup diario a las 2 AM)
echo "0 2 * * * root /usr/local/bin/duplicacy-backup.sh" > /etc/cron.d/duplicacy-backup
Pruning y Políticas de Retención
Duplicacy usa una política de retención flexible especificada como pares intervalo:antigüedad:
source /etc/duplicacy/env.sh
cd /var/www
# Política de retención: un snapshot por hora las últimas 24h,
# uno por día los últimos 30 días,
# uno por semana los últimos 6 meses,
# uno por mes el último año
duplicacy prune -storage s3-principal \
-keep 0:1440 \ # mantener todos los backups de las últimas 24h (1440 min)
-keep 60:10080 \ # un backup cada hora los últimos 7 días
-keep 1440:43200 \ # un backup por día los últimos 30 días
-keep 10080:262800 \ # uno por semana los últimos 6 meses
-all
# Formato de -keep: intervalo_en_minutos:antigüedad_maxima_en_minutos
# 0:360 = mantener todos los backups de menos de 6 horas
# 1440:43200 = backup diario para los últimos 30 días (1440 min/día, 43200 min/30 días)
# Ver cuántos snapshots hay y cuánto ocupan
duplicacy list -storage s3-principal
duplicacy info -storage s3-principal
Restaurar desde un backup
source /etc/duplicacy/env.sh
cd /var/www
# Listar snapshots disponibles
duplicacy list -storage s3-principal
# Ver los archivos en un snapshot específico
duplicacy list -storage s3-principal -r 42 # snapshot número 42
# Restaurar un archivo específico
duplicacy restore -r 42 -storage s3-principal \
-overwrite \
var/www/miapp/config.yml
# Restaurar todo el snapshot en un directorio diferente
mkdir -p /tmp/restauracion
cd /tmp/restauracion
# Inicializar repositorio temporal
duplicacy init -e -storage-name s3 mi-servidor-backup s3://...
source /etc/duplicacy/env.sh
duplicacy restore -r 42 -storage s3
# Restaurar solo los archivos de un directorio
duplicacy restore -r 42 -storage s3-principal \
-overwrite \
"var/www/miapp/uploads/*"
Interfaz Web
Duplicacy tiene una interfaz web opcional para gestión visual:
# Crear directorio de configuración
mkdir -p /opt/duplicacy-web
# Crear servicio systemd para la interfaz web
cat > /etc/systemd/system/duplicacy-web.service << 'EOF'
[Unit]
Description=Duplicacy Web Interface
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/duplicacy-web
ExecStart=/usr/local/bin/duplicacy-web -host 127.0.0.1 -port 3875
Restart=on-failure
User=backup
EnvironmentFile=/etc/duplicacy/env.sh
[Install]
WantedBy=multi-user.target
EOF
# Crear usuario para Duplicacy
useradd --system --create-home --shell /bin/false backup
chown -R backup:backup /opt/duplicacy-web
systemctl daemon-reload
systemctl enable --now duplicacy-web
# Proxy Nginx para la interfaz web
server {
listen 443 ssl;
server_name backup-ui.tudominio.com;
ssl_certificate /etc/letsencrypt/live/backup-ui.tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/backup-ui.tudominio.com/privkey.pem;
auth_basic "Duplicacy Admin";
auth_basic_user_file /etc/nginx/.duplicacy-htpasswd;
location / {
proxy_pass http://127.0.0.1:3875;
}
}
Solución de Problemas
Error de credenciales de almacenamiento
# Verificar que las variables de entorno están cargadas
source /etc/duplicacy/env.sh
env | grep DUPLICACY
# Probar acceso al backend manualmente
# Para S3:
aws s3 ls s3://mi-bucket/backups/ --region us-east-1
# Para B2:
curl -u "$DUPLICACY_B2_ID:$DUPLICACY_B2_KEY" \
https://api.backblazeb2.com/b2api/v2/b2_authorize_account
Backup interrumpido - estado inconsistente
# Si el backup se interrumpió a mitad, Duplicacy puede continuar
# desde donde se quedó en el siguiente intento
cd /var/www
duplicacy backup -storage s3-principal
# Si hay problemas con el estado, verificar el repositorio
duplicacy check -storage s3-principal
Mucho tiempo de backup (sin deduplicación)
# Verificar que la deduplicación funciona correctamente
duplicacy info -storage s3-principal
# La "deduplication ratio" debe ser > 1.0 en backups recurrentes
# Si es 1.0, todos los datos se están subiendo como nuevos
# Verificar que el snapshot ID es el mismo entre backups
cat /var/www/.duplicacy/preferences | jq '.snapshots[].id'
# Si cambia entre backups, Duplicacy no puede deduplicar
Conclusión
Duplicacy destaca entre las herramientas de backup por su arquitectura lock-free, que permite hacer backup simultáneo a múltiples backends cloud sin bloqueos ni coordinación, y por la posibilidad de que múltiples servidores compartan el mismo repositorio con deduplicación cruzada. La amplia variedad de backends soportados —S3, B2, SFTP, Azure, GCS y más— junto con el cifrado de extremo a extremo lo convierten en una solución robusta para estrategias de backup 3-2-1 completamente automatizadas en entornos de producción.


