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.


