Files
security-alert-center/docs/pilot-2.2-heartbeat-reports.md
T
PTah 415d863b3b feat: SAC daily reports from DB aggregation (notif-32)
- Aggregate report.daily.ssh/rdp from 24h ingest; job and systemd timer

- notify_daily_report bypasses NOTIFY_MIN_SEVERITY; ingest routes agent reports

- HTML templates, env SAC_DAILY_REPORT_*, docs and tests (56 cases)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-29 16:30:07 +10:00

92 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Фаза 2.2 — Heartbeat и daily report через SAC
Агент **уже** шлёт в SAC (в т.ч. в `exclusive`):
| Тип | Интервал (ssh-monitor) |
|-----|-------------------------|
| `agent.heartbeat` | каждые **12 ч** |
| `report.daily.ssh` | раз в сутки после `DAILY_REPORT_HOUR` |
SAC отображает их в **События** и на **Dashboard / Хосты**.
---
## UI SAC
- **Dashboard:** счётчики heartbeat/отчётов за 24 ч, хосты с устаревшим heartbeat.
- **Хосты:** колонки *Агент* (`online` / `stale` / `unknown`), время последнего heartbeat и отчёта (ссылка на **Отчёты** по hostname).
- **Отчёты** (`/reports`): список `report.daily.*` по узлам; клик по строке — карточка с метриками и полным текстом (HTML/`report_body` в `details`).
- Старые события без `details.report_body` показывают подсказку обновить агент.
---
## Настройка порога «живости» (сервер SAC)
В `config/sac-api.env`:
```bash
# По умолчанию 780 мин (13 ч) — чуть больше интервала heartbeat агента (12 ч)
SAC_HEARTBEAT_STALE_MINUTES=780
```
После изменения: `sudo systemctl restart sac-api`.
---
## Проверка на пилотном хосте (exclusive)
1. Дождаться heartbeat или ускорить тест: на агенте временно уменьшить интервал нельзя без правки кода — проще подождать или вручную:
```bash
sudo /usr/local/bin/ssh-monitor --dry-run
```
(не шлёт реально; для реального теста — дождаться цикла 12 ч или смотреть уже пришедшие события).
2. В SAC UI → **События**, фильтр `type=agent.heartbeat`.
3. **Хосты** → статус `online` после свежего heartbeat.
4. Ежедневный отчёт: после `DAILY_REPORT_HOUR` — событие `report.daily.ssh` (от агента) **или** от SAC при `SAC_DAILY_REPORT_ENABLED=true` и отсутствии отчёта агента за сутки.
---
## SAC: отчёт без агента (exclusive / пропуск агента)
В `config/sac-api.env`:
```bash
SAC_DAILY_REPORT_ENABLED=true
SAC_DAILY_REPORT_HOUR=9
SAC_DAILY_REPORT_TIMEZONE=Europe/Moscow
SAC_DAILY_REPORT_SKIP_IF_AGENT_SENT=true
SAC_DAILY_REPORT_REQUIRE_ACTIVITY=true
```
- Job: `cd backend && .venv/bin/python -m app.jobs.daily_report` (ручной прогон: `--force`).
- Timer: `deploy/systemd/sac-daily-report.service` + `.timer` (по умолчанию 09:15 UTC в unit; час проверяется по `SAC_DAILY_REPORT_TIMEZONE`).
- Оповещение: `notify_daily_report` — **не** режется `NOTIFY_MIN_SEVERITY=warning` (severity отчёта `info`).
- UI **Отчёты** и Telegram используют `details.report_html` / `report_body` как у агента.
Установка timer (один раз на сервере):
```bash
sudo cp /opt/security-alert-center/deploy/systemd/sac-daily-report.service /etc/systemd/system/
sudo cp /opt/security-alert-center/deploy/systemd/sac-daily-report.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now sac-daily-report.timer
```
---
## Деплой
```bash
sudo /opt/sac-deploy.sh
```
---
## См. также
- [pilot-2.1-exclusive.md](pilot-2.1-exclusive.md)
- [agent-integration.md](agent-integration.md)