diff --git a/decisions/2026-06-30-cptr-on-mac.md b/decisions/2026-06-30-cptr-on-mac.md new file mode 100644 index 0000000..e1fa91f --- /dev/null +++ b/decisions/2026-06-30-cptr-on-mac.md @@ -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]]. diff --git a/projects/dttb/credentials.md b/projects/dttb/credentials.md index 7a1311b..60bc806 100644 --- a/projects/dttb/credentials.md +++ b/projects/dttb/credentials.md @@ -185,11 +185,22 @@ 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) +## 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` | | 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 раз) | diff --git a/projects/dttb/proxmox-inventory.md b/projects/dttb/proxmox-inventory.md index ef8a589..3bf01da 100644 --- a/projects/dttb/proxmox-inventory.md +++ b/projects/dttb/proxmox-inventory.md @@ -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 | | Бэкенд | 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`) | +| Коннекты | 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]] | --- @@ -300,7 +300,7 @@ tags: [dttb, proxmox] ### 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 | | ОС/рантайм | 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`) |