Automatiza backups y mantenimiento con Bash

Aprende a automatizar backups y mantenimiento del sistema con scripts Bash: consejos prácticos, ejemplos reales y crontab para tu servidor.

La automatización como aliada del día a día

Si trabajas con servidores o gestionas sistemas Linux, sabes que las tareas repetitivas consumen tiempo y son propensas a errores humanos. Automatizar backups y mantenimiento con Bash no solo te ahorra horas, sino que garantiza consistencia y trazabilidad. En este artículo te muestro un enfoque práctico, con scripts reales que puedes adaptar a tu infraestructura.

1. Estructura base de un script de backup

Lo primero es definir qué quieres respaldar y dónde almacenarlo. Un patrón fiable es usar variables al inicio del script, fechas dinámicas y compresión con tar. Aquí tienes un ejemplo para respaldar directorios críticos:

#!/bin/bash
# backup_diario.sh

BACKUP_DIR="/var/backups/mi_servidor"
FECHA=$(date +%Y%m%d_%H%M%S)
ORIGEN="/etc /var/www /home/usuario"
DESTINO="$BACKUP_DIR/backup_$FECHA.tar.gz"

mkdir -p "$BACKUP_DIR"
tar -czf "$DESTINO" $ORIGEN 2>> /var/log/backup_error.log

# Rotación: conservar solo los últimos 7 backups
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete

echo "[$(date)] Backup completado: $DESTINO" >> /var/log/backup.log

Detalles importantes: redirigimos errores a un log separado, usamos -mtime +7 para rotación y registramos cada ejecución. Esto te permite auditar sin depender de la memoria.

2. Mantenimiento del sistema con cron

Un backup sin mantenimiento es como un coche sin revisiones. Podemos combinar tareas de limpieza y actualización del sistema en el mismo script o en uno independiente. Por ejemplo:

#!/bin/bash
# mantenimiento_semanal.sh

# Limpiar paquetes obsoletos en Debian/Ubuntu
apt-get update && apt-get upgrade -y
apt-get autoremove -y
apt-get autoclean

# Limpiar logs antiguos (más de 30 días)
find /var/log -name "*.log" -mtime +30 -delete

# Reiniciar servicios si es necesario (ejemplo: Apache)
if systemctl is-active --quiet apache2; then
    systemctl reload apache2
fi

# Resumen del estado del disco
df -h > /var/log/estado_disco.txt

Programa este script con crontab. Por ejemplo, cada domingo a las 3:00 AM:

0 3 * * 0 /usr/local/bin/mantenimiento_semanal.sh

Recuerda hacer el script ejecutable (chmod +x) y probarlo manualmente antes de dejarlo en cron. Te ahorrarás sustos.

3. Notificaciones y registro de errores

De nada sirve un backup si no sabes si falló. Una práctica recomendable es enviar notificaciones por correo o, mejor aún, integrarlo con servicios como Telegram o Slack. Un ejemplo sencillo con curl a la API de Telegram:

#!/bin/bash
# notificar.sh

ENVIAR_NOTIFICACION() {
    local MENSAJE="$1"
    curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
        -d chat_id="$CHAT_ID" \
        -d text="$MENSAJE" > /dev/null
}

TOKEN="TU_TOKEN"
CHAT_ID="TU_CHAT_ID"

# Llamada desde el script principal
if [ $? -eq 0 ]; then
    ENVIAR_NOTIFICACION "✅ Backup completado correctamente"
else
    ENVIAR_NOTIFICACION "❌ Error en el backup - Revisa /var/log/backup_error.log"
fi

Así, cualquier incidencia la conoces al momento, sin tener que entrar al servidor. Es una capa de proactividad que marca la diferencia.

4. Buenas prácticas y consejos finales

Algunas reglas que aplico en todos mis scripts:

  • Usa set -euo pipefail al inicio para que el script falle ante cualquier error no controlado.
  • Separa la lógica en funciones si el script crece. Facilita el mantenimiento.
  • Prueba en un entorno de staging antes de desplegar en producción. Un bash -x script.sh te muestra cada paso ejecutado.
  • Documenta las variables críticas con comentarios. Tu yo del futuro te lo agradecerá.

Conclusión

Automatizar con Bash no es complicado, pero requiere método. Empieza con un backup simple, añade rotación, luego mantenimiento y finalmente notificaciones. Cada capa te da más tranquilidad y control. Con estos scripts base, tienes una fundación sólida para adaptar a tu propio entorno. Y recuerda: un script que no se prueba, es un problema en potencia.