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-1234567890122. 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"
fi3. Añadir al crontab#
0 2 * * * /usr/local/bin/restic-backup.shEl 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"
fi3. 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.