Новости
Новый дата-центр Serverspace в Узбекистане: Ташкент
Serverspace Black Friday
AA
апреля 27, 2026
Обновлено апреля 27, 2026

Развёртывание Qwen в Docker: приватный AI без внешних API

Docker

Облачные 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 году.

Оценка:
5 из 5
Аverage rating : 5
Оценок: 1
050000 г. Алматы пр. Сейфуллина, д. 502
+7 (771) 944-45-66
ООО «ИТГЛОБАЛКОМ ЛАБС»