Заметка Полное руководство: локальный Qwen3-Coder на видеокарте NVIDIA с 24 ГБ VRAM и Open WebUI

1784541878699.png


# Полное руководство: локальный Qwen3-Coder на видеокарте NVIDIA с 24 ГБ VRAM и Open WebUI

Актуальность руководства: 20 июля 2026 года
Основной сценарий: одна видеокарта NVIDIA с 24 ГБ видеопамяти, Ubuntu 22.04 или Ubuntu 24.04, Docker Compose, Ollama и Open WebUI.
Рекомендуемая модель: qwen3-coder:30b в квантизации Q4_K_M.
Рекомендуемый начальный контекст: 16 384 токена.
Рекомендуемый тип KV-кэша: q8_0.

---

## Содержание

1. Что именно мы будем устанавливать
2. Что такое Qwen-Coder, Ollama и Open WebUI
3. Какую версию Qwen-Coder выбрать для 24 ГБ VRAM
4. Почему размер контекста влияет на видеопамять
5. Требования к компьютеру
6. Итоговая архитектура
7. Подготовка Ubuntu
8. Установка драйвера NVIDIA
9. Установка Docker Engine и Docker Compose
10. Установка NVIDIA Container Toolkit
11. Создание Docker Compose-конфигурации
12. Запуск Ollama и Open WebUI
13. Загрузка Qwen3-Coder
14. Проверка работы через командную строку и API
15. Проверка загрузки модели в видеокарту
16. Создание вариантов модели с контекстом 8K, 16K и 32K
17. Первоначальная настройка Open WebUI
18. Рекомендуемые параметры генерации
19. Системный промпт для программирования
20. Как правильно ставить задачи Qwen-Coder
21. Работа с файлами и базой знаний
22. Настройка производительности
23. Что делать при нехватке VRAM
24. Доступ к Open WebUI по SSH
25. Доступ к Open WebUI из локальной сети
26. Публикация Open WebUI через Nginx и HTTPS
27. Обновление Ollama, Open WebUI и модели
28. Резервное копирование
29. Альтернативная установка Ollama без Docker
30. Установка на Windows 11
31. Типичные ошибки и их устранение
32. Полезные команды администратора
33. Поисковые запросы и ключевые слова
34. Финальный чек-лист
35. Официальные источники

---

# 1. Что именно мы будем устанавливать

В результате получится локальный сервер программной модели:

Код:
Браузер
   |
   | HTTP / WebSocket
   v
Open WebUI, порт 3000
   |
   | Ollama API
   v
Ollama, порт 11434
   |
   | CUDA
   v
NVIDIA GPU, 24 ГБ VRAM

Компоненты будут разделены:

  • Qwen3-Coder — языковая модель, специализирующаяся на программировании.
  • Ollama — движок, который загружает модель, размещает её в GPU и выполняет генерацию.
  • Open WebUI — веб-интерфейс для общения с моделью через браузер.
  • Docker Compose — управляет контейнерами Ollama и Open WebUI.
  • NVIDIA Container Toolkit — предоставляет Docker-контейнеру доступ к видеокарте.
  • Docker volumes — сохраняют модели, аккаунты, настройки и историю чатов.

После установки вы сможете:

  • общаться с Qwen3-Coder через браузер;
  • генерировать и исправлять код;
  • разбирать ошибки;
  • просить модель писать тесты;
  • загружать файлы и документацию;
  • хранить историю диалогов;
  • использовать несколько локальных моделей;
  • обращаться к Ollama через HTTP API;
  • подключать IDE, скрипты и программных агентов.

---

# 2. Что такое Qwen-Coder, Ollama и Open WebUI

## 2.1. Что такое Qwen-Coder

Qwen-Coder — семейство языковых моделей команды Qwen компании Alibaba, оптимизированных для задач программирования.

Модель может:

  • писать код;
  • объяснять существующий код;
  • исправлять ошибки;
  • выполнять рефакторинг;
  • создавать тесты;
  • анализировать журналы ошибок;
  • писать Dockerfile и Docker Compose;
  • работать с SQL;
  • создавать Bash- и PowerShell-скрипты;
  • предлагать архитектуру приложения;
  • работать с инструментами и function calling;
  • анализировать несколько файлов, если они помещаются в контекст.

Важно понимать, что Qwen-Coder — не полноценная IDE и не операционная система. Без подключения дополнительных инструментов модель:

  • не запускает код автоматически;
  • не проверяет, существует ли указанный пакет;
  • не имеет доступа к вашей файловой системе;
  • не видит Git-репозиторий целиком;
  • не выполняет команды в терминале;
  • не знает о свежих версиях библиотек без доступа к актуальной документации.

Сгенерированные команды и код необходимо проверять перед выполнением.

---

## 2.2. Что такое Ollama

Ollama — локальный сервер инференса языковых моделей.

Он отвечает за:

  • загрузку модели;
  • хранение скачанных моделей;
  • использование CPU и GPU;
  • управление видеопамятью;
  • токенизацию;
  • генерацию ответа;
  • работу с контекстом;
  • HTTP API;
  • выгрузку неиспользуемой модели из памяти;
  • создание производных моделей через Modelfile.

По умолчанию API Ollama работает на порту:

Код:
11434

Пример адреса:

Код:
http://127.0.0.1:11434

---

## 2.3. Что такое Open WebUI

Open WebUI — самостоятельная веб-платформа для работы с локальными и облачными языковыми моделями.

Она предоставляет:

  • интерфейс, похожий на современные AI-чаты;
  • аккаунты пользователей;
  • историю диалогов;
  • поиск по истории;
  • выбор модели;
  • системные промпты;
  • управление параметрами генерации;
  • загрузку файлов;
  • базы знаний и RAG;
  • подключение инструментов;
  • подключение Ollama;
  • подключение OpenAI-совместимых API;
  • многопользовательский режим;
  • административную панель.

Open WebUI не заменяет Ollama.

Распределение ролей выглядит так:

Код:
Ollama:
- загружает Qwen3-Coder;
- использует видеокарту;
- генерирует токены;
- предоставляет API.

Open WebUI:
- показывает веб-интерфейс;
- хранит аккаунты и чаты;
- отправляет запросы в Ollama;
- показывает потоковый ответ;
- управляет файлами, знаниями и инструментами.

Для обычного чата Open WebUI не требуется прямой доступ к GPU. Видеокарту использует контейнер Ollama.

Поэтому в этом руководстве для Open WebUI используется стандартный образ:

Код:
ghcr.io/open-webui/open-webui:main

CUDA-образ Open WebUI нужен только тогда, когда вы хотите ускорять на GPU собственные задачи Open WebUI, например некоторые варианты распознавания речи или создания эмбеддингов.

---

# 3. Какую версию Qwen-Coder выбрать для 24 ГБ VRAM

Название «Qwen-Coder» относится сразу к нескольким моделям. Для установки необходимо выбрать конкретный тег.

## 3.1. Рекомендуемый вариант

Для одной видеокарты с 24 ГБ VRAM рекомендуется:

Код:
qwen3-coder:30b

Характеристики сборки Ollama:

  • архитектура: Qwen3 MoE;
  • общие параметры: приблизительно 30,5 млрд;
  • активные параметры на токен: приблизительно 3,3 млрд;
  • квантизация весов: Q4_K_M;
  • размер файла модели: приблизительно 19 ГБ;
  • лицензия: Apache 2.0;
  • нативный максимальный контекст модели: 262 144 токена;
  • режим работы: non-thinking, без блоков <think>.

Команда запуска:

Bash:
ollama run qwen3-coder:30b

Почему эта модель подходит:

1. Файл весов занимает около 19 ГБ.
2. На 24-гигабайтной карте остаётся некоторое место для KV-кэша и служебных буферов.
3. MoE-архитектура активирует не все параметры одновременно.
4. Модель существенно сильнее маленьких 7B-моделей во многих сложных задачах программирования.
5. Она поддерживается Ollama без ручной конвертации.

---

## 3.2. Почему не Qwen3-Coder-Next

Более новая модель называется:

Код:
qwen3-coder-next

Её Q4_K_M-сборка Ollama занимает приблизительно:

Код:
52 ГБ

Это больше 24 ГБ VRAM.

Такую модель можно попытаться запускать с частичной выгрузкой в оперативную память, но результат будет зависеть от движка и объёма RAM. Скорость обычно сильно снизится из-за передачи данных между RAM и GPU.

Для нормальной работы qwen3-coder-next целиком на GPU одной 24-гигабайтной видеокарты недостаточно.

Не следует путать:

Код:
3 млрд активных параметров

и:

Код:
52 ГБ весов, которые всё равно необходимо где-то хранить.

MoE уменьшает объём вычислений на один токен, но не превращает 52-гигабайтную модель в 3-гигабайтную.

---

## 3.3. Почему не Qwen3-Coder 480B

Полная версия Qwen3-Coder 480B требует приблизительно 250 ГБ памяти или объединённой памяти даже в локальной квантизированной сборке Ollama.

Для одной 24-гигабайтной видеокарты она не подходит.

---

## 3.4. Альтернативные модели

| Модель | Примерный размер | Когда использовать |
|---|---:|---|
| qwen3-coder:30b | 19 ГБ | Основная рекомендация для 24 ГБ |
| qwen2.5-coder:14b | 9 ГБ | Нужна высокая скорость и большой запас VRAM |
| qwen2.5-coder:32b | 20 ГБ | Более старая плотная 32B-модель, мало запаса VRAM |
| qwen3-coder-next:q4_K_M | 52 ГБ | Не помещается целиком в 24 ГБ |
| qwen3-coder:480b | Не менее 250 ГБ памяти | Не подходит для одной потребительской GPU |

Команды загрузки альтернатив:

Bash:
ollama pull qwen2.5-coder:14b
ollama pull qwen2.5-coder:32b

Практический выбор:

Код:
Нужно максимальное качество в пределах 24 ГБ:
qwen3-coder:30b

Нужна высокая скорость и больше контекста:
qwen2.5-coder:14b

Нужно несколько одновременных пользователей:
лучше использовать меньшую модель или несколько GPU

---

# 4. Почему размер контекста влияет на видеопамять

## 4.1. Что такое контекст

Контекст — объём текста, который модель может учитывать в одном запросе.

В контекст входят:

  • системный промпт;
  • сообщения пользователя;
  • предыдущие ответы;
  • содержимое прикреплённых файлов;
  • схемы инструментов;
  • найденные RAG-фрагменты;
  • генерируемый ответ.

Контекст измеряется в токенах, а не в символах.

Очень грубая оценка для русского и программного текста:

Код:
1 токен может соответствовать примерно 2–4 символам,
но реальное соотношение сильно зависит от языка и содержимого.

---

## 4.2. Максимальный контекст не означает, что он поместится в вашу GPU

Qwen3-Coder архитектурно поддерживает до 262 144 токенов.

Это не означает, что 262 144 токена можно использовать вместе с 19-гигабайтной моделью на видеокарте с 24 ГБ памяти.

Помимо весов модели видеопамять расходуется на:

  • KV-кэш;
  • рабочие буферы;
  • CUDA-контекст;
  • графический интерфейс рабочего стола;
  • браузер с аппаратным ускорением;
  • другие программы;
  • дополнительные параллельные запросы.

Чем больше контекст, тем больше KV-кэш.

---

## 4.3. Практические значения для 24 ГБ

Рекомендуется начинать со следующих значений:

| Контекст | Назначение | Оценка для 24 ГБ |
|---:|---|---|
| 8192 | Короткие задачи, один-два файла | Очень надёжный вариант |
| 16384 | Обычная разработка | Рекомендуемый старт |
| 32768 | Крупные файлы и длинные диалоги | Нужно тестировать |
| 65536 | Большие части репозитория | Часто слишком тяжело для 30B на 24 ГБ |
| 262144 | Архитектурный максимум | Практически нереалистично с этой моделью на 24 ГБ |

В этом руководстве используется:

Код:
OLLAMA_CONTEXT_LENGTH=16384

---

## 4.4. Квантизация весов и квантизация KV-кэша — разные вещи

Модель qwen3-coder:30b использует квантизацию весов:

Код:
Q4_K_M

Отдельно можно квантизировать KV-кэш:

Код:
OLLAMA_KV_CACHE_TYPE=q8_0

Это разные настройки.

Код:
Q4_K_M:
уменьшает размер весов модели.

q8_0 для KV-кэша:
уменьшает память, расходуемую контекстом.

Ollama поддерживает следующие варианты KV-кэша:

Код:
f16
- максимальная точность;
- максимальный расход памяти.

q8_0
- примерно вдвое меньше памяти по сравнению с f16;
- обычно почти незаметная потеря качества;
- рекомендуемый компромисс.

q4_0
- примерно вчетверо меньше памяти по сравнению с f16;
- потеря качества может быть заметнее;
- использовать, если q8_0 недостаточно.

Для 24 ГБ рекомендуется начать с:

Код:
OLLAMA_FLASH_ATTENTION=1
OLLAMA_KV_CACHE_TYPE=q8_0

---

# 5. Требования к компьютеру

## 5.1. Видеокарта

Нужна NVIDIA GPU с 24 ГБ VRAM, например:

  • GeForce RTX 3090;
  • GeForce RTX 3090 Ti;
  • GeForce RTX 4090;
  • RTX A5000;
  • Titan RTX;
  • Tesla P40;
  • другая совместимая карта с 24 ГБ.

Для старых карт могут потребоваться дополнительные настройки и более новый драйвер.

Актуальные требования Ollama для NVIDIA:

Код:
Compute Capability: 5.0 или выше
Драйвер NVIDIA: 550 или новее

Для GPU с Compute Capability от 5.0 до 6.2 требуется драйвер версии 570 или новее.

К этой категории относятся некоторые старые Maxwell- и Pascal-карты, включая Tesla P40.

---

## 5.2. Оперативная память

Практические рекомендации:

Код:
Минимум: 32 ГБ RAM
Рекомендуется: 64 ГБ RAM
Комфортно для экспериментов и CPU offload: 96–128 ГБ RAM

Если модель полностью помещается в VRAM, большой объём RAM не всегда используется постоянно. Однако RAM потребуется:

  • операционной системе;
  • Docker;
  • Open WebUI;
  • файловому кэшу;
  • распаковке и загрузке моделей;
  • CPU offload;
  • обработке документов;
  • эмбеддингам;
  • нескольким контейнерам.

---

## 5.3. Накопитель

Рекомендуется SSD или NVMe.

Минимальный свободный объём:

Код:
50 ГБ

Рекомендуемый свободный объём:

Код:
100 ГБ или больше

Место потребуется для:

  • 19-гигабайтной модели;
  • временных файлов;
  • Docker-образов;
  • дополнительных моделей;
  • обновлений;
  • истории и файлов Open WebUI;
  • резервных копий.

---

## 5.4. Процессор

Для инференса на GPU процессор не является основным ограничением, но влияет на:

  • токенизацию;
  • обработку HTTP-запросов;
  • работу Docker;
  • подготовку промпта;
  • RAG;
  • CPU offload.

Практически рекомендуется:

Код:
8 физических или производительных ядер и больше

---

## 5.5. Операционная система

Основная инструкция рассчитана на:

Код:
Ubuntu 22.04 LTS
Ubuntu 24.04 LTS

В конце статьи приведён отдельный раздел для Windows 11.

---

# 6. Итоговая архитектура

Мы будем использовать два контейнера:

Код:
qwen-stack
├── ollama
│   ├── порт хоста: 127.0.0.1:11434
│   ├── доступ к NVIDIA GPU
│   └── volume с моделями
│
└── open-webui
    ├── порт хоста: 127.0.0.1:3000
    ├── подключение к http://ollama:11434
    └── volume с аккаунтами, чатами и настройками

Почему порты привязываются к 127.0.0.1:

Код:
127.0.0.1:3000:8080
127.0.0.1:11434:11434

Это не позволяет напрямую открыть сервисы из интернета или локальной сети.

Для удалённого доступа можно использовать:

  • SSH-туннель;
  • VPN;
  • Tailscale;
  • Nginx с HTTPS;
  • другой защищённый reverse proxy.

---

# 7. Подготовка Ubuntu

## 7.1. Проверяем архитектуру и версию системы

Bash:
uname -m
cat /etc/os-release

Ожидаемая архитектура:

Код:
x86_64

Проверяем оборудование:

Bash:
lspci | grep -i nvidia
free -h
df -h

Проверяем занятые порты:

Bash:
sudo ss -ltnp | grep -E ':(3000|11434)\b' || true

Если команда ничего не вывела, порты свободны.

---

## 7.2. Обновляем систему

Bash:
sudo apt update
sudo apt full-upgrade -y

Устанавливаем необходимые утилиты:

Bash:
sudo apt install -y \
  ca-certificates \
  curl \
  gnupg \
  gnupg2 \
  jq \
  openssl \
  ubuntu-drivers-common

После большого обновления ядра желательно перезагрузить сервер:

Bash:
sudo reboot

---

# 8. Установка драйвера NVIDIA

## 8.1. Проверяем существующий драйвер

Bash:
nvidia-smi

Если драйвер уже установлен, команда покажет:

  • модель GPU;
  • версию драйвера;
  • температуру;
  • загрузку;
  • использованную видеопамять;
  • процессы, использующие GPU.

Примерно так:

Код:
NVIDIA-SMI ...
Driver Version: 5xx.xx
CUDA Version: 12.x

GPU Name: NVIDIA GeForce RTX 4090
Memory-Usage: ... MiB / 24564 MiB

Важно:

Код:
Строка CUDA Version в nvidia-smi показывает максимальную версию CUDA,
поддерживаемую драйвером. Это не обязательно означает, что полный
CUDA Toolkit установлен в Ubuntu.

Для запуска Ollama в Docker полный CUDA Toolkit на хосте обычно не нужен. Нужны:

  • рабочий драйвер NVIDIA;
  • Docker;
  • NVIDIA Container Toolkit.

---

## 8.2. Устанавливаем рекомендуемый драйвер Ubuntu

Показываем доступные драйверы:

Bash:
ubuntu-drivers devices

Автоматически устанавливаем рекомендуемый пакет:

Bash:
sudo ubuntu-drivers install

Перезагружаем систему:

Bash:
sudo reboot

После перезагрузки:

Bash:
nvidia-smi

Дополнительно:

Bash:
nvidia-smi -L

Пример:

Код:
GPU 0: NVIDIA GeForce RTX 4090 (UUID: GPU-...)

---

## 8.3. Если включён Secure Boot

При включённом Secure Boot модуль NVIDIA может не загрузиться без подтверждения MOK-ключа.

Типичные симптомы:

Код:
nvidia-smi has failed because it couldn't communicate with the NVIDIA driver

или:

Код:
NVIDIA kernel module is not loaded

Проверка:

Bash:
mokutil --sb-state
lsmod | grep nvidia

Возможные решения:

1. Во время установки драйвера создать пароль MOK.
2. После перезагрузки выбрать в синем меню:
- Enroll MOK;
- Continue;
- Yes;
- ввести созданный пароль.
3. Либо отключить Secure Boot в UEFI/BIOS.
4. Повторно загрузить систему и проверить nvidia-smi.

Не переходите к Docker, пока обычная команда nvidia-smi на хосте не работает.

---

# 9. Установка Docker Engine и Docker Compose

## 9.1. Добавляем официальный репозиторий Docker

Bash:
sudo apt-get update
sudo apt-get install -y ca-certificates curl

Создаём каталог ключей:

Bash:
sudo install -m 0755 -d /etc/apt/keyrings

Загружаем ключ Docker:

Bash:
sudo curl -fsSL \
  https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc

Выдаём права на чтение:

Bash:
sudo chmod a+r /etc/apt/keyrings/docker.asc

Добавляем репозиторий:

Bash:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновляем индекс пакетов:

Bash:
sudo apt-get update

Устанавливаем Docker Engine и Compose Plugin:

Bash:
sudo apt-get install -y \
  docker-ce \
  docker-ce-cli \
  containerd.io \
  docker-buildx-plugin \
  docker-compose-plugin

---

## 9.2. Включаем автозапуск Docker

Bash:
sudo systemctl enable --now docker

Проверяем статус:

Bash:
sudo systemctl status docker --no-pager

Проверяем версию:

Bash:
sudo docker version
sudo docker compose version

Обратите внимание на синтаксис:

Код:
Правильно:
docker compose

Старый синтаксис:
docker-compose

---

## 9.3. Проверяем Docker

Bash:
sudo docker run --rm hello-world

Если контейнер успешно запустился, Docker работает.

---

## 9.4. Необязательно: разрешаем запуск Docker без sudo

Bash:
sudo usermod -aG docker "$USER"

Применяем группу в текущем сеансе:

Bash:
newgrp docker

Проверяем:

Bash:
docker ps

Предупреждение: членство в группе docker практически эквивалентно root-доступу. Не добавляйте в эту группу недоверенных пользователей.

Далее в статье команды приведены без sudo. Если пользователь не добавлен в группу docker, ставьте sudo перед командами Docker.

---

# 10. Установка NVIDIA Container Toolkit

Обычный Docker не предоставляет контейнеру доступ к NVIDIA GPU. Для этого устанавливается NVIDIA Container Toolkit.

## 10.1. Устанавливаем зависимости

Bash:
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
  ca-certificates \
  curl \
  gnupg2

---

## 10.2. Добавляем официальный репозиторий NVIDIA

Bash:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor \
  -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

Bash:
curl -s -L \
  https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | 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

---

## 10.3. Устанавливаем NVIDIA Container Toolkit

Bash:
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

---

## 10.4. Подключаем NVIDIA Runtime к Docker

Bash:
sudo nvidia-ctk runtime configure --runtime=docker

Перезапускаем Docker:

Bash:
sudo systemctl restart docker

---

## 10.5. Проверяем GPU внутри Docker

Bash:
sudo docker run --rm \
  --runtime=nvidia \
  --gpus all \
  ubuntu \
  nvidia-smi

Внутри контейнера должна появиться таблица nvidia-smi с вашей видеокартой.

Это обязательная проверка.

Не продолжайте установку Ollama, если данная команда не видит GPU.

---

# 11. Создание Docker Compose-конфигурации

## 11.1. Создаём рабочий каталог

Bash:
sudo mkdir -p /opt/qwen-stack/modelfiles
sudo mkdir -p /opt/qwen-stack/backups
sudo chown -R "$USER":"$USER" /opt/qwen-stack

Переходим в каталог:

Bash:
cd /opt/qwen-stack

---

## 11.2. Генерируем секретный ключ Open WebUI

Bash:
printf 'WEBUI_SECRET_KEY=%s\n' "$(openssl rand -hex 32)" > .env
chmod 600 .env

Проверяем наличие файла:

Bash:
ls -la .env

Не публикуйте содержимое .env.

Не добавляйте его в открытый Git-репозиторий.

Создаём .gitignore:

Bash:
cat > .gitignore <<'EOF'
.env
backups/
EOF

---

## 11.3. Создаём compose.yaml

Bash:
nano compose.yaml

Вставляем:

YAML:
name: qwen-stack

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped

    ports:
      - "127.0.0.1:11434:11434"

    volumes:
      - ollama_data:/root/.ollama
      - ./modelfiles:/modelfiles:ro

    environment:
      OLLAMA_HOST: "0.0.0.0:11434"

      # Начальный размер контекста.
      # Для 24 ГБ и qwen3-coder:30b рекомендуется начинать с 16K.
      OLLAMA_CONTEXT_LENGTH: "16384"

      # На одной 24-гигабайтной GPU лучше обрабатывать
      # только один запрос к модели одновременно.
      OLLAMA_NUM_PARALLEL: "1"

      # Не держим несколько больших моделей в VRAM одновременно.
      OLLAMA_MAX_LOADED_MODELS: "1"

      # После последнего запроса модель остаётся загруженной 10 минут.
      OLLAMA_KEEP_ALIVE: "10m"

      # Снижает потребление памяти на длинном контексте.
      OLLAMA_FLASH_ATTENTION: "1"

      # KV-кэш q8_0 использует примерно вдвое меньше памяти, чем f16.
      OLLAMA_KV_CACHE_TYPE: "q8_0"

      # Необязательно: запрет облачных моделей Ollama.
      # Удалите эту строку, если планируется использовать Ollama Cloud.
      OLLAMA_NO_CLOUD: "1"

    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu

    healthcheck:
      test:
        - CMD
        - ollama
        - list
      interval: 30s
      timeout: 10s
      retries: 10
      start_period: 20s

    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped

    depends_on:
      ollama:
        condition: service_healthy

    ports:
      - "127.0.0.1:3000:8080"

    environment:
      OLLAMA_BASE_URL: "http://ollama:11434"
      WEBUI_SECRET_KEY: "${WEBUI_SECRET_KEY}"
      WEBUI_NAME: "Local Qwen Coder"

    volumes:
      - open_webui_data:/app/backend/data

    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

volumes:
  ollama_data:
    name: qwen-stack-ollama

  open_webui_data:
    name: qwen-stack-open-webui

Сохраняем файл.

В nano:

Код:
Ctrl+O
Enter
Ctrl+X

---

## 11.4. Что означает конфигурация Ollama

### OLLAMA_CONTEXT_LENGTH

YAML:
OLLAMA_CONTEXT_LENGTH: "16384"

Устанавливает контекст по умолчанию в 16 384 токена.

### OLLAMA_NUM_PARALLEL

YAML:
OLLAMA_NUM_PARALLEL: "1"

Разрешает только один одновременно обрабатываемый запрос.

При нескольких параллельных запросах память под контекст умножается. Для одной почти полностью занятой 24-гигабайтной карты значение 1 безопаснее.

### OLLAMA_MAX_LOADED_MODELS

YAML:
OLLAMA_MAX_LOADED_MODELS: "1"

Не позволяет держать в VRAM несколько больших моделей одновременно.

### OLLAMA_KEEP_ALIVE

YAML:
OLLAMA_KEEP_ALIVE: "10m"

Оставляет модель в памяти на 10 минут после последнего запроса.

Преимущества:

  • следующий ответ начинается быстрее;
  • модель не загружается заново после каждого сообщения.

Недостаток:

- видеопамять остаётся занятой ещё 10 минут.

### OLLAMA_FLASH_ATTENTION

YAML:
OLLAMA_FLASH_ATTENTION: "1"

Принудительно включает Flash Attention, если выбранный backend и GPU его поддерживают.

На старых картах при проблемах эту строку можно удалить или заменить на:

YAML:
OLLAMA_FLASH_ATTENTION: "0"

### OLLAMA_KV_CACHE_TYPE

YAML:
OLLAMA_KV_CACHE_TYPE: "q8_0"

Уменьшает расход видеопамяти на контекст.

---

## 11.5. Что означает конфигурация Open WebUI

YAML:
OLLAMA_BASE_URL: "http://ollama:11434"

Внутри Docker Compose контейнер Ollama доступен по имени сервиса:

Код:
ollama

Поэтому Open WebUI обращается не к localhost, а к:

Код:
http://ollama:11434

localhost внутри контейнера Open WebUI означает сам контейнер Open WebUI, а не контейнер Ollama.

---

## 11.6. Почему Open WebUI не получает GPU

В этой схеме GPU использует Ollama.

Open WebUI выполняет роль веб-приложения и не нуждается в GPU для обычного общения с моделью.

Неправильная схема:

Код:
GPU передан только Open WebUI,
а Ollama работает без GPU.

Правильная схема:

Код:
GPU передан контейнеру Ollama.
Open WebUI подключается к API Ollama.

---

# 12. Запуск Ollama и Open WebUI

## 12.1. Проверяем синтаксис Compose

Bash:
cd /opt/qwen-stack
docker compose config

Если ошибок нет, загружаем образы:

Bash:
docker compose pull

Запускаем контейнеры:

Bash:
docker compose up -d

---

## 12.2. Проверяем статус

Bash:
docker compose ps

Ожидаемый результат:

Код:
ollama       running / healthy
open-webui   running

Показываем контейнеры:

Bash:
docker ps

---

## 12.3. Проверяем журналы Ollama

Bash:
docker compose logs --tail=100 ollama

Потоковый просмотр:

Bash:
docker compose logs -f ollama

Для выхода:

Код:
Ctrl+C

---

## 12.4. Проверяем журналы Open WebUI

Bash:
docker compose logs --tail=100 open-webui

Потоковый просмотр:

Bash:
docker compose logs -f open-webui

---

# 13. Загрузка Qwen3-Coder

Загружаем рекомендуемую модель:

Bash:
docker exec -it ollama ollama pull qwen3-coder:30b

Будет загружено приблизительно 19 ГБ данных.

Если соединение прервалось, повторите ту же команду:

Bash:
docker exec -it ollama ollama pull qwen3-coder:30b

Ollama обычно повторно использует уже загруженные слои.

---

## 13.1. Проверяем список моделей

Bash:
docker exec ollama ollama list

В списке должна появиться модель:

Код:
qwen3-coder:30b

---

## 13.2. Проверяем место на диске

Bash:
df -h
docker system df

Проверяем каталог Ollama внутри контейнера:

Bash:
docker exec ollama du -sh /root/.ollama

---

# 14. Проверка через командную строку и API

## 14.1. Интерактивный запуск

Bash:
docker exec -it ollama ollama run qwen3-coder:30b

Пример запроса:

Код:
Напиши на Python функцию чтения большого JSONL-файла без загрузки
всего файла в оперативную память. Добавь обработку повреждённых строк,
аннотации типов и тесты pytest.

Для выхода используйте:

Код:
Ctrl+D

или команду:

Код:
/bye

---

## 14.2. Проверка API

Проверяем список моделей:

Bash:
curl -s http://127.0.0.1:11434/api/tags | jq

Отправляем запрос:

Bash:
curl -s http://127.0.0.1:11434/api/chat \
  -H 'Content-Type: application/json' \
  -d @- <<'JSON' | jq -r '.message.content'
{
  "model": "qwen3-coder:30b",
  "stream": false,
  "messages": [
    {
      "role": "system",
      "content": "Ты опытный разработчик. Пиши безопасный и проверяемый код."
    },
    {
      "role": "user",
      "content": "Напиши HTTP-сервер на Go с эндпоинтом /health и корректным graceful shutdown."
    }
  ]
}
JSON

---

## 14.3. Потоковый запрос

По умолчанию Ollama может возвращать ответ частями.

Bash:
curl -N http://127.0.0.1:11434/api/chat \
  -H 'Content-Type: application/json' \
  -d @- <<'JSON'
{
  "model": "qwen3-coder:30b",
  "stream": true,
  "messages": [
    {
      "role": "user",
      "content": "Объясни разницу между mutex и semaphore и приведи пример на Rust."
    }
  ]
}
JSON

---

## 14.4. Получение скорости генерации

Bash:
curl -s http://127.0.0.1:11434/api/chat \
  -H 'Content-Type: application/json' \
  -d @- <<'JSON' \
  | jq '{
      response: .message.content,
      prompt_tokens: .prompt_eval_count,
      generated_tokens: .eval_count,
      tokens_per_second:
        (if .eval_duration > 0
         then (.eval_count / (.eval_duration / 1000000000))
         else 0
         end)
    }'
{
  "model": "qwen3-coder:30b",
  "stream": false,
  "messages": [
    {
      "role": "user",
      "content": "Напиши итеративную реализацию быстрой сортировки на C++20."
    }
  ]
}
JSON

Скорость зависит от:

  • модели видеокарты;
  • частоты GPU;
  • температуры;
  • длины входного контекста;
  • длины ответа;
  • наличия CPU offload;
  • текущей загрузки GPU;
  • версии Ollama;
  • выбранной квантизации.

---

# 15. Проверка загрузки модели в видеокарту

## 15.1. Открываем мониторинг GPU

В отдельном терминале:

Bash:
watch -n 1 nvidia-smi

После отправки запроса должны увеличиться:

  • Memory-Usage;
  • GPU-Util;
  • энергопотребление.

Для выхода:

Код:
Ctrl+C

---

## 15.2. Проверяем Ollama PS

Во время или сразу после генерации:

Bash:
docker exec ollama ollama ps

Пример ожидаемого вывода:

Код:
NAME                  PROCESSOR    CONTEXT
qwen3-coder:30b       100% GPU     16384

Главное поле:

Код:
PROCESSOR

Желательно увидеть:

Код:
100% GPU

Если вывод показывает смесь CPU и GPU, например:

Код:
70% GPU / 30% CPU

часть модели или рабочих данных была выгружена в оперативную память.

Это не обязательно ошибка, но скорость будет ниже.

---

## 15.3. Более подробный мониторинг

Bash:
nvidia-smi dmon

Или:

Bash:
nvidia-smi \
  --query-gpu=timestamp,name,temperature.gpu,power.draw,memory.used,memory.total,utilization.gpu \
  --format=csv \
  -l 1

---

# 16. Создание вариантов модели с контекстом 8K, 16K и 32K

Даже если сервер имеет значение контекста по умолчанию, удобно создать отдельные имена моделей.

Так в Open WebUI будет понятно, какой контекст выбран.

---

## 16.1. Вариант 8K

Bash:
cd /opt/qwen-stack

Bash:
cat > modelfiles/qwen3-coder-8k.Modelfile <<'EOF'
FROM qwen3-coder:30b
PARAMETER num_ctx 8192
EOF

Создаём модель:

Bash:
docker exec ollama \
  ollama create qwen3-coder-30b-8k \
  -f /modelfiles/qwen3-coder-8k.Modelfile

---

## 16.2. Вариант 16K

Bash:
cat > modelfiles/qwen3-coder-16k.Modelfile <<'EOF'
FROM qwen3-coder:30b
PARAMETER num_ctx 16384
EOF

Bash:
docker exec ollama \
  ollama create qwen3-coder-30b-16k \
  -f /modelfiles/qwen3-coder-16k.Modelfile

---

## 16.3. Вариант 32K

Bash:
cat > modelfiles/qwen3-coder-32k.Modelfile <<'EOF'
FROM qwen3-coder:30b
PARAMETER num_ctx 32768
EOF

Bash:
docker exec ollama \
  ollama create qwen3-coder-30b-32k \
  -f /modelfiles/qwen3-coder-32k.Modelfile

---

## 16.4. Проверяем созданные модели

Bash:
docker exec ollama ollama list

Ожидаемые имена:

Код:
qwen3-coder:30b
qwen3-coder-30b-8k:latest
qwen3-coder-30b-16k:latest
qwen3-coder-30b-32k:latest

Производные модели используют те же базовые слои, поэтому не должны создавать три независимые копии 19-гигабайтных весов.

---

## 16.5. Какой вариант использовать

Код:
qwen3-coder-30b-8k
- короткие задачи;
- максимальный запас VRAM;
- высокая стабильность.

qwen3-coder-30b-16k
- основной вариант;
- несколько файлов;
- длинные технические задания;
- обычные диалоги о коде.

qwen3-coder-30b-32k
- крупные файлы;
- большие логи;
- длинные обсуждения;
- необходимо внимательно следить за VRAM.

Если вариант 32K вызывает CPU offload или ошибку нехватки памяти, возвращайтесь к 16K.

---

# 17. Первоначальная настройка Open WebUI

## 17.1. Открываем интерфейс

Если браузер находится на том же компьютере:

Код:
http://127.0.0.1:3000

Если Ubuntu работает на удалённом сервере, используйте SSH-туннель. Инструкция приведена ниже.

---

## 17.2. Создаём администратора

При первом открытии Open WebUI предложит создать аккаунт.

Первый созданный аккаунт автоматически получает права администратора.

Последующие регистрации обычно получают статус Pending и требуют подтверждения администратора.

Рекомендации:

1. Используйте уникальный пароль.
2. Не используйте пароль от почты или другого сервиса.
3. После входа откройте административную панель.
4. Отключите свободную регистрацию, если другие пользователи не нужны.

Обычно настройка находится примерно здесь:

Код:
Admin Panel
→ Settings
→ Authentication
→ Enable Sign Up

Интерфейс может меняться между версиями.

---

## 17.3. Проверяем соединение с Ollama

Откройте:

Код:
Admin Panel
→ Settings
→ Connections
→ Ollama

Адрес должен быть:

Код:
http://ollama:11434

Не используйте внутри контейнера:

Код:
http://localhost:11434

Потому что localhost в контейнере Open WebUI указывает на сам Open WebUI.

---

## 17.4. Проверяем список моделей

В поле выбора модели должны появиться:

Код:
qwen3-coder:30b
qwen3-coder-30b-8k
qwen3-coder-30b-16k
qwen3-coder-30b-32k

Для начала выберите:

Код:
qwen3-coder-30b-16k

Если модели не появились:

Bash:
docker exec ollama ollama list
docker compose restart open-webui
docker compose logs --tail=100 open-webui

---

## 17.5. Важная настройка num_ctx

В Open WebUI параметр:

Код:
num_ctx

может переопределить серверное значение:

Код:
OLLAMA_CONTEXT_LENGTH

Есть два корректных варианта.

### Вариант A: наследовать значение Ollama

Не включайте ручной параметр num_ctx в Open WebUI.

Тогда будет использоваться значение из:

YAML:
OLLAMA_CONTEXT_LENGTH: "16384"

или значение, записанное в Modelfile.

### Вариант B: задать значение вручную

Установите:

Код:
num_ctx = 16384

Не оставляйте случайно:

Код:
num_ctx = 2048

Контекст 2048 токенов слишком мал для большинства задач программирования, особенно при использовании файлов и инструментов.

---

# 18. Рекомендуемые параметры генерации

Универсальных параметров не существует. Для программирования полезно создать несколько пресетов.

---

## 18.1. Точный и предсказуемый режим

Используется для:

  • исправления конкретной ошибки;
  • написания патча;
  • генерации конфигурации;
  • SQL-миграций;
  • кода, который должен соответствовать точному формату.

Рекомендуемые значения:

Код:
temperature: 0.2–0.4
top_p: 0.8
top_k: 20
repeat_penalty: 1.05
num_ctx: 16384
num_predict: 2048–4096

---

## 18.2. Стандартный режим Qwen

Официально для Qwen3-Coder рекомендуются приблизительно такие sampling-параметры:

Код:
temperature: 0.7
top_p: 0.8
top_k: 20
repeat_penalty: 1.05

Такой режим подходит для:

  • проектирования архитектуры;
  • поиска нескольких решений;
  • мозгового штурма;
  • генерации вариантов реализации;
  • подробных объяснений.

---

## 18.3. Не ставьте слишком большой num_predict без необходимости

num_predict ограничивает максимальную длину ответа.

Не следует по умолчанию ставить:

Код:
65536

на каждое сообщение.

Это может привести к:

  • очень долгой генерации;
  • лишнему расходу контекста;
  • повторениям;
  • зависанию интерфейса на длинном ответе;
  • большому энергопотреблению.

Практический старт:

Код:
2048

Для крупных файлов:

Код:
4096–8192

---

# 19. Системный промпт для программирования

В Open WebUI можно создать собственную модель или пресет с системным промптом.

Пример:

Код:
Ты — опытный senior software engineer и специалист по безопасной разработке.

Правила ответа:

1. Отвечай на языке пользователя.
2. Не выдумывай несуществующие API, параметры команд и библиотеки.
3. Если версия языка, фреймворка или базы данных важна, явно укажи,
   для какой версии написано решение.
4. Перед большим изменением кратко опиши план.
5. При изменении проекта перечисляй затрагиваемые файлы.
6. Для каждого файла указывай полный путь относительно корня проекта.
7. Возвращай готовый код без пропущенных участков и без комментариев
   вида "остальной код без изменений", если пользователь просит полный файл.
8. Добавляй обработку ошибок, валидацию входных данных и логирование,
   когда это уместно.
9. Учитывай безопасность: SQL injection, XSS, CSRF, SSRF, path traversal,
   command injection, утечки секретов и неправильную авторизацию.
10. Не помещай пароли, токены и API-ключи в исходный код.
11. После реализации предложи команды запуска и тестирования.
12. Добавляй автоматические тесты, когда задача допускает тестирование.
13. Если запрос содержит противоречие, укажи на него до написания кода.
14. Если информации недостаточно, сделай минимальные явно обозначенные
    предположения и продолжи решение.
15. Не утверждай, что код был запущен, если он фактически не запускался.
16. Для потенциально опасных команд объясняй последствия.
17. При разборе ошибки сначала выдели наиболее вероятную первопричину,
    затем предложи диагностику, затем исправление.
18. Сохраняй существующий стиль и архитектуру проекта, если они показаны.

---

# 20. Как правильно ставить задачи Qwen-Coder

Качество результата сильно зависит от качества запроса.

---

## 20.1. Плохой запрос

Код:
Сделай мне API.

Проблемы:

  • не указан язык;
  • не указан фреймворк;
  • неизвестна база данных;
  • неизвестна схема авторизации;
  • неизвестны эндпоинты;
  • неизвестен формат ответа;
  • неизвестны требования к развёртыванию.

---

## 20.2. Хороший запрос

Код:
Создай REST API на Python 3.12 и FastAPI.

Требования:
- PostgreSQL 16;
- SQLAlchemy 2.x в async-режиме;
- Alembic;
- Pydantic 2;
- JWT access token сроком 15 минут;
- refresh token хранится в HttpOnly cookie;
- эндпоинты регистрации, входа, обновления токена и выхода;
- пароли хешировать Argon2;
- добавить rate limiting для /login;
- добавить pytest;
- подготовить Dockerfile и compose.yaml;
- конфигурацию читать из переменных окружения;
- не помещать секреты в репозиторий.

Сначала покажи дерево проекта.
Затем выведи каждый файл отдельным блоком с полным путём.
После кода приведи команды запуска и тестирования.

---

## 20.3. Запрос для исправления ошибки

Код:
Ниже приведены:
1. версия среды;
2. полный stack trace;
3. проблемный файл;
4. ожидаемое поведение;
5. фактическое поведение.

Среда:
- Ubuntu 24.04;
- Python 3.12;
- FastAPI 0.x;
- SQLAlchemy 2.x;
- PostgreSQL 16.

Сначала определи первопричину.
Затем покажи минимальный патч.
Не переписывай архитектуру без необходимости.
После патча добавь тест, воспроизводящий ошибку.

---

## 20.4. Запрос для ревью кода

Код:
Проведи code review.

Проверяй:
- логические ошибки;
- race conditions;
- утечки ресурсов;
- безопасность;
- обработку исключений;
- производительность;
- читаемость;
- тестируемость;
- обратную совместимость.

Для каждой проблемы укажи:
- серьёзность: critical, high, medium или low;
- файл и участок кода;
- почему это проблема;
- сценарий воспроизведения;
- исправленный код.

---

## 20.5. Запрос для работы с существующим проектом

Передайте модели:

  • дерево файлов;
  • конфигурацию зависимостей;
  • версии технологий;
  • содержимое затрагиваемых файлов;
  • требования к обратной совместимости;
  • тесты;
  • точный ожидаемый результат.

Пример дерева:

Код:
project/
├── pyproject.toml
├── src/
│   ├── main.py
│   ├── config.py
│   └── users/
│       ├── router.py
│       ├── service.py
│       └── repository.py
└── tests/
    └── test_users.py

---

# 21. Работа с файлами и базой знаний

Open WebUI позволяет прикреплять документы и создавать базы знаний.

Но необходимо различать два режима.

---

## 21.1. Прямое помещение файла в контекст

Содержимое файла передаётся модели непосредственно.

Преимущества:

  • модель видит точный текст;
  • удобно для одного или нескольких небольших файлов;
  • хорошо подходит для конкретного патча.

Недостатки:

  • расходуется контекст;
  • большие файлы могут быть обрезаны;
  • история диалога тоже занимает контекст.

---

## 21.2. RAG

RAG означает Retrieval-Augmented Generation.

Упрощённо процесс выглядит так:

Код:
Документ
→ разбиение на фрагменты
→ создание эмбеддингов
→ сохранение в векторной базе
→ поиск релевантных фрагментов
→ передача найденных фрагментов модели

RAG подходит для:

  • документации;
  • внутренних инструкций;
  • спецификаций;
  • базы знаний;
  • большого количества справочных текстов.

Для точного изменения исходного кода RAG может быть недостаточен, потому что модель получит только найденные фрагменты, а не обязательно весь связанный код.

Для критического патча лучше явно передать:

  • полный проблемный файл;
  • используемые интерфейсы;
  • связанные типы;
  • тесты;
  • stack trace.

---

## 21.3. Open WebUI не выполняет код автоматически

Обычная установка Open WebUI не означает, что модель может:

  • запускать shell-команды;
  • изменять файлы;
  • делать Git commit;
  • выполнять тесты;
  • устанавливать пакеты.

Для этого нужны дополнительные инструменты или агенты.

При подключении терминала или инструмента выполнения кода используйте изоляцию:

  • отдельный непривилегированный контейнер;
  • отсутствие Docker socket;
  • ограниченный каталог;
  • ограничение CPU и RAM;
  • отсутствие секретов;
  • запрет доступа к домашнему каталогу;
  • запрет доступа к production-среде;
  • контроль сетевого доступа.

Никогда не передавайте AI-контейнеру без необходимости:

Код:
/var/run/docker.sock
/root
/home
/etc
~/.ssh
~/.aws
production.env

---

# 22. Настройка производительности

## 22.1. Базовый профиль для 24 ГБ

Рекомендуемая конфигурация:

YAML:
OLLAMA_CONTEXT_LENGTH: "16384"
OLLAMA_NUM_PARALLEL: "1"
OLLAMA_MAX_LOADED_MODELS: "1"
OLLAMA_FLASH_ATTENTION: "1"
OLLAMA_KV_CACHE_TYPE: "q8_0"
OLLAMA_KEEP_ALIVE: "10m"

---

## 22.2. Закройте приложения, использующие GPU

Если видеокарта одновременно выводит рабочий стол, часть VRAM используют:

  • браузер;
  • Discord;
  • Telegram;
  • IDE с аппаратным ускорением;
  • игры;
  • видеоредактор;
  • OBS;
  • локальные генераторы изображений;
  • другие AI-модели.

Проверка:

Bash:
nvidia-smi

Закройте ненужные процессы перед запуском большого контекста.

---

## 22.3. Одна модель и один запрос

Для 24 ГБ не рекомендуется одновременно держать:

  • Qwen3-Coder 30B;
  • модель эмбеддингов на той же GPU;
  • модель генерации изображений;
  • Whisper;
  • вторую большую LLM.

Также не рекомендуется несколько параллельных запросов с большим контекстом.

Оставьте:

Код:
OLLAMA_NUM_PARALLEL=1
OLLAMA_MAX_LOADED_MODELS=1

---

## 22.4. Проверяйте реальный контекст

Bash:
docker exec ollama ollama ps

Не ориентируйтесь только на значение в Compose.

Параметр num_ctx из Open WebUI может переопределить серверную настройку.

---

## 22.5. Измеряйте первый и последующие запросы отдельно

Первый запрос включает:

  • загрузку модели с диска;
  • выделение памяти;
  • инициализацию CUDA;
  • подготовку KV-кэша.

Последующий запрос при загруженной модели будет начинаться быстрее.

---

## 22.6. Температура GPU и throttling

Мониторинг:

Bash:
watch -n 1 nvidia-smi

Следите за:

  • температурой;
  • частотой;
  • энергопотреблением;
  • загрузкой GPU;
  • использованием VRAM.

Если карта перегревается:

  • очистите систему охлаждения;
  • улучшите вентиляцию корпуса;
  • проверьте вентиляторы;
  • ограничьте power limit;
  • убедитесь, что блок питания соответствует карте.

Пример ограничения мощности:

Bash:
sudo nvidia-smi -pl 300

Значение зависит от конкретной карты. Не копируйте 300 вслепую — сначала проверьте допустимый диапазон:

Bash:
nvidia-smi -q -d POWER

---

# 23. Что делать при нехватке VRAM

Типичные признаки:

Код:
CUDA out of memory
model runner process has terminated
failed to allocate CUDA buffer
модель частично работает на CPU
контейнер Ollama перезапускается
ответ очень медленный

Выполняйте действия по порядку.

---

## Шаг 1. Уменьшить контекст

Перейдите:

Код:
32768 → 16384 → 8192

В Open WebUI выберите:

Код:
qwen3-coder-30b-16k

или:

Код:
qwen3-coder-30b-8k

---

## Шаг 2. Проверить num_ctx в Open WebUI

Откройте Advanced Parameters и убедитесь, что там не установлено неожиданное значение:

Код:
65536
131072
262144

Либо отключите ручной num_ctx, либо задайте:

Код:
16384

---

## Шаг 3. Убедиться, что включён q8_0 KV-кэш

В compose.yaml:

YAML:
OLLAMA_FLASH_ATTENTION: "1"
OLLAMA_KV_CACHE_TYPE: "q8_0"

После изменения:

Bash:
cd /opt/qwen-stack
docker compose up -d

Проверяем журналы:

Bash:
docker compose logs --tail=100 ollama

---

## Шаг 4. Закрыть другие GPU-приложения

Bash:
nvidia-smi

Закройте браузеры, игры и другие AI-сервисы.

---

## Шаг 5. Выгрузить модель

Bash:
docker exec ollama ollama stop qwen3-coder:30b

Или через API:

Bash:
curl -s http://127.0.0.1:11434/api/generate \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "qwen3-coder:30b",
    "keep_alive": 0
  }'

---

## Шаг 6. Перезапустить Ollama

Bash:
docker compose restart ollama

---

## Шаг 7. Попробовать q4_0 для KV-кэша

Если q8_0 недостаточно:

YAML:
OLLAMA_KV_CACHE_TYPE: "q4_0"

Применяем:

Bash:
docker compose up -d

Учитывайте, что потеря качества может стать заметнее.

---

## Шаг 8. Перейти на меньшую модель

Bash:
docker exec -it ollama ollama pull qwen2.5-coder:14b

Меньшая модель оставит значительно больше VRAM для контекста.

---

# 24. Доступ к Open WebUI по SSH

Это рекомендуемый способ для удалённого сервера, который не нужно публиковать в интернет.

На локальном компьютере выполните:

Bash:
ssh -N \
  -L 3000:127.0.0.1:3000 \
  username@SERVER_IP

Например:

Bash:
ssh -N \
  -L 3000:127.0.0.1:3000 \
  [email protected]

После подключения откройте на локальном компьютере:

Код:
http://127.0.0.1:3000

Трафик пойдёт через SSH.

Преимущества:

  • порт 3000 не публикуется;
  • не нужен Nginx;
  • не нужен отдельный TLS-сертификат;
  • работает через существующий SSH-доступ.

---

# 25. Доступ к Open WebUI из локальной сети

По умолчанию в Compose указано:

YAML:
ports:
  - "127.0.0.1:3000:8080"

Это означает доступ только с самого сервера.

Для доступа из LAN можно указать конкретный IP сервера:

YAML:
ports:
  - "192.168.1.50:3000:8080"

Или все интерфейсы:

YAML:
ports:
  - "3000:8080"

Первый вариант безопаснее.

После изменения:

Bash:
cd /opt/qwen-stack
docker compose up -d

Открываем:

Код:
http://192.168.1.50:3000

---

## 25.1. Не публикуйте Ollama API без необходимости

Оставьте:

YAML:
- "127.0.0.1:11434:11434"

Не меняйте на:

YAML:
- "11434:11434"

без аутентификации, reverse proxy или надёжного сетевого ограничения.

Сам Ollama API обычно не предназначен для прямой публикации в интернет без защитного слоя.

---

## 25.2. Важное замечание о Docker и UFW

Опубликованные Docker-порты могут обрабатываться правилами Docker до некоторых правил UFW.

Поэтому не полагайтесь только на:

Bash:
sudo ufw deny 3000

Более надёжные меры:

  • привязать порт к 127.0.0.1;
  • привязать порт к конкретному LAN-IP;
  • использовать SSH-туннель;
  • использовать reverse proxy;
  • использовать внешний firewall;
  • не делать port forwarding на роутере.

---

# 26. Публикация Open WebUI через Nginx и HTTPS

Для интернет-доступа рекомендуется:

Код:
Интернет
→ HTTPS 443
→ Nginx
→ 127.0.0.1:3000
→ Open WebUI
→ Ollama

Ollama при этом остаётся недоступен извне.

---

## 26.1. Предварительные условия

Нужны:

  • домен, например ai.example.com;
  • DNS A- или AAAA-запись;
  • открытые порты 80 и 443;
  • Open WebUI, привязанный к 127.0.0.1:3000.

---

## 26.2. Устанавливаем Nginx и Certbot

Bash:
sudo apt update
sudo apt install -y \
  nginx \
  certbot \
  python3-certbot-nginx

---

## 26.3. Создаём конфигурацию Nginx

Bash:
sudo nano /etc/nginx/sites-available/open-webui

Вставляем:

NGINX:
server {
    listen 80;
    listen [::]:80;

    server_name ai.example.com;

    client_max_body_size 100M;

    location / {
        proxy_pass http://127.0.0.1:3000;

        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
        proxy_connect_timeout 60;
    }
}

Замените:

Код:
ai.example.com

на свой домен.

---

## 26.4. Включаем сайт

Bash:
sudo ln -s \
  /etc/nginx/sites-available/open-webui \
  /etc/nginx/sites-enabled/open-webui

Проверяем конфигурацию:

Bash:
sudo nginx -t

Перезагружаем Nginx:

Bash:
sudo systemctl reload nginx

---

## 26.5. Получаем HTTPS-сертификат

Bash:
sudo certbot --nginx -d ai.example.com

Проверяем автоматическое обновление:

Bash:
sudo certbot renew --dry-run

После этого интерфейс должен открываться по адресу:

Код:
https://ai.example.com

---

## 26.6. Настраиваем WEBUI_URL и CORS

Для публичной установки в сервис open-webui можно добавить:

YAML:
environment:
  OLLAMA_BASE_URL: "http://ollama:11434"
  WEBUI_SECRET_KEY: "${WEBUI_SECRET_KEY}"
  WEBUI_NAME: "Local Qwen Coder"
  WEBUI_URL: "https://ai.example.com"
  CORS_ALLOW_ORIGIN: "https://ai.example.com"

Применяем:

Bash:
docker compose up -d

Некоторые параметры Open WebUI сохраняются во внутренней базе и после первого запуска могут иметь приоритет над переменными окружения.

Если изменение не применяется, откройте административную панель и измените соответствующее значение там.

Для нескольких допустимых адресов CORS_ALLOW_ORIGIN использует разделитель ;, например:

YAML:
CORS_ALLOW_ORIGIN: "https://ai.example.com;http://192.168.1.50:3000"

---

## 26.7. Минимальные меры безопасности публичного сервера

Обязательно:

1. Использовать HTTPS.
2. Отключить свободную регистрацию.
3. Использовать длинный уникальный пароль администратора.
4. Не публиковать порт 11434.
5. Не публиковать Docker socket.
6. Регулярно обновлять Open WebUI.
7. Делать резервные копии.
8. Ограничить доступ по VPN или IP, если публичный доступ не нужен.
9. Не хранить секреты в чатах.
10. Не подключать опасные инструменты без sandbox.
11. Не использовать один пароль для Open WebUI и SSH.
12. Настроить firewall и защиту SSH.

---

# 27. Обновление Ollama, Open WebUI и модели

## 27.1. Обновление контейнеров

Bash:
cd /opt/qwen-stack
docker compose pull
docker compose up -d

Проверяем:

Bash:
docker compose ps
docker compose logs --tail=100 ollama
docker compose logs --tail=100 open-webui

Удаляем неиспользуемые старые образы:

Bash:
docker image prune -f

---

## 27.2. Обновление модели

Bash:
docker exec -it ollama ollama pull qwen3-coder:30b

После обновления базовой модели при необходимости пересоздайте производные варианты:

Bash:
docker exec ollama \
  ollama create qwen3-coder-30b-8k \
  -f /modelfiles/qwen3-coder-8k.Modelfile

Bash:
docker exec ollama \
  ollama create qwen3-coder-30b-16k \
  -f /modelfiles/qwen3-coder-16k.Modelfile

Bash:
docker exec ollama \
  ollama create qwen3-coder-30b-32k \
  -f /modelfiles/qwen3-coder-32k.Modelfile

---

## 27.3. Закрепление версии Open WebUI

Тег:

Код:
main

движется вместе с новыми релизами.

Для production-сервера лучше закрепить конкретную версию:

YAML:
image: ghcr.io/open-webui/open-webui:vX.Y.Z

Перед заменой:

1. прочитайте release notes;
2. сделайте резервную копию;
3. запишите текущий тег;
4. обновите образ;
5. проверьте миграцию базы;
6. проверьте вход, чаты и подключение к Ollama.

Не копируйте старый номер версии из случайной статьи. Найдите актуальный стабильный релиз.

---

# 28. Резервное копирование

## 28.1. Что необходимо сохранять

Данные Open WebUI:

Код:
qwen-stack-open-webui

Модели Ollama:

Код:
qwen-stack-ollama

Конфигурация:

Код:
/opt/qwen-stack/compose.yaml
/opt/qwen-stack/.env
/opt/qwen-stack/modelfiles/

.env необходимо хранить как секрет.

---

## 28.2. Резервная копия Open WebUI

Bash:
cd /opt/qwen-stack
mkdir -p backups

Bash:
docker run --rm \
  -v qwen-stack-open-webui:/data:ro \
  -v "$PWD/backups":/backup \
  alpine \
  sh -c 'tar czf /backup/open-webui-$(date +%F-%H%M%S).tar.gz -C /data .'

Проверяем:

Bash:
ls -lh backups

---

## 28.3. Резервная копия моделей Ollama

Модели можно скачать повторно, поэтому их резервная копия необязательна. Но она ускоряет восстановление при медленном интернете.

Bash:
docker run --rm \
  -v qwen-stack-ollama:/data:ro \
  -v "$PWD/backups":/backup \
  alpine \
  sh -c 'tar czf /backup/ollama-$(date +%F-%H%M%S).tar.gz -C /data .'

Архив получится большим.

---

## 28.4. Копия конфигурации

Bash:
tar czf \
  "backups/qwen-config-$(date +%F-%H%M%S).tar.gz" \
  compose.yaml \
  .env \
  modelfiles

Ограничиваем доступ:

Bash:
chmod 600 backups/qwen-config-*.tar.gz

---

## 28.5. Восстановление Open WebUI

Сначала остановите сервис:

Bash:
cd /opt/qwen-stack
docker compose down

Очистите или создайте volume только после проверки имени.

Пример восстановления:

Bash:
docker run --rm \
  -v qwen-stack-open-webui:/data \
  -v "$PWD/backups":/backup:ro \
  alpine \
  sh -c 'rm -rf /data/* /data/.[!.]* /data/..?* 2>/dev/null || true; tar xzf /backup/ИМЯ_АРХИВА.tar.gz -C /data'

После восстановления:

Bash:
docker compose up -d

Перед удалением данных обязательно сделайте дополнительную копию.

---

# 29. Альтернативная установка Ollama без Docker

Иногда Ollama удобнее установить непосредственно в Ubuntu, а Open WebUI оставить в Docker.

Основной Docker Compose-вариант обычно проще переносить и резервировать, но нативная установка тоже работоспособна.

---

## 29.1. Устанавливаем Ollama

Bash:
curl -fsSL https://ollama.com/install.sh | sh

Проверяем:

Bash:
ollama --version
sudo systemctl status ollama --no-pager

---

## 29.2. Настраиваем переменные systemd

Bash:
sudo systemctl edit ollama

Вставляем:

INI:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_CONTEXT_LENGTH=16384"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_KEEP_ALIVE=10m"
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
Environment="OLLAMA_NO_CLOUD=1"

Сохраняем и выполняем:

Bash:
sudo systemctl daemon-reload
sudo systemctl restart ollama

Проверяем:

Bash:
sudo systemctl status ollama --no-pager
journalctl -u ollama --no-pager -n 100

---

## 29.3. Загружаем модель

Bash:
ollama pull qwen3-coder:30b
ollama run qwen3-coder:30b

---

## 29.4. Запускаем Open WebUI отдельно

Создаём постоянный секрет:

Bash:
printf 'WEBUI_SECRET_KEY=%s\n' "$(openssl rand -hex 32)" > open-webui.env
chmod 600 open-webui.env

Запускаем:

Bash:
docker run -d \
  --name open-webui \
  --restart unless-stopped \
  -p 127.0.0.1:3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  --env-file open-webui.env \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  -v open-webui:/app/backend/data \
  ghcr.io/open-webui/open-webui:main

В этой схеме:

Код:
Ollama работает на хосте.
Open WebUI работает в Docker.
Open WebUI обращается к host.docker.internal.

---

## 29.5. Предупреждение об OLLAMA_HOST

Для доступа из Docker нативный Ollama слушает:

Код:
0.0.0.0:11434

Это потенциально делает API доступным через сетевые интерфейсы сервера.

Не пробрасывайте порт 11434 на роутере.

Ограничьте доступ firewall или используйте основной вариант, где Ollama и Open WebUI находятся в одной Docker-сети.

---

# 30. Установка на Windows 11

Для Windows удобна схема:

Код:
Ollama работает как Windows-приложение.
Open WebUI работает в Docker Desktop.

---

## 30.1. Требования

Нужны:

  • Windows 11;
  • свежий драйвер NVIDIA;
  • Ollama for Windows;
  • Docker Desktop;
  • WSL 2;
  • включённая аппаратная виртуализация;
  • 24 ГБ VRAM;
  • достаточно свободного места на диске.

---

## 30.2. Проверяем GPU

Откройте PowerShell:

Код:
nvidia-smi

Команда должна увидеть видеокарту.

---

## 30.3. Устанавливаем Ollama

Скачайте установщик с официального сайта:

Код:
https://ollama.com/download

После установки откройте новый PowerShell:

Код:
ollama --version

---

## 30.4. Настраиваем Ollama через переменные пользователя

Код:
[Environment]::SetEnvironmentVariable(
  "OLLAMA_CONTEXT_LENGTH",
  "16384",
  "User"
)

Код:
[Environment]::SetEnvironmentVariable(
  "OLLAMA_NUM_PARALLEL",
  "1",
  "User"
)

Код:
[Environment]::SetEnvironmentVariable(
  "OLLAMA_MAX_LOADED_MODELS",
  "1",
  "User"
)

Код:
[Environment]::SetEnvironmentVariable(
  "OLLAMA_FLASH_ATTENTION",
  "1",
  "User"
)

Код:
[Environment]::SetEnvironmentVariable(
  "OLLAMA_KV_CACHE_TYPE",
  "q8_0",
  "User"
)

После изменения полностью завершите Ollama через значок в системном трее и запустите заново.

Можно также перезагрузить Windows.

---

## 30.5. Перенос моделей на другой диск

Например, на диск D::

Код:
New-Item -ItemType Directory -Force D:\OllamaModels

Код:
[Environment]::SetEnvironmentVariable(
  "OLLAMA_MODELS",
  "D:\OllamaModels",
  "User"
)

Перезапустите Ollama.

---

## 30.6. Загружаем модель

Код:
ollama pull qwen3-coder:30b

Запускаем:

Код:
ollama run qwen3-coder:30b

Проверяем загрузку:

Код:
ollama ps

В отдельном окне:

Код:
nvidia-smi -l 1

---

## 30.7. Устанавливаем Docker Desktop

Скачайте Docker Desktop:

Код:
https://www.docker.com/products/docker-desktop/

В настройках Docker Desktop убедитесь, что используется WSL 2 backend.

Проверяем PowerShell:

Код:
docker version
docker compose version

---

## 30.8. Запускаем Open WebUI

Сначала создайте volume:

Код:
docker volume create open-webui

Запускаем контейнер:

Код:
docker run -d `
  --name open-webui `
  --restart unless-stopped `
  -p 127.0.0.1:3000:8080 `
  --add-host=host.docker.internal:host-gateway `
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 `
  -v open-webui:/app/backend/data `
  ghcr.io/open-webui/open-webui:main

Открываем:

Код:
http://127.0.0.1:3000

---

## 30.9. Если Open WebUI не видит Windows Ollama

Установите:

Код:
[Environment]::SetEnvironmentVariable(
  "OLLAMA_HOST",
  "0.0.0.0:11434",
  "User"
)

Полностью перезапустите Ollama.

Проверьте:

Код:
curl.exe http://127.0.0.1:11434/api/tags

Проверьте журналы Open WebUI:

Код:
docker logs --tail 100 open-webui

Не публикуйте порт 11434 в интернет. В Windows Firewall разрешайте доступ только из доверенных сетей.

---

# 31. Типичные ошибки и их устранение

## Ошибка 1. Docker не видит GPU

Сообщение:

Код:
could not select device driver "" with capabilities: [[gpu]]

Проверяем:

Bash:
nvidia-smi

Bash:
dpkg -l | grep nvidia-container

Повторно настраиваем runtime:

Bash:
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Тестируем:

Bash:
sudo docker run --rm \
  --runtime=nvidia \
  --gpus all \
  ubuntu \
  nvidia-smi

---

## Ошибка 2. nvidia-smi работает на хосте, но не в контейнере

Проверьте:

Bash:
docker info | grep -i runtime

Bash:
cat /etc/docker/daemon.json

Повторите:

Bash:
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

---

## Ошибка 3. Ollama использует CPU

Проверяем:

Bash:
docker exec ollama ollama ps
nvidia-smi
docker compose logs --tail=200 ollama

Возможные причины:

  • GPU не передан контейнеру;
  • NVIDIA Container Toolkit не настроен;
  • модель и контекст не помещаются в VRAM;
  • после suspend/resume драйвер перестал обнаруживаться;
  • запущены другие GPU-приложения;
  • используется неподдерживаемая карта;
  • установлен слишком старый драйвер.

После suspend/resume в Linux иногда помогает:

Bash:
sudo rmmod nvidia_uvm
sudo modprobe nvidia_uvm
docker compose restart ollama

Если модуль занят, проще перезагрузить систему.

---

## Ошибка 4. CUDA out of memory

Уменьшите:

Код:
num_ctx

Порядок:

Код:
32768 → 16384 → 8192

Проверьте:

Bash:
docker exec ollama ollama ps
nvidia-smi

Убедитесь, что:

YAML:
OLLAMA_NUM_PARALLEL: "1"
OLLAMA_MAX_LOADED_MODELS: "1"
OLLAMA_KV_CACHE_TYPE: "q8_0"

---

## Ошибка 5. Open WebUI не подключается к Ollama

Проверяем API на хосте:

Bash:
curl -s http://127.0.0.1:11434/api/tags | jq

Проверяем Docker-сеть из отдельного временного контейнера:

Bash:
docker run --rm \
  --network qwen-stack_default \
  curlimages/curl:latest \
  -sS http://ollama:11434/api/tags

Проверяем переменную:

Bash:
docker inspect open-webui \
  --format '{{range .Config.Env}}{{println .}}{{end}}' \
  | grep OLLAMA

Должно быть:

Код:
OLLAMA_BASE_URL=http://ollama:11434

Проверяем журналы:

Bash:
docker compose logs --tail=200 open-webui
docker compose logs --tail=200 ollama

---

## Ошибка 6. Модель не отображается в Open WebUI

Bash:
docker exec ollama ollama list
docker compose restart open-webui

В Open WebUI проверьте:

Код:
Admin Panel
→ Settings
→ Connections
→ Ollama
→ http://ollama:11434

---

## Ошибка 7. Контекст остаётся маленьким

Проверяем:

Bash:
docker exec ollama ollama ps

В Open WebUI найдите параметр:

Код:
num_ctx

Он может переопределять OLLAMA_CONTEXT_LENGTH.

Либо выключите ручной num_ctx, либо задайте:

Код:
16384

---

## Ошибка 8. После включения num_ctx модель возвращает пустой ответ

Если параметр автоматически получил значение:

Код:
2048

увеличьте его до:

Код:
8192

или:

Код:
16384

Маленького контекста может не хватать для:

  • истории;
  • системного промпта;
  • tool schemas;
  • содержимого файлов;
  • ответа модели.

---

## Ошибка 9. Порт уже занят

Bash:
sudo ss -ltnp | grep ':3000'
sudo ss -ltnp | grep ':11434'

Или:

Bash:
sudo lsof -iTCP:3000 -sTCP:LISTEN
sudo lsof -iTCP:11434 -sTCP:LISTEN

Измените внешний порт, например:

YAML:
ports:
  - "127.0.0.1:3001:8080"

Тогда адрес:

Код:
http://127.0.0.1:3001

---

## Ошибка 10. Permission denied при обращении к Docker

Сообщение:

Код:
permission denied while trying to connect to the Docker daemon socket

Временно используйте:

Bash:
sudo docker ps

Либо:

Bash:
sudo usermod -aG docker "$USER"
newgrp docker

---

## Ошибка 11. Мало места на диске

Bash:
df -h
docker system df

Удаляем неиспользуемые образы:

Bash:
docker image prune -a

Перед подтверждением внимательно проверьте список.

Не выполняйте без понимания:

Bash:
docker system prune --volumes

Эта команда может удалить volumes и данные.

Удаление ненужной модели:

Bash:
docker exec ollama ollama rm ИМЯ_МОДЕЛИ

---

## Ошибка 12. Open WebUI теряет авторизацию после обновления

Причина может заключаться в изменившемся WEBUI_SECRET_KEY.

Проверьте:

Bash:
cd /opt/qwen-stack
cat .env

Секрет должен оставаться постоянным.

Не генерируйте новый ключ при каждом обновлении.

Изменение ключа завершит существующие пользовательские сессии и может нарушить расшифровку некоторых сохранённых токенов инструментов.

---

## Ошибка 13. Nginx показывает 502 Bad Gateway

Проверяем:

Bash:
curl -I http://127.0.0.1:3000
docker compose ps
docker compose logs --tail=100 open-webui
sudo nginx -t
sudo journalctl -u nginx --no-pager -n 100

Убедитесь, что Nginx использует:

NGINX:
proxy_pass http://127.0.0.1:3000;

---

## Ошибка 14. Через Nginx не работает потоковый ответ

Убедитесь, что присутствуют:

NGINX:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600;
proxy_send_timeout 3600;

Проверьте CORS_ALLOW_ORIGIN.

---

## Ошибка 15. Модель отвечает медленно

Проверяем:

Bash:
docker exec ollama ollama ps
nvidia-smi

Причины:

  • часть модели находится в CPU;
  • слишком большой контекст;
  • длинная история чата;
  • GPU перегревается;
  • другое приложение использует GPU;
  • старый GPU;
  • медленный CPU offload;
  • одновременно поступает несколько запросов;
  • модель каждый раз выгружается и загружается;
  • накопитель медленно читает модель.

---

## Ошибка 16. Flash Attention вызывает проблему на старой GPU

Удалите:

YAML:
OLLAMA_FLASH_ATTENTION: "1"
OLLAMA_KV_CACHE_TYPE: "q8_0"

Или временно установите:

YAML:
OLLAMA_FLASH_ATTENTION: "0"
OLLAMA_KV_CACHE_TYPE: "f16"

Затем уменьшите контекст:

YAML:
OLLAMA_CONTEXT_LENGTH: "8192"

Примените:

Bash:
docker compose up -d

---

# 32. Полезные команды администратора

## Статус контейнеров

Bash:
cd /opt/qwen-stack
docker compose ps

## Запуск

Bash:
docker compose up -d

## Остановка

Bash:
docker compose stop

## Перезапуск

Bash:
docker compose restart

## Полное удаление контейнеров без удаления volumes

Bash:
docker compose down

## Удаление контейнеров вместе с данными

Bash:
docker compose down -v

Опасно: последняя команда удалит модели, аккаунты, чаты и настройки.

## Журнал Ollama

Bash:
docker compose logs -f ollama

## Журнал Open WebUI

Bash:
docker compose logs -f open-webui

## Список моделей

Bash:
docker exec ollama ollama list

## Запущенные модели

Bash:
docker exec ollama ollama ps

## Загрузка модели

Bash:
docker exec -it ollama ollama pull qwen3-coder:30b

## Удаление модели

Bash:
docker exec ollama ollama rm qwen3-coder:30b

## Выгрузка модели из памяти

Bash:
docker exec ollama ollama stop qwen3-coder:30b

## Проверка API

Bash:
curl -s http://127.0.0.1:11434/api/tags | jq

## Проверка GPU

Bash:
nvidia-smi

## Постоянный мониторинг GPU

Bash:
watch -n 1 nvidia-smi

## Проверка Docker volumes

Bash:
docker volume ls
docker volume inspect qwen-stack-ollama
docker volume inspect qwen-stack-open-webui

## Проверка сети

Bash:
docker network ls
docker network inspect qwen-stack_default

## Проверка итоговой Compose-конфигурации

Bash:
docker compose config

## Обновление

Bash:
docker compose pull
docker compose up -d

---

# 33. Поисковые запросы и ключевые слова

Ниже приведены запросы, которые удобно использовать в Google, Яндекс, Bing, GitHub Issues, Reddit и официальной документации.

При поиске ошибки помещайте её точный текст в кавычки.

Пример:

Код:
"could not select device driver" "capabilities: [[gpu]]" Ubuntu

---

## 33.1. Выбор модели

Код:
Qwen3-Coder 30B 24GB VRAM Ollama

Код:
qwen3-coder:30b 19GB Q4_K_M

Код:
Qwen3-Coder 30B A3B 24GB GPU

Код:
Qwen3-Coder 30B RTX 3090

Код:
Qwen3-Coder 30B RTX 4090

Код:
Qwen3-Coder 30B context length VRAM

Код:
Qwen3-Coder-Next 52GB Q4_K_M

Код:
Qwen3-Coder-Next 24GB VRAM offload

Код:
Qwen2.5-Coder 14B vs Qwen3-Coder 30B

Код:
Qwen coder best model for 24GB VRAM

---

## 33.2. Ollama

Код:
Ollama qwen3-coder 30b install

Код:
Ollama qwen3-coder 30b Docker

Код:
Ollama qwen3-coder 30b 100% GPU

Код:
Ollama context length 24GB VRAM

Код:
OLLAMA_CONTEXT_LENGTH qwen3-coder

Код:
OLLAMA_NUM_PARALLEL VRAM usage

Код:
OLLAMA_MAX_LOADED_MODELS one GPU

Код:
OLLAMA_FLASH_ATTENTION qwen3-coder

Код:
OLLAMA_KV_CACHE_TYPE q8_0

Код:
Ollama q8_0 KV cache memory

Код:
Ollama Modelfile PARAMETER num_ctx

Код:
Ollama ps 100% GPU

Код:
Ollama model CPU offload slow

---

## 33.3. NVIDIA и Docker

Код:
NVIDIA Container Toolkit Ubuntu install

Код:
Docker NVIDIA GPU Ubuntu 24.04

Код:
Docker Compose NVIDIA GPU reservation

Код:
docker compose capabilities gpu nvidia

Код:
nvidia-ctk runtime configure docker

Код:
Docker container nvidia-smi not found

Код:
Docker GPU not detected Ubuntu

Код:
"could not select device driver" gpu docker

Код:
"nvidia-container-cli: initialization error"

Код:
NVIDIA Container Toolkit driver library mismatch

Код:
Ollama NVIDIA GPU not detected

Код:
Ollama CUDA out of memory qwen3-coder 30b

---

## 33.4. Open WebUI

Код:
Open WebUI Ollama Docker Compose

Код:
Open WebUI qwen3-coder

Код:
Open WebUI Ollama connection error

Код:
Open WebUI http ollama 11434 Docker network

Код:
Open WebUI OLLAMA_BASE_URL

Код:
Open WebUI host.docker.internal Ollama

Код:
Open WebUI first user administrator

Код:
Open WebUI disable signup

Код:
Open WebUI WEBUI_SECRET_KEY

Код:
Open WebUI num_ctx overrides OLLAMA_CONTEXT_LENGTH

Код:
Open WebUI num_ctx 2048 blank response

Код:
Open WebUI qwen coder system prompt

Код:
Open WebUI RAG source code repository

Код:
Open WebUI Docker volume backup

---

## 33.5. Nginx и удалённый доступ

Код:
Open WebUI Nginx reverse proxy

Код:
Open WebUI Nginx WebSocket

Код:
Open WebUI HTTPS Certbot

Код:
Open WebUI CORS_ALLOW_ORIGIN

Код:
Open WebUI 502 Bad Gateway Nginx

Код:
Open WebUI WebSocket connection failed Nginx

Код:
Open WebUI SSH tunnel port 3000

Код:
Open WebUI Tailscale

---

## 33.6. Windows

Код:
Ollama Windows qwen3-coder 30b

Код:
Ollama Windows OLLAMA_CONTEXT_LENGTH

Код:
Ollama Windows OLLAMA_MODELS D drive

Код:
Open WebUI Docker Desktop Ollama Windows

Код:
Open WebUI host.docker.internal Windows Ollama

Код:
Ollama Windows NVIDIA GPU not detected

Код:
Ollama Windows qwen3-coder CUDA out of memory

---

## 33.7. Поиск по официальным сайтам

Код:
site:ollama.com/library/qwen3-coder qwen3-coder 30b

Код:
site:docs.ollama.com context length

Код:
site:docs.ollama.com OLLAMA_KV_CACHE_TYPE

Код:
site:docs.ollama.com hardware support NVIDIA

Код:
site:docs.openwebui.com starting with Ollama

Код:
site:docs.openwebui.com OLLAMA_BASE_URL

Код:
site:docs.openwebui.com num_ctx

Код:
site:docs.openwebui.com WEBUI_SECRET_KEY

Код:
site:huggingface.co/Qwen Qwen3-Coder-30B-A3B-Instruct

Код:
site:docs.nvidia.com nvidia container toolkit install guide

Код:
site:docs.docker.com engine install ubuntu

---

## 33.8. Поиск по GitHub Issues

Добавляйте к запросу:

Код:
site:github.com/issues

Примеры:

Код:
site:github.com/issues ollama qwen3-coder CUDA out of memory 24GB

Код:
site:github.com/issues open-webui Ollama connection refused

Код:
site:github.com/issues nvidia-container-toolkit Ubuntu 24.04 GPU

Также полезно искать прямо в репозиториях:

Код:
github ollama ollama issues qwen3-coder

Код:
github open-webui open-webui issues num_ctx

---

## 33.9. Как составлять хороший поисковый запрос

Используйте шаблон:

Код:
[программа] [версия] [GPU] [ОС] "[точный текст ошибки]"

Пример:

Код:
Ollama RTX 4090 Ubuntu 24.04 "failed to allocate CUDA buffer"

Ещё один шаблон:

Код:
[модель] [квантизация] [VRAM] [контекст] [движок]

Пример:

Код:
Qwen3-Coder 30B Q4_K_M 24GB 32768 Ollama

Для Open WebUI:

Код:
Open WebUI [способ установки] [backend] "[ошибка]"

Пример:

Код:
Open WebUI Docker Compose Ollama "connection refused"

---

# 34. Финальный чек-лист

Перед использованием проверьте каждый пункт.

## GPU и драйвер

  • [ ] nvidia-smi работает на хосте.
  • [ ] Драйвер NVIDIA версии 550 или новее.
  • [ ] Для старых Compute Capability 5.0–6.2 используется драйвер 570 или новее.
  • [ ] В nvidia-smi отображается приблизительно 24 ГБ VRAM.

## Docker

  • [ ] docker version работает.
  • [ ] docker compose version работает.
  • [ ] Контейнер hello-world запускается.
  • [ ] NVIDIA Container Toolkit установлен.
  • [ ] Команда docker run --gpus all ... nvidia-smi видит GPU.

## Ollama

  • [ ] Контейнер ollama запущен.
  • [ ] API отвечает на 127.0.0.1:11434.
  • [ ] Модель qwen3-coder:30b загружена.
  • [ ] ollama ps показывает использование GPU.
  • [ ] Контекст начинается с 16 384 токенов.
  • [ ] OLLAMA_NUM_PARALLEL=1.
  • [ ] OLLAMA_MAX_LOADED_MODELS=1.
  • [ ] Включён Flash Attention.
  • [ ] KV-кэш использует q8_0.

## Open WebUI

  • [ ] Контейнер open-webui запущен.
  • [ ] Интерфейс открывается на 127.0.0.1:3000.
  • [ ] Первый аккаунт администратора создан.
  • [ ] Свободная регистрация отключена, если она не нужна.
  • [ ] Подключение Ollama использует http://ollama:11434.
  • [ ] Модель отображается в списке.
  • [ ] num_ctx не зафиксирован случайно на 2048.
  • [ ] Volume Open WebUI подключён.
  • [ ] WEBUI_SECRET_KEY сохранён и не меняется при обновлении.

## Безопасность

  • [ ] Порт 11434 не опубликован в интернет.
  • [ ] Порт 3000 привязан к 127.0.0.1, если LAN-доступ не нужен.
  • [ ] Для удалённого доступа используется SSH, VPN или HTTPS.
  • [ ] Пароль администратора уникален.
  • [ ] Docker socket не подключён к Open WebUI.
  • [ ] AI не имеет доступа к SSH-ключам и production-секретам.
  • [ ] Созданы резервные копии Open WebUI.
  • [ ] Конфигурационный .env защищён правами 600.

---

# 35. Краткий итог

Для одной NVIDIA GPU с 24 ГБ видеопамяти оптимальная базовая конфигурация выглядит так:

Код:
Модель:
qwen3-coder:30b

Квантизация весов:
Q4_K_M

Размер модели:
около 19 ГБ

Контекст:
16 384 токена

KV-кэш:
q8_0

Параллельные запросы:
1

Одновременно загруженные модели:
1

Backend:
Ollama

Интерфейс:
Open WebUI

Оркестрация:
Docker Compose

Самая важная проверка:

Bash:
docker exec ollama ollama ps

Желательный результат:

Код:
100% GPU

Самая важная настройка при нехватке памяти:

Код:
уменьшить num_ctx

Самая частая ошибка Open WebUI:

Код:
использование localhost вместо имени ollama внутри Docker-сети

Правильный адрес в Compose:

Код:
http://ollama:11434

Самая важная мера безопасности:

Код:
не публиковать Ollama API на порт 11434 в открытый интернет

---

# Официальные источники

Qwen3-Coder в Ollama:

Код:
https://ollama.com/library/qwen3-coder

Qwen3-Coder-Next в Ollama:

Код:
https://ollama.com/library/qwen3-coder-next

Официальная карточка Qwen3-Coder-30B-A3B-Instruct:

Код:
https://huggingface.co/Qwen/Qwen3-Coder-30B-A3B-Instruct

Документация Ollama:

Код:
https://docs.ollama.com/

Установка Ollama в Linux:

Код:
https://docs.ollama.com/linux

Ollama в Docker:

Код:
https://docs.ollama.com/docker

Поддержка GPU в Ollama:

Код:
https://docs.ollama.com/gpu

Настройка контекста Ollama:

Код:
https://docs.ollama.com/context-length

FAQ Ollama:

Код:
https://docs.ollama.com/faq

Open WebUI:

Код:
https://docs.openwebui.com/

Быстрый запуск Open WebUI:

Код:
https://docs.openwebui.com/getting-started/quick-start/

Подключение Open WebUI к Ollama:

Код:
https://docs.openwebui.com/getting-started/quick-start/connect-a-provider/starting-with-ollama/

Переменные окружения Open WebUI:

Код:
https://docs.openwebui.com/reference/env-configuration/

Установка Docker Engine в Ubuntu:

Код:
https://docs.docker.com/engine/install/ubuntu/

Установка NVIDIA Container Toolkit:

Код:
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

Проверка NVIDIA Container Toolkit:

Код:
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/sample-workload.html
 
Последнее редактирование:
Назад
Верх Низ