42 lines
4.4 KiB
Markdown
42 lines
4.4 KiB
Markdown
---
|
||
date: 2026-06-22
|
||
type: decision
|
||
status: done
|
||
tags: [homelab, proxmox, open-webui, omniroute, npm, ai]
|
||
---
|
||
|
||
# Open WebUI на home lab — веб-клиент «как ChatGPT» поверх OmniRoute
|
||
|
||
## Зачем
|
||
Олегу нужен удобный веб-интерфейс для работы с ИИ на домашнем сервере (не Telegram-бот, не голый CLI). Решение: **Open WebUI** — поверх уже имеющегося OmniRoute (OpenAI-совместимый шлюз, 145 моделей вкл. `cc/claude-opus-4-8` через Max).
|
||
|
||
> NB: на **клиентской** коробке Александра Open WebUI наоборот выкинут — там мозг openclaw со своим веб-UI, а железо слабое (Sandy Bridge i3). Open WebUI оправдан только на мощном home lab. См. [[../projects/dttb/proxmox-inventory]].
|
||
|
||
## Что развёрнуто (LXC 142)
|
||
- **LXC 142 `open-webui`** на Proxmox 10.0.0.250: Debian 12, unprivileged + `nesting=1,keyctl=1` (для Docker), 2 vCPU / 2 ГБ / 12 ГБ.
|
||
- rootfs на хранилище **`work`** (11.5 ТБ), НЕ `local-lvm` (тот забит на 93%).
|
||
- Статика **10.0.0.142**, DNS контейнера = **1.1.1.1** (обойти FakeIP-перехват от роутера 10.0.0.1 при pull образов и загрузке embedding-модели).
|
||
- Docker 20.10 (из Debian-репо), контейнер `ghcr.io/open-webui/open-webui:main` v0.9.6, `-p 3000:8080`, volume `open-webui`, restart=always, onboot=1.
|
||
- Подключение к OmniRoute: `OPENAI_API_BASE_URL=http://10.0.0.179:20128/v1`, `OPENAI_API_KEY=sk-omniroute` (LAN-доступ к OmniRoute **без авторизации** → ключ любой), `ENABLE_OLLAMA_API=false`.
|
||
|
||
## Публикация
|
||
- Spaceweb A-запись `chat → 176.62.183.186` (скрипт `snippets/spaceweb-dns-api.py add-a dttb.ru chat …`).
|
||
- NPM (10.0.0.195:81) proxy host **id39** `chat.dttb.ru` → `10.0.0.142:3000`, WebSockets on, Force SSL, LE cert **id129** (до 2026-09-20).
|
||
- Локально `*.dttb.ru` уже резолвится в 10.0.0.195 (hairpin-перехват DNS на роутере) → по LAN/NetBird работает сразу, без правки DNS.
|
||
|
||
## Грабли
|
||
1. **NPM v2.14 cert-create**: при `provider:letsencrypt` тело принимает только `meta:{}` (пустой). С `letsencrypt_email`/`agree`/`dns_challenge` → `400 data/meta must NOT have additional properties`. Email берётся из аккаунта NPM. (Совпало с заметкой по коробке Александра.)
|
||
2. **DNS-распространение**: после add-a Google DoH видит запись ~через 5 мин, Cloudflare держит негативный кэш до 10 мин (SOA min TTL 600). LE запрашивает авторитативные NS напрямую → серт выпускается, как только Google увидел. Проверка только через DoH (локальный `dig`/getent перехватываются роутером).
|
||
3. **Первый старт Open WebUI**: тянет embedding-модель с HuggingFace (~1 ГБ, 30 файлов) — из РФ медленно, стартап висит на «Fetching 30 files» пару минут. Это нормально; DNS 1.1.1.1 помогает. RAG-эмбеддинги можно позже переключить на OmniRoute.
|
||
4. **Open WebUI signup**: первый зарегистрированный = admin. Открытую регистрацию выключать в Admin Panel → Settings (env `ENABLE_SIGNUP` не действует — persistent config хранится в БД и перебивает env).
|
||
5. **Max-кап**: `cc/claude-opus-4-8` делит 5-часовой кап Max с german/openclaw/swarmclaw/code-server → при нагрузке 400 «out of extra usage» (транзиентно). Для тяжёлых сессий fallback `kr/claude-sonnet-4.5` (free).
|
||
|
||
## Команды
|
||
```bash
|
||
# контейнер
|
||
sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct exec 142 -- docker ps"
|
||
sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct exec 142 -- docker logs --tail 30 open-webui"
|
||
# обновление образа
|
||
pct exec 142 -- bash -lc 'docker pull ghcr.io/open-webui/open-webui:main && docker rm -f open-webui && <docker run ...>'
|
||
```
|