При нажатии кнопки SOS бэкенд должен доставить уведомление в Telegram-группу через Bot API. Вопрос: отправлять каждый сигнал отдельным `sendMessage` (direct) или буферизовать и отправлять пачками (aggregator)?
| Групповая тревога (5 человек за минуту) | 5 | 5 | Лимит: 20/мин ✅ |
| Массовая тревога (20 за минуту) | 20 | 20 | На грани лимита ⚠️ |
| Абсурдный worst case (все 400) | 400 | 400 | Далеко за лимитом ❌ |
**Вывод:** реалистичный пик — 5–10 одновременных сигналов. «Все 400 нажали» — нереалистичный сценарий (разные страны, разные часовые пояса, разные ситуации). Лимит 20 msg/мин покрывает 99.9% случаев.
**Решение #1017:** оценки нагрузки в ADR могут быть «drastically wrong» → архитектура должна позволять включить агрегатор без переписывания. Код агрегатора УЖЕ реализован в `telegram.py:51-121` — он просто не активирован.
Агрегатор (Вариант B) оставлен в коде (`telegram.py:SignalAggregator`) но НЕ активирован. При росте нагрузки — включается изменением 2 строк в `main.py`.
1.**#1020: агрегатор нужен только при 20+ одновременных сигналов/мин.** Для 300–400 пользователей это нереалистичный сценарий. Агрегатор — premature optimization.
2.**Задержка неприемлема для экстренного приложения.** 10-секундный буфер = 10 секунд ожидания, пока спасатель увидит сигнал. При прямой отправке — <1секунды.
3.**Код агрегатора уже написан.**`telegram.py:51-121` содержит полный `SignalAggregator`с lock, flush, rate limiting. Включение в v2:
```python
# main.py lifespan: раскомментировать 2 строки
aggregator = SignalAggregator(interval=10)
asyncio.create_task(aggregator.run())
```
4.**#1017 учтён:** если оценка нагрузки окажется «drastically wrong» — переключение на агрегатор не требует переписывания архитектуры.
---
## Безопасность Telegram-интеграции
### Webhook secret validation (#1010)
Каждый входящий запрос на `POST /api/webhook/telegram` ОБЯЗАН содержать заголовок:
```
X-Telegram-Bot-Api-Secret-Token: <WEBHOOK_SECRET>
```
Реализовано: `middleware.py:verify_webhook_secret()` — FastAPI dependency, 403 при несовпадении.
### HTTPS обязателен (#1011)
- Telegram принимает webhook ТОЛЬКО на HTTPS URL
- Поддерживаемые порты: 443, 80, 88, 8443
- TLS 1.2 минимум
- CA-signed сертификат (Let's Encrypt достаточен)
### setWebhook vs getUpdates (#1009)
Telegram Bot API: `setWebhook` и `getUpdates` взаимоисключающи. Baton использует ТОЛЬКО `setWebhook`. Вызов `getUpdates` автоматически удалит webhook.
1.**Один uvicorn worker достаточен для v1.** Агрегатор не активен → нет shared state → но для консистентности рекомендуется 1 worker.
2.**При 429 от Telegram:** текущий код (`telegram.py:22-25`) обрабатывает retry_after корректно. Сигнал не теряется — он уже в SQLite. Telegram-сообщение задержится на `retry_after` секунд.
3.**Переход на v2 (агрегатор):** изменение 3 строк в `main.py` + изменение signal endpoint (вместо прямого sendMessage → `aggregator.add_signal()`). Оценка: 30 минут работы dev-агента.
4.**Мониторинг:** логировать 429 ответы от Telegram. Если частота > 1/день — триггер для включения агрегатора.