Activar timer: fix HOME= en la unidad, instrucciones de instalación

El manager de systemd --user de devops arranca con HOME=/DATA (el de
/etc/passwd), no /DATA/AppData/home-devops -- ese override solo se
aplica en una shell interactiva vía /etc/profile.d/zz-devops-home.sh,
que el manager de systemd nunca carga. Sin Environment=HOME=... en
lab-agent.service, claude -p habría buscado las credenciales en
/DATA/.claude/ (no existe) y fallado en cada corrida. Detectado y
corregido en vivo corriendo el servicio manualmente vía
systemctl --user start antes de habilitar el timer.

README documenta la instalación real: unidades en
/DATA/.config/systemd/user/ (no ~/.config/... de una shell
interactiva), loginctl enable-linger devops como único paso con sudo.

Timer activo desde 2026-08-26 (lab-agent.timer, cada 15 min,
06:00-23:00 hora local), tras confirmación explícita y ver el costo
mensual estimado.
This commit is contained in:
devops committed 2026-08-26 00:25:45 -05:00
1 parent cd163e6b7c
commit a2717e922a
2 files changed
+41 -10

No files matched your search

+34 -10
View File
@@ -7,11 +7,13 @@ acción correctiva de bajo riesgo. Ver la lista blanca completa, la
justificación de gobernanza y la evidencia de la prueba end-to-end en justificación de gobernanza y la evidencia de la prueba end-to-end en
`apps-registry` → `docs/arquitectura/agente-monitoreo.md`. `apps-registry` → `docs/arquitectura/agente-monitoreo.md`.
**Estado (2026-08-26): script y prueba end-to-end validados en vivo** **Estado (2026-08-26): timer de systemd ACTIVO** (`lab-agent.timer`,
contra el cluster real (deployment canario desechable, ciclo completo usuario `devops`, cada 15 min entre 06:00–23:00 hora local). Validado
DRY_RUN → ejecución real → rate limit/bloqueo → limpieza). El timer de en vivo contra el cluster real: DRY_RUN → ejecución real → rate
systemd (Paso 4) **todavía no está activo** — pendiente de tu limit/bloqueo → recuperación con hilo en Telegram → limpieza, y
confirmación explícita. corrida manual vía `systemctl --user start` con el entorno real del
timer antes de habilitarlo. Ver `docs/arquitectura/agente-monitoreo.md`
para la evidencia completa y el costo mensual estimado.
## Diseño de seguridad (por qué Claude no ejecuta comandos directamente) ## Diseño de seguridad (por qué Claude no ejecuta comandos directamente)
@@ -156,9 +158,31 @@ ejecuta de verdad (confirmado con `kubectl get events` y la anotación
`restartedAt`), y una segunda corrida sobre el mismo recurso caído `restartedAt`), y una segunda corrida sobre el mismo recurso caído
respeta el bloqueo (`notify_only`, sin reintento). Dos bugs reales se respeta el bloqueo (`notify_only`, sin reintento). Dos bugs reales se
encontraron y corrigieron en esa prueba — ver el detalle en encontraron y corrigieron en esa prueba — ver el detalle en
`docs/arquitectura/agente-monitoreo.md`. La notificación real se `docs/arquitectura/agente-monitoreo.md`. Telegram (silencioso para
validó con ntfy.sh en esa prueba; el cambio a Telegram debe repetir `info`, hilo de respuestas al recuperarse) también se validó en vivo
al menos la validación de entrega antes de habilitar el timer. con el mismo canario.
**No actives el timer de systemd todavía** — requiere tu confirmación ## Instalar el timer de systemd
explícita por separado, después de ver el costo mensual estimado.
Unidades de **usuario** (`systemctl --user`), corren como `devops` —
necesario porque `claude -p` usa su login de suscripción. Ojo: el
manager de `systemd --user` de `devops` arranca con `HOME=/DATA` (el
de `/etc/passwd`), no `/DATA/AppData/home-devops` — por eso
`lab-agent.service` fija `Environment=HOME=...` explícitamente; sin
eso, `claude -p` no encuentra las credenciales. Los archivos van en
`/DATA/.config/systemd/user/`, no en el `~/.config/...` de una shell
interactiva (que resuelve a otra ruta por el mismo motivo).
```bash
mkdir -p /DATA/.config/systemd/user
cp systemd/lab-agent.service systemd/lab-agent.timer /DATA/.config/systemd/user/
sudo loginctl enable-linger devops # una vez — si no, systemctl --user ni conecta
export XDG_RUNTIME_DIR=/run/user/$(id -u devops)
systemctl --user daemon-reload
systemctl --user start lab-agent.service # probar una corrida manual primero
systemctl --user enable --now lab-agent.timer
systemctl --user list-timers lab-agent.timer
```
Activo desde 2026-08-26. Ver el costo mensual estimado y el detalle
completo en `docs/arquitectura/agente-monitoreo.md`.
+7
View File
@@ -6,6 +6,13 @@ Wants=network-online.target
[Service] [Service]
Type=oneshot Type=oneshot
WorkingDirectory=/media/HDD-Storage/AppData/k3d-lab-v3/lab-cruzcloud/scripts/lab-agent WorkingDirectory=/media/HDD-Storage/AppData/k3d-lab-v3/lab-cruzcloud/scripts/lab-agent
# El manager de systemd --user de devops arranca con HOME=/DATA (el de
# /etc/passwd), no /DATA/AppData/home-devops -- ese override solo se
# aplica al abrir una shell interactiva via /etc/profile.d/zz-devops-home.sh,
# que el manager de systemd nunca carga. Sin esto, claude -p buscaria
# ~/.claude/.credentials.json en /DATA/.claude/ (no existe) y fallaria
# la autenticacion. Confirmado en vivo 2026-08-26.
Environment=HOME=/DATA/AppData/home-devops
ExecStart=/media/HDD-Storage/AppData/k3d-lab-v3/lab-cruzcloud/scripts/lab-agent/lab-agent.sh --live ExecStart=/media/HDD-Storage/AppData/k3d-lab-v3/lab-cruzcloud/scripts/lab-agent/lab-agent.sh --live
TimeoutStartSec=300 TimeoutStartSec=300