# ToDo — 29.05.2026 (оповещения SAC + «Настройки») Контекст: при **`UseSAC=exclusive`** на агентах Telegram/email с хоста **не идут** — оператору нужны оповещения **из SAC**. Аналитика и прочее — отдельно ([analytics-backlog.md](analytics-backlog.md)). --- ## Уже есть в коде (не путать с «ещё не сделано») | Что | Где | Ограничение | |-----|-----|-------------| | Telegram из SAC | `backend/app/services/telegram_notify.py` | Только если в `sac-api.env`: `TELEGRAM_ENABLED=true`, токен, chat_id | | Порог severity | `telegram_min_severity` (по умолчанию **`high`**) | События **`info`** (успешный RDP `rdp.login.success`) **не** уходят в TG, пока порог не снизить до `warning` | | Вызов при ingest | `events.py` → `notify_event` / `notify_problem` | Шаблон короткий («🚨 SAC событие»), не как у агента | | UI «Настройки» | `/settings`, GET/PUT Telegram | БД `notification_channels` (миграция `004`) + fallback на `sac-api.env` | | Email / webhook | TZ F-NOT-01 | Email ✅, Webhook ✅ | **Вывод на завтра:** для exclusive нужно (1) включить и настроить TG на сервере SAC **или** (2) сделать раздел **«Настройки»** в UI + хранение каналов; порог **`warning` и выше** для событий и problems. **Замечание по коду:** `notify_problem()` сейчас **не проверяет** `telegram_min_severity` (в отличие от `notify_event`) — исправить в рамках `notif-03`. --- ## Задачи (приоритет) ### P0 — exclusive + Telegram | ID | Задача | Критерий | |----|--------|----------| | `notif-01` | Зафиксировать в `agent-integration.md` / runbook: при **exclusive** канал оповещений = SAC; рекомендуемый `TELEGRAM_MIN_SEVERITY=warning` | ✅ docs + `env.native.example` | | `notif-02` | Проверить на staging/prod: ingest `rdp.login.failed` (warning) → TG; `rdp.login.success` (info) → нет TG при `min=warning` | ✅ чеклист [testing-e2e-checklist.md](testing-e2e-checklist.md) § SAC Telegram | | `notif-03` | `notify_problem`: учитывать `telegram_min_severity` | ✅ unit-тест | ### P1 — UI «Настройки» (каналы) | ID | Задача | Критерий | |----|--------|----------| | `notif-10` | Маршрут `/settings`, пункт в сайдбаре (только admin JWT) | ✅ страница + GET API | | `notif-11` | Блок **Telegram**: enabled, bot token, chat id, min severity | ✅ форма + GET/PUT | | `notif-12` | Хранение: **вариант A** — запись в БД `notification_channels` + fallback на env | ✅ миграция `004`, `PUT /notifications/telegram` | | `notif-13` | Секреты: токен не возвращать целиком в GET (маска `***…last4`) | ✅ GET settings | | `notif-14` | Кнопка «Проверить Telegram» → тестовое сообщение | ✅ `POST …/telegram/test` + UI | ### P2 — Email и webhook (после Telegram) | ID | Задача | Критерий | |----|--------|----------| | `notif-20` | SMTP: host, port, user, from, to, TLS — по аналогии с RDP `login_monitor.settings` | ✅ PUT/test API + UI + ingest | | `notif-21` | Webhook: URL, optional secret header, JSON payload (event/problem) | ✅ PUT/test API + UI + ingest | | `notif-22` | TZ F-NOT-02 урезанно: правило «severity ≥ X → каналы» без сложного конструктора | ✅ `notification_policy` + UI «Правило оповещений» | ### P3 — Качество сообщений (можно сдвинуть) | ID | Задача | |----|--------| | `notif-30` | Шаблон TG ближе к агенту (HTML, поля user/ip/logon_type из `details`) | | `notif-31` | Cooldown/dedup на уровне SAC (F-NOT-03) — не дублировать problem при burst | | `notif-32` | F-NOT-05: daily report из SAC при exclusive (отдельный эпик) | --- ## Связь с агентами ```text UseSAC=off → только агент (Telegram на хосте) UseSAC=dual → агент + SAC ingest (+ опционально SAC TG, риск дублей) UseSAC=exclusive→ только SAC ingest; TG/email = настройки SAC (UI/env) ``` --- ## Оценка на день | Блок | Часы (оценка) | |------|----------------| | P0 док + notif-03 + smoke | 2–3 | | P1 UI Settings + API Telegram | 4–6 | | P2 webhook/email | +1 день | **Минимум на завтра:** `notif-01` … `notif-03` + черновик `notif-10` … `notif-14` (хотя бы API без полировки UI). --- ## См. также - [TZ.md](TZ.md) §4.6 F-NOT-01 … F-NOT-05 - [agent-integration.md](agent-integration.md) — режимы UseSAC - `backend/app/config.py` — `telegram_*` - `backend/app/services/telegram_notify.py`