Files
security-alert-center/docs/runbook-ops.md
T

5.6 KiB
Raw Blame History

Runbook: эксплуатация SAC

Краткие процедуры для prod (sac.kalinamall.ru, native install в /opt/security-alert-center).

Деплой приложения

sudo /opt/sac-deploy.sh

Скрипт: git pull / reset --hard, pip install, alembic upgrade head, npm run build, systemctl restart sac-api.

Проверка:

curl -sS https://sac.kalinamall.ru/health | jq .

Ожидается status: ok, database: ok. При устаревших heartbeat агентов — status: degraded, поле hosts_stale > 0.

sac-api.env: формат строк

Файл читается pydantic (SAC_CONFIG_FILE), не как произвольный bash-скрипт.

  • Одна переменная — одна строка: SAC_SSH_AUTO_ADD_HOST_KEY=false
  • Комментарии — отдельной строкой с # в начале
  • Нельзя inline после значения: false ← так и оставляем — deploy упадёт на alembic с bool_parsing

Проверка без деплоя:

sudo -u sac bash -c 'export SAC_CONFIG_FILE=/opt/security-alert-center/config/sac-api.env; cd /opt/security-alert-center/backend && .venv/bin/python -c "from app.config import get_settings; get_settings(); print(\"OK\")"'

Linux SSH update: known_hosts

Перед «Обновить ssh-monitor (SSH)» ключ хоста должен быть в файле (по умолчанию config/ssh_known_hosts):

ssh-keyscan -H 10.10.7.2 | sudo tee -a /opt/security-alert-center/config/ssh_known_hosts
sudo chown sac:sac /opt/security-alert-center/config/ssh_known_hosts
sudo chmod 600 /opt/security-alert-center/config/ssh_known_hosts

Иначе SAC: Server '…' not found in known_hosts. SAC_SSH_AUTO_ADD_HOST_KEY=true для prod не рекомендуется.

Мобильные устройства (Seaca)

См. seaca-mobile.md и seaca-fcm.md.

После деплоя 0.9.0+: в веб-SAC включить мобильные устройства, выдать код оператору. Push — после настройки FCM и сборки APK с google-services.json.

Резервное копирование PostgreSQL

sudo -u postgres pg_dump -Fc sac > /var/backups/sac-$(date +%Y%m%d).dump

Восстановление (на тестовый инстанс):

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)

Ручной прогон:

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 (один раз):

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)

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).