Saltar a contenido

Runbook: Backup fallido

Gravedad 🟡 Media — no hay riesgo inmediato, pero la ventana de vulnerabilidad crece
Tiempo de respuesta < 4 horas (si falla 2 noches seguidas, pasar a 🔴)
Roles implicados Mnemósine (backups), Argos (detección), Terminus (si hay que restaurar)

Un backup que falla una noche es un aviso. Un backup que falla dos noches seguidas es una emergencia: cada hora sin copia aumenta lo que se puede perder.

Síntomas

  • Alerta en ntfy topic backup: "❌ PBS job fallido"
  • Alerta en ntfy topic backup: "❌ restic offsite fallido"
  • PBS UI muestra el último job en rojo
  • Dashboard de Grafana: última verificación de backup > 24h

Diagnóstico

flowchart TD
    A([Alerta: backup fallido]) --> B[Diagnóstico]
    B --> B1[Verificar PBS UI:\núltimo job fallido]
    B1 --> B2[Comprobar espacio:\nzpool list backuppool]
    B2 --> B3[Verificar conectividad\ncon Thoth restic offsite]
    B3 --> B4[Revisar logs del\njob fallido en PBS]
    B4 --> B5[Comprobar LXCs corriendo\ndurante ventana backup]
    B5 --> B6[Verificar snapshots ZFS\nhuérfanas]
    B6 --> C{¿Causa\nencontrada?}
    C -->|Sí| D[Resolución]
    C -->|No| B
    D --> D1[Problema de espacio:\nliberar o ampliar pool]
    D1 --> D2[Conectividad restic:\nverificar túnel a Thoth]
    D2 --> D3[LXC no responde:\narrancar y backup manual]
    D3 --> D4[Fallo persistente:\nreducir alcance backup]
    D4 --> D5[Resolver y verificar\nrestore con nuevo backup]
    D5 --> E[Verificación]
    E --> E1[PBS UI muestra\njob en verde]
    E1 --> E2[ntfy confirma\nbackup completado]
    E2 --> E3[Restore de prueba\nsemanal sin errores]
    E3 --> E4[Grafana: última\nverificación < 24h]
    E4 --> F{¿Backup\nestable?}
    F -->|Sí| G[Prevención]
    F -->|No| D
    G --> G1[Monitorizar espacio\ncon alerta al 80%]
    G1 --> G2[Verificación semanal\nautomática de restore]
    G2 --> G3[Backup manual antes\nde tofu o ansible]
    G3 --> H([Fin])
  • [ ] Verificar PBS UI: https://pbs.sc → Dashboard → ver último job y su estado. Anotar el ID del job fallido.
  • [ ] Comprobar espacio en disco del pool de backup: zpool list backuppool — ¿USED > 80%?
  • [ ] Listar snapshots de PBS locales y su consumo: proxmox-backup-manager snapshot list en el host de PBS
  • [ ] Verificar conectividad con Thoth para restic offsite: ping -c 3 thoth.sc y ssh thoth "df -h /backup/restic"
  • [ ] Revisar logs del job fallido en PBS: https://pbs.sc → Administration → Tasks → filtrar por "failed"
  • [ ] Ver logs de restic en Ra: journalctl -u restic-backup --since "24 hours ago" --no-pager
  • [ ] Comprobar que los LXC a respaldar estaban corriendo durante la ventana de backup (02:00-04:00): pct list en Proxmox
  • [ ] Verificar snapshots ZFS huérfanas consumiendo espacio: zfs list -t snapshot -o name,used,creation | grep -v '@backup' | tail -30
  • [ ] Verificar estado de salud de los pools ZFS: zpool status rpool y zpool status backuppool — ¿algún disco con errores?

Resolución

  • [ ] Problema de espacio en backuppool:

    # Ver qué consume más espacio
    zfs list -o name,used,refer -r backuppool | sort -k2 -h | tail -20
    
    # Eliminar snapshots de PBS antiguas (retención: 30 días)
    proxmox-backup-manager snapshot prune <datastore> --keep-daily 30
    
    # Si no basta, identificar y eliminar backups de LXC fuera de servicio
    proxmox-backup-client list --repository <IP_PBS>:<datastore>
    # Luego eliminar grupos antiguos desde la UI de PBS
    

  • [ ] Problema de conectividad con Thoth (restic offsite):

    # Verificar que el túnel WireGuard a Thoth está activo
    wg show wg-thoth
    
    # Si no hay handshake, reiniciar el túnel
    wg-quick down wg-thoth && wg-quick up wg-thoth
    
    # Reintentar backup manual restic
    restic -r sftp:thoth:/backup/restic backup /datos/criticos
    
    # Verificar que el disco USB en Thoth tiene espacio
    ssh thoth "df -h /backup"
    

  • [ ] LXC no responde o no se pudo respaldar:

    # Identificar el LXC problemático desde los logs de PBS
    # Arrancarlo si está parado y lanzar backup manual
    pct start <ID>
    # Esperar 60 segundos a que los servicios arranquen
    proxmox-backup-client backup pct-<ID>.pxar:/ --repository <IP_PBS>:<datastore>
    

  • [ ] Fallo persistente en el backup automático:

  • Reducir el alcance: respaldar solo LXC Tier A (Authentik, Forgejo, NetBird, Pi-hole, Caddy) y Tier B
  • Lanzar backup manual de los LXC críticos uno por uno:
    for ct in <ID1> <ID2> <ID3>; do
      echo "Respaldando LXC $ct..."
      pct backup $ct --storage pbs --mode snapshot
    done
    
  • Si el backup manual funciona: reiniciar el servicio de PBS (systemctl restart proxmox-backup) y esperar al próximo ciclo programado
  • Si ni el backup manual funciona: verificar integridad del datastore de PBS:

    proxmox-backup-manager verify <datastore>
    

  • [ ] Una vez resuelto: forzar un restore de prueba con el nuevo backup para confirmar que es íntegro:

    # Restaurar un LXC Tier B en un entorno temporal con otro ID
    pct restore <ID_TEMPORAL> <backup-id> --storage local-zfs
    pct start <ID_TEMPORAL>
    # Verificar que arranca y responde
    curl -s http://<IP_TEMPORAL>:<puerto>
    pct stop <ID_TEMPORAL> && pct destroy <ID_TEMPORAL>
    

Verificación

  • PBS UI muestra el último job en verde con timestamp < 24h
  • ntfy topic backup confirma "✅ Backup completado" para PBS y restic
  • zpool list backuppool muestra espacio libre > 20%
  • restic snapshots --repo sftp:thoth:/backup/restic muestra último snapshot < 24h
  • Restore de prueba semanal se ejecuta sin errores (verificar en ntfy o Grafana)
  • Dashboard de Grafana: última verificación < 24h

Si no funciona

  1. Fallo de hardware en el disco de backup: si zpool status backuppool muestra errores de lectura/escritura, sustituir el disco físicamente. Mientras tanto, priorizar restic offsite a Thoth.
  2. Thoth inaccesible (ISP caído en Garganta la Olla): esperar a que vuelva la conectividad. Los backups locales (PBS + rsync a Horus) mantienen la estrategia 3-2-1 incluso sin la copia offsite temporalmente.
  3. Datastore de PBS corrupto: proxmox-backup-manager verify <datastore>. Si hay corrupción irrecuperable, recrear el datastore y lanzar backup completo desde cero. Avisar en Matrix.
  4. Tres noches seguidas sin backup: escalar a 🔴 Crítica. Convocar al rol Terminus. Prioridad absoluta hasta resolver.

Rollback

No aplica un rollback de backup. Si un cambio en la configuración de PBS causó el fallo:

# Restaurar configuración de PBS desde ZFS snapshot
zfs rollback rpool/config/pbs@<fecha-antes-del-cambio>
systemctl restart proxmox-backup

Prevención

  • Monitorizar espacio en backuppool con alerta al 80% (regla en Grafana: zfs_used_percent > 80)
  • Verificación semanal automática de restore de un LXC Tier B (systemd timer: pbs-verify.timer)
  • Backup manual antes de cualquier tofu apply o ansible-playbook que afecte a infraestructura
  • Healthcheck de conectividad con Thoth cada 6 horas: ping -c 3 thoth.sc con alerta en ntfy si falla
  • Mantener el principio 3-2-1: si falla PBS, restic sigue protegiendo. Si falla restic, PBS + rsync mantienen 2 copias locales. Si fallan dos, el tercero aguanta hasta que se resuelva.