# 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/ 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