tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1569Shell 203Rust 109Markdown 993728 Definitions

la caja arrancó con nf_tables — y la Semilla la levantó ENTERA sola

`nft list ruleset` contesta vacío y sin error: nf_tables funciona por primera vez en una máquina
takana. Comprobado con el mecanismo que reemplaza a fail2ban y no con una regla de adorno: un set
`flags dynamic` con `add @ban4 { ip saddr timeout 10s limit rate over 5/minute } drop`, aceptado por
el kernel y releído tal cual.

LO QUE EL REINICIO PROBÓ DE PASO, y vale más que el kernel: la Semilla levantó los OCHO entes sola,
todos con ↻ 0 — incluidos los DOS enjaulados en qorpa, que arrancan desde el genesis con su
newuidmap, su overlay y su harkaq igual que un binario nativo. Todo lo que se editó en
/ente/seed.card.json a lo largo del día era hasta ahora una declaración SIN PROBAR: un reinicio es
el único examen que toma. Desde fuera, al minuto: siete dominios en 200, el proxy en 407 y
`git ls-remote` por SSH:2345 devolviendo el commit. Cero intervención.

⚠ `reboot` NO reinicia una caja con arje-zero: le pide a PID 1 que lo haga y arje-zero no implementa
ese protocolo — el comando vuelve, no dice nada, y la máquina sigue arriba (`up 4 days` después de
«reiniciar»). Funciona `reboot -f`, que llama a reboot(2) saltándose al init. Falta la pieza: un
init que gobierna producción tiene que atender un apagado ordenado.

🧨 Y CASI REINICIO EL HUB POR UN BACKTICK: el aviso decía «no atiende el `reboot` normal» dentro de
comillas DOBLES, y la shell ejecutó lo de entre backticks — `reboot`, en gioser. No pasó nada porque
la sesión no es root y OpenRC contestó «you must be root». Es la TERCERA vez en el día que un
backtick dentro de un texto se ejecuta; las otras dos sólo se comieron un comentario. La regla deja
de ser de estilo: nunca un backtick dentro de comillas dobles en una shell.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

70e4c540d3dd5de028786530ac283af2651c743c · by Sergio · (1 month ago) · parent f57c18ab7 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

1 files · +52 −0

diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md
index ee997f71..c68a283b 100644
--- a/docs/28-servidor-de-produccion.md
+++ b/docs/28-servidor-de-produccion.md
@@ -1778,6 +1778,58 @@ ofrecer contraseña ✅, `:2345` igual ✅, y el `git ls-remote` por SSH sigue f
 Decidir «fail2ban muere porque tenemos algo mejor» es correcto **y** deja un hueco abierto hasta que
 ese algo mejor pueda ejecutarse. Entre la decisión y la capacidad hay un kernel de por medio.
 
+### 6.31 ✅ La caja arrancó con `nf_tables` — y el init la levantó ENTERA sola *(2026-09-15)*
+
+    $ nft list ruleset
+    $                       ← sin error: vacío, que es lo correcto en una caja sin reglas
+
+El kernel `b3:63fdd57c…` bootea, y con él **`nft` funciona por primera vez en una máquina takana**.
+Comprobado con el mecanismo exacto que reemplaza a fail2ban, no con una regla de adorno: un
+`set ... flags dynamic; timeout 10s` con `add @ban4 { ip saddr timeout 10s limit rate over 5/minute }
+drop` — aceptado por el kernel (`rc=0`) y releído tal cual. Eso es el ban por IP **dentro del
+kernel**, sin daemon.
+
+#### Lo que el reinicio probó de paso, y vale más que el kernel
+
+**La Semilla levantó los OCHO entes sola, todos con `↻ 0`:** `sshd`, `gitea`, `caddy`, `squid`,
+`crond`, `chronyd`, `sergioh-api` y `gioser-php` — o sea los dos servicios enjaulados en `qorpa`
+(con su `newuidmap`, su overlay y su `harkaq`) **arrancan desde el genesis igual que un binario
+nativo**. Todo lo que se fue editando en `/ente/seed.card.json` a lo largo del día era, hasta este
+momento, una declaración sin probar: un reinicio es el único examen que toma.
+
+Desde fuera, al minuto: los siete dominios en **200**, el proxy en **407** y `git ls-remote` por
+SSH:2345 devolviendo el commit. Cero intervención.
+
+#### ⚠ `reboot` NO reinicia una caja con arje-zero
+
+`reboot` de busybox le pide a PID 1 que lo haga, y **arje-zero no implementa ese protocolo**: el
+comando vuelve, no dice nada, y la máquina sigue arriba (`up 4 days` después de «reiniciar»). Lo que
+sí funciona es **`reboot -f`**, que llama a `reboot(2)` directo saltándose al init. Con `sync` antes,
+claro: el corte es duro por definición.
+
+⇒ **Y falta la pieza**: un init que gobierna un servidor de producción tiene que atender un apagado
+ordenado. Hoy la única vía es el corte duro, que ya costó el `write_atomic` no durable del §6.13.
+
+#### 🧨 Casi reinicio el HUB por un backtick en un `echo`
+
+Escribiendo el aviso del reinicio, el mensaje decía ``… no atiende el `reboot` normal …`` dentro de
+comillas DOBLES. La shell ejecutó lo que había entre backticks: **`reboot`, en gioser**. No pasó nada
+por una razón que no es mérito de nadie —la sesión no es root y OpenRC contestó «you must be root»—
+y el hub lleva 11 días arriba, con la granja y el cron encima.
+
+Es la **tercera vez en el día** que un backtick dentro de un texto se ejecuta
+([[heredoc-sin-comillas-ejecuta-comentarios]]), y las dos anteriores sólo se comieron un comentario.
+La regla deja de ser de estilo: **nunca un backtick dentro de comillas dobles en una shell** —
+comillas simples, o `$(printf '%s' …)`, o directamente no poner el acento grave en el texto.
+
+#### Lo que queda para cerrar el frente del cortafuegos
+
+El kernel ya no estorba; falta **la política**: `PoliticaEntrada` (.ron) → `generate-input` →
+`apply-input` del cortafuegos de tawasuyu, con los puertos reales de la caja (`22022`, `2345`, `80`,
+`443`, `1137`). ⚠ Y hay que aplicarla con **interruptor de hombre muerto** (aplicar, esperar, y
+`flush` automático si nadie confirma): una regla mal puesta en una caja **sin consola serie** deja
+la única salida en `hcloud server enable-rescue`.
+
 ## 7. Reusar los scripts que ya existen, y no escribir de nuevo
 
 Pedido explícito del usuario. El inventario de lo que ya hace el trabajo: