From b927eeffcb6969101d9259bc3887beac5065b651 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 15 Sep 2026 20:04:54 +0000 Subject: [PATCH] =?UTF-8?q?squid=20corre=20desde=20el=20corpus:=20la=20jau?= =?UTF-8?q?la=20dur=C3=B3=20unas=20horas=20y=20se=20tir=C3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `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) --- docs/28-servidor-de-produccion.md | 47 +++++++++++++++++++++++++++++++ recipes/squid.toml | 8 +++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/docs/28-servidor-de-produccion.md b/docs/28-servidor-de-produccion.md index 1ce3794e..f5767210 100644 --- a/docs/28-servidor-de-produccion.md +++ b/docs/28-servidor-de-produccion.md @@ -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: diff --git a/recipes/squid.toml b/recipes/squid.toml index 4d246b7d..c5ec03ff 100644 --- a/recipes/squid.toml +++ b/recipes/squid.toml @@ -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 \