cptr перенесён на Mac (агент с реальными файлами); chat.dttb.ru idx4 → 10.0.0.180; LXC146 stopped; грабля macOS TCC→NetBird
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
38
decisions/2026-06-30-cptr-on-mac.md
Normal file
38
decisions/2026-06-30-cptr-on-mac.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
date: 2026-06-30
|
||||||
|
type: decision
|
||||||
|
tags: [dttb, mac, ai, agent, open-webui, cptr, netbird, macos-tcc]
|
||||||
|
---
|
||||||
|
|
||||||
|
# cptr на Маке Олега — агент с доступом к РЕАЛЬНЫМ файлам, перенаправление chat.dttb.ru
|
||||||
|
|
||||||
|
## Контекст
|
||||||
|
Песочница cptr в [[2026-06-30-cptr-computer-agent|LXC 146]] делала задачи в изолированном контейнере и **не видела файлы Мака** (разные машины). Олег хотел «полезно по файлам» — агента, который работает с его реальными документами/рабочим столом. Выбор: «безопасно в вакууме» (песочница) vs «полезно, но агент получает доступ к реальной машине». Олег выбрал **второе, осознанно приняв риск** (публичный chat.dttb.ru сможет выполнять команды на Маке).
|
||||||
|
|
||||||
|
## Решение
|
||||||
|
Поставить cptr **на сам Mac** (`MacBookPro.lan`, юзер `ai`, LAN `10.0.0.180`, NetBird `100.70.242.212`, macOS 26.5.1) и **перенаправить** на него коннект cptr в chat.dttb.ru (idx4). Песочницу LXC 146 заглушить (`pct stop 146`).
|
||||||
|
|
||||||
|
## Что развёрнуто на Маке
|
||||||
|
- **Установка:** `uv tool install cptr` → бинарь `/Users/ai/.local/bin/cptr` (Docker на Маке нет, uv 0.11.7 есть). Данные `~/.cptr/app.db`.
|
||||||
|
- **Автозапуск:** LaunchAgent `~/Library/LaunchAgents/ru.dttb.cptr.plist` (`cptr run --host 0.0.0.0 --port 8000 --headless`, RunAtLoad+KeepAlive, лог `~/Library/Logs/cptr.log`, env `PYTHONUNBUFFERED=1` чтобы стартовый токен попадал в лог). Загрузка: `launchctl bootstrap gui/$(id -u) …plist`.
|
||||||
|
- **Admin** `dttb`/`App5870w`; **/v1-ключ** `sk-cptr-9RGc…WkQ` (им ходит Open WebUI).
|
||||||
|
- **Мозг** OmniRoute `cc/claude-opus-4-8`, api_key `lan-trust` — но **по NetBird** (см. грабли), base_url `http://100.70.92.138:20128/v1`.
|
||||||
|
- **Workspace** `/Users/ai` → модель `cptr/ai` (стартовый cwd; терминал агента не ограничен этой папкой — у него права юзера `ai` на весь Мак).
|
||||||
|
- **chat.dttb.ru:** idx4 перенаправлен с песочницы (10.0.0.166) → `http://10.0.0.180:8000/v1`, ключ Мака, `model_ids:["cptr/ai"]`, name «cptr (Mac)». Open WebUI (LXC 142, **без NetBird**) ходит до Мака по домашней LAN `10.0.0.180`.
|
||||||
|
|
||||||
|
## ⚠️ Главная грабля: macOS Local Network privacy (TCC) рубит LAN из launchd
|
||||||
|
**Симптом:** мозг не подключался — `verify` отдаёт `All connection attempts failed` к `10.0.0.179:20128`, **хотя** интерактивный `curl`/`python` с Мака до этого IP дают 200. Discriminating-тест: cptr до **публичного** `api.openai.com` соединяется (отдаёт «Invalid API key»), до **LAN** — «All connection attempts failed».
|
||||||
|
**Причина:** macOS 15+/26 **Local Network privacy** блокирует обращения **фонового launchd-процесса** к локальной сети (10.0.0.0/24 на en0). Промпта на грант для headless-демона нет → тихий отказ. Локальные `run_command` агента (ls, cat и т.п.) — НЕ сетевые, работают; режется только исходящая сеть cptr к LAN.
|
||||||
|
**Фикс (без грантов TCC):** ходить к OmniRoute по **NetBird (utun100)** вместо LAN. У хоста OmniRoute (LXC 132) NetBird-IP `100.70.92.138`, OmniRoute слушает 0.0.0.0:20128. Трафик к `100.70.x` идёт через utun (VPN), который **Local Network gate не трогает** → `verify` = `Connected`. **Правило: на маке для launchd-сервиса, которому нужен LAN-ресурс, давай ему адрес ресурса по NetBird, а не 10.0.0.x.**
|
||||||
|
|
||||||
|
## Безопасность (риск принят Олегом)
|
||||||
|
- Агент исполняет тулы под юзером `ai` → доступ ко **всему Маку** этого юзера (файлы, терминал). Это и было целью.
|
||||||
|
- Гейт к `/v1`: Bearer-ключ (только у Open WebUI) + LAN-достижимость + admin-only Open WebUI. cptr-UI на 8000 — логин `dttb`/`App5870w`. Application Firewall на Маке **выключен**.
|
||||||
|
- cptr слушает `0.0.0.0:8000` → при роуминге на чужом Wi-Fi порт открыт в той сети (гейт — логин/ключ). Для дома ок; если важно — биндить на NetBird-IP или включить firewall.
|
||||||
|
- «Рулить откуда угодно» работает, пока **Mac в домашней сети** (Open WebUI без NetBird тянется только по 10.0.0.180). Для полного роуминга — добавить NetBird на LXC 142 (отложено).
|
||||||
|
- Мозг агента зависит от NetBird на Маке (100.70.92.138). NetBird ляжет → агент без мозга (`reference_mac_sudo` для рестарта).
|
||||||
|
|
||||||
|
## Проверено (e2e)
|
||||||
|
chat.dttb.ru → `cptr/ai` → агент на Маке → `hostname; sw_vers; ls ~/Desktop|wc -l` = `MacBookPro.lan` / `macOS` / `16`. Список `~/Desktop` совпал с реальным. Прямой вызов cptr `/v1` и через Open WebUI — оба ок.
|
||||||
|
|
||||||
|
См. [[2026-06-30-cptr-computer-agent]] (песочница-предшественник), [[../projects/dttb/proxmox-inventory]], [[../projects/dttb/credentials]].
|
||||||
@@ -185,11 +185,22 @@ cd /var/lib/rustdesk-api && /usr/bin/rustdesk-api reset-admin-pwd <new-pw>
|
|||||||
| NPM widget | it5870@yandex.ru / 1qaz!QAZ (как NPM) |
|
| 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]] |
|
| 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)
|
## cptr на Маке (АКТИВНЫЙ — агент с доступом к реальным файлам Мака)
|
||||||
|
|
||||||
| Параметр | Значение |
|
| Параметр | Значение |
|
||||||
|----------|----------|
|
|----------|----------|
|
||||||
| URL | http://10.0.0.166:8000 (LAN-only, БЕЗ публичного домена) |
|
| Хост | `MacBookPro.lan`, юзер `ai`, LAN `10.0.0.180`, NetBird `100.70.242.212`. cptr `~/.local/bin/cptr` (uv tool), LaunchAgent `ru.dttb.cptr`, данные `~/.cptr` |
|
||||||
|
| URL | http://10.0.0.180:8000 (LAN; в chat.dttb.ru = idx4 `cptr/ai`). БЕЗ публичного домена |
|
||||||
|
| Web-логин | `dttb` / `App5870w` (admin) |
|
||||||
|
| /v1 API-ключ | `sk-cptr-9RGczue_EqSnbMHbP7wP86i13qUh1qiKqWYt7emKWkQ` (им ходит Open WebUI) |
|
||||||
|
| Мозг | OmniRoute `cc/claude-opus-4-8`, **base_url `http://100.70.92.138:20128/v1` (NetBird!)** — LAN-адрес блокирует macOS Local Network privacy для launchd. conn id `0d61272b-535f-4a1c-96cb-d77dc7790270`, api_key `lan-trust` |
|
||||||
|
| Управление | `launchctl bootout/bootstrap gui/$(id -u) ~/Library/LaunchAgents/ru.dttb.cptr.plist`; лог `~/Library/Logs/cptr.log`. См. [[../../decisions/2026-06-30-cptr-on-mac]] |
|
||||||
|
|
||||||
|
## cptr — Open WebUI Computer (LXC 146, 🔴 STOPPED — заменён Mac-cptr)
|
||||||
|
|
||||||
|
| Параметр | Значение |
|
||||||
|
|----------|----------|
|
||||||
|
| URL | http://10.0.0.166:8000 (LAN-only, БЕЗ публичного домена) — **контейнер остановлен 2026-06-30** |
|
||||||
| Web-логин | `dttb` / `App5870w` (admin; ⚠️ пароль временный/дефолтный — сменить). Был `oleg`/`1qaz!QAZ`; смена через `PUT /api/admin/users/{id}/username|/password` |
|
| Web-логин | `dttb` / `App5870w` (admin; ⚠️ пароль временный/дефолтный — сменить). Был `oleg`/`1qaz!QAZ`; смена через `PUT /api/admin/users/{id}/username|/password` |
|
||||||
| LXC root | `10.0.0.166` — root / `1qaz!QAZ` (консоль/SSH через pve) |
|
| 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 раз) |
|
| /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 раз) |
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ tags: [dttb, proxmox]
|
|||||||
| Веб | **https://chat.dttb.ru** (NPM proxy host id39, LE cert id129 до 2026-09-20, Force SSL + WebSockets) — публично + LAN/NetBird |
|
| Веб | **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`) |
|
| Бэкенд | 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 в БД) |
|
| Авторизация | встроенная 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`) |
|
| Коннекты | 5 OpenAI-бэкендов: idx0 OmniRoute, idx1 German/Hermes (`hermes-agent`), idx2 GLM z.ai, idx3 openclaw/Антошка, **idx4 cptr (Mac)** (`cptr/ai` — агент на Маке Олега, `http://10.0.0.180:8000/v1`, рулит реальными файлами Мака; мозг OmniRoute via NetBird). Был песочница LXC 146 → перенаправлен на Mac 2026-06-30, см. [[../../decisions/2026-06-30-cptr-on-mac]] |
|
||||||
| Назначение | Личный веб-клиент «как ChatGPT» поверх OmniRoute. Грабли: первый старт тянет embedding-модель с HuggingFace (~1 ГБ, медленно из РФ → DNS контейнера = 1.1.1.1 против FakeIP роутера). См. [[../../decisions/2026-06-22-open-webui-deploy]] |
|
| Назначение | Личный веб-клиент «как ChatGPT» поверх OmniRoute. Грабли: первый старт тянет embedding-модель с HuggingFace (~1 ГБ, медленно из РФ → DNS контейнера = 1.1.1.1 против FakeIP роутера). См. [[../../decisions/2026-06-22-open-webui-deploy]] |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -300,7 +300,7 @@ tags: [dttb, proxmox]
|
|||||||
### LXC 146 — cptr (Open WebUI Computer / агент-исполнитель)
|
### LXC 146 — cptr (Open WebUI Computer / агент-исполнитель)
|
||||||
| Параметр | Значение |
|
| Параметр | Значение |
|
||||||
|----------|----------|
|
|----------|----------|
|
||||||
| Статус | 🟢 running |
|
| Статус | 🔴 **stopped 2026-06-30** — заменён cptr **на самом Маке** Олега (агенту нужны были РЕАЛЬНЫЕ файлы, а песочница их не видит). chat.dttb.ru idx4 перенаправлен на Mac (10.0.0.180). LXC оставлен заглушённым (можно удалить `pct destroy 146` или поднять `pct start 146` для безопасных экспериментов). См. [[../../decisions/2026-06-30-cptr-on-mac]] |
|
||||||
| 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 |
|
| 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) |
|
| ОС/рантайм | 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`) |
|
| Ресурсы | 2 vCPU / 2 GB / swap 1 GB / 12 GB (rootfs на `work`) |
|
||||||
|
|||||||
Reference in New Issue
Block a user