[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:
Alexey Martemyanov committed 2026-09-26 20:06:18 +06:00
1 parent 8199307531
commit b00eb549bf
5 files changed
+469 -25

No files matched your search

+107 -18
View File
@@ -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