Configuración Avanzada de Restic Backup

Restic es una herramienta de backup moderna y eficiente que combina deduplicación, cifrado AES-256 y compresión en un solo binario, soportando múltiples backends de almacenamiento como S3, SFTP, Backblaze B2 y el servidor REST propio. En producción, la configuración avanzada de Restic incluye políticas de retención automatizadas, múltiples repositorios, monitorización y limitación de ancho de banda. Esta guía cubre todo lo necesario para un sistema de backup robusto en servidores Linux.

Requisitos Previos

  • Linux (Ubuntu/Debian o CentOS/Rocky)
  • Acceso root o sudo
  • Cuenta en un proveedor de almacenamiento (S3, B2, SFTP, etc.)
  • Al menos 2x el tamaño de los datos a respaldar en almacenamiento de destino

Instalación de Restic

# Ubuntu/Debian
apt-get install -y restic

# CentOS/Rocky Linux
dnf install -y restic

# O descargar el binario más reciente directamente
RESTIC_VERSION="0.16.4"
curl -LO "https://github.com/restic/restic/releases/download/v${RESTIC_VERSION}/restic_${RESTIC_VERSION}_linux_amd64.bz2"
bunzip2 restic_${RESTIC_VERSION}_linux_amd64.bz2
mv restic_${RESTIC_VERSION}_linux_amd64 /usr/local/bin/restic
chmod +x /usr/local/bin/restic

# Actualizar Restic desde sí mismo
restic self-update

# Verificar la versión
restic version

Configuración de Múltiples Repositorios

La estrategia de backup 3-2-1 requiere múltiples repositorios. Configura las credenciales en archivos de entorno separados:

# Crear directorio de configuración de backup
mkdir -p /etc/restic/repos
chmod 700 /etc/restic/repos

# Configuración para repositorio S3 (AWS o compatible)
cat > /etc/restic/repos/s3.env << 'EOF'
# Credenciales del repositorio S3
RESTIC_REPOSITORY=s3:s3.amazonaws.com/mi-empresa-backups/servidor-produccion
RESTIC_PASSWORD=mi-clave-cifrado-muy-segura-aqui
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_DEFAULT_REGION=us-east-1
EOF
chmod 600 /etc/restic/repos/s3.env

# Configuración para repositorio SFTP (servidor remoto)
cat > /etc/restic/repos/sftp.env << 'EOF'
RESTIC_REPOSITORY=sftp:[email protected]:/backups/restic
RESTIC_PASSWORD=mi-clave-cifrado-muy-segura-aqui
EOF
chmod 600 /etc/restic/repos/sftp.env

# Configuración para Backblaze B2
cat > /etc/restic/repos/b2.env << 'EOF'
RESTIC_REPOSITORY=b2:mi-bucket-b2:servidor-produccion
RESTIC_PASSWORD=mi-clave-cifrado-muy-segura-aqui
B2_ACCOUNT_ID=mi-account-id-b2
B2_ACCOUNT_KEY=mi-application-key-b2
EOF
chmod 600 /etc/restic/repos/b2.env

Inicializar los repositorios

# Inicializar repositorio S3
env $(cat /etc/restic/repos/s3.env | xargs) restic init

# Inicializar repositorio SFTP
env $(cat /etc/restic/repos/sftp.env | xargs) restic init

# Inicializar repositorio B2
env $(cat /etc/restic/repos/b2.env | xargs) restic init

# Verificar que los repositorios responden
env $(cat /etc/restic/repos/s3.env | xargs) restic snapshots

Script de backup multi-repositorio

cat > /usr/local/bin/restic-backup.sh << 'EOF'
#!/bin/bash
# Script de backup a múltiples repositorios con Restic

set -euo pipefail

# Cargar configuración global
FECHA=$(date +%Y-%m-%d)
LOG_FILE="/var/log/restic/backup-$FECHA.log"
DIRECTORIOS_BACKUP=(
    "/etc"
    "/home"
    "/var/www"
    "/opt/aplicaciones"
)
EXCLUSIONES=(
    "/home/*/.cache"
    "/var/www/*/node_modules"
    "/var/www/*/.next"
    "/tmp"
    "*.pyc"
    ".git"
)

# Crear directorio de logs
mkdir -p /var/log/restic

# Función para ejecutar backup en un repositorio
hacer_backup() {
    local ENV_FILE="$1"
    local NOMBRE="$2"
    
    echo "=== Iniciando backup en $NOMBRE ==="
    
    # Cargar variables del repositorio
    set -a
    source "$ENV_FILE"
    set +a
    
    # Crear snapshot
    if restic backup \
        "${DIRECTORIOS_BACKUP[@]}" \
        $(printf -- '--exclude=%s ' "${EXCLUSIONES[@]}") \
        --tag "servidor-produccion" \
        --tag "$NOMBRE" \
        --compression max \
        --verbose; then
        echo "✓ Backup exitoso en $NOMBRE"
    else
        echo "✗ ERROR: Backup fallido en $NOMBRE"
        return 1
    fi
    
    # Aplicar política de retención
    restic forget \
        --keep-daily 7 \
        --keep-weekly 4 \
        --keep-monthly 12 \
        --keep-yearly 2 \
        --prune \
        --verbose
    
    echo "✓ Política de retención aplicada en $NOMBRE"
}

# Ejecutar backup en todos los repositorios
hacer_backup "/etc/restic/repos/s3.env" "S3-Principal" 2>&1 | tee -a "$LOG_FILE"
hacer_backup "/etc/restic/repos/sftp.env" "SFTP-Secundario" 2>&1 | tee -a "$LOG_FILE"

echo "=== Backup completado: $FECHA ===" | tee -a "$LOG_FILE"
EOF

chmod +x /usr/local/bin/restic-backup.sh

Políticas de Retención y Pruning

# Cargar credenciales
source /etc/restic/repos/s3.env

# Ver todos los snapshots actuales
restic snapshots

# Simular política de retención sin ejecutar (dry run)
restic forget \
    --keep-last 5 \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 6 \
    --keep-yearly 1 \
    --dry-run \
    --verbose

# Aplicar la política de retención
restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 12 \
    --keep-yearly 2 \
    --prune

# Verificar la integridad del repositorio después del prune
restic check --read-data-subset=10%

# Comprobar integridad completa (más lento, para uso ocasional)
restic check --read-data

Retención por etiqueta

# Aplicar retención solo a snapshots con una etiqueta específica
restic forget \
    --tag "servidor-produccion" \
    --keep-daily 7 \
    --keep-weekly 4 \
    --prune

# Eliminar un snapshot específico
restic snapshots  # Obtener el ID del snapshot
restic forget abc123def456

Limitación de Ancho de Banda

# Limitar a 50 MB/s de subida
restic backup /var/www \
    --limit-upload 51200  # en KiB/s (51200 KiB = 50 MB)

# Limitar a 20 MB/s de descarga (durante restauraciones)
restic restore latest \
    --target /tmp/restore \
    --limit-download 20480

# Para backups programados, usar --limit-upload en el script
# y ejecutar en horario de bajo tráfico (ej: 3-5 AM)

Usar nice y ionice para reducir impacto

# Ejecutar con baja prioridad de CPU y E/S
nice -n 19 ionice -c 3 restic backup /var/www \
    --limit-upload 25600

# En el crontab del servidor de producción:
# 0 3 * * * root nice -n 19 ionice -c 3 /usr/local/bin/restic-backup.sh

Restic REST Server

Para entornos sin acceso a S3 o cuando necesitas control total del backend:

# Instalar el servidor REST de Restic
wget https://github.com/restic/rest-server/releases/latest/download/rest-server_linux_amd64.gz
gunzip rest-server_linux_amd64.gz
mv rest-server_linux_amd64 /usr/local/bin/rest-server
chmod +x /usr/local/bin/rest-server

# Crear usuario para el servidor REST
mkdir -p /srv/restic-repos
useradd --system --no-create-home --shell /bin/false restic-server
chown restic-server:restic-server /srv/restic-repos

# Crear archivo de contraseñas
htpasswd -B -c /etc/restic/.htpasswd usuario-backup
# Crear servicio systemd para el REST server
cat > /etc/systemd/system/restic-rest-server.service << 'EOF'
[Unit]
Description=Restic REST Server
After=network.target

[Service]
Type=simple
User=restic-server
ExecStart=/usr/local/bin/rest-server \
    --path /srv/restic-repos \
    --htpasswd-file /etc/restic/.htpasswd \
    --tls \
    --tls-cert /etc/letsencrypt/live/backup.tudominio.com/fullchain.pem \
    --tls-key /etc/letsencrypt/live/backup.tudominio.com/privkey.pem \
    --listen :8000 \
    --append-only
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now restic-rest-server

# Usar el servidor REST desde los clientes
export RESTIC_REPOSITORY="rest:https://usuario-backup:[email protected]:8000/servidor-prod"
restic init
restic backup /var/www

Monitorización y Alertas

Script con notificaciones

cat > /usr/local/bin/restic-backup-monitor.sh << 'EOF'
#!/bin/bash
# Backup con monitorización y notificaciones

source /etc/restic/repos/s3.env

NTFY_URL="https://ntfy.tudominio.com/backups"
INICIO=$(date +%s)

# Función para notificar
notificar() {
    local TITULO="$1"
    local MENSAJE="$2"
    local PRIORIDAD="${3:-default}"
    
    curl -s -X POST "$NTFY_URL" \
        -H "Title: $TITULO" \
        -H "Priority: $PRIORIDAD" \
        -d "$MENSAJE" > /dev/null
}

# Ejecutar backup
if restic backup \
    /etc /home /var/www /opt \
    --exclude="/home/*/.cache" \
    --tag "daily" \
    --compression max 2>&1; then
    
    FIN=$(date +%s)
    DURACION=$(( FIN - INICIO ))
    
    # Obtener tamaño del último snapshot
    STATS=$(restic stats latest --mode restore-size 2>&1)
    
    notificar "✓ Backup exitoso" "Duración: ${DURACION}s\n${STATS}" "default"
else
    notificar "✗ FALLO de backup" "Revisar logs del servidor de producción" "urgent"
    exit 1
fi

# Aplicar retención y notificar resultado
restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 12 \
    --prune 2>&1

restic check 2>&1 || notificar "⚠ Error en verificación" "El repositorio tiene inconsistencias" "high"
EOF

chmod +x /usr/local/bin/restic-backup-monitor.sh

Configurar cron

# Editar el crontab del sistema
cat > /etc/cron.d/restic-backup << 'EOF'
# Backup diario a las 2:30 AM
30 2 * * * root /usr/local/bin/restic-backup-monitor.sh >> /var/log/restic/cron.log 2>&1

# Verificación semanal de integridad (domingos a las 4 AM)
0 4 * * 0 root bash -c 'source /etc/restic/repos/s3.env && restic check --read-data-subset=25%' >> /var/log/restic/check.log 2>&1
EOF

Solución de Problemas

Error de bloqueo del repositorio

# Si un backup se interrumpió y dejó un lock
source /etc/restic/repos/s3.env

# Ver locks activos
restic list locks

# Eliminar locks obsoletos (verificar que no hay otro proceso en curso)
restic unlock

# Verificar la integridad después de desbloquear
restic check

Backup lento o se interrumpe

# Aumentar los workers de lectura/escritura
restic backup /var/www \
    --read-concurrency 8 \
    --pack-size 128  # Tamaño de pack en MiB (mayor = menos archivos pequeños)

# Ver estadísticas de progreso en tiempo real
restic backup /var/www --verbose=2

Repositorio corrupto

# Verificar y reparar automáticamente índices
restic rebuild-index

# Verificar integridad completa
restic check --read-data

# Ver snapshots sin usar el índice principal
restic list snapshots --no-cache

Error de credenciales SFTP

# Probar conexión SSH manualmente
ssh -i /root/.ssh/id_ed25519 [email protected] "ls /backups/restic/"

# Verificar que la clave SSH está autorizada en el servidor de backup
cat /root/.ssh/id_ed25519.pub
# Agregar al archivo authorized_keys del servidor de backup

Conclusión

Restic con múltiples repositorios, políticas de retención automatizadas y monitorización activa constituye un sistema de backup de nivel enterprise que protege los datos ante cualquier escenario: fallo de hardware, eliminación accidental, ransomware o desastre en el proveedor cloud. La deduplicación y compresión de Restic hacen que el almacenamiento sea eficiente incluso con backups frecuentes, mientras que el cifrado AES-256 garantiza que los datos nunca sean accesibles para terceros, incluido el propio proveedor de almacenamiento.