Обзор проекта
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-контракт – отмечены как незавершённые в рабочем плане.
Настройка окружения
- Убедитесь, что установлены Python 3.11 и Node.js 18 или новее, затем создайте и активируйте виртуальное окружение.
bash python3 -m venv .venv source .venv/bin/activateВ Windows используйтеpython -m venv .venv, затем.venv\Scripts\activate. - Установите зависимости 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 описаны в следующем шаге. - Установите зависимости Node и соберите фронтенд, чтобы каталог
static/distсуществовал перед запуском Flask.bash npm ci npm run buildПри разработке можно запуститьnpm run devв отдельном терминале для горячей перезагрузки. - Скопируйте
.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】