Copias de Seguridad + Notificaciones en Telegram + Systemd Timers

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:

  1. Empaqueta y comprime tus datos de forma ultrarrápida usando compresión multihilo (pigz).
  2. Envía un resumen automático a Telegram con el tamaño del archivo, el tiempo empleado y el estado (éxito o error).
  3. Realiza la rotación automática para borrar copias antiguas y no llenar el disco.
  4. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio