Open WebUI: свой ChatGPT за 10 минут
Когда я начал активно использовать локальные LLM через Ollama, быстро надоело общаться с моделью через терминал. Хотелось нормальный веб-интерфейс: с историей чатов, переключением между моделями, возможностью шарить доступ коллегам. Коммерческие решения (ChatGPT, Claude) стоят денег и не работают с локальными моделями. Open WebUI решает обе проблемы — это бесплатный self-hosted интерфейс, который выглядит и работает как ChatGPT, но подключается к любому бэкенду.
Что такое Open WebUI
Open WebUI (раньше назывался Ollama WebUI) — это веб-приложение с открытым исходным кодом для взаимодействия с LLM. По сути, это self-hosted альтернатива ChatGPT с кучей дополнительных возможностей:
- Подключение к Ollama, OpenAI API, любым OpenAI-совместимым API (vLLM, llama.cpp, text-generation-webui)
- Встроенный RAG — загрузка документов прямо в чат
- Web search — модель может искать в интернете
- Управление пользователями (регистрация, роли, квоты)
- Model presets — настройка system prompt, temperature и других параметров для каждой модели
- Генерация изображений (через AUTOMATIC1111 или ComfyUI)
- Голосовой ввод и синтез речи
- Поддержка markdown, LaTeX, подсветка кода
Проект развивается очень активно — на GitHub больше 60k звёзд, релизы выходят каждые 1-2 недели.
Зачем self-hosted, когда есть ChatGPT
Три причины, по которым я поднял свой инстанс:
Приватность. Мы обсуждаем внутреннюю архитектуру, конфиги серверов, иногда скидываем куски кода с захардкоженными значениями. Отправлять это в OpenAI или Anthropic — не вариант. Локальная модель работает полностью offline.
Стоимость. Подписка ChatGPT Plus — $20/мес на человека. Для команды из 8 человек это $160/мес. Сервер с GPU (RTX 3090, 24 GB VRAM) стоит ~$100/мес в аренде. На нём можно крутить llama3.1:70b и обслуживать всю команду. А если хватает 8b модели — достаточно CPU-сервера за $30/мес.
Кастомизация. Можно настроить model presets под конкретные задачи: один пресет для code review с нужным system prompt, другой для написания документации, третий для ответов на вопросы по внутренним runbooks. В ChatGPT это Custom GPTs, но там нельзя подключить свою модель.
Установка: Docker Compose
Самый быстрый способ — Docker Compose с Ollama в соседнем контейнере.
# docker-compose.yml
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
# Для GPU (NVIDIA):
# 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:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_AUTH=true
- WEBUI_SECRET_KEY=your-secret-key-change-me
volumes:
- open_webui_data:/app/backend/data
depends_on:
- ollama
restart: unless-stopped
volumes:
ollama_data:
open_webui_data: Запускаем:
docker compose up -d Через 30 секунд Open WebUI доступен на http://localhost:3000. Первый зарегистрированный пользователь автоматически становится администратором.
Если Ollama уже установлена на хосте
Если Ollama работает прямо на хосте (не в Docker), можно поднять только Open WebUI:
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
volumes:
- open_webui_data:/app/backend/data
extra_hosts:
- "host.docker.internal:host-gateway"
restart: unless-stopped
volumes:
open_webui_data: host.docker.internal — специальный DNS-адрес, который резолвится в IP хост-машины. На Linux нужна строка extra_hosts для его работы.
Подключение разных бэкендов
Open WebUI не привязан к Ollama. Можно подключить любой OpenAI-совместимый API.
OpenAI / Anthropic (через прокси)
В настройках администратора (Settings → Connections) можно добавить OpenAI API endpoint:
URL: https://api.openai.com/v1
API Key: sk-... После этого модели GPT-4o, o1 и другие появятся в списке рядом с локальными моделями Ollama. Для Claude нужен OpenAI-совместимый прокси, например LiteLLM:
litellm:
image: ghcr.io/berriai/litellm:main-latest
container_name: litellm
ports:
- "4000:4000"
environment:
- ANTHROPIC_API_KEY=sk-ant-...
command: --model anthropic/claude-sonnet-4-20250514 vLLM или llama.cpp server
Если у вас мощный GPU-сервер и вы хотите максимальную производительность, вместо Ollama можно использовать vLLM:
# Запуск vLLM с OpenAI-совместимым API
python -m vllm.entrypoints.openai.api_server
--model meta-llama/Llama-3.1-70B-Instruct
--tensor-parallel-size 2
--port 8000 В Open WebUI добавьте его как OpenAI connection: http://vllm-server:8000/v1.
Управление моделями
После установки нужно загрузить модели. Это можно сделать прямо из интерфейса Open WebUI (Settings → Models → Pull a model) или через CLI:
# Базовые модели
docker exec -it ollama ollama pull llama3.1:8b
docker exec -it ollama ollama pull llama3.1:70b # если есть GPU
docker exec -it ollama ollama pull mistral:7b
docker exec -it ollama ollama pull qwen2.5:14b
# Для генерации эмбеддингов (RAG)
docker exec -it ollama ollama pull nomic-embed-text
# Для программирования
docker exec -it ollama ollama pull qwen2.5-coder:7b
# Проверяем загруженные модели
docker exec -it ollama ollama list Какие модели выбрать:
- llama3.1:8b — универсальная модель на каждый день. Работает на CPU за приемлемое время (~10 токенов/сек на 8-ядерном Xeon).
- qwen2.5:14b — хорошо работает с русским языком, лучше llama3 для текстовых задач на русском.
- qwen2.5-coder:7b — специализирована на коде. Для code review и генерации кода работает лучше общих моделей.
- llama3.1:70b — тяжёлая артиллерия. Нужен GPU с 40+ GB VRAM (A100) или два GPU. Качество сравнимо с GPT-4, но требования к железу серьёзные.
Встроенный RAG
Одна из killer-фич Open WebUI — встроенный RAG. Можно загрузить документы прямо в чат, и модель будет отвечать на вопросы по ним.
Как это работает:
- Перетащите файл (PDF, TXT, MD, DOCX) в чат или нажмите на скрепку.
- Open WebUI автоматически разобьёт документ на чанки и создаст эмбеддинги.
- При каждом вопросе система найдёт релевантные фрагменты и подставит их в контекст.
Для RAG нужна модель эмбеддингов. В настройках (Settings → Documents):
- Embedding Model:
nomic-embed-text(по умолчанию) илиbge-m3для лучшей мультиязычности - Chunk Size: 800 (по умолчанию 1500 — я рекомендую уменьшить)
- Chunk Overlap: 200
Можно также создавать коллекции документов (Knowledge) — загрузить туда все runbooks и потом подключать коллекцию к любому чату одной кнопкой.
Настройка для команды
Управление пользователями
Open WebUI поддерживает три роли:
- Admin — полный доступ, управление пользователями и настройками
- User — стандартный пользователь, может общаться с моделями
- Pending — зарегистрировался, но ещё не одобрен администратором
В продакшене рекомендую:
environment:
- WEBUI_AUTH=true # Требовать авторизацию
- ENABLE_SIGNUP=true # Разрешить регистрацию
- DEFAULT_USER_ROLE=pending # Новые юзеры ждут одобрения
- ENABLE_LOGIN_FORM=true # Показывать форму логина Model Presets
Для каждой модели можно настроить пресет с кастомным system prompt. Я создал несколько:
- Code Reviewer — system prompt с инструкциями по ревью кода, temperature 0.1
- Tech Writer — для написания документации, temperature 0.3
- DevOps Assistant — знает нашу инфраструктуру (описание серверов в system prompt), temperature 0.1
- Creative — для брейнштормов, temperature 0.8
Продакшен-деплой
Для реального использования нужно добавить nginx, SSL и мониторинг.
Nginx reverse proxy с SSL
# /etc/nginx/sites-available/chat.example.com
server {
listen 80;
server_name chat.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name chat.example.com;
ssl_certificate /etc/letsencrypt/live/chat.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem;
client_max_body_size 50M; # Для загрузки документов в RAG
location / {
proxy_pass http://127.0.0.1:3000;
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;
# WebSocket support (для стриминга ответов)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
}
} Получаем SSL-сертификат:
certbot --nginx -d chat.example.com Ограничение ресурсов
Если Ollama работает на том же сервере, что и другие сервисы — ограничьте ресурсы:
services:
ollama:
image: ollama/ollama:latest
deploy:
resources:
limits:
memory: 12G # Не больше 12 GB RAM
cpus: "4.0" # Не больше 4 CPU cores
environment:
- OLLAMA_MAX_LOADED_MODELS=2 # Максимум 2 модели в памяти
- OLLAMA_NUM_PARALLEL=2 # Максимум 2 параллельных запроса Без этих ограничений llama3.1:70b может занять всю RAM и убить соседние сервисы.
Бэкапы
Данные Open WebUI (чаты, настройки, загруженные документы) хранятся в SQLite-базе внутри volume open_webui_data. Для бэкапа:
# Бэкап
docker run --rm
-v open_webui_data:/data
-v $(pwd)/backups:/backup
alpine tar czf /backup/open-webui-$(date +%Y%m%d).tar.gz -C /data .
# Добавить в crontab
0 3 * * * /opt/scripts/backup-open-webui.sh Полезные фичи, о которых не все знают
Web Search. В настройках можно подключить поиск (SearXNG, Google PSE, Brave Search). После этого модель сможет искать актуальную информацию в интернете. SearXNG — лучший выбор для self-hosted:
searxng:
image: searxng/searxng:latest
container_name: searxng
ports:
- "8888:8080"
volumes:
- ./searxng:/etc/searxng В Open WebUI: Settings → Web Search → Engine: SearXNG, URL: http://searxng:8080.
Промпт-шаблоны. Можно создавать шаблоны промптов с переменными. Например, шаблон для объяснения кода: «Объясни этот код для [[level]] разработчика: [[code]]» — переменные в двойных скобках подставляются автоматически.
Artifacts. Open WebUI умеет рендерить HTML/JS/CSS прямо в чате — полезно для визуализаций и быстрых прототипов.
Итог
Open WebUI — это лучший self-hosted интерфейс для LLM, который я пробовал. Установка занимает 10 минут, базовая настройка — ещё 20. Для команды, которая хочет использовать LLM без привязки к облачным сервисам и без утечки данных наружу — это must have. Единственное, что нужно понимать: качество ответов определяется моделью, а не интерфейсом. Если llama3.1:8b не справляется с вашей задачей — никакой UI это не исправит. Но возможность быстро переключаться между моделями, загружать документы и шарить доступ коллегам — это то, что превращает «игрушку для экспериментов» в рабочий инструмент.