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.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.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
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"
Todavía no se probó que el sysctl persistente se aplique después de un
**reinicio real del NAS**. Tampoco se sabe si una actualización de
ZimaOS pisa `upper_etc`. En el próximo reinicio, revisar
`sysctl net.ipv6.conf.all.disable_ipv6` antes de dar por cerrado este
punto.
Falta confirmar que el drop-in de `/etc/sysctl.d/` se aplique solo en
el **próximo** reinicio. Tampoco se sabe si una actualización de
ZimaOS pisa `upper_etc`.
---
@@ -312,13 +360,16 @@ con un dato observable, no por deducción.
## Pendientes
- [ ] **Commitear el fix de `entrypoint.sh`.** La imagen `fix-real` que
corre en producción lo tiene, pero en el repo `scripts` el cambio
sigue como modificación local sin commitear (`git status` →
`M tmux-host/entrypoint.sh`). Si alguien reconstruye la imagen
desde `main`, vuelve el `set -eu` sin supervisor.
- [ ] Validar que IPv6 siga deshabilitado después del próximo reinicio
real del NAS (ver la nota de la causa c).
- [ ] Limpiar las etiquetas de imagen viejas de `tmux-host`
(`supervised`, `supervised-v2`, `local`, `test-fix`, etc.) para no
confundir cuál es la vigente.
- [x] ~~Commitear el fix de `entrypoint.sh`.~~ Mergeado a `main` del repo
`scripts` el 2026-09-26 (`510cc41`). Antes se verificó que
`entrypoint.sh` y `healthcheck.sh` del repo fueran idénticos (md5) a
los de la imagen `fix-real` en producción.
- [x] ~~Validar que IPv6 siga deshabilitado después de un reinicio
real del NAS.~~ Probado el 2026-09-26 y **falló**: `/etc/sysctl.conf`
no se aplica al arrancar en ZimaOS. Se movió a
`/etc/sysctl.d/99-disable-ipv6.conf` (ver la causa c).
- [ ] Confirmar en el próximo reinicio que el drop-in de
`/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).