From b0e10206d083f54cd5a93d412beca0591e78e298 Mon Sep 17 00:00:00 2001 From: dttb Date: Tue, 30 Jun 2026 10:52:04 +0300 Subject: [PATCH] =?UTF-8?q?cptr=20(Open=20WebUI=20Computer)=20LXC=20146=20?= =?UTF-8?q?=E2=80=94=20AI-=D0=B0=D0=B3=D0=B5=D0=BD=D1=82-=D0=BF=D0=B5?= =?UTF-8?q?=D1=81=D0=BE=D1=87=D0=BD=D0=B8=D1=86=D0=B0,=205-=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D0=BD=D0=B5=D0=BA=D1=82=20chat.dttb.ru;=20IP=20.14?= =?UTF-8?q?6=E2=86=92.166=20(=D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA?= =?UTF-8?q?=D1=82=20=D1=81=20=D0=AF=D0=BD=D0=B4=D0=B5=D0=BA=D1=81-=D0=A1?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D1=86=D0=B8=D0=B5=D0=B9)?= 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-30-cptr-computer-agent.md | 44 +++++++++++++++++++++ projects/dttb/credentials.md | 11 ++++++ projects/dttb/network-topology.md | 8 ++++ projects/dttb/proxmox-inventory.md | 19 ++++++++- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 decisions/2026-06-30-cptr-computer-agent.md diff --git a/decisions/2026-06-30-cptr-computer-agent.md b/decisions/2026-06-30-cptr-computer-agent.md new file mode 100644 index 0000000..4310e96 --- /dev/null +++ b/decisions/2026-06-30-cptr-computer-agent.md @@ -0,0 +1,44 @@ +--- +date: 2026-06-30 +type: decision +tags: [dttb, proxmox, ai, agent, open-webui, computer-use] +--- + +# cptr (Open WebUI Computer) — агент-песочница, 5-й коннект chat.dttb.ru + +## Контекст +Олег попросил завести [open-webui/computer](https://github.com/open-webui/computer) («cptr») и подцепить к Open WebUI. cptr = «компьютер в браузере»: файлы, терминал, git, редактор + AI-агент. Отдаёт **OpenAI-совместимый `/v1/chat/completions`**, где каждый *workspace* виден как модель `cptr/` с полным агентским доступом (терминал/ФС/web/git) к хосту, где крутится. + +## Решение +Отдельный **LXC 146 `cptr`** (песочница) на Proxmox 10.0.0.250 — radius взрыва ограничен контейнером. Мозг агента = OmniRoute Opus 4.8. cptr держим **LAN-only** (авторы: «только доверенная сеть, не в публичный интернет»); публичный chat.dttb.ru ходит к нему server-side по локалке (как Hermes 8642 / openclaw 18789). + +## Что развёрнуто +- **LXC 146** Debian 12, unprivileged + `nesting=1,keyctl=1`, Docker 20.10, **2 vCPU / 2 GB / 12 GB** на `work`, onboot. +- IP **10.0.0.166** (nameserver 1.1.1.1, без NetBird). См. грабли с IP ниже. +- Контейнер `ghcr.io/open-webui/computer:latest`: `docker run -d --name cptr --restart unless-stopped -p 8000:8000 -v cptr-data:/data …`. Образ сам стартует `cptr run --host 0.0.0.0 --port 8000 --headless` (из Dockerfile CMD). +- Admin `oleg`/`1qaz!QAZ` (web http://10.0.0.166:8000). +- Workspace `cptr/main` → `/data/workspaces/main` (persistent в томе). +- **5-й OpenAI-коннект Open WebUI** (idx4): `http://10.0.0.166:8000/v1` + Bearer `sk-cptr-…`. В дропдауне chat.dttb.ru появилась модель `cptr/main`. + +## Headless-настройка cptr (всё через API, FastAPI — точные пути из `/openapi.json`) +1. **Startup-токен**: `cptr run` **генерит свой** 64-hex и печатает в логах (`docker logs cptr` → `…/?token=…`), env `CPTR_STARTUP_TOKEN` игнорится. Брать из логов. +2. **Создать админа**: `POST /api/auth/setup {username,password,token,display_name}` → `{ok:true}` (даёт cookie `cptr_session`). +3. **Логин**: `POST /api/auth/login {username,password}` → cookie. +4. **Ключ для `/v1`**: `POST /v1/keys {name}` (cookie-auth) → отдаёт `{key:"sk-cptr-…",id,name}` **raw один раз**. +5. **Мозг (brain)**: `POST /api/admin/connections {name,provider:"openai",base_url,api_key,models,enabled}`; проверка `POST /api/admin/connections/{id}/verify`. +6. **Workspace**: `PUT /api/state/workspace?path=/data/workspaces/main` **с JSON-телом** `{"name":"main","path":"…"}` (без тела — 500: роутер читает `request.json()`). После — `cptr/main` появляется в `GET /v1/models` (Bearer-ключ). +7. **В Open WebUI**: `POST /openai/config/update` (полное тело) — добавить URL+key в `OPENAI_API_BASE_URLS`/`OPENAI_API_KEYS` индексом 4 + `OPENAI_API_CONFIGS["4"]={enable,name:"cptr (computer agent)",connection_type:"external",model_ids:["cptr/main"]}`. НЕ затирать idx0-3. + +## Грабли (за что наступали) +- ⚠️ **Конфликт IP**: сначала дали **.146** — там реальное устройство **Яндекс-Станция Миди** (MAC `AC:BA:C0:39:82:64`). Тесты прошли (ARP случайно указывал на контейнер), но это мина → Станция перехватит ARP → chat.dttb.ru 502. **Та же грабля, что у LXC 145** ([[2026-06-27-homepage-dashboard-lxc145]]). Перенесли на **.166** (`pct set 146 -net0 …ip=10.0.0.166/24` + `pct reboot`), проверено arping + ping-sweep. **Урок: сверять IP с [[../projects/dttb/network-topology]] ДО раздачи; .145/.146 заняты TP-Link/Яндексом.** +- **Пустой api_key мозга → битый заголовок**: cptr при пустом ключе шлёт `Authorization: Bearer ` (пустой) → httpx «Illegal header value» → verify=false. Лечится **любым непустым** значением (`lan-trust`) — OmniRoute на LAN всё равно отдаёт `cc/claude-opus-4-8` по произвольному Bearer (проверено: `Bearer dummy` → completion 200). Это **отличие от Open WebUI**, где ключ OmniRoute = пустая строка. +- `/v1/models` пустой, пока нет ни одного workspace (модели гейтвея = workspaces, не мозг). Завести через `PUT /api/state/workspace`. +- Workspace-dir держать в томе `/data` (переживает пересоздание контейнера), не в `/home/cptr`. + +## Безопасность +Гейт = **Bearer-ключ `sk-cptr-…` (только у Open WebUI) + LAN + admin-only Open WebUI**. Агент исполняет тулы (терминал/ФС) **внутри LXC 146** — проверено: на `hostname`/`uname` агент видит хостнейм контейнера (`d01b45f09cc6`), не Proxmox-хост. Аудит-лог включён (`CPTR_AUDIT_LOG_LEVEL=INFO`). cptr **не** за NPM и без публичного домена. + +## Проверено (e2e) +chat.dttb.ru → `cptr/main` → OmniRoute Opus → агент → `run_command`: `uname -a; pwd` вернул `Linux d01b45f09cc6 … x86_64` + cwd `/data/workspaces/main`. `echo cptr-live; whoami` → `cptr-live`/`cptr`. + +См. [[../projects/dttb/proxmox-inventory#LXC 146 — cptr (Open WebUI Computer / агент-исполнитель)]], [[2026-06-22-open-webui-deploy]]. diff --git a/projects/dttb/credentials.md b/projects/dttb/credentials.md index a016565..ef3aa5a 100644 --- a/projects/dttb/credentials.md +++ b/projects/dttb/credentials.md @@ -185,6 +185,17 @@ cd /var/lib/rustdesk-api && /usr/bin/rustdesk-api reset-admin-pwd | NPM widget | it5870@yandex.ru / 1qaz!QAZ (как NPM) | | authentik (отложен) | proxy provider pk 3 `dash-forward`, app slug `dash`, embedded outpost. См. [[../../decisions/2026-06-27-homepage-dashboard-lxc145]] | +## cptr — Open WebUI Computer (LXC 146) + +| Параметр | Значение | +|----------|----------| +| URL | http://10.0.0.166:8000 (LAN-only, БЕЗ публичного домена) | +| Web-логин | `oleg` / `1qaz!QAZ` (admin, создан через `/api/auth/setup` + startup-token) | +| LXC root | `10.0.0.166` — root / `1qaz!QAZ` (консоль/SSH через pve) | +| /v1 API-ключ | `sk-cptr-RmajHvDRn7-KzNMLNASnvn9svkXWb9ySVQLG6M8Ifs0` (name `open-webui`, id `7d780f22-9d86-4d72-b88e-867987764d55`) — Bearer для OpenAI-гейтвея, им ходит chat.dttb.ru. Новый: `POST /v1/keys {name}` (отдаёт raw 1 раз) | +| Мозг (brain) | connection id `6f6f89a8-a764-496b-a5f9-9dba194a24a3` → OmniRoute `http://10.0.0.179:20128/v1` / `cc/claude-opus-4-8`, api_key=`lan-trust` | +| Назначение | AI-агент-песочница (терминал/ФС/git внутри LXC 146); 5-й коннект Open WebUI (`cptr/main`). См. [[../../decisions/2026-06-30-cptr-computer-agent]] | + ## SSH-ключи и доступы | Хост | Порт | Метод | diff --git a/projects/dttb/network-topology.md b/projects/dttb/network-topology.md index 7ca6a85..bf5ac1a 100644 --- a/projects/dttb/network-topology.md +++ b/projects/dttb/network-topology.md @@ -286,6 +286,14 @@ tags: [dttb] | MAC | `AC:BA:C0:39:82:64` | | Открытые порты | Нет (все 100 закрыты) | | Роль | Яндекс Станция Миди (умная колонка) | +| ⚠️ | **Этот MAC** ловил конфликт IP у LXC 145 (.145) и LXC 146 cptr (.146) — оба перенесли (.148 и .166). При раздаче LAN-IP под LXC обходить .145/.146 | + +### 10.0.0.166 — cptr (LXC 146) +| Параметр | Значение | +|----------|----------| +| MAC | `BC:24:11:12:F1:F6` (Proxmox veth) | +| Открытые порты | 8000/http (cptr — Open WebUI Computer + AI-агент, LAN-only) | +| Роль | LXC 146 cptr, песочница-агент; 5-й коннект chat.dttb.ru. См. [[proxmox-inventory]] | ### 10.0.0.149 — SHIP Device (L900) | Параметр | Значение | diff --git a/projects/dttb/proxmox-inventory.md b/projects/dttb/proxmox-inventory.md index 40d49db..c54e408 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-27 (добавлен LXC 145 homepage — дашборд, dash.dttb.ru) +> Последнее обновление: 2026-06-30 (добавлен LXC 146 cptr — Open WebUI Computer/агент-песочница, 10.0.0.166, 5-й коннект chat.dttb.ru) --- @@ -243,6 +243,7 @@ tags: [dttb, proxmox] | Веб | **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-совместимый; ключ коннекта = **пустая строка**, НЕ dummy — с непустым неизвестным ключом OmniRoute отдаёт 0 моделей) → 242 модели; дефолт `cc/claude-opus-4-8` (делит Max-кап с german/openclaw/swarmclaw/code-server, бывает 400 «out of extra usage», fallback `kr/claude-sonnet-4.5`) | | Авторизация | встроенная Open WebUI (1 admin = Олег). Открытую регистрацию выключать в Admin Panel → Settings (env `ENABLE_SIGNUP` не рулит — persistent config в БД) | +| Коннекты | 5 OpenAI-бэкендов: idx0 OmniRoute, idx1 German/Hermes (`hermes-agent`), idx2 GLM z.ai, idx3 openclaw/Антошка, **idx4 cptr** (`cptr/main` — агент-песочница [[#LXC 146 — cptr (Open WebUI Computer / агент-исполнитель)]], `http://10.0.0.166:8000/v1`) | | Назначение | Личный веб-клиент «как ChatGPT» поверх OmniRoute. Грабли: первый старт тянет embedding-модель с HuggingFace (~1 ГБ, медленно из РФ → DNS контейнера = 1.1.1.1 против FakeIP роутера). См. [[../../decisions/2026-06-22-open-webui-deploy]] | --- @@ -296,6 +297,22 @@ tags: [dttb, proxmox] --- +### LXC 146 — cptr (Open WebUI Computer / агент-исполнитель) +| Параметр | Значение | +|----------|----------| +| Статус | 🟢 running | +| IP | **10.0.0.166** (LAN, статика, nameserver 1.1.1.1, БЕЗ NetBird). ⚠️ сначала дали .146 — **конфликт с Яндекс-Станцией Миди** (MAC `AC:BA:C0:39:82:64`, та же грабля, что у LXC 145 на .145/.146). Перенесли на свободный .166 (проверено arping + ping-sweep). VMID остался 146 | +| ОС/рантайм | Debian 12, unprivileged + nesting/keyctl, Docker 20.10; контейнер `ghcr.io/open-webui/computer:latest` (cptr, `-p 8000:8000`, volume `cptr-data:/data`, restart=unless-stopped, onboot=1) | +| Ресурсы | 2 vCPU / 2 GB / swap 1 GB / 12 GB (rootfs на `work`) | +| Веб | http://10.0.0.166:8000 — **LAN-only, БЕЗ NPM/публичного домена** (авторы cptr: «только доверенная сеть, не в публичный интернет»). Логин `oleg` / `1qaz!QAZ` | +| Мозг агента | OmniRoute `http://10.0.0.179:20128/v1`, модель `cc/claude-opus-4-8` (Opus 4.8 via Max, делит кап). ⚠️ api_key = `lan-trust` (любой **непустой** — при пустом cptr шлёт битый `Bearer ` → httpx «Illegal header value») | +| /v1-гейтвей | OpenAI-совместимый `http://10.0.0.166:8000/v1`; модель = workspace `cptr/main` (`/data/workspaces/main`, persistent в томе). Авторизация Bearer-ключ `sk-cptr-…` (см. credentials). Workspace заводится `PUT /api/state/workspace?path=…` с JSON-телом состояния | +| Интеграция | **5-й OpenAI-коннект Open WebUI** (chat.dttb.ru, idx4) → в дропдауне модель `cptr/main` = агент с терминалом/файлами/git/web песочницы. Гейт = ключ + LAN + admin-only Open WebUI | +| Tags | ai, agent, computer-use | +| Назначение | **cptr — «компьютер в браузере» + AI-агент-исполнитель в песочнице.** Доступ к терминалу/ФС **только внутри LXC 146** (radius взрыва ограничен контейнером, проверено: агент видит хостнейм контейнера, не Proxmox). См. [[../../decisions/2026-06-30-cptr-computer-agent]] | + +--- + ## 🔴 Остановленные LXC | VMID | Имя | Назначение |