Matriz de Resiliencia¶
Matrices de resiliencia de SmallCountry para los cinco escenarios de fallo más probables. Cada matriz muestra, servicio por servicio, qué funciona, qué se degrada y qué deja de funcionar.
Estas matrices son parte del Mecanismo 3 — Degradación Independiente. Su propósito es que quien administra sepa exactamente qué esperar cuando algo falla, sin sorpresas y sin necesidad de descubrirlo en el momento del incidente.
Escenario 1: Sin Internet¶
La fibra se corta. El router 4G de la finca pierde cobertura. SmallCountry entra en modo isla completo. No hay acceso a servicios externos, pero la red local y todos los servicios internos siguen funcionando.
| Sistema | Funciona | Degradado | No funciona | Notas |
|---|---|---|---|---|
| Authentik | ✅ | — | — | Autenticación local sin dependencia externa |
| Caddy | ✅ | — | — | Certificados internos. Sin Let's Encrypt |
| Pi-hole | ✅ | ⚠️ Sin upstream DNS | — | Resuelve .sc local. No resuelve dominios externos |
| Nextcloud | ✅ | — | — | Sincronización local. Sin Collabora Online (externo) |
| Immich | ✅ | ⚠️ Sin mapas | — | Fotos, búsqueda y álbumes funcionan |
| Matrix | ✅ | ⚠️ Sin federación | — | Chat local sin conexión a servidores externos |
| Jitsi | ✅ | — | — | Videollamadas en red local |
| Jellyfin | ✅ | ⚠️ Sin metadata nueva | — | Reproduce lo ya descargado |
| farmOS | ✅ | ⚠️ Sin mapas satélite | — | Registro de campo completo |
| Node-RED | ✅ | — | — | Todos los flujos locales funcionan |
| Mosquitto | ✅ | — | — | Bus MQTT interno |
| n8n | ✅ | ⚠️ Webhooks externos caídos | — | Flujos locales funcionan |
| Grafana | ✅ | ⚠️ Sin plugins externos | — | Dashboards completos |
| VictoriaMetrics | ✅ | — | — | Recolección y consulta local |
| Uptime Kuma | ✅ | ⚠️ No monitoriza URLs externas | — | Monitorización interna |
| Geb (Cerbo GX) | ✅ | ⚠️ Sin VRM remoto | — | Monitorización local vía MQTT |
| ESP32 / sensores | ✅ | — | — | Datos se siguen recolectando |
| Shelly | ✅ | ⚠️ Sin nube Shelly | — | Control local vía MQTT |
| Vaultwarden | ✅ | ⚠️ Sin sync externo | — | Acceso a contraseñas en caché |
| Searxng | ❌ | — | ✅ | Requiere internet para buscar |
| FreshRSS | ❌ | — | ✅ | No puede obtener feeds |
| Ollama | ✅ | — | — | Modelos en local |
| Hermes Agent | ✅ | ⚠️ Sin búsqueda web | — | Asistente local completo |
| WireGuard | ✅ | ⚠️ Sin endpoints remotos | — | Túneles locales activos |
| NetBird | ⚠️ | Solo LAN | — | Sin NAT traversal externo |
| deSEC | ❌ | — | ✅ | Necesita API externa |
| ntfy | ✅ | — | — | Push local en red WiFi |
| Forgejo | ✅ | ⚠️ Sin mirror externo | — | Git local completo |
| Ansible | ✅ | — | — | Playbooks locales |
| Proxmox | ✅ | — | — | Gestión local |
| ZFS | ✅ | — | — | Snapshots y scrubs locales |
| PBS | ✅ | ⚠️ Sin offsite sync | — | Backup local completo |
| Restic | ✅ | ⚠️ Sin push a Thoth | — | Snapshot local |
| Homepage | ✅ | ⚠️ Sin widgets externos | — | Panel con servicios locales |
| Mautic | ✅ | ⚠️ Sin envío de email | — | CRM local |
| FacturaScripts | ✅ | ⚠️ Sin Verifactu | — | Facturación local |
Resumen: ~90% de servicios funcionales. Solo caen los que requieren consultas a APIs externas (Searxng, FreshRSS, deSEC).
Escenario 2: Sin VPN¶
Los túneles WireGuard y NetBird entre Chapinería y Garganta la Olla están caídos. Las dos ubicaciones quedan aisladas entre sí. Cada ubicación opera con sus recursos locales.
| Sistema | Chapinería (Ra + Horus) | Garganta (Geb + sensores) | Notas |
|---|---|---|---|
| Authentik | ✅ | N/A (no hay en Garganta) | — |
| Caddy | ✅ | N/A | — |
| Pi-hole | ✅ | ⚠️ Cache DNS local | — |
| Nextcloud | ✅ | ❌ Sin acceso remoto | Datos solo en Chapinería |
| Immich | ✅ | ❌ | — |
| Matrix | ✅ | ❌ | — |
| Jitsi | ✅ | ❌ | — |
| Grafana | ✅ | ⚠️ Sin métricas de Geb | Los dashboards de energía se vacían |
| VictoriaMetrics | ✅ | ⚠️ Sin ingesta de Geb | — |
| Node-RED | ✅ (flujos locales) | ✅ (flujos en Geb) | Los flujos que cruzan ubicaciones fallan |
| Mosquitto | ✅ (local) | ✅ (local) | Sin bridge MQTT entre ubicaciones |
| Geb (Cerbo GX) | ❌ Sin telemetría remota | ✅ Funciona autónomo | MPPT y batería operan sin Ra |
| ESP32 / sensores | ❌ Sin datos remotos | ✅ Siguen recolectando | Los ESP32 almacenan localmente |
| Shelly | ❌ Sin control remoto | ✅ Control local | La bomba del sótano (local a Ra) no se ve afectada |
| Ollama | ✅ | N/A | — |
| Hermes Agent | ✅ | N/A | — |
| n8n | ✅ (flujos locales) | ❌ | Flujos que dependen de Geb fallan |
| WireGuard | ❌ Túneles caídos | ❌ | — |
| NetBird | ❌ Malla caída | ❌ | — |
| Forgejo | ✅ | N/A | — |
| Proxmox | ✅ | ✅ | — |
| ZFS | ✅ | ✅ | — |
| PBS | ✅ | ❌ Sin acceso a Thoth | — |
| Restic | ✅ (local) | ❌ | Sin push a Thoth |
Resumen: Cada ubicación es autónoma en sus funciones esenciales. La pérdida de VPN rompe la capa de monitorización unificada, el control centralizado de la finca y los backups offsite. Los sistemas de supervivencia (Geb, MPPT, batería, Shelly local) siguen operando sin Ra.
Escenario 3: Sin Energía¶
La red eléctrica falla. La batería LiFePO4 asume la carga. Si el apagón se prolonga, el sistema transita por los perfiles de ahorro y emergencia hasta el apagado ordenado.
| Sistema | Red + batería >80% | Batería 40-80% (Ahorro) | Batería <40% (Emergencia) | Batería <10% | Notas |
|---|---|---|---|---|---|
| Ra | ✅ | ✅ | ⚠️ Solo Tier S+A | ❌ Apagado seguro | Shutdown ordenado con ZFS sync |
| Horus | ✅ | ⚠️ GPU apagada | ❌ Apagado | ❌ | IA solo CPU en perfil Ahorro |
| Geb | ✅ | ✅ | ✅ | ✅ | Alimentado por batería directamente |
| Thoth | ⚠️ Depende de su UPS | ❌ Si sin energía | ❌ | ❌ | Backup offsite difiere hasta recuperación |
| Authentik | ✅ | ✅ | ✅ | ❌ | — |
| Caddy | ✅ | ✅ | ✅ | ❌ | — |
| Pi-hole | ✅ | ✅ | ✅ | ❌ | — |
| Nextcloud | ✅ | ✅ | ❌ (Tier B) | ❌ | — |
| Immich | ✅ | ✅ | ❌ (Tier B) | ❌ | — |
| Matrix | ✅ | ✅ | ❌ (Tier B) | ❌ | — |
| Grafana | ✅ | ✅ | ❌ (Tier B) | ❌ | — |
| Node-RED | ✅ | ✅ | ✅ (flujos críticos) | ❌ | Solo flujos de supervivencia |
| Mosquitto | ✅ | ✅ | ✅ | ❌ | — |
| ESP32 / sensores | ✅ | ✅ | ⚠️ Solo batería interna | ❌ | ESP32 con batería duran 48-72h |
| Shelly bomba sótano | ✅ | ✅ | ✅ | ✅ | Prioridad absoluta. Ignora perfiles |
| Ollama | ✅ | ❌ GPU apagada | ❌ | ❌ | — |
| Jellyfin | ✅ | ❌ (Tier C) | ❌ | ❌ | — |
| Forgejo | ✅ | ✅ | ❌ (Tier B) | ❌ | — |
| Ansible | ✅ | ✅ | ❌ | ❌ | No se despliega en emergencia |
| ZFS | ✅ | ✅ | ✅ | ✅ (sync final) | Último snapshot antes del apagado |
| PBS | ✅ | ❌ | ❌ | ❌ | — |
| Restic | ✅ | ❌ | ❌ | ❌ | — |
| ntfy | ✅ | ✅ | ✅ | ❌ | Notificaciones de batería crítica |
| WireGuard | ✅ | ✅ | ⚠️ Solo túneles locales | ❌ | — |
Resumen: El sistema prioriza la supervivencia física por encima de todo. La bomba del sótano es el último servicio en apagarse. El apagado ordenado garantiza que ZFS sincronice antes de cortar.
Escenario 4: Sin Authentik¶
El proveedor de identidad cae. Authentik es el punto único de fallo más crítico para la experiencia de usuario. Sin él, ningún servicio con forward-auth es accesible.
| Sistema | Funciona | Degradado | No funciona | Notas |
|---|---|---|---|---|
| Authentik | ❌ | — | ✅ | Causa raíz del escenario |
| Caddy | ✅ | ⚠️ forward-auth falla | — | Caddy mismo funciona pero no puede validar sesiones |
| Pi-hole | ✅ | — | — | Sin dependencia de Authentik |
| Nextcloud | ❌ | — | ✅ | Protegido por forward-auth |
| Immich | ❌ | — | ✅ | Protegido por forward-auth |
| Matrix | ❌ | — | ✅ | Protegido por forward-auth |
| Grafana | ❌ | — | ✅ | Protegido por forward-auth |
| Jitsi | ✅ (sin auth) | — | — | Jitsi permite acceso sin autenticación |
| farmOS | ❌ | — | ✅ | Protegido por forward-auth |
| Node-RED | ⚠️ | Acceso directo por IP | — | Accesible sin pasar por Caddy (solo admin) |
| Mosquitto | ✅ | — | — | MQTT no requiere autenticación de usuario |
| n8n | ❌ | — | ✅ | Protegido por forward-auth |
| Ollama | ✅ | — | — | API accesible sin auth en red local |
| Hermes Agent | ⚠️ | Sin auth de usuario | — | API local funciona |
| Forgejo | ❌ | — | ✅ | Protegido por OAuth2 |
| Proxmox | ✅ | — | — | Autenticación propia (PAM) |
| ZFS | ✅ | — | — | Sin dependencia |
| PBS | ✅ | — | — | Autenticación propia |
| Ansible | ✅ | — | — | Claves SSH, no depende de Authentik |
| ESP32 / sensores | ✅ | — | — | Sin dependencia |
| Geb | ✅ | — | — | Sin dependencia |
| Shelly | ✅ | — | — | Sin dependencia |
| Uptime Kuma | ✅ | — | — | Sin dependencia (acceso directo) |
| ntfy | ✅ | — | — | Sin dependencia |
| Vaultwarden | ⚠️ | Acceso local con PIN | — | App móvil cachea el vault |
| Jellyfin | ❌ | — | ✅ | Protegido por forward-auth |
| FacturaScripts | ❌ | — | ✅ | Protegido por forward-auth |
| Mautic | ❌ | — | ✅ | Protegido por forward-auth |
Resumen: ~40% de servicios inaccesibles para usuarios finales. Los sistemas críticos de infraestructura (Proxmox, ZFS, Mosquitto, sensores) no dependen de Authentik. La recuperación está documentada en el Protocolo de Mortalidad para Authentik con RTO < 15 minutos.
Escenario 5: Sin MQTT (Mosquitto caído)¶
El broker Mosquitto cae. El bus de mensajería IoT se silencia. Los sensores no pueden publicar y Node-RED no recibe eventos del mundo físico.
| Sistema | Funciona | Degradado | No funciona | Notas |
|---|---|---|---|---|
| Mosquitto | ❌ | — | ✅ | Causa raíz |
| ESP32 / sensores | ⚠️ | Almacenan localmente | ❌ No publican | Los ESP32 acumulan datos en buffer local |
| Node-RED | ⚠️ | Sin eventos IoT | — | Flujos HTTP y cron siguen funcionando |
| Geb (Cerbo GX) | ⚠️ | Modbus TCP activo | ❌ Sin MQTT | Telemetría accesible vía Modbus |
| Shelly | ⚠️ | Control HTTP directo | ❌ Sin MQTT | Accesibles por API REST |
| Grafana | ⚠️ | Sin datos IoT nuevos | — | Dashboards de campo se congelan |
| VictoriaMetrics | ⚠️ | Sin ingesta IoT | — | El resto de métricas siguen entrando |
| InfluxDB | ⚠️ | Sin ingesta IoT | — | Datos históricos disponibles |
| Authentik | ✅ | — | — | Sin dependencia |
| Caddy | ✅ | — | — | Sin dependencia |
| Pi-hole | ✅ | — | — | Sin dependencia |
| Nextcloud | ✅ | — | — | Sin dependencia |
| Immich | ✅ | — | — | Sin dependencia |
| Matrix | ✅ | — | — | Sin dependencia |
| n8n | ✅ | — | — | Sin dependencia directa |
| Ollama | ✅ | — | — | Sin dependencia |
| farmOS | ✅ | ⚠️ Sin datos nuevos de sensores | — | Datos manuales se siguen registrando |
| Home Assistant | ⚠️ | Sin actualizaciones MQTT | — | Control manual por interfaz |
| Forgejo | ✅ | — | — | Sin dependencia |
| Proxmox | ✅ | — | — | Sin dependencia |
| ZFS | ✅ | — | — | Sin dependencia |
| PBS | ✅ | — | — | Sin dependencia |
| ntfy | ✅ | ⚠️ Sin alertas de campo | — | Alertas de infraestructura siguen llegando |
Resumen: La caída de MQTT es un fallo de capa de campo, no de infraestructura. Los servicios de usuario, identidad y almacenamiento no se ven afectados. La finca pierde telemetría en tiempo real, pero los sensores acumulan datos localmente y los retransmiten al reconectar. La bomba del sótano tiene un camino alternativo vía Shelly HTTP directo. RTO estimado: <5 minutos (reinicio de Mosquitto).