Saltar a contenido

Despliegue de la API

La imagen

tai-api init deja en la raíz del proyecto un dockerfile y un entrypoint.sh. Son tuyos: se crean una vez.

docker build -t mi-api \
  --build-arg MAIN_DATABASE_URL=... \
  --build-arg SECRET_KEY=... \
  --build-arg API_DOCS_PWD=... .
docker run -p 8000:80 mi-api
  • Python 3.11 y Poetry, con las dependencias del pyproject.toml del proyecto.
  • uvicorn <paquete>.__main__:app en el puerto PORT (80), un solo proceso —api con el namespace por defecto; init escribe el que tenga el proyecto, también con --app-dir—. Detrás de un orquestador que escala por réplicas es lo adecuado; para varios procesos en una máquina, añade --workers en el entrypoint.sh.
  • HEALTHCHECK contra /health.
  • SSH en el 2222 para la consola de Azure App Service: sshd solo arranca si WEBSITES_ENABLE_APP_SERVICE_STORAGE (lo pone Azure) o AZURE_ENV valen true.

Los secretos como --build-arg quedan en la imagen

El dockerfile los declara como ARG y los copia a ENV para que la misma receta sirva en local. En un despliegue real, mejor como variables del contenedor —la configuración de la Web App, los secretos del orquestador— y no en el build: cualquiera con la imagen los lee con docker inspect.

Las variables

Las imprescindibles, según la autenticación:

Sin autenticación Database Keycloak
MAIN_DATABASE_URL ✔ ✔ ✔
SECRET_KEY si hay columnas cifradas ✔ si hay columnas cifradas
MAIN_KEYCLOAK_URL, KEYCLOAK_API_CLIENT_SECRET ✔
PUBLIC_URL con la sesión con cookie
API_DOCS_PWD ✔ ✔ ✔

La lista completa, en Variables de entorno.

Detrás del frontend

Con el cliente TypeScript, el frontend sirve la API por un proxy /api: el navegador ve un solo origen y la cookie de sesión funciona igual en Azure que on-premise. Ver Despliegue del frontend.

La API no necesita saber nada del proxy salvo dos cosas: ROOT_PATH = "/api", el prefijo que el proxy le quita, y ALLOWED_ORIGINS sin * si la sesión va en cookie. Ver Configuración.

Antes de publicar

  • [ ] API_DOCS_PWD definida: sin ella, /docs se protege con admin/admin.
  • [ ] SECRET_KEY larga y aleatoria, distinta en cada entorno.
  • [ ] Con Database, la contraseña del usuario admin cambiada (ADMIN_PWD al hacer el feed, o POST /auth/me/password).
  • [ ] Con la sesión con cookie, la API servida por HTTPS: la cookie es Secure fuera de localhost.
  • [ ] tai-api rbac push aplicado contra el backend de ese entorno.