From 72a271550218d548a918a1b5f1ba043d15b55767 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Thu, 27 Aug 2026 23:04:26 -0500 Subject: [PATCH] docs: agrega mount de .claude.json (la confianza del folder no persistia) hasTrustDialogAccepted vive en ~/.claude.json (archivo suelto en /root), no dentro de ~/.claude/ que ya estaba montado -- se perdia en cada recreacion del contenedor pese a que el login si persistia. Fix: bind mount archivo-a-archivo, sembrado con el .claude.json ya confirmado. Verificado en vivo: claude arranca sin re-pedir el dialogo tras recrear el contenedor. --- .../arquitectura/sesion-tmux-persistente.md | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/workloads/docs-portal/docs/arquitectura/sesion-tmux-persistente.md b/workloads/docs-portal/docs/arquitectura/sesion-tmux-persistente.md index 5025b55..dc06db2 100644 --- a/workloads/docs-portal/docs/arquitectura/sesion-tmux-persistente.md +++ b/workloads/docs-portal/docs/arquitectura/sesion-tmux-persistente.md @@ -57,6 +57,7 @@ docker run -d \ -v /media/HDD-Storage:/media/HDD-Storage \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /DATA/AppData/k3d-lab-v3/claude-code-home:/root/.claude \ + -v /DATA/AppData/k3d-lab-v3/claude-code-home.json:/root/.claude.json \ --network host \ alpine sh -c "apk add --no-cache tmux docker-cli bash curl git kubectl nodejs npm && npm install -g @anthropic-ai/claude-code && git config --global --add safe.directory '*' && tail -f /dev/null" ``` @@ -67,6 +68,7 @@ docker run -d \ | `/media/HDD-Storage` | `/media/HDD-Storage` | Ver "Gotcha: el symlink `/DATA/AppData`" abajo — sin esto, los repos no se ven dentro del contenedor pese a montar `/DATA` | | `/var/run/docker.sock` | `/var/run/docker.sock` | Seguir controlando Docker y k3d (contenedores, `k3d node`, etc.) desde dentro del contenedor | | `/DATA/AppData/k3d-lab-v3/claude-code-home` | `/root/.claude` | Persistir login/config de Claude Code — sobrevive no solo a un `docker restart`, sino a recrear el contenedor entero | +| `/DATA/AppData/k3d-lab-v3/claude-code-home.json` | `/root/.claude.json` | Ver "Gotcha: la confianza del folder no persistía" abajo — es un archivo suelto, no vive dentro de `~/.claude/` | ## Gotcha: el symlink `/DATA/AppData` @@ -127,6 +129,40 @@ bajo el volumen de `/root/.claude`) — se perdería si el contenedor se recrea. Ponerla en el `sh -c` de arranque la deja recreándose sola cada vez, sin pasos manuales que recordar. +## Gotcha: la confianza del folder no persistía + +Al abrir `claude` por primera vez en un directorio, pide confirmar un +diálogo de "¿confiás en este folder?" (más aún acá, porque este repo +trae un `.claude/settings.local.json` con permisos pre-aprobados). Esa +confirmación se guarda en `~/.claude.json` — un **archivo suelto en +`/root`**, no dentro de la carpeta `~/.claude/` que ya estaba montada +como volumen. Resultado: aunque el login (`~/.claude/.credentials.json`) +sí persistía, el diálogo de confianza volvía a aparecer cada vez que +se recreaba el contenedor — justo el tipo de "reconfigurar de nuevo" +que este setup existe para evitar. + +**Cómo se detectó:** al confirmar el diálogo por primera vez, se +comparó `/root/.claude.json` dentro del contenedor contra sí mismo +antes y después — mismo tamaño y mismo `mtime`, es decir, la +confirmación en pantalla nunca se había registrado. La causa real: +la primera vez se movió el selector con las flechas pero nunca se +presionó Enter, así que en rigor el diálogo seguía sin confirmar; una +vez confirmado *de verdad* (`tmux send-keys` moviendo el cursor a +"Yes, I trust this folder" + Enter), el archivo saltó de 2.2 KB a +40 KB y apareció la clave `projects` con la ruta del repo adentro. + +**Fix:** copiar ese `.claude.json` ya confirmado a +`/DATA/AppData/k3d-lab-v3/claude-code-home.json` en el host, y +montarlo **archivo a archivo** (no como carpeta) en +`-v .../claude-code-home.json:/root/.claude.json`. A diferencia de +los demás volúmenes de este setup, este necesitó sembrarse con +contenido real primero — un bind mount de archivo con un origen que +no existe todavía en el host termina creando un directorio vacío en +su lugar, no un archivo, y rompe el arranque del contenedor. +Verificado en vivo: tras recrear el contenedor con este mount, `claude` +arrancó directo en la sesión normal, sin volver a pedir el diálogo de +confianza. + Sobre paquetes: alpine (imagen `alpine` sin pin de versión, la misma que uso este setup) sí trae `kubectl` en sus repos — no hizo falta cambiar de imagen base ni instalarlo por binario aparte, contrario a @@ -165,7 +201,7 @@ crea. No hay que recordar cuál de los dos casos aplica. |---|---|---| | Corte de SSH / cerrar la terminal / cambiar de dispositivo | Sí — es exactamente el caso que este setup resuelve | Sí | | `docker restart tmux-host` (reinicio del NAS) | **No** — el proceso `tmux server` muere con el contenedor; `lab-session.sh` crea una sesión nueva automáticamente | Sí, vía el volumen montado en `/root/.claude` | -| `docker rm` + recrear el contenedor desde cero | No | Sí, vía el mismo volumen — no hace falta volver a autenticar | +| `docker rm` + recrear el contenedor desde cero | No | Sí, vía el mismo volumen — no hace falta volver a autenticar ni reconfirmar el diálogo de confianza del folder (ver el mount de `claude-code-home.json`) | ## Validación en vivo