Reemplaza ntfy.sh por Telegram Bot API (preferencia del usuario, no reduce el costo — el costo real es de la API de Claude/Sonnet, no del canal). Texto plano sin parse_mode: el motivo que devuelve Claude es texto libre y puede traer caracteres que rompen el parser Markdown de Telegram. Token en TELEGRAM_BOT_TOKEN_FILE (dueño devops, no root-only -- el servicio corre como devops por el login de suscripción, mismo criterio ya aplicado a GITEA_TOKEN_FILE). Validado en vivo: entrega confirmada con el mismo código de notify_send(). Agrega pausa nocturna (ACTIVE_HOURS_START/END, default 06:00-23:00 hora local) para no acumular costo de API sin necesidad: el script chequea el horario ANTES de tocar kubectl/docker/curl o invocar claude -p, no solo antes de notificar. Nota documentada: esta ventana no se solapa con COMMERCE_BACKEND_WINDOW_* (00:00-06:00), por lo que medusa-deploy queda efectivamente inalcanzable para auto-restart en la práctica -- pendiente de decisión aparte. Agrega unidades systemd de usuario (lab-agent/systemd/*.service, *.timer) con límites de CPU/memoria: OnCalendar cada 15 min dentro del horario activo, corre como devops (systemctl --user), sin habilitar todavía -- requiere confirmación explícita tras ver el costo mensual estimado (~US$60-65, documentado en agente-monitoreo.md).
90 lines
4.3 KiB
Bash
90 lines
4.3 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 vía Telegram Bot API (reemplaza a ntfy.sh, 2026-08-26) ---
|
|
# Token del bot: creado con @BotFather, va en un archivo aparte (ver
|
|
# README.md). NO root-only pese al patrón original — el servicio corre
|
|
# como `devops` (necesita el login de suscripción de ese usuario para
|
|
# claude -p), así que un archivo root:root 600 sería ilegible para él.
|
|
# Mismo criterio ya aplicado a GITEA_TOKEN_FILE.
|
|
TELEGRAM_BOT_TOKEN_FILE=/DATA/AppData/k3d-lab/lab-agent/secrets/telegram_bot_token
|
|
# chat_id NO es secreto (no autentica nada sin el token) — va acá directo.
|
|
TELEGRAM_CHAT_ID=
|
|
|
|
# --- Horario activo (hora LOCAL del host) ---
|
|
# Fuera de esta ventana el script aborta ANTES de tocar kubectl/docker/
|
|
# curl o invocar claude -p — pausa nocturna para no acumular costo de
|
|
# API. OJO: esta ventana NO se solapa con COMMERCE_BACKEND_WINDOW_*
|
|
# (00:00-06:00) — mientras el agente está pausado, medusa-deploy nunca
|
|
# es elegible para auto-restart en la práctica, aunque la regla siga
|
|
# activa en el código. Ver docs/arquitectura/agente-monitoreo.md.
|
|
ACTIVE_HOURS_START=06:00
|
|
ACTIVE_HOURS_END=23:00
|
|
|
|
# --- 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
|