Compare commits

..
2 Commits
Author SHA1 Message Date
devops 2566e06abd Merge branch 'docs/tmux-host-ipv6-reinicio-2026-09-26'
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 9m35s
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 42s
2026-09-26 19:22:40 +00:00
devopsandClaude Opus 5.5 c7ac1b52be docs(playbooks): resultado del reinicio real, IPv6 via /etc/sysctl.d en ZimaOS
La prueba de reinicio del NAS (2026-09-26) mostro que /etc/sysctl.conf
persiste pero ZimaOS no lo aplica al arrancar (systemd-sysctl solo lee
/etc/sysctl.d/*.conf, sin symlink 99-sysctl.conf). Se documenta la causa,
el fix con /etc/sysctl.d/99-disable-ipv6.conf, como aplicarlo en caliente
con un contenedor privilegiado de un solo uso, y se cierran los pendientes
ya resueltos (commit de entrypoint.sh, limpieza de etiquetas).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_018r19s4H8MBGegqToqw5guP
2026-09-26 19:22:39 +00:00
@@ -176,7 +176,8 @@ en caliente y persistente:
sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1
# Persistente: /etc/sysctl.conf del host # Persistente: /etc/sysctl.d/99-disable-ipv6.conf del host
# (NO /etc/sysctl.conf -- ver "Validación tras reinicio real" abajo)
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
``` ```
@@ -207,12 +208,59 @@ pero `/etc` es un overlay con capa de escritura en
`/mnt/overlay/upper_etc` (ext4 en `/dev/sdc7`), así que el archivo `/mnt/overlay/upper_etc` (ext4 en `/dev/sdc7`), así que el archivo
persiste. persiste.
### Validación tras reinicio real: `/etc/sysctl.conf` no alcanzaba (2026-09-26)
Se reinició el NAS a propósito (~17:13Z) para probar la persistencia.
Resultado **(verificado)**:
- `/etc/sysctl.conf` **sí** sobrevivió al reinicio con las dos líneas
(el overlay de `/etc` persiste).
- Pero `sysctl net.ipv6.conf.all.disable_ipv6` volvió a dar **`0`**: el
archivo existía y **nunca se aplicó** al arrancar.
**Causa.** En ZimaOS, `systemd-sysctl` solo carga `/etc/sysctl.d/*.conf`
(y `/usr/lib/sysctl.d/`, `/lib/sysctl.d/`). Otras distros traen un
symlink `/etc/sysctl.d/99-sysctl.conf -> ../sysctl.conf` que hace que
`/etc/sysctl.conf` también se lea al arrancar. **ZimaOS no lo trae**, así
que escribir en `/etc/sysctl.conf` funciona solo en caliente (con
`sysctl -p`) y no sobrevive un reinicio. Nada avisa del problema: el
archivo está, el contenido es correcto y el valor igual vuelve a `0`.
**Por qué no se rompió enseguida.** Tras el reinicio el host no tenía
ninguna IPv6 global utilizable, así que `getaddrinfo` no devolvía la AAAA
de `api.anthropic.com` y todo salía por IPv4. Pero `curl -6` seguía
fallando (`Could not connect to server`). Si el router vuelve a entregar
una IPv6 global por SLAAC, vuelve el timeout. Funcionaba por casualidad,
no porque estuviera corregido.
**Fix.** Mover la configuración a un drop-in que ZimaOS sí lee:
`/etc/sysctl.d/99-disable-ipv6.conf` (mismas dos líneas).
Para aplicarlo en caliente sin reiniciar: dentro de `tmux-host`,
`/proc/sys` es de solo lectura (`sysctl -w` → `Read-only file system`).
Hace falta un contenedor privilegiado de un solo uso en la red del host,
o `sudo sysctl -p` directo en el host:
```bash
docker run --rm --privileged --network host \
-v /etc/sysctl.d:/etc/sysctl.d:ro \
alpine sysctl -p /etc/sysctl.d/99-disable-ipv6.conf
```
**Validado en vivo (verificado, 2026-09-26 ~19:15Z):**
`disable_ipv6 = 1` en `all` y `default`, ninguna dirección IPv6 global en
el host y `curl` a `api.anthropic.com` por IPv4 (`connect=0.035s`).
!!! warning "Lección"
"El archivo de configuración persistió" no es lo mismo que "la
configuración se aplica al arrancar". La única validación real de
algo persistente es **reiniciar y medir el valor efectivo**, no
revisar que el archivo siga ahí.
!!! note "Pendiente de validar" !!! note "Pendiente de validar"
Todavía no se probó que el sysctl persistente se aplique después de un Falta confirmar que el drop-in de `/etc/sysctl.d/` se aplique solo en
**reinicio real del NAS**. Tampoco se sabe si una actualización de el **próximo** reinicio. Tampoco se sabe si una actualización de
ZimaOS pisa `upper_etc`. En el próximo reinicio, revisar ZimaOS pisa `upper_etc`.
`sysctl net.ipv6.conf.all.disable_ipv6` antes de dar por cerrado este
punto.
--- ---
@@ -312,13 +360,16 @@ con un dato observable, no por deducción.
## Pendientes ## Pendientes
- [ ] **Commitear el fix de `entrypoint.sh`.** La imagen `fix-real` que - [x] ~~Commitear el fix de `entrypoint.sh`.~~ Mergeado a `main` del repo
corre en producción lo tiene, pero en el repo `scripts` el cambio `scripts` el 2026-09-26 (`510cc41`). Antes se verificó que
sigue como modificación local sin commitear (`git status` → `entrypoint.sh` y `healthcheck.sh` del repo fueran idénticos (md5) a
`M tmux-host/entrypoint.sh`). Si alguien reconstruye la imagen los de la imagen `fix-real` en producción.
desde `main`, vuelve el `set -eu` sin supervisor. - [x] ~~Validar que IPv6 siga deshabilitado después de un reinicio
- [ ] Validar que IPv6 siga deshabilitado después del próximo reinicio real del NAS.~~ Probado el 2026-09-26 y **falló**: `/etc/sysctl.conf`
real del NAS (ver la nota de la causa c). no se aplica al arrancar en ZimaOS. Se movió a
- [ ] Limpiar las etiquetas de imagen viejas de `tmux-host` `/etc/sysctl.d/99-disable-ipv6.conf` (ver la causa c).
(`supervised`, `supervised-v2`, `local`, `test-fix`, etc.) para no - [ ] Confirmar en el próximo reinicio que el drop-in de
confundir cuál es la vigente. `/etc/sysctl.d/` deja IPv6 en `1` sin intervención.
- [x] ~~Limpiar las etiquetas de imagen viejas de `tmux-host`.~~ Hecho el
2026-09-26: quedan solo `2026-09-26-fix-real` (vigente) y
`2026-09-20-uv` (rollback).