Files
scripts/lab-agent/lab-agent.env.example
T
devops 5c1cb3aa5e Agregar lab-agent: wrapper headless de diagnóstico/corrección (Paso 2)
Invoca claude -p con --allowedTools "" y --json-schema para que el
modelo solo devuelva una decisión estructurada, nunca ejecute comandos
directamente. Se descartó dar un Bash tool con patrón por prefijo tras
confirmar en vivo que --allowedTools "Bash(cmd)" también permite
"cmd && inyectado" (coincidencia por prefijo, no exacta) — inseguro
para comandos root-capaces como kubectl/docker. El wrapper bash es el
único ejecutor, y revalida cada decisión contra su propio cálculo de
elegibilidad (umbral 10min, rate limit 30min, ventana horaria para
medusa-deploy, bloqueo tras intento sin recuperación) antes de actuar.

Validado en vivo (dry-run) contra el cluster real hasta el paso de
invocar claude -p, que falla correctamente por falta del secreto
ANTHROPIC_API_KEY_FILE (no creado a propósito, ver README).
2026-08-25 22:18:31 -05:00

59 lines
2.6 KiB
Bash

# Copia este archivo a lab-agent.env (sin .example) y ajusta valores.
# lab-agent.env NO debe contener secretos — API keys y tokens van en
# archivos aparte, root-only (ver ANTHROPIC_API_KEY_FILE / GITEA_TOKEN_FILE).
# --- Alcance kubectl ---
NAMESPACE=ecommerce
KUBECONFIG_PATH=/DATA/.kube/config
# --- 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) ---
PUBLIC_DOMAINS="shop.cruzcloud.net commerce.cruzcloud.net media.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
# --- Secretos root-only (archivos, NO valores — ver README.md) ---
ANTHROPIC_API_KEY_FILE=/etc/claude-lab-agent/secrets/anthropic_api_key
GITEA_TOKEN_FILE=/etc/claude-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