Desplegar un LLM en producción con Docker Compose
Ejecutar un LLM localmente en tu computadora lleva diez minutos. Desplegar un LLM en producción con Docker Compose para un equipo —con una URL en HTTPS, monitoreo, respaldos y verdadera seguridad— es otro trabajo. Esta guía reúne una pila completa (Ollama, Open WebUI, Qdrant, n8n, Traefik) en un único archivo docker-compose.yml comentado, listo para instalarse en un VPS o un servidor on-premise.
#¿Por qué esta pila de software?
El objetivo es cubrir las cuatro necesidades concretas de una pyme o de un equipo técnico que adopte la IA local: un motor de inferencia (Ollama), una interfaz de usuario web (Open WebUI), una base de datos vectorial para el RAG (Qdrant) y una capa de automatización sin código (n8n). Todo ello se integra con Traefik como proxy inverso, que se encarga del HTTPS mediante Let's Encrypt y del enrutamiento.
Cada servicio funciona en su contenedor aislado, con sus volúmenes persistentes. Puedes desactivar uno sin romper los demás, actualizar un solo componente o replicar la pila en un entorno de staging con un solo comando.
#Arquitectura objetivo
Agentes que actúan en tu máquina: Cline agéntico, MCP, n8n + Ollama, automatizaciones locales.
- Espacio en línea de por vida
- PDF + archivos
- Reembolsado 30 j
- Traefik (puertos 80/443)
- Proxy inverso + terminación TLS automática mediante Let's Encrypt. Todo el tráfico externo pasa por él.
- Open WebUI (interno)
- Interfaz de chat tipo ChatGPT, disponible en chat.votre-domaine.fr. Autenticación local o OIDC.
- Ollama (interno)
- Daemon de inferencia. NO está expuesto públicamente, accesible únicamente desde la red Docker.
- Qdrant (interno)
- Base vectorial para el RAG. Almacenamiento de los embeddings de tus documentos.
- n8n
- Automatización sin código, disponible en n8n.votre-domaine.fr.
- Prometheus + Grafana
- Opcionales, expuestos internamente para el monitoreo de GPU/CPU/RAM.
#Prerrequisitos
- Un servidor Linux
- Ubuntu 22.04 LTS o Debian 12, acceso SSH como root, 16 GB de RAM mínimo, 200 GB de disco.
- Un GPU NVIDIA recomendado
- RTX 3090 de 24 GB o RTX 4090 para usar cómodamente modelos de 14B–32B, o RTX 4070 de 12 GB para modelos de 7B. Sin GPU, limítate a modelos de 3B en CPU.
- Un nombre de dominio
- Con acceso al DNS para crear subdominios. Indispensable para Let's Encrypt.
- Docker Engine + Compose v2
- Instalación a través del script oficial get.docker.com. El plugin compose está incluido desde 2022.
- NVIDIA Container Toolkit
- Si tienes una GPU, es lo que permite a Docker ponerla a disposición de los contenedores.
#1. Preparar el servidor
Se parte de una instalación nueva de Ubuntu 22.04. Tres cosas que hay que instalar: Docker, el NVIDIA Container Toolkit (si hay GPU) y un firewall bien configurado.
#2. docker-compose.yml comentado
Crea un directorio de trabajo y el archivo principal. Es el corazón del despliegue — cada sección está comentada para que puedas adaptarlo sin romper todo.
#3. Configurar Traefik y el DNS
Antes del primer docker compose up, crea tres registros DNS de tipo A que apunten a la IP pública de tu servidor:
- chat.votre-domaine.fr
- La interfaz de usuario Open WebUI.
- n8n.votre-domaine.fr
- El editor de flujos n8n.
- traefik.votre-domaine.fr
- El panel de control de Traefik (protegido por autenticación básica).
Genera el hash para la autenticación básica del panel de Traefik. Atención: en el .env, duplica los $ (escape de docker-compose).
#4. Primera puesta en marcha y comprobaciones
- 01Iniciar la pilaDesde /opt/llm-stack, ejecuta docker compose up -d. Traefik negociará los certificados Let's Encrypt en unos segundos; vigila los logs.
- 02Verificar el estado de los serviciosdocker compose ps doit afficher tous les services en running. Aucun ne doit redémarrer en boucle.
- 03Descargar un primer modelodocker compose exec ollama ollama pull qwen3.5:9b (6,6 Go, 256k de contexte, le polyvalent 8 Go de référence en 2026). Pour un modèle plus costaud sur un GPU 24 Go : qwen3.8:27b (≈18 Go de VRAM, 262k de contexte, licence Apache 2.0).
- 04Probar la interfazAbre https://chat.votre-domaine.fr. La primera cuenta creada = administrador. ENABLE_SIGNUP=false bloquea cualquier registro público posterior.
- 05Verificar que el GPU esté en usodocker compose exec ollama ollama ps : la colonne PROCESSOR doit afficher 100% GPU.
#5. Fortalecer la seguridad
Un conjunto de servicios expuesto públicamente y mal configurado recibe escaneos en menos de una hora. Estas son las seis reglas no negociables para un despliegue de LLM en producción con Docker Compose que no acabará en el radar de alguien en shodan.io.
- Contraseñas fuertes y únicas
- Genera tus secretos con openssl rand -base64 32. Nunca uses la contraseña de ejemplo del .env.
- Desactivar el registro público
- ENABLE_SIGNUP=false en Open WebUI. Sin eso, cualquiera puede crear una cuenta y consumir recursos de tu GPU.
- Encabezados de seguridad mediante middleware Traefik
- Agrega un middleware secureHeaders con HSTS, frame-deny, content-type-nosniff. Tres líneas, mucho impacto.
- Limitar los recursos por contenedor
- En deploy.resources.limits, establece memory y cpus. Esto evita que un servicio que haya fallado deje todo el servidor fuera de servicio.
- Contenedores en solo lectura cuando sea posible
- Agrega read_only: true en Traefik y Qdrant. Tmpfs para los directorios de escritura temporales.
- Actualizaciones mensuales
- watchtower automatiza los pulls, pero es preferible que uses un cron + una etiqueta git explícita para mantener el control de las versiones en producción.
#6. Monitoreo con Prometheus + Grafana
Tres métricas que es imprescindible supervisar en producción: la VRAM utilizada por Ollama, la latencia de las solicitudes de Open WebUI y el estado de los certificados Let's Encrypt (Traefik expone todo en /metrics).
En Grafana, importa el dashboard con ID 14574 (NVIDIA GPU Exporter) y el 17346 (Traefik v3). Tienes una visión completa en 5 minutos: VRAM, temperaturas de la GPU, tasas de solicitudes HTTP por subdominio y latencias P95.
#7. Copias de seguridad y actualizaciones
Cinco volúmenes contienen todos tus datos críticos: ollama_data (modelos), open_webui_data (cuentas + conversaciones + RAG), qdrant_data (vectores), n8n_data (flujos de trabajo), traefik_certs (certificados).
Para las actualizaciones, ve sobre seguro: fija las versiones (image: ollama/ollama:0.5.4 en lugar de :latest), haz una instantánea del VPS antes de cada actualización y prueba primero en un entorno de staging.
#Solución de problemas
- Traefik no genera certificado
- Comprueba que los puertos 80 y 443 estén abiertos Y que el DNS apunte correctamente al servidor. docker compose logs traefik | grep -i error revela el 90 % de los casos (DNS no propagado, límite de solicitudes, fallo del desafío).
- Open WebUI muestra 'No models found'
- Aún no has descargado ningún modelo en Ollama. docker compose exec ollama ollama pull qwen3.5:9b. Revisa también OLLAMA_BASE_URL=http://ollama:11434 (nombre del servicio, no localhost).
- GPU no detectado en el contenedor
- nvidia-container-toolkit no instalado o Docker no reiniciado tras la configuración. Prueba con docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi.
- n8n redirige en bucle hacia HTTP
- WEBHOOK_URL y N8N_PROTOCOL=https deben estar definidos. De lo contrario, n8n cree que está en HTTP y el navegador se confunde.
- Grafana no accesible detrás de Traefik
- Agrega GF_SERVER_ROOT_URL=https://grafana.${DOMAIN} y GF_SERVER_SERVE_FROM_SUB_PATH=false a su sección environment.
- Latencia que se dispara con varios usuarios
- OLLAMA_NUM_PARALLEL demasiado alto para la VRAM. Reduce su valor a 1 o 2 según tu tarjeta. Supervisa ollama ps mientras el sistema está bajo carga.
#Para ir más allá
Tu stack está funcionando, con monitorización y copias de seguridad. Tres vías naturales para profesionalizarla aún más:
- Conectar el RAG a tus documentos
- La guía RAG con ChromaDB y Mistral se adapta sin dificultad a Qdrant — misma lógica de embeddings y chunking, base vectorial diferente.
- Automatizar workflows empresariales
- La guía Automatizar con n8n y Ollama describe diez recetas concretas (traducción de correos, clasificación de leads, resumen de RSS) que aprovechan directamente tu stack.
- Abordar el cumplimiento normativo
- La guía del LLM local y el RGPD detalla las obligaciones legales (registro, duración de conservación, derechos de los usuarios) que deben documentarse para un despliegue en empresa.
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.