Облачные LLM удобны, но за этим удобством стоят три реальные издержки. Каждый промпт и документ покидает вашу инфраструктуру, ежемесячные счета непредсказуемо растут вместе с нагрузкой, а вся работа встаёт в момент, когда отзывают API-ключ или включают региональную блокировку.
Qwen, семейство open-source моделей от Alibaba, закрывает все три вопроса. Лицензия Apache 2.0 разрешает свободное коммерческое использование без ограничений, а линейка покрывает диапазон от модели 1.7B, которая запускается на ноутбуке, до MoE на 235B параметров, конкурирующей с системами уровня GPT-4. В связке с Docker весь стек становится переносимым, воспроизводимым и готовым к деплою на любом Linux-сервере с интернетом.
В этом руководстве мы пройдём весь путь от чистого сервера до рабочего Qwen с интерфейсом в стиле ChatGPT и уложимся в пятнадцать минут.
Что мы собираем
Стек состоит из двух контейнеров, объединённых в одном Docker Compose файле:
- Ollama запускает модель и отдаёт OpenAI-совместимый API на порту 11434.
- Open WebUI работает как браузерный интерфейс поверх Ollama и даёт нам историю переписки, загрузку документов и многопользовательский доступ на порту 8080.
Почему именно эта связка: Ollama берёт на себя управление моделями одной командой, поддерживает GPU-ускорение из коробки, а её API повторяет формат OpenAI, так что любой существующий клиентский код продолжает работать после смены base URL. Open WebUI добавляет пользовательский слой без необходимости писать собственный фронтенд.
Какую модель Qwen выбрать под своё железо
Размер модели Qwen обозначается количеством параметров, где B означает миллиарды. Чем больше параметров, тем выше качество ответов и тем больше памяти требуется. Второй важный фактор это квантизация, технология сжатия модели с минимальной потерей качества. Вариант Q4_K_M считается практическим стандартом: он сокращает требования к памяти примерно в четыре раза и используется в этом руководстве.
В таблице ниже приведены самые востребованные размеры Qwen3 в Q4_K_M с контекстным окном 8K:
| Модель | Размер на диске | Требуется памяти | Для чего подходит |
|---|---|---|---|
| Qwen3 1.7B | 1,4 ГБ | от 2 до 3 ГБ RAM | Edge-устройства, лёгкие тесты |
| Qwen3 4B | 2,5 ГБ | от 4 до 5 ГБ RAM | Серверы только с CPU |
| Qwen3 8B | 5 ГБ | от 6 до 7 ГБ VRAM/RAM | Чат, RAG, сбалансированный выбор |
| Qwen3 14B | 9 ГБ | от 10 до 12 ГБ VRAM | Качественные рассуждения |
| Qwen3 32B | 20 ГБ | от 22 до 24 ГБ VRAM | RTX 4090 или A6000 |
| Qwen3 30B-A3B (MoE) | 18 ГБ | от 20 ГБ VRAM | Скорость за счёт активных параметров |
Для большинства команд оптимальным выбором становится Qwen3 8B. Модель уверенно работает на GPU с 12 ГБ или на CPU с 16 ГБ RAM, а её качества хватает для чата, помощи с кодом и анализа документов. Стоит учесть, что Qwen3.5 и Qwen3.6 пока не поддерживаются в Ollama: они поставляются с отдельными мультимодальными vision-файлами. Под эти модели подходят vLLM или llama.cpp.
Подготовка: сервер, Docker и NVIDIA Container Toolkit
До старта понадобятся три компонента: Linux-сервер, Docker с Compose и (для GPU) NVIDIA Container Toolkit.
В качестве сервера лучше всего подходит Ubuntu 22.04 или 24.04. Требования к памяти зависят от модели: 16 ГБ RAM это минимум для Qwen3 8B на CPU, а GPU с 8 ГБ VRAM и больше открывает возможность быстрого инференса. Если подходящего железа под рукой нет, облачный сервер с GPU от Serverspace покрывает всю линейку Qwen от 1.7B до 32B без вложений в собственное оборудование.
Установка Docker и Compose на Ubuntu:
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
Чтобы изменения в группах применились, потребуется выйти из системы и зайти заново. После этого проверяем версии:
docker --version
docker compose version
Если в системе есть видеокарта NVIDIA, ставим Container Toolkit. Без него Docker не сможет пробросить GPU в контейнер:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sudo sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update && sudo apt install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Проверяем, что проброс GPU работает:
docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
Успешный запуск выводит модель видеокарты и версию драйвера. На macOS проброс GPU в Docker Desktop недоступен, поэтому на Маке остаётся либо CPU-инференс, либо нативная установка Ollama без контейнера.
Шаг 1: пишем docker-compose.yml
Создаём рабочую папку и compose-файл:
mkdir ~/qwen-stack && cd ~/qwen-stack
nano docker-compose.yml
Вставляем такой конфиг:
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
restart: unless-stopped
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "8080:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=replace-with-a-long-random-string
volumes:
- openwebui_data:/app/backend/data
depends_on:
- ollama
restart: unless-stopped
volumes:
ollama_data:
openwebui_data:
Несколько важных деталей:
- Тома сохраняют скачанные модели и пользовательские данные на диске между перезапусками контейнеров. Без них каждый docker compose down стирает модель, и нам приходится снова качать несколько гигабайт.
- OLLAMA_BASE_URL=http://ollama:11434 использует внутренний DNS Docker, благодаря которому Open WebUI находит контейнер Ollama по имени сервиса, а не по localhost.
- WEBUI_SECRET_KEY шифрует cookie сессий. Перед публикацией стека в продакшене обязательно меняем заглушку на длинную случайную строку.
- Если на сервере нет GPU, секцию resources удаляем целиком.
Шаг 2: запускаем стек
Поднимаем оба сервиса в фоне:
docker compose up -d
При первом запуске Docker скачает оба образа, в сумме около 2 ГБ. Проверяем, что контейнеры стартовали:
docker compose ps
В выводе должны быть оба сервиса в статусе Up:
NAME IMAGE STATUS
ollama ollama/ollama:latest Up 30 seconds
open-webui ghcr.io/open-webui/open-webui:main Up 30 seconds
Убеждаемся, что GPU подхватился:
docker compose logs ollama | grep -i "cuda\|gpu"
Должны появиться строки про обнаружение CUDA-драйвера. Если совпадений нет, скорее всего шаг с NVIDIA Toolkit прошёл не до конца и его нужно повторить.
Шаг 3: скачиваем модель Qwen
Модели подтягиваются изнутри запущенного контейнера Ollama:
docker exec -it ollama ollama pull qwen3:8b
Загрузка занимает несколько минут в зависимости от канала. Когда она завершится, смотрим список установленных моделей:
docker exec -it ollama ollama list
NAME ID SIZE MODIFIED
qwen3:8b abc123def456 5.2 GB About a minute ago
Делаем быстрый тест прямо в CLI:
docker exec -it ollama ollama run qwen3:8b "Объясни Docker volumes за два предложения."
Если модель отвечает, значит весь стек работает от и до.
Шаг 4: первый чат через Open WebUI
Открываем http://your-server-ip:8080 в браузере. На первом заходе появляется форма регистрации.
Важно: первая зарегистрированная учётная запись автоматически становится администратором. Все последующие регистрации попадают в очередь и требуют его одобрения. Регистрируем свой аккаунт сразу же, чтобы на публичном IP роль админа не достал кто-то посторонний.
После регистрации открывается интерфейс чата. В верхней части выбираем qwen3:8b в селекторе моделей и отправляем сообщение. На этом этапе нам уже доступны: история диалогов, загрузка документов для retrieval-augmented generation, настройка системного промпта в каждом чате и управление доступом для команды.
Используем OpenAI-совместимый API
Ollama отдаёт API, который повторяет формат chat completions от OpenAI. Любой существующий клиентский код переезжает на локальную модель сменой base URL.
Быстрая проверка через curl:
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3:8b",
"messages": [{"role": "user", "content": "Hello"}]
}'
Тот же запрос из Python с помощью официальной библиотеки openai:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama"
)
resp = client.chat.completions.create(
model="qwen3:8b",
messages=[{"role": "user", "content": "Hello"}]
)
print(resp.choices[0].message.content)
Значение api_key Ollama игнорирует, но указать его всё равно нужно: без него клиент OpenAI откажется отправлять запрос.
Замечание по безопасности: не выставляем порт 11434 в публичный интернет без авторизации. У Ollama нет встроенной аутентификации, и любой, кто доберётся до порта, сможет свободно использовать модель. Ставим перед ней обратный прокси с TLS и базовой авторизацией или ограничиваем доступ файрволом до доверенных IP.
Типичные проблемы и как их обходить
Несколько ситуаций встречаются регулярно:
- GPU не определился. Если инференс идёт медленно, а в docker compose logs ollama фигурирует только CPU, скорее всего NVIDIA Container Toolkit настроен не до конца. Повторяем шаг с nvidia-ctk и перезапускаем Docker.
- Out-of-memory при загрузке модели. Qwen3 14B не поместится в 8 ГБ VRAM. Берём модель поменьше или более агрессивную квантизацию: ollama pull qwen3:8b-q4_0.
- Open WebUI не видит модели. Селектор моделей пустой, когда OLLAMA_BASE_URL задан неверно. Внутри одного Compose значение должно быть именно http://ollama:11434, а не http://localhost:11434.
- Модели исчезают после docker compose down. Это значит, что секция volumes пропущена или названа с ошибкой. Проверяем, что ollama_data объявлен в нижней части compose-файла.
- Контекст по умолчанию в 2048 токенов слишком короткий. В Open WebUI можно поднять num_ctx в настройках конкретной модели. Значение 8192 или 16384 закрывает большинство задач с длинными документами; ещё выше потребует пропорционально больше памяти.
- CUDA 13.2 выдаёт мусор на Qwen3.6. Известный баг драйвера на апрель 2026 года: пока остаёмся на CUDA 12.x.
Когда Ollama перестаёт хватать: vLLM как production-альтернатива
Ollama хорошо подходит для одиночного разработчика и небольших команд. Когда параллельная нагрузка переваливает за десяток пользователей или становится узким местом batched-инференс, лучше переходить на vLLM. Он обеспечивает более высокий throughput на Qwen, поддерживает tensor parallelism между несколькими GPU и работает с готовыми FP8 и AWQ квантизациями.
Минимальный запуск vLLM в Docker выглядит так:
docker run --gpus all -p 8000:8000 --ipc=host \
-v ~/.cache/huggingface:/root/.cache/huggingface \
vllm/vllm-openai:latest --model Qwen/Qwen3-8B
OpenAI-совместимый API будет доступен на порту 8000, а Open WebUI работает с ним так же, как и с Ollama: достаточно указать в OLLAMA_BASE_URL эндпоинт vLLM.
Итог
За пятнадцать минут мы прошли путь от чистого сервера до полностью приватного Qwen с интерфейсом чата и OpenAI-совместимым API. Никаких внешних сервисов, никакой оплаты за токены, никаких данных, утекающих наружу. Дальше логично загрузить внутренние документы в Open WebUI для RAG, подключить API к существующим приложениям и масштабироваться до более крупной модели Qwen, если того потребует качество.
Модель лежит в томе, конфигурация умещается в один compose-файл, и весь стек разворачивается на новом сервере одной командой docker compose up -d. Так выглядит self-hosted AI в 2026 году.