| Service | Image | Port | Statut |
|---|---|---|---|
| Ollama | ollama/ollama · 0.32.6 · VM210 | 11434 | 🟢 Opérationnel |
| ComfyUI | 0.36.0 · image locale durcie · VM210 (Linux) | 8188 | 🔵 Validé (génération locale) |
| Open WebUI | ghcr.io/open-webui/open-webui · 0.11.0 · VM210 | 3000 | 🟢 Opérationnel |
| PostgreSQL + pgvector | déployé sur VM215 · 18.4 / 0.8.6 | 5432 | 🟢 Opérationnel |
| Qdrant | qdrant/qdrant · 1.18.3 | 6333 | 🟡 Repli (fallback) |
| n8n | n8nio/n8n:latest · VM300 | 5678 | 🟢 Opérationnel |
| NPM (Nginx Proxy Manager) | jc21/nginx-proxy-manager:latest | 443 · 81 | ⚪ Non sourcé |
| Portainer | portainer/portainer-ce:latest | 9443 | ⚪ Non sourcé |
| Whisper API | onerahmet/openai-whisper-asr-webservice · VM210 | 9000 | 🔵 Validé · planifié |
- Installation Docker Engine + Docker Compose
- Rédaction de fichiers docker-compose.yml
- Gestion des volumes persistants (montage ZFS)
- Gestion des réseaux Docker (bridge, host)
- Isolation applicative des services IA
- Variables d'environnement via fichiers .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:Le service n8n ci-dessus est un exemple simplifié (volume local, sans base externe) destiné à illustrer la structure Compose. Le déploiement réel sur VM300 s'appuie sur une base PostgreSQL externe dédiée ; voir la page Automatisation (n8n) pour l'architecture effective.
ComfyUI 0.36.0 s'exécute dans une image construite localement : base Python figée par digest, sources figées par commit, dépendances verrouillées avec leurs empreintes (wheels téléchargées puis installées hors ligne). Environnement validé : Python 3.12.14, PyTorch 2.11.0, CUDA 13.0.
- Exécution sans privilèges, système de fichiers racine en lecture seule
- Modèles montés en lecture seule ; dossiers dédiés pour entrées, sorties, état et caches
- Nœuds personnalisés et API désactivés (ce n'est pas un blocage général du réseau sortant)
- Interface publiée uniquement sur la boucle locale de la VM ; accès par tunnel SSH, sans publication Internet
- Checkpoint vérifié par empreinte SHA-256 (issue du dépôt de confiance) avant utilisation
Le POC Windows antérieur (VM260) reste distinct de ce déploiement Linux. Le partage GPU ComfyUI/Ollama est une bascule manuelle, pas encore un ordonnanceur automatique. Détails et mesures sur la page IA & LLM.
Commande utilisée (assainie) — vérifications d'état exécutées sur le conteneur ComfyUI et le conteneur Ollama : statut du conteneur, dernières lignes de journal, modèles Ollama résidents, puis contrôles HTTP de l'API locale de ComfyUI. Noms de conteneurs et hôtes remplacés par des exemples.
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 confirme la réponse du serveur ; la présence du checkpoint dans le chargeur confirme sa détection, pas
encore la réussite d'une inférence. ollama ps décrit les modèles résidents, sans garantir l'absence
de requêtes en cours. Détails sur le déchargement mémoire (/free) et la télémétrie GPU sur la page
IA & LLM.
Commande utilisée (assainie) — un démarrage a échoué dans getpass.getuser() : l'UID
du compte hôte n'existait pas dans le fichier passwd du conteneur. Les variables suivantes ont permis de
conserver l'exécution non privilégiée, sans reconstruire l'image :
environment: USER: comfyui TORCHINDUCTOR_CACHE_DIR: /state/cache/torchinductor
/state/cache désigne ici un montage d'exemple accessible en écriture à l'UID du conteneur. La
variable USER ne crée pas de compte et n'accorde aucun privilège.