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.