Документация

Обзор проекта

Crisis-Monitor – это небольшое веб‑приложение для регистрации чрезвычайных ситуаций. Ниже описаны основные этапы установки и запуска тестов.

Актуальная продуктовая поверхность

В релизе 2e104589 benchmark-план выполняется небольшими вертикальными срезами, без выдумывания данных и статусов:

  • /field/report – online-first форма полевого наблюдения, создающая обычный инцидент со структурированными метаданными; offline-черновики пока не входят в контракт.
  • /api/v1/sources/health и /api/v1/sources/credibility разделяют состояние проверки источника, свежесть событий и наблюдаемую структуру review-данных.
  • Доска активации команд остаётся read-only, а narrative velocity показывает только наблюдаемую динамику двух временных окон.
  • Evidence bundle содержит безопасное резюме AAR без текста ответов участников и имён рецензентов.
  • Dashboard показывает read-only scorecard готовности смены: просрочки, критические записи без владельца, свежесть SitRep, активные watch zones и покрытие playbook. При отсутствии знаменателя отображается not measured, а не искусственные 100%.
  • AV DS 4 имеет отдельную широкую компоновку для экранов 2560px и 3440px; это перестройка сетки, а не простое растягивание карточек. Подробное подтверждение: аудит релиза 2026-08-04.

На текущем срезе claim-to-evidence слой показывает связанные DISARM-сигналы как наблюдаемые утверждения с trust-tier, источником и числом подтверждений; это не автоматический вердикт истины. Оставшиеся benchmark-задачи – reviewed corpus, recommendation queue и acknowledgement-контракт – отмечены как незавершённые в рабочем плане.

Настройка окружения

  1. Убедитесь, что установлены Python 3.11 и Node.js 18 или новее, затем создайте и активируйте виртуальное окружение. bash python3 -m venv .venv source .venv/bin/activate В Windows используйте python -m venv .venv, затем .venv\Scripts\activate.
  2. Установите зависимости Python. Можно воспользоваться скриптом setup-dev.sh или выполнить команды вручную. bash ./setup-dev.sh # или вручную: pip install --upgrade pip pip install -r requirements.txt -r requirements-dev.txt На macOS с процессорами Apple Silicon дополнительно установите библиотеки через Homebrew: brew install libmagic cairo pango gdk-pixbuf libffi go. В Windows для библиотеки python-magic потребуется пакет python-magic-bin, а в Debian/Ubuntu выполните sudo apt-get install libmagic1. Скрипт устанавливает только зависимости Python; пакеты Node описаны в следующем шаге.
  3. Установите зависимости Node и соберите фронтенд, чтобы каталог static/dist существовал перед запуском Flask. bash npm ci npm run build При разработке можно запустить npm run dev в отдельном терминале для горячей перезагрузки.
  4. Скопируйте .env.example в .env и заполните переменные SECRET_KEY и APP_ENV. Пример содержимого файла:

dotenv MAIL_SERVER=smtp.example.com MAIL_PORT=587 MAIL_USERNAME=your_user MAIL_PASSWORD=your_password MAIL_USE_TLS=true ALERT_EMAIL_TO=alerts@example.com ALERT_EMAIL_FROM=monitor@example.com REMINDER_RECIPIENTS=user1@example.com,user2@example.com TELEGRAM_TOKEN=bot_token HEALTH_CHECK_INTERVAL=60 EXTERNAL_API_URL=https://example.com/data WEATHER_API_KEY=your_weather_api_key ALERTS_ENABLED=true

При использовании config.ProductionConfig переменные MAIL_USERNAME, MAIL_PASSWORD, ALERT_EMAIL_TO и ALERT_EMAIL_FROM получают безопасные значения по умолчанию. Для боевого режима рекомендуется задать их явно, чтобы включить отправку почты.

Переменные MAIL_SERVER, MAIL_PORT, MAIL_USERNAME и MAIL_PASSWORD задают параметры почтового сервера для оповещений. В ALERT_EMAIL_TO указывается получатель, а ALERT_EMAIL_FROM определяет отправителя. Адреса в REMINDER_RECIPIENTS перечисляются через запятую для ежедневных напоминаний. Значение TELEGRAM_TOKEN позволяет получать уведомления в Telegram. Переменная WEATHER_API_KEY включает получение данных о погоде в сервисе контекста.

Переменная APP_ENV выбирает профиль конфигурации (development или production).

Тестирование

Перед запуском тестов установите зависимости:

pip install -r requirements.txt
pip install -r requirements-dev.txt

Для запуска тестов используйте:

pytest

Покрытие измеряется командой make coverage по пакетам app, services и utils. Текущий локальный проверяемый floor равен 60 %; обычный pytest не создаёт coverage-артефакты. make coverage повторяет CI-контур без tests/e2e, а make coverage-full запускает полный локальный замер вместе с e2e.

Pre-commit

Хуки pre-commit помогают автоматически форматировать код и запускать линтеры. Установите и инициализируйте их командой:

pip install pre-commit
pre-commit install

Хуки запускают Ruff, стабильную mypy-границу, тесты pytest и проверку миграций.

Чтобы проверить конкретные файлы, используйте ключ --files:

pre-commit run --files README_ru.md docs/overview_ru.md

Шаблоны тикетов

Сохранённые шаблоны ускоряют создание повторяющихся инцидентов. Управлять ими можно на странице /templates. При добавлении тикета выберите нужный шаблон или передайте параметр template_id, чтобы форма заполнилась автоматически.

Выбор нескольких инцидентов

В таблице можно отметить несколько строк галочками. После выбора становятся активны кнопки «Сравнить» и «Экспортировать». Они открывают страницу сравнения или сохраняют выбранные записи в CSV‑файл. Массовое изменение или удаление тикетов сейчас не поддерживается.

Страница сравнения выводит таблицу с ID, названием и статусом каждого отмеченного тикета, чтобы быстро увидеть различия.

Администраторы могут просматривать подробный журнал действий на странице /admin/audit_log. Здесь отображаются старые и новые значения при изменении статусов, назначении ответственных и других операций.

Буфер ссылок

Страница /buffer позволяет временно сохранять внешние ссылки перед созданием тикета. У каждой записи отображается время добавления и миниатюрный предпросмотр страницы, чтобы оценить содержание, не переходя по ссылке. Нажмите «Создать тикет» рядом с нужной строкой, чтобы открыть форму создания с уже заполненными полями URL и описания. Если страница содержит OpenGraph-метаданные, приложение автоматически подставит описание и изображение в буфер при сохранении ссылки. Ошибки сети не мешают добавлению записи.

Сохранённые наборы фильтров

На странице списка тикетов можно сохранить текущий поисковый запрос. Нажмите «Сохранить поиск» после выбора нужных параметров – фильтр сохранится в разделе Избранное. Там же его можно переименовать и открыть одним кликом. Наборы фильтров привязываются к пользователю, поэтому каждый участник команды может вести собственный список часто используемых запросов.

Правила эскалации

Администраторы могут задавать автоматические правила на странице /admin/escalation_rules. Каждое правило содержит объект conditions и список actions. Условия позволяют выбрать подходящие тикеты. Поддерживаются ключи:

  • status_name – имя статуса тикета.
  • risk_name – уровень риска.
  • hours_since_update – сколько часов прошло с момента последнего изменения.

Поддерживаются два действия:

  • "telegram" – отправить сообщение в канал уведомлений.
  • "notify_team" – уведомить участников назначенной команды.

Пример правила:

{
  "conditions": {
    "status_name": "В работе",
    "risk_name": "Высокий",
    "hours_since_update": 48
  },
  "actions": ["telegram"]
}

Правила можно включать и отключать через интерфейс. Каждые пять минут планировщик проверяет их и заносит совпадения в таблицу EscalationLog.

При сохранении система ищет другое активное правило с теми же conditions. Если оно найдено, но список actions отличается, пользователю выводится предупреждение, чтобы избежать противоречивых действий.

Рекомендуемые задания cron

При развёртывании с APP_ENV=production добавьте следующие записи в cron, чтобы регулярно выполнять служебные операции:

0 2 * * * python scripts/backup.py
15 2 * * * flask --app app:create_app shell -c 'from utils.cleanup_utils import cleanup_old_files; cleanup_old_files()'
30 2 * * * python run.py --run-reminders

Мониторинг угроз

В комплект поставки входит вспомогательный класс ThreatMonitor (services/threat_monitor.py), пересчитывающий поле threat_level для открытых тикетов. Он учитывает количество заметок и поиск по ключевым словам в описании и текстах заметок. При резком росте балла выше порога сервис публикует событие threat_spike в поток SSE, чтобы панели могли отреагировать.【F:services/threat_monitor.py†L13-L68】

ARQ cron job cron_threat_scan в services/worker.py вызывает threat_monitor.update_threat_levels() каждую минуту. Это поддерживает актуальные уровни угроз без отдельного воркера. При необходимости пересчитать оценки вручную можно выполнить:

python cli.py cron-threat-scan

Фоновые операции

Тот же планировщик выполняет несколько служебных заданий в режиме разработки:

  • Резервное копирование: BackupService.create_backup() архивирует базу данных и каталог вложений с периодичностью, заданной BACKUP_INTERVAL_HOURS.【F:app/init.py†L381-L438】【F:services/backup_service.py†L27-L95】
  • Очистка файлов и undo: cleanup_old_files() удаляет устаревшие логи и временные файлы, а cleanup_expired_undo_actions() убирает просроченные записи отката.【F:app/init.py†L385-L392】【F:utils/cleanup_utils.py†L36-L45】【F:utils/undo_utils.py†L20-L60】
  • Метрики по тикетам: flush_ticket_metrics() отправляет количество созданных тикетов на METRICS_URL.【F:app/init.py†L393-L395】【F:utils/metrics.py†L9-L43】
  • Проверка внешнего API: check_external_api() фиксирует число новых элементов, полученных по EXTERNAL_API_URL.【F:app/init.py†L397-L400】【F:utils/external_api.py†L12-L43】
  • Контроль SLA: check_overdue_tickets() публикует события sla_breached для просроченных задач, а escalate_overdue_tickets() предупреждает о тикетах без активности перед дедлайном.【F:app/init.py†L401-L468】【F:services/ticket_service.py†L1430-L1495】
  • Правила эскалации: активные правила переоцениваются services.escalation_service.check_and_escalate() каждые пять минут.【F:app/init.py†L427-L472】【F:services/escalation_service.py†L13-L114】
  • Напоминания о дедлайнах: send_deadline_reminders() отправляет письма и сообщения о приближающихся сроках и записывает факты рассылки, чтобы избежать дублей.【F:app/init.py†L419-L482】【F:utils/reminders.py†L93-L147】
  • Ночная архивация: archive_old_tickets() переносит старые тикеты в архив по расписанию в полночь по UTC.【F:app/init.py†L423-L489】【F:utils/archive_utils.py†L9-L34】

Дополнительно MonitoringScheduler работает в отдельном потоке: он выполняет регулярные проверки базы, публикует события health_check_failed и рассылает почтовые уведомления при сбоях.【F:app/init.py†L493-L495】【F:utils/monitoring.py†L16-L102】