Copias de Seguridad con Restic: Solución de Backup Moderna, Rápida y Segura

Introducción

Restic es un programa de copias de seguridad moderno, rápido y seguro diseñado desde cero para la eficiencia, seguridad y facilidad de uso. Escrito en Go y liberado como software de código abierto, Restic se ha convertido rápidamente en una de las soluciones de backup más populares en el ecosistema Linux, ofreciendo características avanzadas como deduplicación, cifrado, compresión y soporte para múltiples backends de almacenamiento incluyendo almacenamiento local, SFTP, almacenamiento de objetos compatible con S3 y muchos proveedores en la nube.

Lo que distingue a Restic es su enfoque en la simplicidad sin sacrificar potencia. A diferencia de las herramientas de backup tradicionales que requieren configuración compleja o conocimiento especializado, Restic proporciona una interfaz de línea de comandos sencilla que lo hace accesible tanto para principiantes como para administradores de sistemas experimentados. Al mismo tiempo, sus sofisticados algoritmos de deduplicación, cifrado verificable y capacidades de backup incremental lo hacen adecuado para entornos de producción que gestionan terabytes de datos.

Esta guía completa cubre Restic desde la instalación hasta despliegues de producción avanzados, incluyendo gestión de repositorios, estrategias de backup, procedimientos de restauración, integración en la nube, automatización, monitoreo y escenarios del mundo real siguiendo la regla de backup 3-2-1 para protección completa de datos.

Entendiendo la Arquitectura de Restic

Cómo Funciona Restic

Restic implementa una arquitectura de backup sofisticada optimizada para seguridad y eficiencia:

Almacenamiento direccionable por contenido: Restic divide los archivos en fragmentos de tamaño variable utilizando un algoritmo de hash rodante (similar a Borg). Cada fragmento se almacena una vez independientemente de cuántos archivos o backups lo contengan, permitiendo una deduplicación eficiente.

Backups basados en snapshots: Cada backup crea un "snapshot"—una vista completa de tus datos en un momento específico. Sin embargo, debido a la deduplicación, solo los fragmentos nuevos o modificados consumen almacenamiento adicional.

Diseño con cifrado prioritario: Todos los datos se cifran en el cliente antes de salir de tu sistema. Restic usa AES-256 en modo contador con Poly1305-AES para autenticación. El formato del repositorio está documentado, asegurando la recuperabilidad a largo plazo.

Flexibilidad de backend: Restic soporta almacenamiento local, SFTP, servidores REST y numerosos proveedores de almacenamiento en la nube (S3, Azure Blob, Google Cloud Storage, Backblaze B2 y más) a través de una interfaz unificada.

Verificación e integridad: Cada snapshot puede ser verificado para asegurar la integridad de los datos. Restic comprueba tanto los metadatos de archivos como el contenido real de los datos durante la verificación.

Restic vs Otras Soluciones de Backup

Restic vs BorgBackup:

  • Ambos: Deduplicación definida por contenido, cifrado, compresión
  • Restic: Configuración más simple, soporte más amplio de backends (especialmente nube)
  • Borg: Más maduro, modo solo-añadir, ligeramente más rápido para backups locales
  • Restic: Escrito en Go (binario único, multiplataforma)
  • Borg: Escrito en Python/C (más dependencias)

Restic vs Duplicity:

  • Duplicity: Cadenas de backup completo + incremental tradicionales
  • Restic: Basado en snapshots, no requiere cadenas de backup
  • Duplicity: Restauración más compleja desde cadenas incrementales
  • Restic: Restauración simple de snapshots, navegar cualquier snapshot directamente
  • Restic: Mejor eficiencia de deduplicación

Restic vs rsnapshot:

  • Rsnapshot: Snapshots basados en enlaces duros, formato de sistema de archivos
  • Restic: Deduplicación basada en fragmentos, repositorio cifrado
  • Rsnapshot: Estructura de directorios legible por humanos
  • Restic: El repositorio requiere herramientas Restic para el acceso
  • Restic: Soporte nativo de almacenamiento en la nube

Características Clave y Beneficios

Deduplicación universal: Los fragmentos idénticos se almacenan solo una vez en todos los snapshots, minimizando el consumo de almacenamiento.

Cifrado verificado: El cifrado AES-256 con autenticación previene tanto el acceso no autorizado como la manipulación.

Múltiples backends de almacenamiento: Backup a unidades locales, almacenamiento en red o proveedores en la nube sin cambiar flujos de trabajo.

Rápido y eficiente: Escrito en Go para rendimiento, operaciones paralelizadas, uso optimizado de red.

Navegación de snapshots: Monta cualquier snapshot como sistema de archivos de solo lectura para navegar archivos fácilmente y restauración selectiva.

Prune y forget: Elimina snapshots antiguos mientras limpia automáticamente fragmentos de datos sin referencias.

Multiplataforma: Binario único se ejecuta en Linux, macOS, Windows, sistemas BSD.

No requiere servidor especial: Usa almacenamiento estándar (sistemas de archivos, SFTP, S3) sin software de servidor propietario.

Instalación

Instalando Restic desde Gestores de Paquetes

Ubuntu/Debian:

# Update package lists
sudo apt update

# Install Restic
sudo apt install restic

# Verify installation
restic version

CentOS/Rocky Linux/RHEL:

# Enable EPEL repository
sudo dnf install epel-release

# Install Restic
sudo dnf install restic

# Verify installation
restic version

Instalando el Binario Más Reciente de Restic

Para la versión más reciente:

# Download latest release (check GitHub for current version)
cd /tmp
wget https://github.com/restic/restic/releases/download/v0.16.3/restic_0.16.3_linux_amd64.bz2

# Extract and install
bzip2 -d restic_0.16.3_linux_amd64.bz2
chmod +x restic_0.16.3_linux_amd64
sudo mv restic_0.16.3_linux_amd64 /usr/local/bin/restic

# Verify
restic version

Salida esperada:

restic 0.16.3 compiled with go1.21.5 on linux/amd64

Instalando desde Código Fuente

Para desarrollo o compilaciones personalizadas:

# Install Go (if not already installed)
wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

# Clone and build Restic
git clone https://github.com/restic/restic.git
cd restic
go run build.go

# Install binary
sudo cp restic /usr/local/bin/
restic version

Inicialización del Repositorio

Creando tu Primer Repositorio

Inicializa un repositorio para almacenar backups:

Repositorio local:

# Create repository directory
mkdir -p /backup/restic-repo

# Initialize repository
restic init --repo /backup/restic-repo
# enter password for new repository:
# enter password again:
# created restic repository abc123def456 at /backup/restic-repo

Repositorio remoto SFTP:

# Initialize on remote server via SFTP
restic init --repo sftp:user@backup-server:/backup/restic-repo

Almacenamiento compatible con S3 (AWS S3, MinIO, Wasabi, etc.):

# Export AWS credentials
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"

# Initialize S3 repository
restic init --repo s3:s3.amazonaws.com/bucket-name/restic-repo

Backblaze B2:

# Export B2 credentials
export B2_ACCOUNT_ID="your-account-id"
export B2_ACCOUNT_KEY="your-account-key"

# Initialize B2 repository
restic init --repo b2:bucket-name:restic-repo

Gestión de Contraseñas del Repositorio

Usando archivo de contraseña (para automatización):

# Create password file
echo "your-secure-password" > /root/.restic-password
chmod 600 /root/.restic-password

# Use with Restic
restic --repo /backup/restic-repo --password-file /root/.restic-password snapshots

Usando variable de entorno:

# Set password in environment
export RESTIC_PASSWORD="your-secure-password"

# Or in scripts
export RESTIC_REPOSITORY="/backup/restic-repo"
export RESTIC_PASSWORD="your-secure-password"

restic snapshots

Usando comando de contraseña (leer desde bóveda segura):

# Example with pass password manager
restic --repo /backup/restic-repo \
    --password-command "pass show backup/restic-password" \
    snapshots

Configuración del Repositorio

Configurar valores predeterminados del repositorio:

# Set default repository
export RESTIC_REPOSITORY="/backup/restic-repo"
export RESTIC_PASSWORD_FILE="/root/.restic-password"

# Add to ~/.bashrc or backup scripts for persistence
echo 'export RESTIC_REPOSITORY="/backup/restic-repo"' >> ~/.bashrc
echo 'export RESTIC_PASSWORD_FILE="/root/.restic-password"' >> ~/.bashrc

Creando Backups

Creación Básica de Backup

Crea tu primer snapshot:

# Simple backup
restic backup /home/user

# Multiple paths
restic backup /home /etc /var/www

# With tags for organization
restic backup --tag daily --tag production /home /var/www

Con hostname descriptivo:

# Specify hostname (useful for multiple machines backing up to same repo)
restic backup --host web-server-01 /var/www

Salida detallada:

# Show progress and statistics
restic backup --verbose /home /etc

Ejemplo de salida:

repository abc123 opened successfully, password is correct
created new cache in /root/.cache/restic

Files:        1234 new,     0 changed,     0 unmodified
Dirs:          567 new,     0 changed,     0 unmodified
Added to the repo: 2.456 GiB

processed 1234 files, 5.234 GiB in 2:15
snapshot 9abc1234 saved

Excluyendo Archivos y Directorios

Optimiza backups con patrones de exclusión:

Exclusiones por línea de comandos:

restic backup /home \
    --exclude='*.tmp' \
    --exclude='*.log' \
    --exclude='.cache' \
    --exclude='node_modules' \
    --exclude='Downloads'

Archivo de exclusión:

Crear /etc/restic/exclude.txt:

# Temporary files
*.tmp
*.swp
*.bak
~*

# Caches
.cache/
.thumbnails/
__pycache__/
*.pyc
node_modules/
vendor/

# Logs
*.log
/var/log/

# System directories
/proc
/sys
/dev
/run
/tmp
/lost+found

# Large media files (optional)
*.iso
*.img
*.vmdk

Usar archivo de exclusión:

restic backup --exclude-file=/etc/restic/exclude.txt /home /var/www

Excluir cachés automáticamente:

# Exclude directories with CACHEDIR.TAG
restic backup --exclude-caches /home

Prueba en Seco

Probar backup sin crear snapshot:

# Dry run to see what would be backed up
restic backup --dry-run --verbose /home

# Shows files that would be processed without actually backing up

Script de Backup de Producción

Script de backup completo para uso en producción:

#!/bin/bash
# /usr/local/bin/restic-backup.sh

set -e

# Configuration
export RESTIC_REPOSITORY="/backup/restic-repo"
export RESTIC_PASSWORD_FILE="/root/.restic-password"

BACKUP_PATHS="/home /etc /var/www /opt /root"
EXCLUDE_FILE="/etc/restic/exclude.txt"
LOG_FILE="/var/log/restic-backup.log"
ADMIN_EMAIL="[email protected]"

# Logging function
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

# Error handler
error_exit() {
    log "ERROR: $1"
    echo "Restic backup failed: $1" | mail -s "Backup FAILED - $(hostname)" "$ADMIN_EMAIL"
    exit 1
}

log "Starting Restic backup"

# Pre-backup: Database dumps
log "Creating database dumps"
mkdir -p /var/backups/db-dumps

mysqldump --all-databases --single-transaction \
    | gzip > /var/backups/db-dumps/mysql-all.sql.gz || error_exit "MySQL dump failed"

sudo -u postgres pg_dumpall \
    | gzip > /var/backups/db-dumps/postgresql-all.sql.gz || error_exit "PostgreSQL dump failed"

# Create backup snapshot
log "Creating backup snapshot"
restic backup \
    --tag daily \
    --tag $(date +%A) \
    --exclude-file="$EXCLUDE_FILE" \
    --verbose \
    $BACKUP_PATHS \
    /var/backups/db-dumps \
    2>&1 | tee -a "$LOG_FILE"

if [ ${PIPESTATUS[0]} -ne 0 ]; then
    error_exit "Restic backup command failed"
fi

# Check snapshot was created
log "Verifying snapshot creation"
restic snapshots --last 1 || error_exit "Snapshot verification failed"

# Forget old snapshots with retention policy
log "Applying retention policy"
restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 12 \
    --keep-yearly 2 \
    --prune \
    2>&1 | tee -a "$LOG_FILE"

# Cleanup old database dumps
find /var/backups/db-dumps -name "*.sql.gz" -mtime +3 -delete

log "Backup completed successfully"

# Send success notification
SNAPSHOT_INFO=$(restic snapshots --last 1)
echo "Backup completed successfully at $(date)" | \
    mail -s "Backup SUCCESS - $(hostname)" "$ADMIN_EMAIL"

exit 0

Hacer ejecutable:

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

Gestionando Snapshots

Listando Snapshots

Ver todos los backups en el repositorio:

# List all snapshots
restic snapshots

# Example output:
# ID        Time                 Host        Tags        Paths
# ----------------------------------------------------------------
# 9abc1234  2026-01-10 02:00:01  web-server  daily       /home /etc /var/www
# 8def5678  2026-01-11 02:00:01  web-server  daily       /home /etc /var/www

Listar con filtros específicos:

# Snapshots for specific host
restic snapshots --host web-server

# Snapshots with specific tag
restic snapshots --tag daily

# Snapshots for specific path
restic snapshots --path /home

# Latest snapshot only
restic snapshots --last 1

# Compact output
restic snapshots --compact

Detalles del Snapshot

Obtener información detallada sobre snapshots:

# Show files in snapshot
restic ls 9abc1234

# Show directory tree
restic ls --long 9abc1234

# Show specific path in snapshot
restic ls 9abc1234 /home/user/

Comparando Snapshots

Encontrar diferencias entre backups:

# Compare two snapshots
restic diff 9abc1234 8def5678

# Shows added, removed, and modified files

Verificando Integridad del Repositorio

Verificar integridad del repositorio y datos:

# Quick check (metadata only)
restic check

# Read and verify all data
restic check --read-data

# Check subset of data (10%)
restic check --read-data-subset=10%

Retención y Limpieza

Comando Forget

Eliminar snapshots basándose en política de retención:

# Apply retention policy without deleting data
restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 12 \
    --keep-yearly 2

# With --prune to actually remove unreferenced data
restic forget \
    --keep-daily 7 \
    --keep-weekly 4 \
    --keep-monthly 12 \
    --prune

Opciones de política de retención:

  • --keep-last N: Mantener N snapshots más recientes
  • --keep-hourly N: Mantener N snapshots por hora
  • --keep-daily N: Mantener N snapshots diarios
  • --keep-weekly N: Mantener N snapshots semanales
  • --keep-monthly N: Mantener N snapshots mensuales
  • --keep-yearly N: Mantener N snapshots anuales
  • --keep-within DURATION: Mantener snapshots dentro de duración (ej., "7d", "2m", "1y")
  • --keep-tag TAG: Mantener todos los snapshots con etiqueta especificada

Ejemplos de políticas de retención:

Agresiva (almacenamiento mínimo):

restic forget --keep-daily 3 --keep-weekly 2 --keep-monthly 3 --prune

Equilibrada (recomendada):

restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --keep-yearly 2 --prune

Extendida (cumplimiento/archivo):

restic forget --keep-daily 30 --keep-weekly 12 --keep-monthly 24 --keep-yearly 7 --prune

Retención basada en tiempo:

# Keep everything from last 30 days, then apply policy
restic forget --keep-within 30d --keep-monthly 12 --keep-yearly 5 --prune

Limpiando el Repositorio

La bandera --prune elimina datos sin referencias. Para más control:

# Forget snapshots without pruning
restic forget --keep-daily 7 --keep-weekly 4

# Prune separately
restic prune

# Show what would be pruned (dry run)
restic prune --dry-run

Procedimientos de Restauración

Montando Snapshots

Montar snapshot como sistema de archivos de solo lectura:

# Create mount point
mkdir -p /mnt/restic

# Mount latest snapshot
restic mount /mnt/restic &

# Browse snapshots
ls /mnt/restic/snapshots/
# 2026-01-10T020001/
# 2026-01-11T020001/

# Navigate snapshot
cd /mnt/restic/snapshots/2026-01-11T020001/home/user/
ls -la

# Unmount when done
fusermount -u /mnt/restic
# or
umount /mnt/restic

Montar snapshot específico:

# Mount single snapshot by ID
restic mount --snapshot-filter 9abc1234 /mnt/restic

Restaurando Archivos

Restaurar datos desde snapshots:

Restaurar snapshot completo:

# Restore to original location
restic restore latest --target /

# Restore to different location
restic restore latest --target /restore-destination/

Restaurar rutas específicas:

# Restore single file
restic restore latest \
    --target /restore/ \
    --include /home/user/important-file.txt

# Restore directory
restic restore latest \
    --target /restore/ \
    --include /home/user/documents/

# Restore multiple paths
restic restore latest \
    --target /restore/ \
    --include /etc/nginx/ \
    --include /var/www/

Restaurar por ID de snapshot:

# Restore specific snapshot
restic restore 9abc1234 --target /restore/

Restaurar con filtros:

# Restore only specific file types
restic restore latest \
    --target /restore/ \
    --include '*.conf'

# Exclude certain paths during restore
restic restore latest \
    --target /restore/ \
    --exclude /var/log/

Restauración Selectiva de Archivos

Flujo de trabajo de restauración interactiva:

# 1. Find snapshot containing file
restic find important-document.pdf

# Output shows which snapshots contain the file
# Found matching entries in snapshot 9abc1234 from 2026-01-11
# /home/user/Documents/important-document.pdf

# 2. Mount snapshot
restic mount /mnt/restic

# 3. Copy file
cp /mnt/restic/snapshots/2026-01-11T020001/home/user/Documents/important-document.pdf /home/user/

# 4. Unmount
fusermount -u /mnt/restic

Restauración Completa del Sistema

Procedimiento de recuperación ante desastres:

# Boot from live USB/rescue system

# Partition and format disks
parted /dev/sda mklabel gpt
parted /dev/sda mkpart primary ext4 1MiB 100%
mkfs.ext4 /dev/sda1

# Mount target filesystem
mount /dev/sda1 /mnt/target

# Initialize Restic variables
export RESTIC_REPOSITORY="sftp:user@backup-server:/backup/restic-repo"
export RESTIC_PASSWORD="your-password"

# Restore latest snapshot
restic restore latest --target /mnt/target/

# Reinstall bootloader
mount --bind /dev /mnt/target/dev
mount --bind /proc /mnt/target/proc
mount --bind /sys /mnt/target/sys
chroot /mnt/target
grub-install /dev/sda
update-grub
exit

# Cleanup and reboot
umount /mnt/target/dev /mnt/target/proc /mnt/target/sys
umount /mnt/target
reboot

Integración con Almacenamiento en la Nube

Configuración de AWS S3

Configurar repositorio S3:

# Export AWS credentials
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

# Initialize repository
restic init --repo s3:s3.amazonaws.com/my-backup-bucket/restic-repo

# Create backup to S3
restic backup --repo s3:s3.amazonaws.com/my-backup-bucket/restic-repo /home /etc

Usando almacenamiento compatible con S3 (MinIO, Wasabi, DigitalOcean Spaces):

# MinIO example
export AWS_ACCESS_KEY_ID="your-minio-access-key"
export AWS_SECRET_ACCESS_KEY="your-minio-secret-key"

restic init --repo s3:https://minio.example.com/bucket-name/restic-repo

Configuración de Backblaze B2

Configurar repositorio B2:

# Export B2 credentials
export B2_ACCOUNT_ID="your-account-id"
export B2_ACCOUNT_KEY="your-application-key"

# Initialize repository
restic init --repo b2:my-backup-bucket:restic-repo

# Create backup
restic backup --repo b2:my-backup-bucket:restic-repo /home /etc

B2 con políticas de ciclo de vida (para optimización de costos):

  • Configurar bucket B2 con reglas de ciclo de vida para transicionar datos antiguos a niveles de almacenamiento más económicos
  • Restic funciona de manera transparente con los niveles de B2

Configuración de Azure Blob Storage

# Export Azure credentials
export AZURE_ACCOUNT_NAME="your-storage-account"
export AZURE_ACCOUNT_KEY="your-account-key"

# Initialize repository
restic init --repo azure:container-name:/restic-repo

# Create backup
restic backup --repo azure:container-name:/restic-repo /home /etc

Configuración de Google Cloud Storage

# Authenticate with gcloud
gcloud auth application-default login

# Initialize repository
restic init --repo gs:my-backup-bucket:/restic-repo

# Create backup
restic backup --repo gs:my-backup-bucket:/restic-repo /home /etc

Automatización y Programación

Configuración de Temporizador Systemd

Crear archivo de servicio (/etc/systemd/system/restic-backup.service):

[Unit]
Description=Restic Backup Service
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/restic-backup.sh
User=root
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7

# Environment variables
Environment="RESTIC_REPOSITORY=/backup/restic-repo"
Environment="RESTIC_PASSWORD_FILE=/root/.restic-password"

# Security hardening
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=read-only
ReadWritePaths=/backup /var/log /var/backups

# Timeout after 6 hours
TimeoutSec=21600

[Install]
WantedBy=multi-user.target

Crear archivo de temporizador (/etc/systemd/system/restic-backup.timer):

[Unit]
Description=Restic Daily Backup Timer
Requires=restic-backup.service

[Timer]
OnCalendar=daily
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=30min

[Install]
WantedBy=timers.target

Habilitar e iniciar:

sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
sudo systemctl list-timers restic-backup.timer
sudo journalctl -u restic-backup.service

Programación Basada en Cron

# Edit root crontab
sudo crontab -e

# Daily backup at 2 AM
0 2 * * * /usr/local/bin/restic-backup.sh >> /var/log/restic-cron.log 2>&1

# Weekly integrity check on Sunday at 3 AM
0 3 * * 0 /usr/local/bin/restic-check.sh >> /var/log/restic-check.log 2>&1

Script de Verificación Automatizada

#!/bin/bash
# /usr/local/bin/restic-check.sh

export RESTIC_REPOSITORY="/backup/restic-repo"
export RESTIC_PASSWORD_FILE="/root/.restic-password"

LOG_FILE="/var/log/restic-check.log"
ADMIN_EMAIL="[email protected]"

echo "[$(date)] Starting repository check" | tee -a "$LOG_FILE"

# Check repository integrity
restic check --read-data-subset=5% 2>&1 | tee -a "$LOG_FILE"

if [ ${PIPESTATUS[0]} -eq 0 ]; then
    echo "Repository check completed successfully" | \
        mail -s "Restic Check OK - $(hostname)" "$ADMIN_EMAIL"
else
    echo "Repository check FAILED" | \
        mail -s "Restic Check FAILED - $(hostname)" "$ADMIN_EMAIL"
fi

Escenarios de Implementación del Mundo Real

Escenario 1: Estación de Trabajo Personal a la Nube

Requisitos:

  • Directorio home del usuario
  • Backups diarios a Backblaze B2
  • Retención de 30 días
  • Almacenamiento económico

Implementación:

# Initialize B2 repository
export B2_ACCOUNT_ID="your-account-id"
export B2_ACCOUNT_KEY="your-key"
export RESTIC_PASSWORD="your-password"

restic init --repo b2:personal-backup:restic-repo

# Create backup script
cat > ~/bin/restic-backup.sh << 'EOF'
#!/bin/bash
export B2_ACCOUNT_ID="your-account-id"
export B2_ACCOUNT_KEY="your-key"
export RESTIC_REPOSITORY="b2:personal-backup:restic-repo"
export RESTIC_PASSWORD_FILE="$HOME/.restic-password"

restic backup \
    --exclude-file="$HOME/.config/restic/exclude.txt" \
    "$HOME"

restic forget --keep-daily 30 --prune
EOF

chmod +x ~/bin/restic-backup.sh

# Schedule with cron
crontab -e
# Add: 0 14 * * * ~/bin/restic-backup.sh

Escenario 2: Servidor de Producción a Múltiples Ubicaciones

Requisitos:

  • Servidor web + bases de datos
  • Backup local + SFTP remoto + S3
  • Snapshots por hora
  • Retención de 90 días

Implementación:

#!/bin/bash
# /usr/local/bin/restic-multi-backup.sh

BACKUP_PATHS="/var/www /etc /opt"

# Repository 1: Local
export RESTIC_REPOSITORY="/backup/restic-local"
export RESTIC_PASSWORD_FILE="/root/.restic-password-local"

restic backup $BACKUP_PATHS
restic forget --keep-hourly 24 --keep-daily 90 --prune

# Repository 2: Remote SFTP
export RESTIC_REPOSITORY="sftp:backup@remote-server:/backups/restic-repo"
export RESTIC_PASSWORD_FILE="/root/.restic-password-remote"

restic backup $BACKUP_PATHS
restic forget --keep-daily 90 --prune

# Repository 3: S3 (archival)
export AWS_ACCESS_KEY_ID="your-key"
export AWS_SECRET_ACCESS_KEY="your-secret"
export RESTIC_REPOSITORY="s3:s3.amazonaws.com/backup-bucket/restic-repo"
export RESTIC_PASSWORD_FILE="/root/.restic-password-s3"

restic backup $BACKUP_PATHS
restic forget --keep-monthly 12 --keep-yearly 7 --prune

Resolución de Problemas

Problemas de Bloqueo

Síntoma: repository is already locked

Solución:

# List locks
restic list locks

# Remove stale lock (if no backup running)
restic unlock

# Force unlock (use with caution)
restic unlock --remove-all

Optimización de Rendimiento

Backups lentos:

# Increase pack size for large files
export RESTIC_PACK_SIZE=64

# Limit upload bandwidth
restic backup --limit-upload 5000 /home

# Increase cache size
restic cache --max-size 2048

Reparación del Repositorio

Repositorio corrupto:

# Rebuild index
restic rebuild-index

# Remove corrupted data
restic prune --unsafe-recover-no-free-space

Conclusión

Restic proporciona una solución de backup moderna, segura y eficiente que equilibra simplicidad con características poderosas. Su deduplicación definida por contenido, cifrado fuerte y soporte flexible de backends lo hacen adecuado para casos de uso que van desde estaciones de trabajo personales hasta infraestructura empresarial.

Puntos clave:

  1. Inicializar de forma segura: Elige contraseñas fuertes y protege los archivos de contraseñas apropiadamente.

  2. Aprovechar almacenamiento en la nube: Aprovecha el soporte nativo de Restic para S3, B2, Azure y otros proveedores en la nube.

  3. Automatizar consistentemente: Implementa temporizadores systemd o trabajos cron con manejo completo de errores.

  4. Aplicar políticas de retención: Usa forget/prune regularmente para gestionar el consumo de almacenamiento.

  5. Verificar regularmente: Ejecuta verificaciones periódicas de integridad para asegurar la salud del repositorio.

  6. Probar la restauración: Practica procedimientos de restauración para asegurar familiaridad y confianza.

  7. Implementar regla 3-2-1: Mantén múltiples copias en diferentes backends de almacenamiento y ubicaciones.

Restic destaca en entornos que requieren:

  • Flujos de trabajo de backup nativos en la nube
  • Requisitos de cifrado fuerte
  • Soporte multiplataforma (Linux, macOS, Windows)
  • Opciones flexibles de backend de almacenamiento
  • Interfaz de línea de comandos simple e intuitiva

Combinado con planificación apropiada, automatización y la estrategia de backup 3-2-1, Restic proporciona protección de datos robusta y verificable para infraestructura moderna.