[2026-09-26] eagle: personal/plans/balda-mm-phase4-agents.md personal/tech/agents-bridge.md personal/tech/balda-executor-mcp.md personal/tech/music-tags-final-review.md personal/tech/music-tags-repair-truenas.md
This commit is contained in:
1 parent
8199307531
commit
b00eb549bf
5 files changed
+469
-25
No files matched your search
@@ -12,9 +12,9 @@
|
||||
|---|---|---|
|
||||
| 1 | `~/agents` + `~/cli-auth` + контейнер | ✅ собрано, запущено |
|
||||
| 2 | Мост FastAPI :8790 | ✅ работает под launchd |
|
||||
| 3 | Сеть (Cloudflare Tunnel) | ⏳ **на Alex** — CF-панель |
|
||||
| 4 | Секция «Agents» в Dashboard | ✅ API + вкладка |
|
||||
| 5 | Связка Балда → мост | ⏳ не начато |
|
||||
| 3 | Сеть Kraken → Mac | ✅ **LAN напрямую**, туннель не нужен |
|
||||
| 4 | Секция «Agents» в Dashboard | ✅ активирована и проверена |
|
||||
| 5 | Связка Балда → мост | 🟡 **связка работает**, конфиг Балды ждёт переключения на `type: http` |
|
||||
| 6 | Приёмка от аккаунта Alex | 🔴 блокер: авторизация CLI |
|
||||
|
||||
---
|
||||
@@ -27,7 +27,7 @@
|
||||
| 2 | Подтверждения | Full access → `permissions.mode: allow_all` |
|
||||
| 3 | Управление линками в `~/agents` | Секция «Agents» в Eagle Dashboard |
|
||||
| 4 | Auth CLI (claude/codex) | на хосте, `~/cli-auth`, **вне** `~/agents`; логинит **Alex вручную** |
|
||||
| 5 | Сеть Kraken → Mac | Cloudflare Tunnel (существующий cloudflared на Mac) |
|
||||
| 5 | Сеть Kraken → Mac | ✅ **LAN напрямую** (`http://192.168.1.57:8790`); Cloudflare Tunnel — резерв |
|
||||
| 6 | Провайдер исполнителя | `claude` (дефолт в `.env`); `codex` собирается в том же образе, переключается переменной |
|
||||
|
||||
---
|
||||
@@ -58,8 +58,11 @@ Mattermost (Alex)
|
||||
Балда-оркестратор (Kraken, DeepSeek, allow_all)
|
||||
│ читает Obsidian, формирует ТЗ, /goalkeeper → work → validate
|
||||
▼
|
||||
Cloudflare Tunnel: agents-bridge.qentra.top → localhost:8790 ⏳
|
||||
│ (существующий cloudflared на Mac, PID + LaunchAgent)
|
||||
MCP-сервер balda-executor-mcp (Kraken, контейнер в mattermost_mm-net) :8890
|
||||
│ инструменты executor_run / executor_status / executor_health
|
||||
│ HTTP + X-Bridge-Secret
|
||||
▼
|
||||
LAN: http://192.168.1.57:8790 ← Kraken и Mac в одной сети, туннель не нужен
|
||||
▼
|
||||
Мост (Mac, FastAPI :8790) — под launchd com.agents.bridge
|
||||
│ idempotency key, таймаут 900 с, лимит 1 задача, shared secret
|
||||
@@ -74,6 +77,8 @@ Cloudflare Tunnel: agents-bridge.qentra.top → localhost:8790 ⏳
|
||||
diff + тесты + коммит → Балда → Mattermost
|
||||
```
|
||||
|
||||
Детали MCP-сервера: [[personal/tech/balda-executor-mcp]].
|
||||
|
||||
### Auth CLI на хосте
|
||||
|
||||
| Данные | Хост | В контейнере | Права |
|
||||
@@ -97,14 +102,22 @@ diff + тесты + коммит → Балда → Mattermost
|
||||
| `~/Docker/balda-executor/agents-mounts.yaml` | манифест внешних проектов |
|
||||
| `~/Docker/balda-executor/tools/render-mounts.py` | манифест → `compose.override.yaml` |
|
||||
| `~/Developer/agents-bridge/` | мост: `app.py`, `store.py`, `executor.py`, `config.py` |
|
||||
| `~/Library/LaunchAgents/com.agents.bridge.plist` | автозапуск + KeepAlive |
|
||||
| `~/Library/LaunchAgents/com.agents.bridge.plist` | автозапуск + KeepAlive, `--host 0.0.0.0` |
|
||||
| `~/Developer/eagle-dash/agents.py` | роутер секции «Agents» |
|
||||
| `~/Developer/balda-executor-mcp/` | MCP-сервер: `server.py`, `Dockerfile`, `docker-compose.yml` |
|
||||
| `/home/kraken/mcp/docker-compose.yml` (Kraken) | запуск контейнера MCP |
|
||||
|
||||
**Известные питфоллы (пройдены):**
|
||||
- `docker compose` в этом окружении **отсутствует** — только `docker-compose` (v5.1.3);
|
||||
- `docker compose` на Mac **отсутствует** — только `docker-compose` (v5.1.3);
|
||||
**на Kraken наоборот**: `docker compose`, а `docker-compose` → `command not found`;
|
||||
- `compose.override.yaml` обязателен при старте, иначе `up` падает на монтировании;
|
||||
- компайл: `node:24-bookworm` вместо `scratch` (CA-сертификаты — иначе TLS-фейл);
|
||||
- `psutil` не установлен в venv дашборда → supervisor не может трекать мост по PID; health для моста — `type: http`.
|
||||
- образ исполнителя: `node:24-bookworm` вместо `scratch` (CA-сертификаты — иначе TLS-фейл);
|
||||
- `psutil` не установлен в venv дашборда → supervisor не может трекать мост по PID; health для моста — `type: http`;
|
||||
- `--host` берётся из `ProgramArguments` plist, **`.env` его не перебивает**;
|
||||
смена аргументов требует `bootout`+`bootstrap`, не `kickstart`;
|
||||
- образ Балды из `scratch`: **нет shell**, `docker exec … sh` не работает;
|
||||
`docker.sock` в контейнер Балды **не смонтирован** → `docker run` изнутри невозможен;
|
||||
- на Kraken в sshd `AllowTcpForwarding no` → обратный SSH-туннель поставить нельзя.
|
||||
|
||||
---
|
||||
|
||||
@@ -177,13 +190,62 @@ diff + тесты + коммит → Балда → Mattermost
|
||||
|
||||
---
|
||||
|
||||
## 7. Сеть (шаг 3) — на Alex
|
||||
## 7. Сеть Kraken → Mac — ✅ РЕШЕНО, туннель НЕ нужен
|
||||
|
||||
Cloudflare Tunnel: добавить published route `agents-bridge.qentra.top` → HTTP `localhost:8790` +
|
||||
Access Application. Токен и процесс cloudflared не трогаются.
|
||||
⚠️ hostname — **одноуровневый** (двухуровневые дают TLS handshake failure).
|
||||
### Итог: обычный HTTP по локальной сети
|
||||
|
||||
Проверка после настройки: `curl https://agents-bridge.qentra.top/healthz`.
|
||||
Kraken и Mac **стоят в одной LAN и видят друг друга напрямую** — проверено
|
||||
`ping` с Kraken на `192.168.1.57` (RTT ~2.4 мс, 0% потерь). Никакой туннель,
|
||||
никакой проброс и никакая Access Application не нужны.
|
||||
|
||||
```
|
||||
BRIDGE_URL=http://192.168.1.57:8790
|
||||
```
|
||||
|
||||
Проверки, подтвердившие связь:
|
||||
|
||||
| Проверка | Результат |
|
||||
|---|---|
|
||||
| `ping` Kraken → `192.168.1.57` | 2/2, RTT 2.4 мс ✅ |
|
||||
| `curl` с Kraken на `:8790/healthz` | `status: ok` ✅ |
|
||||
| `curl` из контейнера в `mattermost_mm-net` на `:8790/healthz` | `status: ok` ✅ |
|
||||
|
||||
### Что НЕ сработало и почему (чтобы не повторять)
|
||||
|
||||
| Путь | Почему отпал |
|
||||
|---|---|
|
||||
| Cloudflare Tunnel (`agents-bridge.qentra.top`) | Требует правки маршрута в CF-панели — ручная работа Alex, а LAN работала сразу. Остаётся резервным вариантом, если Mac уедет из этой сети |
|
||||
| Обратный SSH-туннель (`ssh -R`) | 🔴 **На Kraken в sshd стоит `AllowTcpForwarding no`.** Симптом: `Error: remote port forwarding failed for listen port 18790`, в verbose — `debug1: Remote: Server has disabled port forwarding.` Не диагностировать как «порт занят»: порт свободен, форвард выключен администратором |
|
||||
|
||||
📌 Если понадобится туннель в будущем — сначала проверить `AllowTcpForwarding` на Kraken,
|
||||
потом уже ставить форвард. Cloudflare Tunnel этот запрет обходит (исходящее соединение,
|
||||
не SSH-форвард).
|
||||
|
||||
### Мост теперь слушает всю сеть — это осознанное изменение
|
||||
|
||||
| Было | Стало | Почему |
|
||||
|---|---|---|
|
||||
| `BRIDGE_HOST=127.0.0.1` | `BRIDGE_HOST=0.0.0.0` | иначе Kraken не достучится |
|
||||
|
||||
⚠️ **Порт 8790 теперь открыт в локальной сети.** Защита — `X-Bridge-Secret` (обязателен,
|
||||
иначе `POST /task` отдаёт 503). При уходе Mac в недоверенную сеть — вернуть `127.0.0.1`
|
||||
и поднимать туннель.
|
||||
|
||||
🔴 **Питфолл: `.env` не перебивает plist.** Я поменял `BRIDGE_HOST` в `.env`, но мост
|
||||
продолжал слушать `127.0.0.1` — потому что `--host` **жёстко задан в `ProgramArguments`**
|
||||
plist. Симптом: `lsof` показывает `127.0.0.1:8790` после «перезапуска с новым конфигом».
|
||||
Исправлять надо **в plist**, а не в `.env`.
|
||||
|
||||
```bash
|
||||
# применить: правка plist → перезагрузка сервиса (не kickstart!)
|
||||
launchctl bootout gui/$(id -u)/com.agents.bridge
|
||||
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.agents.bridge.plist
|
||||
# проверка: должно быть *:8790, а не 127.0.0.1:8790
|
||||
lsof -nP -iTCP:8790 -sTCP:LISTEN
|
||||
```
|
||||
|
||||
`kickstart` перечитывает только программу, но **не** изменённый `ProgramArguments` —
|
||||
для смены аргументов нужен `bootout` + `bootstrap`.
|
||||
|
||||
---
|
||||
|
||||
@@ -201,14 +263,41 @@ Access Application. Токен и процесс cloudflared не трогают
|
||||
|
||||
## 9. Открыто
|
||||
|
||||
1. Cloudflare Tunnel (шаг 3) — нужен доступ к CF-панели
|
||||
2. Связка Балда → мост (шаг 5) — MCP-инструмент
|
||||
3. Логин CLI (Alex вручную) — без него сквозная приёмка невозможна
|
||||
1. **Переключить конфиг Балды на HTTP-MCP** — сейчас там stdio-вариант с `docker run`,
|
||||
который не может работать (нет `docker.sock` и нет shell в образе Балды).
|
||||
Нужен `type: http` → `http://balda-executor-mcp:8890/mcp`. См. [[personal/tech/balda-executor-mcp]] §7.
|
||||
2. Проверить, что инструменты видны в сессии Балды (после перезапуска).
|
||||
3. Логин CLI (Alex вручную) — без него сквозная приёмка невозможна.
|
||||
4. Cloudflare Tunnel — **не нужен** на текущей схеме; держать как резерв, если Mac
|
||||
уедет из LAN.
|
||||
|
||||
## 10. Шаг 5 — связка Балда → мост (что сделано 2026-09-26)
|
||||
|
||||
| Компонент | Где | Статус |
|
||||
|---|---|---|
|
||||
| MCP-сервер `balda-executor-mcp` | `~/Developer/balda-executor-mcp/` | ✅ код + образ |
|
||||
| Образ | `balda-executor-mcp:0.1.0`, загружен на Kraken | ✅ |
|
||||
| Контейнер MCP | Kraken, `/home/kraken/mcp/docker-compose.yml` | ✅ Up |
|
||||
| Конфиг Балды | `runtime.mcp_servers.executor-mcp` + `balda.mcp_servers` | 🟡 ждёт `type: http` |
|
||||
| `.env` Балды | `+ BRIDGE_URL`, `+ BRIDGE_SECRET` | ✅ |
|
||||
|
||||
Бэкапы на Kraken: `config.yaml.bak-mcp-20260926-194313`, `.env.bak-mcp-*`, `.env.bak-url-*`.
|
||||
|
||||
Проверено живьём: MCP-handshake (stdio и HTTP), `tools/list` с 3 инструментами,
|
||||
`executor_health` из docker-сети Kraken вернул живые данные моста на Mac,
|
||||
Балда после правки конфига стартовала без ошибок.
|
||||
|
||||
📌 **Ключевой вывод по архитектуре:** MCP-сервер обязан быть **отдельным контейнером
|
||||
с HTTP-транспортом**. Вариант «stdio + `docker run` изнутри Балды» нерабочий:
|
||||
в образе Балды нет shell и не смонтирован `docker.sock`.
|
||||
|
||||
## Связанные заметки
|
||||
- [[personal/projects/balda/balda-mm-delegation-plan]] — общий план (Фазы 4-5)
|
||||
- [[personal/projects/balda/balda-kraken-mm-deploy]] — Фаза 3 (✅)
|
||||
- [[personal/plans/balda-mm-pr-plan]] — Фаза 2 (PR #8)
|
||||
- [[personal/tech/balda-executor-mcp]] — MCP-сервер делегирования (шаг 5)
|
||||
- [[personal/tech/agents-bridge]] — мост :8790 (шаг 2)
|
||||
- [[personal/tech/eagle-dashboard-agents-tab]] — секция «Agents» в дашборде (шаг 4)
|
||||
- [[personal/tech/macos-docker-virtiofs-mount-limits]] — ограничения macOS Docker
|
||||
- [[personal/tech/balda-go-fx-pitfalls]] — fx-питфоллы, дельта-апплаер
|
||||
- [[family/how-to/kraken-portainer-access]] — cloudflared, routes
|
||||
|
||||
Reference in new issue
Block a user