| Servicio | Imagen | Puerto | Estado |
|---|---|---|---|
| Ollama | ollama/ollama · 0.32.6 · VM210 | 11434 | 🟢 Operativo |
| ComfyUI | 0.36.0 · imagen local reforzada · VM210 (Linux) | 8188 | 🔵 Validado (generación local) |
| Open WebUI | ghcr.io/open-webui/open-webui · 0.11.0 · VM210 | 3000 | 🟢 Operativo |
| PostgreSQL + pgvector | desplegado en VM215 · 18.4 / 0.8.6 | 5432 | 🟢 Operativo |
| Qdrant | qdrant/qdrant · 1.18.3 | 6333 | 🟡 Respaldo (fallback) |
| n8n | n8nio/n8n:latest · VM300 | 5678 | 🟢 Operativo |
| NPM (Nginx Proxy Manager) | jc21/nginx-proxy-manager:latest | 443 · 81 | ⚪ Sin fuente |
| Portainer | portainer/portainer-ce:latest | 9443 | ⚪ Sin fuente |
| Whisper API | onerahmet/openai-whisper-asr-webservice · VM210 | 9000 | 🔵 Validado · planificado |
- Instalación de Docker Engine + Docker Compose
- Redacción de archivos docker-compose.yml
- Gestión de volúmenes persistentes (montaje ZFS)
- Gestión de redes Docker (bridge, host)
- Aislamiento a nivel de aplicación de los servicios de IA
- Variables de entorno mediante archivos .env
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main # 0.11.0
container_name: open-webui
ports:
- '3000:8080'
volumes:
- open-webui-data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://host-gateway:11434
# Backend vectoriel : pgvector hébergé sur VM215 (sans GPU)
- VECTOR_DB=pgvector
- PGVECTOR_DB_URL=postgresql://<role>:<secret>@<hote-vm215>/rag
- RAG_EMBEDDING_ENGINE=ollama
- RAG_EMBEDDING_MODEL=bge-m3
extra_hosts:
- 'host-gateway:host-gateway'
restart: unless-stopped
n8n:
image: n8nio/n8n:latest
container_name: n8n
ports:
- '5678:5678'
volumes:
- n8n-data:/home/node/.n8n
restart: unless-stopped
# Solution de repli — conservée tant que le retrait n'est pas clôturé
qdrant:
image: qdrant/qdrant:latest # 1.18.3
container_name: qdrant
ports:
- '6333:6333'
volumes:
- qdrant-data:/qdrant/storage
restart: unless-stopped
volumes:
open-webui-data:
n8n-data:
qdrant-data:El servicio n8n anterior es un ejemplo simplificado (volumen local, sin base de datos externa) destinado a ilustrar la estructura de Compose. El despliegue real en VM300 se apoya en una base de datos PostgreSQL externa dedicada; consulte la página Automatización (n8n) para la arquitectura efectiva.
ComfyUI 0.36.0 se ejecuta en una imagen construida localmente: base de Python fijada por digest, fuentes fijadas por commit, dependencias bloqueadas con sus hashes (wheels descargadas e instaladas sin conexión). Entorno validado: Python 3.12.14, PyTorch 2.11.0, CUDA 13.0.
- Ejecución sin privilegios, sistema de archivos raíz de solo lectura
- Modelos montados en solo lectura; carpetas dedicadas para entradas, salidas, estado y cachés
- Nodos personalizados y API deshabilitados (no es un bloqueo general de la red saliente)
- Interfaz publicada únicamente en el loopback local de la VM; acceso mediante túnel SSH, sin publicación en Internet
- Checkpoint verificado por hash SHA-256 (procedente del repositorio de confianza) antes de su uso
El PoC anterior de Windows (VM260) permanece separado de este despliegue Linux. El uso compartido de GPU entre ComfyUI/Ollama es un cambio manual, todavía no un planificador automático. Detalles y mediciones en la página IA y LLM.
Comando utilizado (depurado) — comprobaciones de estado ejecutadas sobre el contenedor de ComfyUI y el contenedor de Ollama: estado del contenedor, últimas líneas de registro, modelos Ollama residentes y, después, comprobaciones HTTP de la API local de ComfyUI. Nombres de contenedores y hosts sustituidos por ejemplos.
COMFY_CONTAINER='<conteneur-comfyui>'
OLLAMA_CONTAINER='<conteneur-ollama>'
COMFY_URL='http://127.0.0.1:8188'
docker inspect "$COMFY_CONTAINER" --format '{{.State.Status}}'
docker logs --tail 40 "$COMFY_CONTAINER"
docker exec "$OLLAMA_CONTAINER" ollama ps
curl --fail --max-time 10 -sS -o /dev/null \
-w 'HTTP=%{http_code}\n' "$COMFY_URL/"
curl --fail --max-time 10 -sS "$COMFY_URL/object_info/CheckpointLoaderSimple"
curl --fail --max-time 10 -sS "$COMFY_URL/queue"HTTP 200 confirma la respuesta del servidor; la presencia del checkpoint en el cargador confirma su detección, todavía no el éxito de una inferencia. ollama ps describe los modelos residentes, sin garantizar la ausencia de solicitudes en curso. Detalles sobre la liberación de memoria (/free) y la telemetría de la GPU en la página IA y LLM.
Comando utilizado (depurado) — un arranque falló en getpass.getuser(): el UID de la cuenta del host no existía en el archivo passwd del contenedor. Las siguientes variables permitieron conservar la ejecución sin privilegios, sin reconstruir la imagen:
environment: USER: comfyui TORCHINDUCTOR_CACHE_DIR: /state/cache/torchinductor
/state/cache designa aquí un montaje de ejemplo con permiso de escritura para el UID del contenedor. La variable USER no crea una cuenta ni concede ningún privilegio.