cptr (Open WebUI Computer) LXC 146 — AI-агент-песочница, 5-й коннект chat.dttb.ru; IP .146→.166 (конфликт с Яндекс-Станцией)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
44
decisions/2026-06-30-cptr-computer-agent.md
Normal file
44
decisions/2026-06-30-cptr-computer-agent.md
Normal file
@@ -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/<basename>` с полным агентским доступом (терминал/ФС/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]].
|
||||
@@ -185,6 +185,17 @@ cd /var/lib/rustdesk-api && /usr/bin/rustdesk-api reset-admin-pwd <new-pw>
|
||||
| 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-ключи и доступы
|
||||
|
||||
| Хост | Порт | Метод |
|
||||
|
||||
@@ -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)
|
||||
| Параметр | Значение |
|
||||
|
||||
@@ -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 | Имя | Назначение |
|
||||
|
||||
Reference in New Issue
Block a user