Open WebUI на home lab: LXC 142 → chat.dttb.ru поверх OmniRoute (NPM id39, LE id129)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
41
decisions/2026-06-22-open-webui-deploy.md
Normal file
41
decisions/2026-06-22-open-webui-deploy.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
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 ...>'
|
||||||
|
```
|
||||||
@@ -52,6 +52,7 @@ tags: [dttb, npm]
|
|||||||
| 33 | `tg.umnybot.ru` | 10.0.0.190:3000 | ✅ Let's Encrypt | ✅ | ✅ | ❌ | Telegram web (KasmVNC, ZimaOS) — Basic Auth ACL `umnybot-kasm` |
|
| 33 | `tg.umnybot.ru` | 10.0.0.190:3000 | ✅ Let's Encrypt | ✅ | ✅ | ❌ | Telegram web (KasmVNC, ZimaOS) — Basic Auth ACL `umnybot-kasm` |
|
||||||
| 34 | `rustdesk.umnybot.ru` | 10.0.0.190:3005 | ✅ Let's Encrypt | ✅ | ✅ | ❌ | RustDesk client web (KasmVNC, ZimaOS) — Basic Auth ACL `umnybot-kasm` |
|
| 34 | `rustdesk.umnybot.ru` | 10.0.0.190:3005 | ✅ Let's Encrypt | ✅ | ✅ | ❌ | RustDesk client web (KasmVNC, ZimaOS) — Basic Auth ACL `umnybot-kasm` |
|
||||||
| 36 | `unifi.dttb.ru` | 10.0.0.196:8443 (HTTPS) | ✅ Let's Encrypt | ✅ | ✅ | ✅ | **UniFi Network Application** (LXC 140) |
|
| 36 | `unifi.dttb.ru` | 10.0.0.196:8443 (HTTPS) | ✅ Let's Encrypt | ✅ | ✅ | ✅ | **UniFi Network Application** (LXC 140) |
|
||||||
|
| 39 | `chat.dttb.ru` | 10.0.0.142:3000 | ✅ Let's Encrypt (id129) | ✅ | ✅ | ✅ | **Open WebUI** (LXC 142) — веб-клиент поверх OmniRoute |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -90,6 +91,7 @@ location /.well-known/matrix/client {
|
|||||||
| 10.0.0.10 | 9443 | porteiner.dttb.ru |
|
| 10.0.0.10 | 9443 | porteiner.dttb.ru |
|
||||||
| 10.0.0.43 | 21114 | remot.dttb.ru |
|
| 10.0.0.43 | 21114 | remot.dttb.ru |
|
||||||
| 10.0.0.112 | 8840 | ip.dttb.ru |
|
| 10.0.0.112 | 8840 | ip.dttb.ru |
|
||||||
|
| 10.0.0.142 | 3000 | chat.dttb.ru (Open WebUI) |
|
||||||
| 10.0.0.155 | 8123 | home.dttb.ru |
|
| 10.0.0.155 | 8123 | home.dttb.ru |
|
||||||
| 10.0.0.169 | 8080 | office.dttb.ru |
|
| 10.0.0.169 | 8080 | office.dttb.ru |
|
||||||
| 10.0.0.179 | 8080, 20128 | ai.dttb.ru, omni.dttb.ru |
|
| 10.0.0.179 | 8080, 20128 | ai.dttb.ru, omni.dttb.ru |
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ tags: [dttb, proxmox]
|
|||||||
> **Основная нода:** pve (10.0.0.250) — описана ниже
|
> **Основная нода:** pve (10.0.0.250) — описана ниже
|
||||||
> **Вторая нода (standalone):** pve (10.0.0.147) — отдельный хост i3-2100/15GB/SSD+1.8TB HDD, см. [[proxmox-pve-147]] (VM 100 ZimaOS, LXC 101 второй NPM)
|
> **Вторая нода (standalone):** pve (10.0.0.147) — отдельный хост i3-2100/15GB/SSD+1.8TB HDD, см. [[proxmox-pve-147]] (VM 100 ZimaOS, LXC 101 второй NPM)
|
||||||
>
|
>
|
||||||
> Последнее обновление: 2026-06-18 (добавлен LXC 141 german — Hermes Agent, личный ассистент в Telegram)
|
> Последнее обновление: 2026-06-22 (добавлен LXC 142 open-webui — Open WebUI на chat.dttb.ru поверх OmniRoute)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ tags: [dttb, proxmox]
|
|||||||
| 120 | 7 | 4 | 8 GB | 60 GB | — |
|
| 120 | 7 | 4 | 8 GB | 60 GB | — |
|
||||||
| 124 | Matrix | 8 | 10 GB | 100 GB | Matrix/Synapse (matrix.dttb.ru) |
|
| 124 | Matrix | 8 | 10 GB | 100 GB | Matrix/Synapse (matrix.dttb.ru) |
|
||||||
| 125 | datacentr | 2 | 12 GB | 100 GB | — |
|
| 125 | datacentr | 2 | 12 GB | 100 GB | — |
|
||||||
| 130 | Zima-OS | 4 | 12 GB | 32 GB | ZimaOS |
|
| 130 | Zima-OS | 4 | 12 GB | 32 GB | ZimaOS NAS — 10.0.0.221, веб `dttb`/`1qaz!QAZ` (см. credentials) |
|
||||||
| 131 | ubuntu | — | — | — | (новый, уточнить) |
|
| 131 | ubuntu | — | — | — | (новый, уточнить) |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -232,6 +232,20 @@ tags: [dttb, proxmox]
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### LXC 142 — open-webui (Open WebUI)
|
||||||
|
| Параметр | Значение |
|
||||||
|
|----------|----------|
|
||||||
|
| Статус | 🟢 running |
|
||||||
|
| IP | 10.0.0.142 (LAN, статика), без NetBird |
|
||||||
|
| ОС/рантайм | Debian 12, unprivileged + nesting/keyctl, Docker 20.10; контейнер `ghcr.io/open-webui/open-webui:main` v0.9.6 (`-p 3000:8080`, volume `open-webui`, restart=always, onboot=1) |
|
||||||
|
| Ресурсы | 2 vCPU / 2 GB / 12 GB (rootfs на `work`, НЕ local-lvm — тот забит на 93%) |
|
||||||
|
| Веб | **https://chat.dttb.ru** (NPM proxy host id39, LE cert id129 до 2026-09-20, Force SSL + WebSockets) — публично + LAN/NetBird |
|
||||||
|
| Бэкенд | OmniRoute `http://10.0.0.179:20128/v1` (OpenAI-совместимый; LAN-доступ без авторизации → dummy-ключ `sk-omniroute`) → все 145 моделей; рабочий Opus = `cc/claude-opus-4-8` (делит Max-кап с german/openclaw/swarmclaw/code-server, бывает 400 «out of extra usage») |
|
||||||
|
| Авторизация | встроенная Open WebUI (1 admin = Олег). Открытую регистрацию выключать в Admin Panel → Settings (env `ENABLE_SIGNUP` не рулит — persistent config в БД) |
|
||||||
|
| Назначение | Личный веб-клиент «как ChatGPT» поверх OmniRoute. Грабли: первый старт тянет embedding-модель с HuggingFace (~1 ГБ, медленно из РФ → DNS контейнера = 1.1.1.1 против FakeIP роутера). См. [[../../decisions/2026-06-22-open-webui-deploy]] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🔴 Остановленные LXC
|
## 🔴 Остановленные LXC
|
||||||
|
|
||||||
| VMID | Имя | Назначение |
|
| VMID | Имя | Назначение |
|
||||||
|
|||||||
Reference in New Issue
Block a user