From 96d16306caffea5e2deb91a74814c9f01ff5bb0b Mon Sep 17 00:00:00 2001 From: dttb Date: Mon, 22 Jun 2026 05:00:11 +0300 Subject: [PATCH] =?UTF-8?q?Open=20WebUI=20=D0=BD=D0=B0=20home=20lab:=20LXC?= =?UTF-8?q?=20142=20=E2=86=92=20chat.dttb.ru=20=D0=BF=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=85=20OmniRoute=20(NPM=20id39,=20LE=20id129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- decisions/2026-06-22-open-webui-deploy.md | 41 +++++++++++++++++++++++ projects/dttb/npm-proxy-hosts.md | 2 ++ projects/dttb/proxmox-inventory.md | 18 ++++++++-- 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 decisions/2026-06-22-open-webui-deploy.md diff --git a/decisions/2026-06-22-open-webui-deploy.md b/decisions/2026-06-22-open-webui-deploy.md new file mode 100644 index 0000000..5e298a0 --- /dev/null +++ b/decisions/2026-06-22-open-webui-deploy.md @@ -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 && ' +``` diff --git a/projects/dttb/npm-proxy-hosts.md b/projects/dttb/npm-proxy-hosts.md index 382776f..822adcc 100644 --- a/projects/dttb/npm-proxy-hosts.md +++ b/projects/dttb/npm-proxy-hosts.md @@ -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` | | 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) | +| 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.43 | 21114 | remot.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.169 | 8080 | office.dttb.ru | | 10.0.0.179 | 8080, 20128 | ai.dttb.ru, omni.dttb.ru | diff --git a/projects/dttb/proxmox-inventory.md b/projects/dttb/proxmox-inventory.md index c26d7fd..9ad6bf6 100644 --- a/projects/dttb/proxmox-inventory.md +++ b/projects/dttb/proxmox-inventory.md @@ -9,7 +9,7 @@ tags: [dttb, proxmox] > **Основная нода:** 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) > -> Последнее обновление: 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 | — | | 124 | Matrix | 8 | 10 GB | 100 GB | Matrix/Synapse (matrix.dttb.ru) | | 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 | — | — | — | (новый, уточнить) | --- @@ -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 | VMID | Имя | Назначение |