# modules/matilda/ — Administración de servidores **Propósito.** Administrar servidores de forma declarativa: se describe el inventario deseado (hosts, contenedores Docker, vhosts de proxy inverso) y matilda renderiza la configuración y calcula el plan que reconcilia el estado actual con el deseado. ## Crates | crate | tipo | rol | | ---------------- | ---- | ------------------------------------------------------------ | | `matilda-core` | lib | Modelo: `Host`, `Container`, `VHost`, `Inventory` | | `matilda-config` | lib | Renderizado: `Container` → docker-compose / `docker run`; `VHost` → nginx | | `matilda-plan` | lib | Reconciliación: `plan(actual, deseado)` → lista ordenada de `Action`s | App: `apps/matilda` — demo CLI (`cargo run -p matilda`). ## Flujo ```text Inventory (deseado) ──► matilda-config ──► docker-compose.yml + nginx │ └──► matilda-plan ◄── Inventory (actual) ──► Plan { actions } ``` - **Declarativo**: el inventario describe *qué* debe existir; nadie ejecuta nada en `core`/`config`/`plan` — son funciones puras. - **Plan ordenado**: crear contenedores antes que vhosts; eliminar vhosts antes que sus contenedores. Determinista (inventario en `BTreeMap`). ## Dependencias - `config` y `plan` ← `matilda-core`. Todos `#![forbid(unsafe_code)]`. - Cero Docker, cero SSH, cero disco — sólo modelos y strings. ## Estado `core` + `config` + `plan` implementados y verdes (29 tests) + demo CLI. **Pendiente** (la capa de I/O, ~7 sub-crates del plan original): | crate pendiente | rol | | ----------------- | ------------------------------------------------ | | `matilda-linker` | transporte SSH (sobre `transport-ssh-multiplex`) | | `matilda-ghost` | agente remoto que aplica el plan en el servidor | | `matilda-docker` | ejecución real de Docker vía Linker/Ghost | | `matilda-app` | frontend GPUI |