Open WebUI: свой ChatGPT за 10 минут

open-webuillmself-hostingdocker

Стек деплоя Open WebUI: браузер, Nginx, Open WebUI, Ollama

Когда я начал активно использовать локальные 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. Можно загрузить документы прямо в чат, и модель будет отвечать на вопросы по ним.

Как это работает:

  1. Перетащите файл (PDF, TXT, MD, DOCX) в чат или нажмите на скрепку.
  2. Open WebUI автоматически разобьёт документ на чанки и создаст эмбеддинги.
  3. При каждом вопросе система найдёт релевантные фрагменты и подставит их в контекст.

Для 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 это не исправит. Но возможность быстро переключаться между моделями, загружать документы и шарить доступ коллегам — это то, что превращает «игрушку для экспериментов» в рабочий инструмент.

© 2026 Terminal Notes. Built with SvelteKit.