Files
security-alert-center/docs/runbook-ops.md
T
PTah f0bd31c544 fix(nginx): отклонять чужие Host на SAC (default_server 444)
Только sac.kalinamall.ru; ext.kalinamall.ru и прочие имена на IP SAC не отдают UI. ssl_reject_handshake на :443.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-13 11:24:21 +10:00

105 lines
4.3 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.
# Runbook: эксплуатация SAC
Краткие процедуры для prod (`sac.kalinamall.ru`, native install в `/opt/security-alert-center`).
## Деплой приложения
```bash
sudo /opt/sac-deploy.sh
```
Скрипт: `git pull` / `reset --hard`, `pip install`, `alembic upgrade head`, `npm run build`, `systemctl restart sac-api`.
Проверка:
```bash
curl -sS https://sac.kalinamall.ru/health | jq .
```
Ожидается `status: ok`, `database: ok`. При устаревших heartbeat агентов — `status: degraded`, поле `hosts_stale` > 0.
## Мобильные устройства (Seaca)
См. [seaca-mobile.md](seaca-mobile.md) и [seaca-fcm.md](seaca-fcm.md).
После деплоя 0.9.0+: в веб-SAC включить мобильные устройства, выдать код оператору. Push — после настройки FCM и сборки APK с `google-services.json`.
## Резервное копирование PostgreSQL
```bash
sudo -u postgres pg_dump -Fc sac > /var/backups/sac-$(date +%Y%m%d).dump
```
Восстановление (на тестовый инстанс):
```bash
sudo -u postgres pg_restore -d sac_test --clean /var/backups/sac-YYYYMMDD.dump
```
Перед restore на prod — остановить API: `sudo systemctl stop sac-api`.
## Retention (очистка БД)
Политика по умолчанию (`config/sac-api.env`):
| Данные | Срок |
|--------|------|
| `events` | 90 дней (`SAC_EVENTS_RETENTION_DAYS`) |
| `problems` со статусом `resolved` | 180 дней (`SAC_PROBLEMS_RETENTION_DAYS`) |
Ручной прогон:
```bash
sudo -u sac bash -c '
set -a; source /opt/security-alert-center/config/sac-api.env; set +a
cd /opt/security-alert-center/backend
.venv/bin/python -m app.jobs.retention
'
```
Установка ежедневного timer (один раз):
```bash
sudo cp /opt/security-alert-center/deploy/systemd/sac-retention.service /etc/systemd/system/
sudo cp /opt/security-alert-center/deploy/systemd/sac-retention.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now sac-retention.timer
systemctl list-timers sac-retention.timer
```
## Суточные отчёты (F-NOT-05)
```bash
sudo cp /opt/security-alert-center/deploy/systemd/sac-daily-report.service /etc/systemd/system/
sudo bash /opt/security-alert-center/deploy/systemd/render-sac-daily-report-timer.sh \
/opt/security-alert-center/config/sac-api.env \
/etc/systemd/system/sac-daily-report.timer
sudo systemctl daemon-reload
sudo systemctl enable --now sac-daily-report.timer
systemctl list-timers sac-daily-report.timer
# Ручной прогон (игнор часа)
sudo -u sac bash -lc 'cd /opt/security-alert-center/backend && .venv/bin/python -m app.jobs.daily_report --force'
```
Переменные: `SAC_DAILY_REPORT_*` в `config/sac-api.env` (см. `deploy/env.native.example`).
## Health и мониторинг
| Endpoint | Назначение |
|----------|------------|
| `GET /health` | БД, версия, `hosts_stale`, `last_event_received_at` |
| `GET /api/v1/stream/events` | SSE для UI (счётчики + `last_event_id` каждые 5 с) |
Агенты: `GET /health` без JWT. UI Dashboard: блок «Последние события» подгружается при смене `last_event_id` в SSE.
## Типовые проблемы
**События в Telegram есть, в UI нет** — проверить ingest (лог агента `SAC: accepted`), режим `UseSAC`, обновить Dashboard (live ~5 с).
**422 на ingest** — см. `Logs/sac-last-post.json` на Windows-агенте; обновить `Sac-Client.ps1` (RDP) или `sac-client.sh` (Linux).
**Устаревший heartbeat** — увеличить `SAC_HEARTBEAT_STALE_MINUTES` или проверить `agent.heartbeat` на хосте.
**Чужой Host на IP SAC (форма SAC на ext.kalinamall.ru)** — в nginx только `server_name sac.kalinamall.ru`; default_server → 444 / `ssl_reject_handshake`. Обновить конфиг из `deploy/nginx/sac.conf.tls.example`, `sudo nginx -t && sudo systemctl reload nginx`. HAProxy на этом не решается — правка на **192.168.160.145** (nginx SAC).