5b9d8107fc
Traduce un Plan de reconciliación a ApplySteps concretos: por cada acción, los archivos a escribir en el servidor y los comandos a correr. Contenedores → docker rm/run; vhosts → archivo nginx + reload; hosts → sin pasos (son destino de conexión, no algo a aplicar). steps_to_script() emite un script bash único con heredocs. Sigue agnóstico de transporte — ejecutar los pasos (local, SSH o vía matilda-ghost) es la capa de I/O. La demo CLI ahora imprime el script. 6 tests; matilda llega de la declaración al script ejecutable. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
51 lines
2.2 KiB
Markdown
51 lines
2.2 KiB
Markdown
# 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 |
|
|
| `matilda-apply` | lib | Puente plan→ejecución: `Action`s → `ApplyStep`s (archivos + comandos) y script de shell |
|
|
|
|
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` + `apply` implementados y verdes (35 tests) +
|
|
demo CLI. La cadena pura ya llega de la declaración al script de shell
|
|
concreto listo para correr en el servidor.
|
|
|
|
**Pendiente** (la capa de I/O):
|
|
|
|
| crate pendiente | rol |
|
|
| ----------------- | ------------------------------------------------ |
|
|
| `matilda-linker` | transporte SSH (sobre `transport-ssh-multiplex`) |
|
|
| `matilda-ghost` | agente remoto que ejecuta los `ApplyStep`s |
|
|
| `matilda-app` | frontend GPUI |
|