[2026-06-16] zulip-router: fix — use Eagle credentials, not a new bot
This commit is contained in:
@@ -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()` патч из кода (больше не нужен)
|
||||||
|
|||||||
Reference in New Issue
Block a user