English | 简体中文 | 繁體中文 | Русский
Локальная LLM с доступом к MCP-инструментам и семантическим поиском по коду для AI-ассистентов разработки (Cline, Claude, Cursor и др.).
Сервисы: Ollama (LLM) + LiteLLM (шлюз) + MCP Gateway + Embeddings
Память: ~5 ГБ RAM (с моделью 3B)
Платформы: linux/amd64, linux/arm64
graph LR
U["👤 Пользователь"] -->|использует| C["🤖 AI-клиент<br/>(Cline, Claude и др.)"]
C -->|MCP-инструменты| M["MCP Gateway<br/>(MCP-эндпоинт)"]
C -->|чат| L["LiteLLM<br/>(AI-шлюз)"]
L -->|маршрутизация| O["Ollama<br/>(локальная LLM)"]
L -->|MCP-протокол| M
C -->|эмбеддинги| E["Embeddings<br/>(текст → векторы)"]
| Сервис | Назначение | Порт по умолчанию |
|---|---|---|
| Ollama (LLM) | Запускает локальные LLM-модели (llama3, qwen, mistral и др.) | 11434 |
| LiteLLM | AI-шлюз с панелью администратора — маршрутизирует запросы к Ollama и 100+ провайдерам | 4000 |
| MCP Gateway | Предоставляет MCP-инструменты (файловая система, fetch, GitHub, поиск, БД) AI-клиентам | 3000 |
| Embeddings | Преобразует текст в векторы для семантического поиска и RAG | 8000 |
git clone https://github.com/hwdsl2/docker-ai-stack
cd docker-ai-stack/stacks/code-assistant
docker compose up -dЗагрузка модели (обязательно перед отправкой LLM-запросов):
docker exec ollama ollama_manage --pull llama3.2:3bДля GPU-ускорения NVIDIA используйте CUDA compose-файл:
docker compose -f docker-compose.cuda.yml up -dТребования: GPU NVIDIA, драйвер NVIDIA 535+, и NVIDIA Container Toolkit, установленный на хосте. CUDA-образы поддерживают только linux/amd64.
Если вы предпочитаете использовать команды docker run напрямую, сначала создайте общую сеть для связи между сервисами:
docker network create ai-stackЗатем запустите каждый сервис в общей сети:
# PostgreSQL (required by LiteLLM)
docker run -d --name litellm-db --restart always \
--network ai-stack \
-e POSTGRES_USER=litellm \
-e POSTGRES_PASSWORD=litellm \
-e POSTGRES_DB=litellm \
-v litellm-db:/var/lib/postgresql \
postgres:18
# Ollama (LLM)
docker run -d --name ollama --restart always \
--network ai-stack \
-v ollama-data:/var/lib/ollama \
-v ollama-shared:/var/lib/ollama-shared \
hwdsl2/ollama-server
# MCP Gateway
docker run -d --name mcp --restart always \
--network ai-stack \
-v mcp-data:/var/lib/mcp \
-v mcp-shared:/var/lib/mcp-shared \
hwdsl2/mcp-gateway
# Embeddings
docker run -d --name embeddings --restart always \
--network ai-stack \
-p 127.0.0.1:8000:8000 \
-v embeddings-data:/var/lib/embeddings \
hwdsl2/embeddings-server
# LiteLLM (AI-шлюз)
docker run -d --name litellm --restart always \
--network ai-stack \
-p 4000:4000 \
-e LITELLM_OLLAMA_BASE_URL=http://ollama:11434 \
-e LITELLM_MCP_URL=http://mcp:3000/mcp \
-e LITELLM_DATABASE_URL=postgresql://litellm:litellm@litellm-db:5432/litellm \
-v litellm-data:/etc/litellm \
-v ollama-shared:/var/lib/ollama-shared:ro \
-v mcp-shared:/var/lib/mcp-shared:ro \
hwdsl2/litellm-serverПримечание: Общая сеть позволяет сервисам обращаться друг к другу по имени контейнера (например, LiteLLM подключается к Ollama через http://ollama:11434).
Загрузка модели (обязательно перед отправкой LLM-запросов):
docker exec ollama ollama_manage --pull llama3.2:3bПосле запуска стека можно проверить, что все сервисы работают корректно:
# Выполните из корневой директории docker-ai-stack
../../stack-check.shДоступ к панели администратора LiteLLM:
Откройте http://<server-ip>:4000/ui в браузере. Войдите с именем пользователя admin и вашим мастер-ключом LiteLLM в качестве пароля. Панель администратора предоставляет управление виртуальными ключами, отслеживание расходов и настройку моделей.
Примечание: Для развёртываний с выходом в интернет настоятельно рекомендуется использовать обратный прокси для добавления HTTPS. В этом случае также измените "4000:4000/tcp" на "127.0.0.1:4000:4000/tcp" в docker-compose.yml, чтобы предотвратить прямой доступ к незашифрованному порту.
Попробуйте в Playground:
В панели администратора нажмите Playground в левом меню. Выберите локальную модель (например, ollama/llama3.2:3b) из выпадающего списка и начните общаться — это быстрый способ убедиться, что локальная языковая модель работает сквозным образом.
Каждый сервис можно настроить с помощью опционального env-файла. Скопируйте пример env-файла из соответствующего репозитория, отредактируйте его и раскомментируйте монтирование тома в docker-compose.yml:
| Сервис | Env-файл | Репозиторий |
|---|---|---|
| Ollama | ollama.env |
docker-ollama |
| LiteLLM | litellm.env |
docker-litellm |
| MCP Gateway | mcp.env |
docker-mcp-gateway |
| Embeddings | embed.env |
docker-embeddings |
Подробные параметры настройки, справочник API и управление моделями описаны в документации каждого сервиса.
По умолчанию все сервисы слушают по незашифрованному HTTP. Для развёртываний с доступом из интернета установите обратный прокси (например, Caddy, Nginx или Traefik) перед стеком для обеспечения HTTPS. Каждый репозиторий сервиса содержит подробное руководство по обратному прокси с примерами для Caddy и nginx.
Инструкции по резервному копированию и восстановлению см. в руководстве Резервное копирование и восстановление.
Обновление всех сервисов до последних версий:
docker compose pull
docker compose up -dВаши данные сохраняются в Docker-томах. Всегда делайте резервную копию перед обновлением.
LiteLLM и MCP Gateway автоматически подключены при использовании compose-файла или команд docker run выше — ручная настройка ключей не требуется.
API-ключи автоматически передаются между сервисами через общие тома Docker:
- MCP Gateway генерирует API-ключ при первом запуске и копирует его в том
mcp-shared - LiteLLM читает ключ MCP из общего тома при запуске
Переменная окружения LITELLM_MCP_URL=http://mcp:3000/mcp уже задана, все сервисы подключаются автоматически.
# Получение API-ключей
LITELLM_KEY=$(docker exec litellm litellm_manage --getkey)
MCP_KEY=$(docker exec mcp mcp_manage --showkey | grep '^mcp-' | head -1)
# Используйте с AI-клиентом (например, Cline в VS Code):
# LLM-эндпоинт: http://localhost:4000 (с LITELLM_KEY)
# MCP-эндпоинт: http://localhost:3000/mcp (с MCP_KEY)
# Генерация эмбеддингов для семантического поиска по коду
curl -s http://localhost:8000/v1/embeddings \
-H "Content-Type: application/json" \
-d '{"input": "function to handle authentication", "model": "text-embedding-ada-002"}' \
| jq '.data[0].embedding[:5]'