02 reconstruibilidad
Principio¶
SmallCountry debe poder regenerarse por completo desde un Proxmox VE limpio utilizando OpenTofu (infraestructura como código), Ansible (configuración declarativa con roles), Forgejo (fuente de verdad) y code-server (entorno de rescate).
Esta reconstrucción se apoya en un espejo local de paquetes y un registro OCI con cuarentena que garantizan la soberanía de la cadena de suministro y la operación offline.
La infraestructura es efímera; los datos son el único activo permanente.
Ciclo de reconstrucción completa¶
-
Arranque desde cero
El scriptbootstrap.shconfigura las fuentes de paquetes para usar exclusivamente el espejo local, instala OpenTofu y Ansible, y clona el repositorio central desde Forgejo.
No se necesita acceso a internet. -
**Aprovisionamiento con OpenTofu
OpenTofu recrea toda la estructura del sistema: bridges, VLANs, LXCs, volúmenes ZFS (sistema de archivos con integridad de datos) y reglas de firewall.
El archivo de estado de la infraestructura se protege localmente como un activo más. -
**Configuración declarativa con Ansible
Ansible aplica sus roles: instala paquetes desde el proxy caché local, despliega contenedores desde el registro OCI local y aplica configuraciones y certificados TLS (cifrado de comunicaciones).
La idempotencia asegura que el proceso es repetible y seguro. -
Verificación funcional
Se ejecutan tests automáticos: healthchecks HTTP, consultas de integridad a bases de datos y pruebas funcionales de servicios.
Objetivo de RTO (tiempo objetivo de recuperación): < 15 minutos.
Cadena de suministro soberana¶
Para que la reconstrucción y los despliegues diarios no dependan de repositorios externos, SmallCountry controla todos los artefactos que consume.
Espejo local (Tier A obligatorio)¶
| Recurso | Herramienta | Función |
|---|---|---|
| Paquetes Debian/Proxmox | Apt‑Cacher‑NG | Proxy caché transparente. Si internet cae, los paquetes ya descargados se siguen sirviendo. |
| Imágenes Docker | **Registro OCI pull‑through en Forgejo | Descarga, almacena en ZFS y sirve las imágenes. Los nodos de producción nunca acceden a Docker Hub. |
| Paquetes Python | Espejo PyPI local | Cachea las dependencias de Ansible, code-server y otras herramientas. |
Cuarentena de artefactos (Supply Chain Guard)¶
Todo artefacto nuevo debe pasar un período de cuarentena antes de usarse en producción.
| Tier del servicio | Período de cuarentena | Excepción |
|---|---|---|
| Tier A (Crítico) | 60 días | Solo parches de seguridad confirmados, tras verificación rápida. |
| Tier B (Importante) | 14 días | Solo parches de seguridad confirmados. |
| Tier C (Medio) | 7 días | – |
| Tier D/5 (Degradable/Efímero) | Sin cuarentena | – |
Pipeline de cuarentena automatizado:
- Cacheo: la nueva imagen o paquete se descarga en el espejo local.
- Escaneo: se analiza con Trivy (vulnerabilidades), se verifica su firma con Cosign y se inspecciona su SBOM (lista de componentes de software).
- Pruebas en staging: el artefacto se despliega en un entorno de pruebas y se ejecutan tests funcionales.
- Promoción: si pasa todas las verificaciones, se promociona para producción. Si falla, se bloquea y se alerta.
Stack necesario¶
- Proxmox VE – Hipervisor de destino.
- OpenTofu – Módulos declarativos para crear la infraestructura.
- Ansible + Semaphore – Roles declarativos para provisionar los servicios.
- Forgejo – Repositorio de código, CI/CD (integración y despliegue continuo) y registro OCI pull‑through.
- Apt‑Cacher‑NG – Proxy caché de paquetes APT.
- Espejo PyPI local – Caché de paquetes Python.
- Trivy, Cosign, SBOM – Herramientas de escaneo de la cadena de suministro.
- ZFS – Snapshots, réplicas e integridad de datos.
- code-server – IDE de rescate basado en navegador.
- Nivel 0 (Rescue Boat) – SSD físico con binarios, estado de OpenTofu y el script
bootstrap.sh.
Relaciones con otros principios¶
- 1. Infraestructura y configuración como código: la reconstrucción es la prueba irrefutable de que Forgejo es la fuente de verdad.
- 3. Aislamiento del núcleo y perímetro único de acceso: todo el proceso ocurre dentro del perímetro seguro, validando el modo isla como modo de operación real.
- 5. Resiliencia física delegada al hardware: mientras se reconstruye el mundo del software, los dispositivos físicos (bomba, riego) siguen funcionando de forma autónoma.
- 7. Soberanía operativa y operación local: el espejo y la cuarentena materializan la soberanía de la cadena de suministro, permitiendo la operación offline y la protección contra vulnerabilidades externas.
graph TD
%% Cadena de suministro soberana (columna izquierda)
subgraph Cadena [Cadena de suministro soberana]
direction TB
E1[Espejo APT / PyPI / OCI]
E2[Cuarentena Trivy + Cosign + SBOM]
E3[Staging + tests funcionales]
E4[Promoción a producción]
E1 --> E2 --> E3 --> E4
end
%% Arranque desde cero
subgraph Arranque [Arranque desde cero]
direction TB
A1[Proxmox VE limpio]
A2[bootstrap.sh]
A3[OpenTofu + Ansible instalados]
A4[Repositorio Forgejo clonado]
A1 --> A2 --> A3 --> A4
end
%% Aprovisionamiento
subgraph Aprovisionamiento [Aprovisionamiento]
direction TB
B1[OpenTofu]
B2[Bridges / VLANs / LXCs]
B3[Volúmenes ZFS]
B1 --> B2 --> B3
end
%% Configuración declarativa
subgraph Configuracion [Configuración declarativa]
direction TB
C1[Ansible + roles]
C2[Paquetes desde caché local]
C3[Contenedores desde registro OCI local]
C4[Certificados TLS]
C1 --> C2
C1 --> C3
C1 --> C4
end
%% Verificación funcional
subgraph Verificacion [Verificación funcional]
direction TB
D1[Healthchecks HTTP]
D2[Consultas de integridad]
D3[Pruebas funcionales de servicios]
D4[Objetivo RTO < 15 min]
D1 --> D2 --> D3 --> D4
end
%% Flujo vertical principal
Arranque --> Aprovisionamiento
Aprovisionamiento --> Configuracion
Configuracion --> Verificacion
%% Conexiones de la cadena de suministro
E4 --> A2
E1 --> C2
E1 --> C3
%% Colores por fase
style Cadena fill:#e1bee7,stroke:#8e24aa,color:#000
style Arranque fill:#f9a8d4,stroke:#c2185b,color:#000
style Aprovisionamiento fill:#90caf9,stroke:#1565c0,color:#000
style Configuracion fill:#a5d6a7,stroke:#2e7d32,color:#000
style Verificacion fill:#ffe082,stroke:#f57f17,color:#000
← Principio 1: Fuente única de verdad | Principio 3: Aislamiento del núcleo →
Declarativo vs Reactivo: dos paradigmas de automatización¶
SmallCountry utiliza dos motores de automatización con filosofías complementarias:
| Herramienta | Paradigma | Qué hace | Ejemplo |
|---|---|---|---|
| Ansible | Declarativo | Mantiene el estado deseado. Aplica una y otra vez la misma configuración idempotente. Si algo se desvía, lo corrige | "El LXC (contenedor ligero de Proxmox) de Nextcloud debe tener PostgreSQL 16 instalado y el puerto 8080 abierto" |
| n8n | Reactivo | Responde a eventos en tiempo real. Detecta un cambio, ejecuta un flujo y se detiene | "Ha fallado el backup nocturno → notificar al admin y crear un issue en Forgejo" |
Ansible garantiza que el paisaje es correcto. n8n garantiza que el sistema reacciona a lo que ocurre. Ambos se ejecutan desde Semaphore para tener trazabilidad unificada, y ambos se definen en código versionado en Forgejo.