Оглавление: узкие места · матрица · развёртывание · маршрут API · наблюдаемость · шаги · приёмка · ориентиры · FAQ
Стек локального вывода — llama.cpp против Ollama; мульти-агенты — CrewAI на удалённом Mac; LlmMac. Ниже — матрица для платформы: очередь, circuit breaker, пороги стоимости до нагрузки.
Три узких места до включения многопользовательского режима
- Смешение очередей: веб-чат и внешние SDK бьют в один и тот же пул потоков Ollama без лимита одновременных запросов; задержка p95 растёт ступенькой, а не линейно.
- Один токен на всё: общий API-ключ для UI и интеграций не позволяет отозвать доступ агента без простоя людей; нужны как минимум два класса секретов с разными политиками ротации.
- Отсутствие порога стоимости: без счётчика токенов в минуту и дневного burn rate circuit breaker сработает слишком поздно, когда VRAM уже фрагментирована длинным контекстом.
Матрица: OpenWebUI плюс Ollama против «голого» Ollama за reverse-proxy
| Критерий | OpenWebUI + Ollama | Ollama напрямую за Nginx |
|---|---|---|
| Сессии и роли | Встроенные аккаунты, комнаты, история чатов; проще развести команды | Нужна внешняя IdP или самописный слой; история в клиенте |
| OpenAI-совместимый маршрут | Единая точка для UI и SDK через прокси OpenWebUI к Ollama | Префикс /v1 у Ollama; клиенты настраиваются вручную |
| Слоты параллелизма | Ограничение на уровне воркеров UI и параметров OLLAMA_NUM_PARALLEL |
Только параметры демона и ядра; риск перегруза без UI-очереди |
| Токены и аудит | Отдельные API-ключи OpenWebUI для людей и для роботов | Один общий ключ или IP-allowlist на прокси |
| Circuit breaker и стоимость | Можно навесить внешний шлюз перед UI с RPM и TPM | Нужен отдельный сервис учёта; иначе burn rate непрозрачен |
| Операционная сложность | Выше: обновления UI, миграции БД, бэкапы чатов | Ниже, но выше риск регресса в UX и безопасности |
Развёртывание: слоты, переменные окружения и границы процесса
На Mac mini M4 зафиксируйте версии Ollama; задайте OLLAMA_MAX_LOADED_MODELS и OLLAMA_NUM_PARALLEL по VRAM квантования. Для команд от пяти человек вынесите БД OpenWebUI на отдельный том от каталога моделей. Разделите системных пользователей демона Ollama и веб-процесса, чтобы права на ~/.ollama не совпадали с UI.
# ориентиры env для пилота на M4 с 24 ГБ унифицированной памяти
OLLAMA_NUM_PARALLEL=2
OLLAMA_MAX_LOADED_MODELS=1
# OpenWebUI: ограничить воркеры ASGI и таймаут upstream к OllamaМаршрутизация API: префикс OpenAI, заголовки и предохранитель
Клиенты с base_url OpenAI направляйте на OpenWebUI или шлюз с нормализацией к /v1/chat/completions Ollama. Роботам — обязательный заголовок и короткий токен CI; людям — встроенный логин или SSO. Перед Ollama держите reverse-proxy с лимитом тела и таймаутом; при серии 503 включайте circuit breaker на 30 с и отдавайте компактный JSON без текста промпта.
Наблюдаемость: метрики очереди, токены и пороги стоимости
Метрики: prefill и decode отдельно — рост prefill на Apple Silicon часто значит конкуренцию за память, не за CUs. Считайте сессии OpenWebUI и соединения к Ollama; сверяйте с порогом стоимости TPM и дневным лимитом. Гибрид с облаком маркируйте отдельным label, чтобы burn rate узла не смешивался с облаком. См. мульти-модельный роутинг.
Шаги внедрения перед нагрузкой
Шаг 1. Одна квантизация и хэш веса; без авто latest в проде. Шаг 2. OLLAMA_NUM_PARALLEL и воркеры UI под суммарный контекст в VRAM с запасом. Шаг 3. Два класса API-токенов: сервисный долгий и агентский с TTL. Шаг 4. Reverse-proxy: лимит тела, breaker по коду и латентности. Шаг 5. Пороги RPM, TPM и день в шлюзе; при превышении рубите только роботов. Шаг 6. Синтетика: два чата плюс SDK, сравните p95 с одиночным запросом в отчёте приёмки.
Чек-лист приёмки удалённого узла
- Слоты: задокументированы значения
OLLAMA_NUM_PARALLEL, лимит воркеров OpenWebUI и максимальное число одновременных чатов на пользователя. - Маршрут API: единый
base_urlдля OpenAI-клиентов, провереныchat.completionsи стриминг без буферизации на прокси. - Токены: ротация для сервисных ключей не чаще согласованного окна; агентские ключи отзываются без рестарта Ollama.
- Circuit breaker: порог ошибок и окно полуоткрытия заданы; при срабатывании UI показывает понятное сообщение без утечки внутренних путей.
- Порог стоимости: дневной burn rate и минутный TPM согласованы с финансами; алерт уходит до превышения на двадцать процентов.
- Регрессия памяти: после часа смешанной нагрузки нет роста резидентного набора за пределами ожидаемого кэша модели.
Ориентиры для слайда и договора с бизнесом
- Три числа в дашборде: одновременные сессии UI, активные запросы к Ollama, процент времени в очереди относительно общей длительности ответа.
- Два токена минимум: человеческий контур и машинный контур с разными ACL и аудитом.
- Один сценарий отката: при деградации отключить только агентский маршрут, оставив чат для инженеров без перезагрузки весов.
FAQ
Стоит ли выносить OpenWebUI в Docker на том же Mac? Да, если нужна воспроизводимость версий; тогда монтируйте сокет или порт Ollama явно и ограничьте cgroup по CPU, чтобы веб не вытеснил инференс.
Как совместить локальный и облачный маршрут? Используйте шлюз с политикой по имени модели; локальные имена не должны пересекаться с облачными псевдонимами без таблицы соответствия.
Что логировать при срабатывании circuit breaker? Код upstream, латентность до первого токена, идентификатор класса клиента без содержимого сообщений пользователя.
Навигация: главная, технический блог, тарифы, аренда узла.
Итог: связка OpenWebUI и Ollama выигрывает у «голого» демона в управляемости сессий, но требует явных слотов параллелизма, раздельных токенов, circuit breaker и порогов стоимости; приёмка на удалённом Mac снижает риск сюрпризов при росте команды.