Skip to content

CT217: cobertura de backup declarada y observada

20 de octubre de 2026. Sólo fuentes y cuatro llamadas PVE autorizadas desde pmx2: recursos217, config217 filtrada, jobs y una consulta de snapshots. Sin backup, sync, verify, restore, drill, SQL/export, NAS walk, lectura de payload/secretos o cambios runtime. Sólo se redactó este informe.

Declaración runtime, 02:45:36.705338 CEST

CT217 figura running en proxmox2. Su config proyectada contiene rootfs zfs-ha:subvol-217-disk-0, size40G; ningún mpN declarado. Se descartaron env y campos lxc.*. /opt/observa y /home/monxas/appdata son rutas de guest bajo el rootfs declarado, sin un mount point PVE separado declarado para ellas; esto no descarta submontajes manuales, NFS interno o exclusiones de paths.

Job que selecciona217 enabled schedule storage Selección/exclusión
backup-lxc-terra 1 01:00 pbs vmid217 explícito, no excluido, nodo compatible

Es el único job seleccionante observado; no quedaron selecciones pool sin resolver. No se copiaron targets ajenos ni se crea otro scheduler. Declaración de job no equivale a ejecución satisfactoria.

Snapshots listados, 02:46:41.579069 CEST

La llamada adicional exacta fue /nodes/proxmox2/storage/pbs/content --content backup --vmid217. Se conservaron hasta tres entradas recientes; la respuesta contenía dos:

Volid ctime CEST size informado
pbs:backup/ct/217/2026-10-19T23:02:36Z 20oct01:02:36 19.924.189.387 B (~18,56 GiB)
pbs:backup/ct/217/2026-10-19T07:08:28Z 19oct09:08:28 17.079.081.109 B (~15,91 GiB)

Edad del último ctime: 1h44m05,58s. Size es metadata API, no uso deduplicado ni bytes verificados. No se consultaron worker status/endtime, integridad ni contenido. Los snapshots listados no prueban restore, coherencia de aplicaciones o inclusión de cada ruta.

El último ctime precede a Required instalada a las02:12: no se acredita que ese snapshot contenga esa versión; tampoco se infiere su exclusión sin payload/intervalo del job. La regla tiene su fuente Git. La auditoría anterior registraba a las23:02 «28 invitados con copia PBS<26h»: evidencia agregada reciente compatible con217, no un restore suyo.

Matriz de configuración y persistencia

El perfil declara diez servicios y 16 binds Docker absolutos: siete de configuración/secretos y nueve de datos. Un Docker bind dentro del guest no es por ello un mount PVE externo excluido de vzdump. Para todos los paths siguientes rige la condición rootfs anterior, sin comprobación de payload:

Paths de guest Fuente disponible / límite de recuperación
/opt/observa/compose.yaml Perfil/hash e identidades de imágenes; no Compose completo ni bindings de secretos reconstruidos
/opt/observa/conf/prometheus.yml Template reconciliado26jobs; autenticación no acreditada por esta auditoría; hash c8… previo no comparado con PBS
/home/monxas/appdata/prometheus/alerts.yml Fuente versionada87reglas; versión actual en PBS no comprobada
appdata/alertmanager/{alertmanager.yml,telegram-bot-token,vera-alert-secret} YAML candidato Git; contenido runtime y secretos no verificados; tres mounts RO
appdata/blackbox/blackbox.yml, appdata/loki-config/loki-config.yaml Paths observados; no fuente completa actual localizada; ausencia Git no demuestra ausencia PBS
Datos appdata/{alertmanager/data,grafana,healthchecks,loki,prometheus/data,pushgateway,scrutiny/config,scrutiny/influxdb,uptime-kuma} Nueve binds de datos; JSON Grafana parciales no equivalen a sus bases; sin prueba de consistencia/restore
Named/anonymous volumes Cero named volumes declarados; no descarta image-declared VOLUME, anónimos ni Docker data-root separado: no se inspeccionó Mounts

appdata/… abrevia /home/monxas/appdata/…. RepoDigests observados no sustituyen backups de datos ni acreditan disponibilidad de registry. El perfil conserva complete_recovery_spec: false.

Huecos concretos y propuesta mínima

  • backup-retention.md conserva targets verificados en agosto, anteriores a217. La lectura actual sí acredita su selección: no interpretar la tabla antigua como ausencia de backup ni como inventario actual completo.
  • backup-appdata-fixed.sh, líneas28–39, pertenece a VM208; horario retirado el8sept. No declara una copia diaria de /opt/observa ni del appdata trasladado. No se propone reactivarlo.
  • pbs_restore_drill.py, líneas42–44, permite LXC100/123/155/200/251 y config123: excluye217. El drill19oct probó123. No se encontró prueba de restore217; no añadirlo sin más al pool aleatorio con su pila de diez servicios.
  • normalidad comprueba jobs y frescura, no mounts/payload/coherencia. El éxito agregado no cierra esos huecos.

Siguiente cambio fuente acotado: registrar esta evidencia individual fechada en documentación/perfil, separando job declarado, snapshot listado, paths comprobados y restore probado. Sólo las dos primeras están acreditadas. Antes de un ensayo futuro, revisar metadata de submontajes, volúmenes Docker y exclusiones, y preparar extracción/restore aislado específico con límites revisados. No se ejecutó ni autorizó aquí esa ampliación; no requiere otro daemon, cron o backup.

Evidencia privada y cierre

Archivos0600, fsync de archivo/directorio, sólo metadata filtrada:

  • ~/.local/state/homelab-incident-evidence/ct217-backup-metadata-20261020T004541Z.json, SHA256 <REDACTED>.
  • ~/.local/state/homelab-incident-evidence/ct217-pbs-snapshots-20261020T004641Z.json, SHA256 <REDACTED>.

Las cuatro llamadas terminaron rc0. No hubo más SSH/PVE tras snapshots, ni cambios en código, perfiles, jobs o almacenamiento.