Ir al contenido

Monitorización de backups con restic y healthchecks.io: alertas desde el móvil

Rogelio Guerra Riverón
Autor
Rogelio Guerra Riverón
Construyendo mi propia infraestructura web desde cero. Aquí documento cada paso: servidores, redes, contenedores y lo que vaya surgiendo.

El problema
#

Tenía restic corriendo backups cada noche en mi servidor doméstico, pero nunca sabía si algo fallaba. Los logs se acumulaban en el servidor y yo seguía con mi vida. Hasta que un día descubrí que los backups llevaban dos semanas sin ejecutarse. Desde ese momento decidí que necesitaba notificaciones en tiempo real.

La solución: healthchecks.io
#

Encontré healthchecks.io, un servicio de monitorización que detecta cuándo tus crons no se ejecutan. Es simple: tu script hace un ping a una URL después de completarse. Si el ping no llega en el intervalo esperado, te avisa.

Configuración paso a paso
#

1. Crear una cuenta en healthchecks.io
#

Voy a healthchecks.io, me registro y creo un nuevo check. Le pongo un nombre descriptivo como “Backup diario servidor”.

El sitio me genera una URL única como:

https://hc-ping.com/12345678-1234-1234-1234-123456789012

2. Script wrapper para restic
#

Mi script de backup es simple. Ejecuto restic con los parámetros necesarios y luego hago el ping:

#!/bin/bash

# Variables
RESTIC_REPO="/mnt/backup/restic-repo"
RESTIC_PASSWORD="tu-contraseña"
BACKUP_SOURCE="/home /etc /opt"
HC_URL="https://hc-ping.com/tu-uuid-aqui"

# Log
LOG_FILE="/var/log/restic-backup.log"

# Ejecutar backup
restic -r "$RESTIC_REPO" backup $BACKUP_SOURCE >> "$LOG_FILE" 2>&1
BACKUP_STATUS=$?

# Verificar integridad
restic -r "$RESTIC_REPO" check >> "$LOG_FILE" 2>&1
CHECK_STATUS=$?

# Registrar resultado
echo "[$(date)] Backup: $BACKUP_STATUS, Check: $CHECK_STATUS" >> "$LOG_FILE"

# Ping a healthchecks solo si todo fue bien
if [ $BACKUP_STATUS -eq 0 ] && [ $CHECK_STATUS -eq 0 ]; then
    curl -fsS -m 10 --retry 5 -o /dev/null "$HC_URL"
else
    # Ping con parámetro fail si algo falló
    curl -fsS -m 10 --retry 5 -o /dev/null "$HC_URL/fail"
fi

3. Añadir al crontab
#

0 2 * * * /usr/local/bin/restic-backup.sh

El backup corre a las 2 AM cada día.

4. Configurar alertas en healthchecks.io
#

En el dashboard del check, configuro:

  • Grace time: 10 minutos (tiempo para que el ping llegue después de la ejecución)
  • Alert period: 24 horas (si no recibe ping en 24h, avisa)
  • Notificaciones: Email + Telegram

5. Integración con Telegram (opcional pero recomendado)
#

Healthchecks integra bien con Telegram. Creo un bot en Telegram, copio el token y lo configuro en healthchecks. Ahora las alertas llegan directo al móvil.

Verificación manual desde el móvil
#

También puedo hacer un ping manual desde cualquier lado:

curl https://hc-ping.com/tu-uuid-aqui

Útil si quiero verificar que todo funciona desde el móvil mientras estoy fuera de casa.

Mejoras que añadí después
#

1. Logs más detallados:

echo "Snapshots actuales: $(restic -r "$RESTIC_REPO" snapshots | wc -l)" >> "$LOG_FILE"

2. Chequeo de espacio:

AVAILABLE=$(df "$RESTIC_REPO" | awk 'NR==2 {print $4}')
if [ "$AVAILABLE" -lt 5242880 ]; then
    curl -fsS "$HC_URL/fail" -d "Espacio bajo: ${AVAILABLE}KB"
fi

3. Prioridades diferentes:

Creé varios checks: uno crítico para backups diarios (alerta inmediata) y otro para verificaciones semanales (menos sensible).

Lo que funciona bien
#

  • Notificaciones en tiempo real sin gestionar servidor de mail
  • No consume recursos (un simple ping HTTP)
  • El plan gratuito cubre perfectamente casos personales
  • Historial de ejecuciones visible en dashboard
  • Integración con múltiples canales (email, Telegram, Slack, etc.)

Lo que hay que tener en cuenta
#

  • Necesitas internet en el servidor para hacer el ping
  • Si restic se cuelga, el script nunca hace ping. Considera añadir timeout
  • healthchecks.io depende de un servicio externo (aunque es muy confiable)

Después de implementar esto, duermo mejor. Las alertas me avisan rápido si algo falla y puedo reaccionar antes de que sea un problema real.