Files
scripts/lab-agent/lab-agent.env.example
T
devops ad53cff1e7 Rediseñar auth a login de suscripción y corregir bugs de la prueba e2e
Auth: ANTHROPIC_API_KEY_FILE queda vacío por defecto — claude -p usa el
login de suscripción ya activo (~/.claude/.credentials.json) en vez de
una API key root-only. Se descartó ese diseño en vivo al confirmar que
no había API key real disponible; además elimina la necesidad de crear
secretos root-only vía sudo. Consecuencia: el futuro servicio systemd
debe correr como devops, no root. CLAUDE_BIN/KUBECTL_BIN se agregan por
ruta absoluta (ninguno está en el PATH de root/systemd).

Bugs encontrados y corregidos durante la prueba end-to-end contra el
cluster real (deployment canario desechable):
- execute_corrective_action se invocaba en un subshell ($()), perdiendo
  sus variables de resultado (LAST_ACTION_*) -> crash "unbound
  variable". Ahora usa el exit status de la función, invocada directo.
- DRY_RUN marcaba blocked=true en state.json como si la acción hubiera
  sido real, contaminando una corrida real posterior sobre el mismo
  recurso. Ahora el estado solo se actualiza fuera de DRY_RUN.

También: GITEA_TOKEN_FILE pasa a /DATA (dueño devops, sin sudo), y
media.cruzcloud.net se excluye de PUBLIC_DOMAINS (uso personal, no es
parte del lab).

Prueba e2e completa documentada en apps-registry:
docs/arquitectura/agente-monitoreo.md.
2026-08-25 23:11:24 -05:00

75 lines
3.4 KiB
Bash

# Copia este archivo a lab-agent.env (sin .example) y ajusta valores.
# lab-agent.env NO debe contener secretos — lo único sensible es el token
# de Gitea Actions, que va en un archivo aparte (ver GITEA_TOKEN_FILE).
# --- Alcance kubectl ---
NAMESPACE=ecommerce
KUBECONFIG_PATH=/DATA/.kube/config
# claude y kubectl viven bajo el HOME de devops, no en un PATH estándar de
# root/systemd (confirmado en vivo 2026-08-26: `sudo which claude` no lo
# encuentra). Rutas absolutas, no confiar en PATH.
CLAUDE_BIN=/DATA/AppData/home-devops/.local/bin/claude
KUBECTL_BIN=/DATA/AppData/home-devops/.local/bin/kubectl
# --- Umbrales (lista blanca aprobada 2026-08-25) ---
UNHEALTHY_THRESHOLD_MIN=10
RATE_LIMIT_MIN=30
# Deployment que corresponde a "commerce-backend" en la terminología de
# CLAUDE.md. En el cluster real (verificado 2026-08-25) es medusa-deploy,
# no un deployment llamado literalmente "commerce-backend".
COMMERCE_BACKEND_DEPLOYMENT=medusa-deploy
# Ventana horaria (hora LOCAL del host ZimaOS) en la que medusa-deploy
# es elegible para auto-restart. Fuera de esta ventana: solo diagnóstico.
COMMERCE_BACKEND_WINDOW_START=00:00
COMMERCE_BACKEND_WINDOW_END=06:00
# --- Alcance docker ---
# Único contenedor con auto-restart aprobado (incidente 2026-08-16).
DOCKER_RESTART_ALLOWLIST=gitea-runner
# --- Señal de "runner atascado" vía API de Gitea Actions (mejor esfuerzo) ---
# Repos a consultar por runs con status=running que llevan más de
# UNHEALTHY_THRESHOLD_MIN minutos sin terminar. Si GITEA_TOKEN_FILE no
# existe o la API falla, esta señal se omite (fail-safe: nunca dispara
# una acción por una señal que no se pudo verificar) y solo queda la
# señal de "contenedor no está running".
GITEA_ACTIONS_REPOS="devops/apps-registry"
# --- Endpoints públicos a chequear (solo diagnóstico, no gatillan acciones) ---
# media.cruzcloud.net excluido a propósito: no es parte del lab, es uso
# personal aparte (confirmado 2026-08-26).
PUBLIC_DOMAINS="shop.cruzcloud.net commerce.cruzcloud.net gitea.cruzcloud.net docs.cruzcloud.net"
# --- Rutas de estado/logs (escribibles por devops, NO root-only) ---
STATE_FILE=/DATA/AppData/k3d-lab/lab-agent/state.json
LOG_DIR=/DATA/AppData/k3d-lab/lab-agent/logs
# --- Autenticación de claude -p ---
# Vacío (default): usa el login de suscripción ya activo para el usuario
# que corre el script (~/.claude/.credentials.json) — por eso el servicio
# systemd del Paso 4 corre como `devops`, no como root: root no tiene ese
# login. Solo completar esta ruta si en algún momento se prefiere
# autenticar con una API key real en vez del login de suscripción.
ANTHROPIC_API_KEY_FILE=
# Token de Gitea Actions (opcional, scope read:repository). Dueño devops,
# 600 — ya no root-only, no hace falta sudo para crearlo.
GITEA_TOKEN_FILE=/DATA/AppData/k3d-lab/lab-agent/secrets/gitea_token
# --- Modelo e invocación de Claude Code headless ---
CLAUDE_MODEL=claude-sonnet-5
CLAUDE_MAX_BUDGET_USD=0.50
# --- Notificaciones (Paso 3 — dejar vacío hasta tener un canal real) ---
# Ej. self-hosted: https://ntfy.cruzcloud.net/lab-agent
# ntfy.sh público: https://ntfy.sh/<topic-privado-dificil-de-adivinar>
NTFY_URL=
# --- Pruebas controladas (Paso 5) ---
# DRY_RUN=1: calcula elegibilidad y decisión igual que en producción,
# pero NO ejecuta kubectl/docker de verdad — registra y notifica como si
# lo hubiera hecho, marcado [DRY_RUN]. Poner en 0 para el modo real.
DRY_RUN=1