[2026-06-16] zulip-router: fix — use Eagle credentials, not a new bot

This commit is contained in:
Alexey Martemyanov
2026-06-16 13:14:34 +06:00
parent 7668508911
commit c838b7a26a
+22 -27
View File
@@ -5,7 +5,7 @@ _Последнее обновление: 2026-06-16_
## Цель ## Цель
Event-роутер между Zulip и balda-ботами (Валера, Клавдий). Event-роутер между Zulip и balda-ботами (Валера, Клавдий).
Решает проблему конкурентного получения событий — сейчас оба бота через Events API видят все сообщения одновременно. Решает проблему конкурентного получения событий — сейчас оба бота видят все сообщения одновременно.
## Проблема (root cause) ## Проблема (root cause)
@@ -17,16 +17,16 @@ Event-роутер между Zulip и balda-ботами (Валера, Кла
``` ```
Zulip Zulip
├── Events API ← Валера (valera-bot, poll на :8091) ├── Events API ← Валера (valera-bot, poll на :8091) — отключён
── Events API ← Клавдий (claudio-bot, poll на :8092) ── Events API ← Клавдий (claudio-bot, poll на :8092) — отключён
└── Webhook → оба (outgoing webhook bot_type=3 через @mention) └── Webhook → оба (outgoing webhook через @mention)
``` ```
## Архитектура (с роутером) ## Архитектура (с роутером)
``` ```
Zulip Event Queue Zulip Event Queue
↓ poll (отдельный бот-роутер или reuse одного из существующих) ↓ poll (credentials Eagle из ~/.hermes/config.yaml)
[zulip-router] (~/Docker/zulip-router/) [zulip-router] (~/Docker/zulip-router/)
├── @Валера / @Valera → POST http://balda-agent-valera-1:8091/zulip/webhook ├── @Валера / @Valera → POST http://balda-agent-valera-1:8091/zulip/webhook
├── @Клавдий / @Klavdiy → POST http://claudio-agent-claudio-1:8092/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) ↕ 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 ## Что меняется в balda
После деплоя роутера у обоих ботов нужно **отключить Events API polling** в config.yaml: После деплоя роутера Events API polling уже отключён у обоих ботов (сделано 2026-06-16):
```yaml ```yaml
zulip: zulip:
events_polling: events_polling:
enabled: false # ← было true enabled: false
``` ```
После этого сообщения приходят **только через webhook** (от роутера). Сообщения приходят **только через webhook** от роутера.
Перезапуск: `docker-compose up -d` (в каждом compose).
## Код ## Код
@@ -75,45 +74,41 @@ zulip:
**Compose:** `~/Docker/zulip-router/docker-compose.yaml` **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** Не создавать нового бота. Eagle уже имеет права на чтение всех публичных стримов.
2. Тип: **Outgoing webhook**
3. Имя: `zulip-router` (или любое)
4. Bot email: скопировать (понадобится в .env)
5. API key: скопировать (понадобится в .env)
6. Endpoint URL: не заполнять (роутер сам поллит, webhook от Zulip ему не нужен)
7. Сохранить
### Env vars ### Env vars
Создать `~/Docker/zulip-router/.env`: Создать `~/Docker/zulip-router/.env`:
```env
ZULIP_ROUTER_BOT_EMAIL=zulip-router-bot@zulip.qentra.top
ZULIP_ROUTER_API_KEY=<api-key из шага 5>
# Куда форвардить ```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 VALERA_WEBHOOK=http://balda-agent-valera-1:8091/zulip/webhook
CLAUDIO_WEBHOOK=http://claudio-agent-claudio-1:8092/zulip/webhook CLAUDIO_WEBHOOK=http://claudio-agent-claudio-1:8092/zulip/webhook
``` ```
### Запуск ### Запуск
```bash ```bash
cd ~/Docker/zulip-router cd ~/Docker/zulip-router
docker-compose up -d docker-compose up -d
docker logs zulip-router --tail 20 # проверить что poll loop запущен docker logs zulip-router --tail 20 # проверить poll loop
```
## TODO ## TODO
- [ ] Написать код роутера (~260 LOC) - [ ] Написать код роутера (~260 LOC)
- [ ] Создать compose `~/Docker/zulip-router/docker-compose.yaml` - [ ] Создать 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-compose up -d`
- [ ] Проверить логи: `docker logs zulip-router --tail 50` - [ ] Проверить логи: `docker logs zulip-router --tail 50`
- [ ] Отключить `events_polling.enabled` у Валеры → `docker-compose up -d`
- [ ] Отключить `events_polling.enabled` у Клавдия → `docker-compose up -d`
- [ ] Протестировать: @Клавдий и @Валера в разных топиках - [ ] Протестировать: @Клавдий и @Валера в разных топиках
- [ ] Проверить ownership: сообщение в топик без @mention → последний бот - [ ] Проверить ownership: сообщение в топик без @mention → последний бот
- [ ] Удалить `extractOtherMention()` патч из кода (больше не нужен) - [ ] Удалить `extractOtherMention()` патч из кода (больше не нужен)