Math Service — Despliegue
Guía de despliegue y ejecución del Math Service en distintos entornos.
Despliegue con Docker Compose (principal)
El método recomendado para desarrollo y puesta en marcha del stack completo.
Arrancar solo el Math Service y sus dependencias
docker compose up -d mongo ollama rag_service math_service
Arrancar el stack completo
docker compose up -d
El servicio estará disponible en http://localhost:8083.
Construir con dependencias de desarrollo
INSTALL_DEV=true docker compose build math_service
docker compose up -d math_service
Verificar estado
# Health check
curl http://localhost:8083/health
# Logs en tiempo real
docker logs -f math-service
# Estado de todos los servicios
docker compose ps
Definición en docker-compose.yml
math_service:
build:
context: .
dockerfile: math_service/Dockerfile
args:
INSTALL_DEV: ${INSTALL_DEV:-false}
container_name: math-service
env_file:
- .env
environment:
MONGO_HOSTNAME: mongo
OLLAMA_HOST: ollama
RAG_SERVICE_URL: http://rag_service:8081
ports:
- "8083:8083"
depends_on:
- mongo
- ollama
- rag_service
restart: unless-stopped
Las variables en environment sobreescriben las del .env de forma que el servicio siempre apunta a los contenedores correctos en la red Docker interna.
Dockerfile — Build multietapa
El Dockerfile usa un build en dos etapas para optimizar el tamaño de la imagen final:
Stage 1: builder (python:3.14-slim)
└─ instala dependencias con pip
└─ acepta ARG INSTALL_DEV para incluir dependencias de test
Stage 2: runtime (python:3.14-slim)
└─ copia site-packages del builder (sin build tools)
└─ copia el código fuente
└─ crea usuario no-root (UID 1000)
└─ EXPOSE 8083
└─ CMD: uvicorn math_service.api:app --host 0.0.0.0 --port 8083
Construir manualmente
# Build desde la raíz del proyecto (el contexto debe ser la raíz)
docker build -t tfg-math-service:latest \
-f math_service/Dockerfile \
.
# Con dependencias de desarrollo
docker build -t tfg-math-service:dev \
-f math_service/Dockerfile \
--build-arg INSTALL_DEV=true \
.
Ejecutar el contenedor manualmente
docker run -d \
--name math-service \
-p 8083:8083 \
-e MONGO_HOSTNAME=host.docker.internal \
-e OLLAMA_HOST=host.docker.internal \
-e RAG_SERVICE_URL=http://host.docker.internal:8081 \
-e MISTRAL_API_KEY=tu_api_key \
tfg-math-service:latest
Dependencias de arranque
El servicio necesita que estén disponibles:
| Servicio | Puerto | Impacto si no disponible |
|---|---|---|
| MongoDB | 27017 | El servicio no puede leer conversaciones ni persistir FAQs/tópicos. Arranca pero todas las operaciones de DB fallarán. |
| Ollama | 11434 | La generación de FAQs falla: no se pueden obtener embeddings. |
| RAG Service | 8081 | La extracción de tópicos falla: no hay chunks de documentos. |
Si algún servicio no está disponible al arrancar, el Math Service inicia igualmente. El endpoint /health reflejará el estado con status: "degraded".
GET /health → {"status": "degraded", "mongo_connected": false, ...}
URLs por entorno
| Entorno | URL |
|---|---|
| Docker Compose (interno) | http://math_service:8083 |
| Docker Compose (externo) | http://localhost:8083 |
| Desarrollo local | http://localhost:8083 |
| Swagger UI | http://localhost:8083/docs |
| ReDoc | http://localhost:8083/redoc |
| Métricas Prometheus | http://localhost:8083/metrics |
Monitorización
Prometheus
El servicio expone métricas automáticas en /metrics:
http_requests_total— número de requests por endpoint y código de estadohttp_request_duration_seconds— histograma de latencias- Métricas del proceso Python (GC, memoria, CPU)
La integración con Prometheus está configurada en prometheus.yml en la raíz del proyecto:
scrape_configs:
- job_name: math_service
static_configs:
- targets: ["math_service:8083"]
Grafana
Los dashboards de Grafana se provisionan automáticamente desde grafana/provisioning/. Ver infrastructure/monitoring.md para detalles.
Logs JSON estructurados
Todos los logs del servicio se emiten en formato JSON con correlation ID, facilitando su ingesta en Loki/Promtail:
{
"timestamp": "2026-03-12T10:30:00Z",
"level": "INFO",
"logger": "math_service.services.faq_service",
"message": "Gathered 87 student questions (subject=iv)",
"correlation_id": "abc123"
}
Gestión de errores en producción
El servicio no interrumpe el arranque si los servicios dependientes no están listos (fail-open). Esto permite:
- Despliegues independientes de cada microservicio
- Reintentos automáticos por
restart: unless-stopped - Visibilidad del estado en
/healthsin necesidad de revisar logs
Si el RAG Service o MongoDB no están disponibles durante una operación, el endpoint devolverá 500 con el mensaje de error específico.
Actualizar el servicio
# Reconstruir la imagen tras cambios en el código
docker compose build math_service
# Reiniciar con la nueva imagen
docker compose up -d --no-deps math_service
# Ver los últimos logs para confirmar que arrancó bien
docker logs --tail 20 math-service