gioser

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 1572Shell 203Rust 109Markdown 993728 Definitions

⎇ main recipes/caddy.toml TOML · 60 lines · 3.6 KB History raw

CUTOVER: el gitea sirve desde la caja nueva — TLS válido, HTTPS y SSH, supervisado por arje 69526768b · Sergio ·

1# caddy 2.11.4 — servidor web y proxy inverso. Un binario Go estático, sin dependencias en runtime.
2#
3# ── ESTADO: TERMINADA (2026-09-11). Antes era un import de nix en crudo ────────────────────────
4# La cabecera decía «PUNTO DE PARTIDA, no final» y el `commit` era el TAG FLOTANTE `v2.11.4`, que
5# contradice el ADR 0006: un tag se puede mover, y entonces la misma receta construye otra cosa sin
6# que el hash lo note. Anclado con `takana pin` al SHA inmutable `e2eee6a7…` — el hash se movió a
7# propósito (`b3:d38acaa0…` → nuevo), que es exactamente lo que un anclaje debe hacer.
8#
9# ── POR QUÉ IMPORTA QUE ESTÉ TERMINADA ─────────────────────────────────────────────────────────
10# El `caddy` de gioser **no tiene dueño**: es un binario puesto a mano en `/usr/bin`, sin paquete y
11# sin receta (medido por `scripts/mudanza/censar.py`, que le preguntó a pacman). Se pierde con la
12# máquina. Con esta receta el servidor nuevo lo declara en su perfil y lo reconstruye — que es la
13# diferencia entre mudar un servidor y poder mudarlo otra vez (SDD 29).
14#
15# `link = "static"` y CGO apagado: Go estático no arrastra sonames, así que no repite la fuga del
16# `NEEDED` colgante — el binario corre en la imagen sin el sysroot del lab debajo.
17name    = "caddy"
18version = "2.11.4"
19license = "Apache-2.0"
20
21[source]
22repo   = "https://github.com/caddyserver/caddy"
23commit = "e2eee6a7fce366321294c9c2a79f3146891dcbdf"
24
25[build]
26compiler = "zig-cc"
27target   = "x86_64-linux-musl"
28link     = "static"
29flags    = []
30
31# `go` es herramienta de BUILD, no dependencia de runtime: el binario sale autocontenido.
32[deps]
33build = ["go"]
34
35# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
36# Fuera de `hash_inputs`: declarar esto NO re-hashea caddy.
37#
38# Caddy es el que pone la cara al exterior: sin él, un dominio mudado no responde aunque su backend
39# esté vivo. La guarda comprueba el Caddyfile y sale 78 nombrándolo — un caddy sin config **arranca
40# igual** y sirve una página vacía en el 80, que es peor que no arrancar: el dominio parece vivo.
41#
42# ⚠ `HOME` NO es cosmético: ahí guarda las claves y los certificados de ACME
43# (`$HOME/.local/share/caddy`). Con el HOME del padre, un reinicio pediría certificados NUEVOS a
44# Let's Encrypt y se comería el límite de emisión del dominio.
45#
46# Corre como ROOT a propósito: enlaza :80 y :443, que son privilegiados. La alternativa es
47# `setcap cap_net_bind_service`, que no se puede aplicar desde el store (el artefacto es de sólo
48# lectura y los caps no viajan en el hardlink) ⇒ sería estado fuera del árbol, que es justo lo que
49# esta distro evita. Queda anotado como decisión, no como olvido.
50#
51# Rutas ABSOLUTAS: el `sh` de busybox no despacha applets y PID 1 no garantiza `PATH`.
52[[service]]
53label      = "caddy"
54id         = "01M2EKDA00V4XCPRH5WRSGDAJP"
55exec       = "/bin/busybox"
56argv = ["sh", "-c", "test -f /etc/caddy/Caddyfile || { echo 'caddy: falta /etc/caddy/Caddyfile — es config del SITIO' >&2; exit 78; }; /bin/mkdir -p /var/lib/caddy /var/log/caddy; exec /usr/bin/caddy run --config /etc/caddy/Caddyfile --adapter caddyfile"]
57envp       = [["PATH", "/usr/bin:/bin"], ["HOME", "/var/lib/caddy"], ["XDG_DATA_HOME", "/var/lib/caddy"]]
58networking = "full"
59cgroup     = "arje.slice/caddy"
60restart    = { initial_ms = 1000, max_ms = 30000 }