| Сервис | Образ | Порт | Статус |
|---|---|---|---|
| Ollama | ollama/ollama · 0.32.6 · VM210 | 11434 | 🟢 В работе |
| ComfyUI | 0.36.0 · усиленный локальный образ · VM210 (Linux) | 8188 | 🔵 Проверено (локальная генерация) |
| Open WebUI | ghcr.io/open-webui/open-webui · 0.11.0 · VM210 | 3000 | 🟢 В работе |
| PostgreSQL + pgvector | развёрнут на VM215 · 18.4 / 0.8.6 | 5432 | 🟢 В работе |
| Qdrant | qdrant/qdrant · 1.18.3 | 6333 | 🟡 Резерв (fallback) |
| n8n | n8nio/n8n:latest · VM300 | 5678 | 🟢 В работе |
| NPM (Nginx Proxy Manager) | jc21/nginx-proxy-manager:latest | 443 · 81 | ⚪ Без источника |
| Portainer | portainer/portainer-ce:latest | 9443 | ⚪ Без источника |
| Whisper API | onerahmet/openai-whisper-asr-webservice · VM210 | 9000 | 🔵 Проверено · запланировано |
- Установка Docker Engine + Docker Compose
- Написание файлов docker-compose.yml
- Управление постоянными томами (монтирование ZFS)
- Управление сетями Docker (bridge, host)
- Изоляция сервисов ИИ на уровне приложений
- Переменные окружения через файлы .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:Сервис n8n выше — упрощённый пример (локальный том, без внешней базы данных) для иллюстрации структуры Compose. Реальное развёртывание на VM300 использует выделенную внешнюю базу PostgreSQL; см. страницу Автоматизация (n8n) для действительной архитектуры.
ComfyUI 0.36.0 работает в локально собранном образе: базовый образ Python закреплён по digest, исходники закреплены по commit, зависимости зафиксированы с контрольными суммами (wheel-пакеты скачиваются и устанавливаются офлайн). Проверенное окружение: Python 3.12.14, PyTorch 2.11.0, CUDA 13.0.
- Запуск без привилегий, корневая файловая система только для чтения
- Модели монтируются только для чтения; отдельные папки для входных, выходных данных, состояния и кэшей
- Пользовательские узлы и API отключены (это не общая блокировка исходящего трафика)
- Интерфейс публикуется только на локальном loopback ВМ; доступ через SSH-туннель, без публикации в Интернете
- Чекпоинт проверяется по контрольной сумме SHA-256 (из доверенного репозитория) перед использованием
Более ранний Windows-POC (VM260) остаётся отдельным от этого Linux-развёртывания. Совместное использование GPU ComfyUI/Ollama — это ручное переключение, а не автоматический планировщик. Подробности и измерения — на странице ИИ и LLM.
Использованная команда (санированная) — проверки состояния контейнера ComfyUI и контейнера Ollama: статус контейнера, последние строки журнала, резидентные модели Ollama, затем HTTP-проверки локального API ComfyUI. Имена контейнеров и хостов заменены примерами.
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 подтверждает ответ сервера; наличие чекпоинта в загрузчике подтверждает его обнаружение, но ещё не успешный инференс. ollama ps показывает резидентные модели, не гарантируя отсутствия выполняющихся запросов. Подробности об освобождении памяти (/free) и телеметрии GPU на странице ИИ и LLM.
Использованная команда (санированная) — один из запусков завершился ошибкой в getpass.getuser(): UID учётной записи хоста отсутствовал в файле passwd контейнера. Следующие переменные позволили сохранить непривилегированное выполнение без пересборки образа:
environment: USER: comfyui TORCHINDUCTOR_CACHE_DIR: /state/cache/torchinductor
/state/cache здесь обозначает пример точки монтирования, доступной для записи UID контейнера. Переменная USER не создаёт учётную запись и не даёт никаких привилегий.