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 \