diff --git a/personal/projects/zulip-router.md b/personal/projects/zulip-router.md index f6a86cee..e34fada3 100644 --- a/personal/projects/zulip-router.md +++ b/personal/projects/zulip-router.md @@ -5,7 +5,7 @@ _Последнее обновление: 2026-06-16_ ## Цель Event-роутер между Zulip и balda-ботами (Валера, Клавдий). -Решает проблему конкурентного получения событий — сейчас оба бота через Events API видят все сообщения одновременно. +Решает проблему конкурентного получения событий — сейчас оба бота видят все сообщения одновременно. ## Проблема (root cause) @@ -17,16 +17,16 @@ Event-роутер между Zulip и balda-ботами (Валера, Кла ``` Zulip - ├── Events API ← Валера (valera-bot, poll на :8091) - └── Events API ← Клавдий (claudio-bot, poll на :8092) - └── Webhook → оба (outgoing webhook bot_type=3 через @mention) + ├── Events API ← Валера (valera-bot, poll на :8091) — отключён + ├── Events API ← Клавдий (claudio-bot, poll на :8092) — отключён + └── Webhook → оба (outgoing webhook через @mention) ``` ## Архитектура (с роутером) ``` Zulip Event Queue - ↓ poll (отдельный бот-роутер или reuse одного из существующих) + ↓ poll (credentials Eagle из ~/.hermes/config.yaml) [zulip-router] (~/Docker/zulip-router/) ├── @Валера / @Valera → POST http://balda-agent-valera-1:8091/zulip/webhook ├── @Клавдий / @Klavdiy → POST http://claudio-agent-claudio-1:8092/zulip/webhook @@ -34,7 +34,7 @@ Zulip Event Queue ↕ ownership: stream+topic → bot (TTL 24h, persisted to /data/ownership.json) ``` -**Важно:** таргеты — не Hermes инстансы, а balda-боты (Go бинарники). У каждого уже есть webhook endpoint `/zulip/webhook`. +**Ключевое:** credentials — Eagle/Орла (не новый бот). Роутер регистрирует свою event queue (отдельную от очереди Eagle). ## Правила маршрутизации @@ -46,16 +46,15 @@ Zulip Event Queue ## Что меняется в balda -После деплоя роутера у обоих ботов нужно **отключить Events API polling** в config.yaml: +После деплоя роутера Events API polling уже отключён у обоих ботов (сделано 2026-06-16): ```yaml zulip: events_polling: - enabled: false # ← было true + enabled: false ``` -После этого сообщения приходят **только через webhook** (от роутера). -Перезапуск: `docker-compose up -d` (в каждом compose). +Сообщения приходят **только через webhook** от роутера. ## Код @@ -75,45 +74,41 @@ zulip: **Compose:** `~/Docker/zulip-router/docker-compose.yaml` -### Перед запуском: создать бота-роутера в Zulip +### Credentials: Eagle, не новый бот -Нужен **отдельный** бот (не valera-bot, не claudio-bot). +Роутер использует credentials Eagle/Орла из `~/.hermes/config.yaml` → `platforms.zulip`. -1. В Zulip: **Settings → Bots → Add a new bot** -2. Тип: **Outgoing webhook** -3. Имя: `zulip-router` (или любое) -4. Bot email: скопировать (понадобится в .env) -5. API key: скопировать (понадобится в .env) -6. Endpoint URL: не заполнять (роутер сам поллит, webhook от Zulip ему не нужен) -7. Сохранить +Не создавать нового бота. Eagle уже имеет права на чтение всех публичных стримов. ### Env vars Создать `~/Docker/zulip-router/.env`: -```env -ZULIP_ROUTER_BOT_EMAIL=zulip-router-bot@zulip.qentra.top -ZULIP_ROUTER_API_KEY= -# Куда форвардить +```env +# Credentials Eagle/Орла — из ~/.hermes/config.yaml +ZULIP_BOT_EMAIL=eagle-bot@zulip.qentra.top +ZULIP_API_KEY=<скопировать из конфига Eagle> + +# Куда форвардить (Docker DNS, сеть balda_default) VALERA_WEBHOOK=http://balda-agent-valera-1:8091/zulip/webhook CLAUDIO_WEBHOOK=http://claudio-agent-claudio-1:8092/zulip/webhook ``` ### Запуск + ```bash cd ~/Docker/zulip-router docker-compose up -d -docker logs zulip-router --tail 20 # проверить что poll loop запущен +docker logs zulip-router --tail 20 # проверить poll loop +``` ## TODO - [ ] Написать код роутера (~260 LOC) - [ ] Создать compose `~/Docker/zulip-router/docker-compose.yaml` -- [ ] Создать бота-роутера в Zulip (или реюзнуть valera-bot/claudio-bot), получить API key +- [ ] Набить `.env` с credentials Eagle (из `~/.hermes/config.yaml`) - [ ] `docker-compose up -d` - [ ] Проверить логи: `docker logs zulip-router --tail 50` -- [ ] Отключить `events_polling.enabled` у Валеры → `docker-compose up -d` -- [ ] Отключить `events_polling.enabled` у Клавдия → `docker-compose up -d` - [ ] Протестировать: @Клавдий и @Валера в разных топиках - [ ] Проверить ownership: сообщение в топик без @mention → последний бот - [ ] Удалить `extractOtherMention()` патч из кода (больше не нужен)