Dependencias entre Servicios
Mapa completo de las dependencias entre los servicios de SmallCountry : quién necesita a quién para funcionar, cadenas de dependencia críticas y el análisis de puntos únicos de fallo (SPOF).
Grafo de dependencias
flowchart TD
subgraph Tier_S["Tier S — Supervivencia"]
Geb["Geb (Cerbo GX)"]
ShellySotano["Shelly — Bomba sótano"]
end
subgraph Tier_A["Tier A — Crítico"]
Proxmox["Proxmox VE"]
ZFS["ZFS"]
PiHole["Pi-hole (DNS)"]
Authentik["Authentik (IdP)"]
Caddy["Caddy (proxy)"]
PostgreSQL["PostgreSQL"]
Mosquitto["Mosquitto (MQTT)"]
WireGuard["WireGuard"]
NetBird["NetBird"]
end
subgraph Tier_B["Tier B — Importante"]
Grafana["Grafana"]
Victoria["VictoriaMetrics"]
NodeRED["Node-RED"]
n8n["n8n"]
Nextcloud["Nextcloud"]
Immich["Immich"]
Matrix["Matrix Synapse"]
farmOS["farmOS"]
Ollama["Ollama"]
Forgejo["Forgejo"]
Ansible["Ansible"]
OpenTofu["OpenTofu"]
end
subgraph Tier_C["Tier C — Conveniente"]
Jellyfin["Jellyfin"]
Navidrome["Navidrome"]
Kavita["Kavita"]
Homepage["Homepage"]
Searxng["Searxng"]
FreshRSS["FreshRSS"]
Jitsi["Jitsi"]
ntfy["ntfy"]
Uptime["Uptime Kuma"]
Vaultwarden["Vaultwarden"]
end
subgraph Tier_D["Tier D — Experimental"]
PostHog["PostHog"]
Matomo["Matomo"]
BirdNET["BirdNET + Frigate"]
Continue["Continue.dev"]
Sherlog["Sherlog"]
end
%% Dependencias críticas
Authentik --> PostgreSQL
Authentik --> PiHole
Caddy --> Authentik
Caddy --> PiHole
Nextcloud --> PostgreSQL
Nextcloud --> Authentik
Nextcloud --> Caddy
Immich --> PostgreSQL
Immich --> Authentik
Immich --> Caddy
Matrix --> PostgreSQL
Matrix --> Authentik
Matrix --> Caddy
Grafana --> Victoria
Grafana --> Authentik
Grafana --> Caddy
Victoria --> Proxmox
NodeRED --> Mosquitto
NodeRED --> Authentik
farmOS --> PostgreSQL
farmOS --> Authentik
Ollama --> Proxmox
Forgejo --> PostgreSQL
Forgejo --> Authentik
Jellyfin --> Caddy
Jitsi --> Caddy
Mosquitto --> PiHole
NetBird --> PiHole
WireGuard --> PiHole
Geb --> Mosquitto
ShellySotano --> Mosquitto
n8n --> Authentik
n8n --> PostgreSQL
ntfy --> Caddy
Vaultwarden --> Caddy
Homepage --> Caddy
Uptime --> Caddy
%% Infraestructura base
PostgreSQL --> ZFS
Proxmox --> ZFS
Authentik --> ZFS
Caddy --> ZFS
Nextcloud --> ZFS
Immich --> ZFS
Matrix --> ZFS
Victoria --> ZFS
Grafana --> ZFS
Mosquitto --> ZFS
Ollama --> ZFS
Forgejo --> ZFS
Jellyfin --> ZFS
farmOS --> ZFS
style Tier_S fill:#ef9a9a,stroke:#c62828,color:#000
style Tier_A fill:#ffe082,stroke:#f57f17,color:#000
style Tier_B fill:#a5d6a7,stroke:#2e7d32,color:#000
style Tier_C fill:#90caf9,stroke:#1565c0,color:#000
style Tier_D fill:#ce93d8,stroke:#7b1fa2,color:#000
Cadenas de dependencia críticas
Cadena
Longitud
Impacto si se rompe
Persona → Caddy → Authentik → PostgreSQL → ZFS → Proxmox
6
Nadie puede acceder a ningún servicio con SSO
Persona → Caddy → Nextcloud → PostgreSQL → ZFS → Proxmox
6
Sin acceso a archivos, calendario, contactos
ESP32 → Mosquitto → Node-RED → ntfy → Persona
5
Sin alertas de campo en tiempo real
Prometheus → Alertmanager → ntfy → Persona
4
Sin notificaciones de monitorización
Ansible → SSH → LXC → Docker → Servicio
5
Sin capacidad de despliegue automatizado
Forgejo Actions → Ansible → SSH → LXC
4
Sin CI/CD para despliegues
Ollama → Qdrant → PostgreSQL → ZFS
4
Sin búsqueda semántica (RAG desactivado)
Geb → Mosquitto → Node-RED → Shelly → Bomba sótano
5
La bomba del sótano no se activa automáticamente
Análisis de Puntos Únicos de Fallo (SPOF)
Componente
¿SPOF?
Si cae, ¿qué se pierde?
Mitigación
Proxmox (Ra)
✅ Sí
Todos los LXC de Ra (~42 servicios)
ZFS snapshot @15min. Recuperación en <2h con hardware de repuesto
ZFS (rpool)
✅ Sí
Todos los datos persistentes
Backup 3-2-1. PBS diario + Restic offsite en Thoth
Authentik
✅ Sí
Acceso SSO a todos los servicios
Forward-auth bypass de emergencia. Recuperación en <15 min con runbook
Caddy
✅ Sí
Proxy inverso. Sin él, nada es accesible vía HTTPS
Configuración versionada en Forgejo. Recuperación en <5 min
Pi-hole
✅ Sí
Resolución DNS del dominio .sc
Registros DNS replicados en archivos hosts de emergencia
PostgreSQL
✅ Sí
Backend de 20+ servicios
Replicación en streaming a Horus. WAL archives en ZFS
Mosquitto
✅ Sí
Bus de mensajería IoT. Sin MQTT, los sensores no hablan
ESP32 almacenan datos localmente y retransmiten al reconectar
Red eléctrica
✅ Sí
Todo
Batería LiFePO4 4.8 kWh + SAI. Autonomía de 30 horas
Router internet
✅ Sí
Conectividad externa
Modo isla: el 90% de los servicios funcionan sin internet
Geb (Cerbo GX)
✅ Sí
Monitorización energética y automatismos solares
Sin Geb, Node-RED pierde telemetría. Batería y MPPT funcionan autónomamente
WireGuard
❌ No
Redundante con NetBird
Si WireGuard cae, NetBird mantiene la malla
NetBird
❌ No
Redundante con WireGuard
Si NetBird cae, WireGuard mantiene los túneles
Dependencias externas
SmallCountry minimiza las dependencias externas por diseño. Estas son las únicas que existen:
Dependencia
¿Crítica?
¿Modo isla?
Notas
Energía eléctrica
✅ Sí
✅ Batería + solar
30h de autonomía. Perfiles de ahorro automáticos
Proveedor de internet
⚠️ No
✅ Modo isla
90% de servicios funcionan sin internet
NTP (hora exacta)
⚠️ Baja
⚠️ Deriva del reloj
TOTP y TLS toleran derivas de varias horas
DNS externo
❌ No
✅ Pi-hole local
Solo necesario para servicios que consultan APIs externas
Let's Encrypt
❌ No
✅ Certs internos
Caddy usa certificados internos en modo isla
Estrategia de mitigación de SPOFs
Todo versionado en Forgejo. Si un servidor muere, Ansible reconstruye el servicio desde cero.
Backup 3-2-1. Tres copias, dos medios, uno externo (Thoth). Verificación semanal.
Modo isla. El sistema está diseñado para funcionar sin internet. El 90% de los servicios son isla-compatibles.
Runbooks. Cada SPOF tiene un runbook de recuperación documentado con pasos exactos.
Degradación independiente. Si un servicio cae, los que no dependen de él siguen funcionando (Mecanismo 3 ).