Hacer copias de seguridad es indispensable, pero que se ejecuten en silencio sin que sepas si han funcionado o han fallado es un peligro. Un script de backup solo es realmente efectivo si te avisa al instante en tu móvil cuando ha terminado correctamente o si ha ocurrido algún problema.
En esta guía vamos a crear un sistema automatizado de backups que:
- Empaqueta y comprime tus datos de forma ultrarrápida usando compresión multihilo (
pigz). - Envía un resumen automático a Telegram con el tamaño del archivo, el tiempo empleado y el estado (éxito o error).
- Realiza la rotación automática para borrar copias antiguas y no llenar el disco.
- Se automatiza mediante Systemd Timers (la alternativa moderna, robusta y con gestión de logs superior a Cron).
1. Requisitos previos
Para que el script funcione correctamente, asegúrate de tener instaladas las herramientas necesarias y de contar con las credenciales de tu bot de Telegram:
sudo apt update
sudo apt install tar pigz curl
Deberás tener a mano:
BOT_TOKEN: El token de tu bot de Telegram.CHAT_ID: El ID del chat o grupo donde quieres recibir los avisos.
2. El Script de Backup (backup_telegram.sh)
Crea el archivo del script en una ruta de sistema (por ejemplo, /usr/local/bin/backup_telegram.sh):
sudo nano /usr/local/bin/backup_telegram.sh
Pega el siguiente código en el editor:
#!/bin/bash
# ==========================================
# CONFIGURACIÓN DEL SCRIPT
# ==========================================
# Credenciales de Telegram
BOT_TOKEN="TU_BOT_TOKEN_AQUI"
CHAT_ID="TU_CHAT_ID_AQUI"
# Directorios
ORIGEN="/var/www/html" # Carpeta o datos a respaldar
DESTINO="/var/backups/mis_backups" # Dónde se guardará el backup
LOG_FILE="/var/log/backup_telegram.log" # Archivo de log local
# Configuración
DIAS_RETENCION=7 # Días tras los cuales se borran backups viejos
FECHA=$(date +"%Y-%m-%d_%H-%M-%S")
HOSTNAME=$(hostname)
NOMBRE_ARCHIVO="backup_${HOSTNAME}_${FECHA}.tar.gz"
RUTA_FINAL="${DESTINO}/${NOMBRE_ARCHIVO}"
# ==========================================
# FUNCIONES AUXILIARES
# ==========================================
enviar_telegram() {
local MENSAJE="$1"
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "text=${MENSAJE}" \
-d "parse_mode=HTML" > /dev/null
}
# ==========================================
# EJECUCIÓN DEL BACKUP
# ==========================================
# Crear directorio de destino si no existe
mkdir -p "${DESTINO}"
# Medir tiempo de inicio
TIEMPO_INICIO=$(date +%s)
echo "[$(date)] Iniciando backup de ${ORIGEN}..." >> "${LOG_FILE}"
# Ejecutar tar con compresión multihilo (pigz)
if tar -I pigz -cf "${RUTA_FINAL}" "${ORIGEN}" 2>> "${LOG_FILE}"; then
# Calcular tiempo transcurrido y tamaño
TIEMPO_FIN=$(date +%s)
DURACION=$((TIEMPO_FIN - TIEMPO_INICIO))
TAMANO=$(du -h "${RUTA_FINAL}" | cut -f1)
# Limpieza de backups antiguos (rotación)
ARCHIVOS_ELIMINADOS=$(find "${DESTINO}" -name "backup_${HOSTNAME}_*.tar.gz" -mtime +${DIAS_RETENCION} -print -delete | wc -l)
# Notificación de ÉXITO a Telegram
TEXTO_TELEGRAM="<b>✅ Backup completado con éxito</b>%0A"
TEXTO_TELEGRAM+="<b>🖥️ Servidor:</b> <code>${HOSTNAME}</code>%0A"
TEXTO_TELEGRAM+="<b>📁 Archivo:</b> <code>${NOMBRE_ARCHIVO}</code>%0A"
TEXTO_TELEGRAM+="<b>📦 Tamaño:</b> ${TAMANO}%0A"
TEXTO_TELEGRAM+="<b>⏱️ Tiempo:</b> ${DURACION} segundos%0A"
TEXTO_TELEGRAM+="<b>🧹 Archivos viejos purgados:</b> ${ARCHIVOS_ELIMINADOS}"
enviar_telegram "${TEXTO_TELEGRAM}"
echo "[$(date)] Backup finalizado con éxito. Tamaño: ${TAMANO}" >> "${LOG_FILE}"
else
# Notificación de ERROR a Telegram
TEXTO_TELEGRAM="<b>❌ ERROR CRÍTICO EN BACKUP</b>%0A"
TEXTO_TELEGRAM+="<b>🖥️ Servidor:</b> <code>${HOSTNAME}</code>%0A"
TEXTO_TELEGRAM+="<b>⚠️ Mensaje:</b> No se pudo crear el archivo comprimido. Revisa el log local en <code>${LOG_FILE}</code>."
enviar_telegram "${TEXTO_TELEGRAM}"
echo "[$(date)] ERROR al realizar el backup." >> "${LOG_FILE}"
exit 1
fi
Otorga permisos de ejecución
Guarda el archivo (Ctrl + O, Enter, Ctrl + X) y dale permisos de ejecución:
sudo chmod +x /usr/local/bin/backup_telegram.sh
Pruébalo manualmente lanzándolo desde la consola:
sudo /usr/local/bin/backup_telegram.sh
Si la configuración es correcta, deberías recibir inmediatamente la notificación en tu Telegram.
3. Automatización con Systemd (Service + Timer)
Aunque podrías usar cron, los timers de Systemd ofrecen ventajas claras:
- Generan logs detallados accesibles directamente mediante
journalctl. - Manejan mejor las situaciones en las que el servidor estaba apagado a la hora programada.
- Aíslan la ejecución del script evitando conflictos de entorno de usuario.
Para ello necesitamos dos archivos: un archivo de Servicio (qué ejecutar) y un archivo de Timer (cuándo ejecutarlo).
Paso A: Crear la unidad de Servicio
Crea el archivo /etc/systemd/system/backup-telegram.service:
sudo nano /etc/systemd/system/backup-telegram.service
Pega el siguiente contenido:
[Unit]
Description=Servicio de Backup Automatizado con alertas a Telegram
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_telegram.sh
[Install]
WantedBy=multi-user.target
Paso B: Crear la unidad de Timer
Crea el archivo /etc/systemd/system/backup-telegram.timer:
sudo nano /etc/systemd/system/backup-telegram.timer
Pega el siguiente contenido (configurado para ejecutarse todos los días a las 03:00 AM):
[Unit]
Description=Timer diario para el Backup con alertas a Telegram
[Timer]
# Se ejecuta todos los días a las 3 de la madrugada
OnCalendar=*-*-* 03:00:00
# Si el equipo estaba apagado a esa hora, lo ejecuta inmediatamente al arrancar
Persistent=true
[Install]
WantedBy=timers.target
Paso C: Activar y arrancar el Timer
Recarga la configuración de Systemd para que reconozca los nuevos archivos y habilita el temporizador:
# Recargar el demonio de systemd
sudo systemctl daemon-reload
# Activar el timer para que se inicie automáticamente en cada arranque
sudo systemctl enable --now backup-telegram.timer
4. Monitorización y comandos útiles
Puedes comprobar en cualquier momento el estado de tus temporizadores activos y ver cuándo se ejecutará el próximo backup con:
# Listar timers activos y hora de próxima ejecución
systemctl list-timers --all | grep backup
Para consultar los logs de ejecuciones anteriores almacenados por Systemd:
# Ver los logs del servicio de backup
sudo journalctl -u backup-telegram.service
Si quieres forzar una ejecución de prueba a través de Systemd sin esperar a las 03:00 AM:
sudo systemctl start backup-telegram.service
Conclusión
Con esta combinación tienes una infraestructura de respaldos profesional, completamente desatendida, veloz gracias al aprovechamiento multihilo de la CPU y con la tranquilidad de que tu servidor te avisará proactivamente por Telegram en caso de éxito o de fallo.