squid corre desde el corpus: la jaula duró unas horas y se tiró

`b3:932ba096…` proyectado en la caja y arrancado por arje SIN bwrap: `pid 11548 · uid=968 ·
exe=/usr/sbin/squid`, con la cuenta `proxy` que declara la receta. La instancia `qorpa/squid` se
borró — el manifiesto es descartable por diseño (ADR 0015 D3) y esto es para lo que existía.

El arreglo de esta tanda: **`--disable-log-daemon-helpers` compilaba perfecto y no arrancaba**. El
default de `access_log` es `daemon:`, asi que sin `log_file_daemon` squid muere con `FATAL:
logfile_daemon /usr/lib/squid/log_file_daemon: (2) No such file or directory`. Sellaba, hasheaba y
pasaba `-k parse` — se ve SOLO levantando el servicio con la config real. Familia
[[subcomando-sin-driver]].

El control que lo caza, y que corre en el hub antes de tocar produccion: con la config REAL del
origen y en un puerto aparte, arranque completo + CONNECT a claude.ai y api.anthropic.com con
TCP_TUNNEL/200 + el access.log escrito por el log daemon + `basic_ncsa_auth` leyendo el `passwd` de
verdad (control negativo: clave mala ⇒ `ERR Wrong password`). Los DOS primeros intentos de esta
receta habrian llegado a produccion sin ese control: el binario estaba sellado y el hash era estable
las dos veces.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sergio
2026-09-15 20:04:54 +00:00
co-authored by Claude Opus 5
parent eb7bfb19a9
commit b927eeffcb
2 changed files with 54 additions and 1 deletions
+47
View File
@@ -1644,6 +1644,53 @@ minutos, sin compilar nada—, no la respuesta final. La diferencia con `php-fpm
definitivo), mientras que **`squid` es C, se compila con el lab y su sitio natural es una receta**
como la de `gitea`. Cuando esté, la instancia se tira: el manifiesto es descartable a propósito.
### 6.28 📦 `squid` YA NO ESTÁ ENJAULADO: corre desde el corpus *(2026-09-15)*
La jaula del §6.27 duró unas horas, que es lo que tenía que durar. **Hoy el proxy de producción es
el artefacto sellado `b3:932ba096…`**, proyectado en la caja y arrancado por arje sin bwrap de por
medio: `pid 11548 · uid=968 · exe=/usr/sbin/squid`. La instancia `qorpa/squid` se borró — el
manifiesto es descartable por diseño (D3) y esto es exactamente para lo que existía esa salida.
`recipes/squid.toml`: 7.7, estático de verdad (binario **y** los cuatro helpers), `[[user]] proxy`
con uid 968 y `[[service]]` del SDD 30. Declarado en `perfil.servidor` como paquete y en `servicios`.
**La config NO viaja en el paquete y es a propósito**: `squid.conf`, el `passwd` de los tres usuarios
y las dos ACL (412 K, 40 IPs autorizadas) son datos del SITIO. El servicio los comprueba al arrancar
y sale **78 nombrando cuál falta**, en vez de dejar un bucle de reinicios.
#### Los tres muros de la receta, en orden
1. **La URL de upstream devolvía una página HTML de 8985 bytes con un 200.**
`squid-cache.org/Versions/v7/squid-7.7.tar.xz` no es el tarball. Pinear su sha256 habría anclado
la receta a una página de error — y habría «funcionado» hasta el primer build. Va el release de
GitHub, que además trae `configure` generado.
2. 🧨 **`--export-dynamic` desactivaba el enlace estático, y el binario sellaba igual.** El primer
artefacto tenía `usr/sbin/squid` **dinámico con `NEEDED libc.so`** mientras sus helpers salían
estáticos: inerte en cualquier imagen sin cargador ([[needed-colgante-libstdcxx]]) pese a
`link = "static"`. La cadena tiene tres eslabones y ninguno es obvio: `squid_LDFLAGS` trae
`-export-dynamic` (para módulos eCAP, apagados) → **el wrapper del lab quita `-static` de
cualquier enlace que mencione `--export-dynamic`**, a propósito, para poder enlazar las `.so`
dlopen-ables de Python → y **libtool vuelve a añadirlo solo** en cuanto hay un `-dlopen`, así que
sacarlo de la variable no alcanza. Se vacía `export_dynamic_flag_spec` en el `libtool` GENERADO,
con guarda que aborta si el campo no aparece: *un `sed` que no acierta deja pasar el problema y
el binario sale dinámico sin que nada falle*.
⚠ Y `-dlopen force` **no sobra**: vaciar `squid_LDFLAGS` entero rompe el enlace con
`undefined symbol: lt__PROGRAM__LTX_preloaded_symbols`, que emite el propio libtool porque hay un
`-dlopen`. De los dos flags estorba uno; distinguirlos costó un build y adivinar cuesta lo mismo.
3. **`--disable-log-daemon-helpers` compilaba perfecto y no arrancaba.** El default de `access_log`
es `daemon:`, así que sin `log_file_daemon` squid muere con
`FATAL: logfile_daemon /usr/lib/squid/log_file_daemon: (2) No such file or directory`. **Sólo se
ve levantando el servicio con la config real; el sellado, el hash y el `-k parse` pasan los tres.**
Es la familia de [[subcomando-sin-driver]] otra vez.
#### El control que hay que correr antes de tocar producción
Con la config REAL del origen, en el hub y en un puerto aparte: `-k parse` sin FATAL, arranque
completo, **`CONNECT claude.ai` y `CONNECT api.anthropic.com` con TCP_TUNNEL/200**, el `access.log`
escrito por el log daemon, y el `basic_ncsa_auth` leyendo el `passwd` de verdad (control negativo:
con una clave mala contesta `ERR Wrong password`). Los dos primeros intentos de esta receta habrían
llegado a producción sin ese control: el binario estaba sellado y el hash era estable las dos veces.
## 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:
+7 -1
View File
@@ -27,6 +27,12 @@
# protocolos de red que este proxy no habla. `eui` además quiere las cabeceras de ARP del sistema.
# · `--disable-translation`: las páginas de error localizadas se GENERAN con `po2html`, que el lab
# no trae. El inglés sale igual.
# · ⚠ `--enable-log-daemon-helpers=file` **no es opcional aunque suene a extra**: el default de
# `access_log` es `daemon:/var/log/squid/access.log`, y sin ese helper squid arranca, avisa… y
# muere con `FATAL: logfile_daemon /usr/lib/squid/log_file_daemon: (2) No such file or directory`.
# La primera versión de esta receta lo apagaba junto al resto de los helpers y sólo se vio al
# levantar el servicio con la config real — nunca al construir. Los que sí sobran (DB, reescritura
# de URL, ACL externas) siguen apagados.
name = "squid"
version = "7.7"
license = "GPL-2.0-or-later"
@@ -51,7 +57,7 @@ configure = '''
--disable-arch-native --disable-strict-error-checking --disable-translation \
--enable-auth-basic=NCSA --disable-auth-digest --disable-auth-negotiate --disable-auth-ntlm \
--disable-external-acl-helpers --disable-url-rewrite-helpers --disable-storeid-rewrite-helpers \
--disable-log-daemon-helpers --disable-security-cert-validators --disable-security-cert-genrators \
--enable-log-daemon-helpers=file --disable-security-cert-validators --disable-security-cert-genrators \
--disable-icap-client --disable-snmp --disable-wccp --disable-wccpv2 --disable-eui --disable-htcp \
--without-openssl --without-gnutls --without-nettle --without-cap --without-systemd \
--without-ldap --without-sasl --without-gss --without-mit-krb5 --without-heimdal-krb5 \