Construido de cero a pedido de una sesión de Cowork (instrucciones
pegadas tal cual a Claude Code en ctunlinux): puente HTTP genérico de
solo lectura, no la app de conciliación que se había planteado
originalmente para este mismo directorio de trabajo (api-cowork).
Código en trivasa-bi-core/query_api/ — main.py, db.py,
sql_guard.py, bearer.py, audit.py, requirements.txt. Sin
comitear a git todavía en trivasa-bi-core (pendiente, ver abajo).
3 targets probados reales: postgres_dw (trivasa_dw, rol
ealcocer_ro), mssql_205 (TRIVASADB3 staging), mssql_207
(TRIVASADB producción real).
Bearer token generado (openssl rand -hex 32) y guardado en Infisical
(secret-management, env dev, QUERY_API_TOKEN) — nunca impreso en
ninguna sesión de Claude Code, ni en local ni por Cowork.
Token de machine identity de Infisical (~/.config/infisical/ehas-uk.env)
estaba expirado — se generó uno nuevo (claude-esteban, TTL 30 días
desde 2026-09-07) con acceso a los proyectos Trivasa y
secret-management.
Servicio systemd real, no proceso suelto:query-api.service,
enabled + active, escuchando en 127.0.0.1:8765. Reemplazó al
script de prueba (~/api-cowork/api.py) que ocupaba ese puerto — el
primero se paró bien, pero volvió a levantarse solo una vez más
durante el arranque del servicio real (choque de puerto, resuelto
matándolo de nuevo); no se encontró cron/systemd/watchdog que lo
relance, así que fue relanzado a mano en algún momento fuera de esta
sesión — vale la pena confirmar que no se vuelva a correr por error.
Reusa el túnel/hostname ya reservado (reportesweb.frento.com.mx →
127.0.0.1:8765) — no se tocó /etc/cloudflared/config.yml.
Validado end-to-end a través del túnel público, no solo en local:
/health sin auth, /query real contra los 3 targets, rechazo real
(no solo revisado el código) de DELETE/UPDATE/INSERT/
multi-statement, y 401 sin token.
Gotcha real encontrado y resuelto: EnvironmentFile de systemd ignora
el prefijo export en silencio — hizo falta un segundo archivo de
entorno en formato plano solo para la unidad
(~/.config/infisical/ehas-uk-systemd.env).
Pendiente
[ ] Comitear y pushear trivasa-bi-core/query_api/ — el código está
en disco y funcionando, pero no en git todavía.
[ ] Cambiar el subdominio reportesweb.frento.com.mx a uno que
describa el servicio real (ver nota en index.md) — nombre genérico
heredado, no se tocó en esta pasada.
[ ] Confirmar con Esteban si ~/api-cowork/api.py (el script de prueba
que ocupaba el puerto 8765 antes) se puede borrar del todo o si sigue
sirviendo para algo.
[ ] No hay rotación automática del QUERY_API_TOKEN ni alerta si el
token de machine identity de Infisical vuelve a expirar — ambos son
manuales hoy.