Modo HTTP para bib_openapi — Resolución OOM en STAGE CX23 (s50)
Resumen
En el sprint s50 (05-05-2026) se migró el extractor de schema OpenAPI de la Biblioteca de docker exec a HTTP, resolviendo el OOM (rc=137) que bloqueaba el reindexado automático en el servidor STAGE CX23 (4 GB de RAM).
Commit: 05b0bde19ebd88e4dd409cd0006228b1b116e1f7
Autor: @Esquembri
Problema raíz
El script bib_openapi.py extraía el schema OpenAPI ejecutando python -c api.get_openapi_schema() dentro del container Django mediante docker exec. Esta operación requería cargar Django entero en un proceso efímero, con un pico de ~500 MB de RAM. En STAGE CX23 (4 GB compartidos con la app y Postgres), el kernel mataba el proceso con rc=137 (OOM kill).
ERROR docker exec rc=137
ERROR: rc=137 indica OOM kill — usar --url HTTP en lugar de --container
Solución implementada
1. Nuevo endpoint GET /api/openapi-export
Registrado en config/urls.py. Devuelve api.get_openapi_schema() en el proceso web ya cargado — sin coste adicional de RAM. Protegido por _InternalToolsAuth (Bearer token, INTERNAL_TOOLS_TOKEN, mínimo 32 chars).
2. Modo HTTP en bib_openapi.py
Nueva función extract_openapi_via_http(url, token) que realiza un GET al endpoint con Authorization: Bearer. Se convierte en el modo default (sin --container). El modo docker exec queda como fallback explícito para dev local.
3. Token seguro en cron-bib-reindex.sh
El cron lee el token desde /opt/bib-reindex/.token-internal (chmod 600) y lo exporta como INTERNAL_TOOLS_TOKEN antes de llamar a bib_openapi.py --push. Eliminada la detección de container web activo (docker ps).
Arquitectura antes / después
ANTES (docker exec):
cron → docker ps → docker exec container → python -c → Django carga entero → OOM ❌
DESPUÉS (HTTP):
cron → leer .token-internal → bib_openapi.py --push → GET /api/openapi-export → Django ya cargado ✅
Archivos modificados
| Archivo | Cambio |
|---|---|
config/urls.py | _InternalToolsAuth + @api.get("/openapi-export") |
scripts/bib_openapi.py | Modo HTTP default, modo docker como fallback, mensaje OOM |
scripts/cron-bib-reindex.sh | Lee .token-internal, exporta INTERNAL_TOOLS_TOKEN, sin docker ps |
Impacto
- Elimina OOM en STAGE CX23 y cualquier host con <2 GB libres.
- Más rápido: HTTP request vs. levantar Python + Django en docker exec.
- Más resiliente: el cron no necesita acceso al socket Docker del host.
- Sin cambio en la API pública: el endpoint es interno, sin sesión de usuario.
Pasos post-deploy
Ver runbook runbook--infra--deploy-internal-tools-token para la secuencia completa (token, Dokploy, cron entry).
Véase también
- [[entity—api—endpoint—openapi-export]]
- [[entity—api—script—bib-openapi]]
- [[runbook—infra—deploy-internal-tools-token]]