Обзор продукта
Что такое DBWatch PRO и для кого он создан
DBWatch PRO — self-hosted система мониторинга PostgreSQL для команд любого размера. Health Score, анализ запросов, метрики в реальном времени, планирование ресурсов — всё в одном инструменте.
Продукт разработан для DBA, DevOps-инженеров и SRE, которым нужен полный контроль над PostgreSQL-базами данных без зависимости от облачных SaaS-решений. Один Docker-контейнер — и вы получаете профессиональный мониторинг за минуты.
Health Score
Интегральная оценка 0–100 по 7 факторам: CPU, RAM, Disk, Connections, Cache hit ratio, Deadlocks, Slow queries. Доступно на всех тарифах.
Реал-тайм метрики
CPU, RAM, диск, подключения, cache hit ratio с WebSocket live-обновлениями каждые 2 секунды. История до 90 дней.
Анализ запросов
Топ медленных запросов из pg_stat_statements, EXPLAIN-планы, Index Advisor с рекомендациями CREATE INDEX.
Сессии & Блокировки
Connection Breakdown (Standard), Lock Tree blocker→waiters, Wait Events, история состояний 48ч, Idle-in-tx badge.
Анализ Bloat
Раздутие таблиц и индексов из-за MVCC. Severity badge ok/warning/critical, history chart 90 дней, VACUUM-рекомендации.
Capacity Planning
Прогноз загрузки CPU, RAM, диска и соединений с оценкой «дней до заполнения».
Multi-Server
Управление несколькими PostgreSQL-серверами из одного интерфейса. Standard — 1 сервер, Professional — без ограничений.
Алерты
Настраиваемые пороги с уведомлениями через Email, Webhook, Slack. Дебаунс и дедупликация из коробки.
PDF Отчёты
Health Report на любой период — сводка по метрикам, топ запросов, алерты. Экспорт в один клик.
Command Palette
Глобальный поиск Cmd+K / Ctrl+K. Быстрая навигация по всем разделам с клавиатуры.
Архитектура
DBWatch PRO — all-in-one Docker-образ со встроенным Nginx, FastAPI backend и агентом сбора метрик. Все данные хранятся локально.
Браузер → :8080 → Nginx
├── /assets/ → статика (React SPA)
├── /api/ → FastAPI backend
├── /ws/ → WebSocket (live метрики)
└── / → SPA routing
Внутри контейнера:
Supervisor
├── nginx (reverse proxy + static)
├── backend (FastAPI, порт 8000)
└── agent (сборщик метрик, каждые 60 сек)
Данные:
├── SQLite (metrics.db) — метрики, алерты, инстансы
└── PostgreSQL — pg_stat_statements, query_stats_history
Стек технологий
| Компонент | Технологии |
|---|---|
| Backend | Python 3.11, FastAPI 0.115, SQLAlchemy 2.0, psycopg 3.2, psutil, PyJWT |
| Frontend | React 19, Vite 7, Tailwind CSS 3, Recharts 3, SWR 2, Lucide React |
| Инфраструктура | Docker, Nginx, Supervisor, PostgreSQL 16 |
Системные требования
Минимальные требования для развёртывания DBWatch PRO
| Требование | Минимум | Рекомендуется |
|---|---|---|
| Docker Engine | 20.10+ | 24.0+ |
| Docker Compose | v2 | v2.20+ |
| RAM | 512 MB | 1 GB+ |
| CPU | 1 vCPU | 2 vCPU |
| Дисковое пространство | 500 MB | 2 GB+ (для истории метрик) |
| PostgreSQL | 12+ | 16–17 |
Для анализа запросов необходимо расширение pg_stat_statements на мониторируемом PostgreSQL-сервере. Без него остальной мониторинг работает в полном объёме.
Поддерживаемые ОС
DBWatch PRO работает на любой системе с Docker: Linux (Ubuntu, Debian, CentOS, RHEL), macOS, Windows (через WSL2/Docker Desktop). Рекомендуется Linux в production.
Сетевые требования
- Порт 8080 — веб-интерфейс DBWatch PRO (единственный внешний порт)
- Доступ к PostgreSQL-серверу по сети (порт 5432 по умолчанию)
Быстрая установка
Установка DBWatch PRO за 2 минуты
Автоустановка (рекомендуется)
Самый быстрый способ — использовать скрипт автоустановки. Он проверит зависимости, запросит параметры подключения к PostgreSQL, лицензионный ключ и порт — и запустит всё автоматически.
curl -fsSL https://dbwatch.ru/install.sh | sudo bash
Ручная настройка Docker Compose
Если вы хотите настроить конфигурацию вручную — сначала запустите install.sh. Скрипт создаст docker-compose.yml и .env в папке /opt/dbwatch, которые можно отредактировать после установки.
Пример структуры docker-compose.yml:
# /opt/dbwatch/docker-compose.yml
services:
dbwatch:
image: ghcr.io/leg1onary/dbwatch-pro:latest
ports:
- "8080:8080"
env_file: .env
volumes:
- dbwatch-data:/app/data
restart: unless-stopped
volumes:
dbwatch-data:
Docker-образ распространяется через приватный реестр. Скрипт install.sh автоматически авторизуется в реестре — ручная авторизация не требуется.
Замените PG_DSN на реальную строку подключения к вашему PostgreSQL-серверу. Пустой LICENSE_KEY активирует бесплатный тариф Standard (1 сервер бесплатно навсегда).
Первая настройка
Что делать после установки
1. Откройте веб-интерфейс
Перейдите по адресу http://your-host:8080. Если вы установили на локальную машину — http://localhost:8080.
2. Проверьте подключение к PostgreSQL
На странице Overview вы увидите основные метрики базы данных. Если данные отображаются — подключение успешно. Если нет — проверьте PG_DSN в настройках.
3. Настройте API-ключ
Для production-окружения обязательно задайте переменную DBWATCH_API_KEY для защиты API от неавторизованного доступа.
environment:
PG_DSN: "postgresql://user:password@host:5432/dbname"
DBWATCH_API_KEY: "your-secure-api-key-here"
4. Настройте уведомления
Перейдите в Settings → Уведомления или укажите переменные окружения для отправки алертов. Подробнее — в разделе Уведомления.
5. Проверьте pg_stat_statements
На странице Settings в блоке PG Extensions проверьте, что расширение pg_stat_statements установлено. Без него раздел «Запросы» будет недоступен.
6. Включите Premium (опционально)
Если у вас есть лицензионный ключ, введите его в Settings → License прямо в UI — без перезапуска контейнера. Premium активирует: Multi-Server (до 50 серверов), EXPLAIN-планы, Index Advisor, Sessions drill-down, Lock Tree, Bloat history, PDF-отчёты, Slack-алерты, история 90 дней. Health Score доступен на всех тарифах включая Standard.
Обновление
Как обновить DBWatch PRO до последней версии
Через install.sh (рекомендуется)
Самый простой способ — перезапустите скрипт установки. Он скачает новый образ, сохранит настройки и перезапустит контейнер:
curl -fsSL https://dbwatch.ru/install.sh | sudo bash
Данные метрик хранятся в Docker volume (dbwatch-data) и не теряются при обновлении. Миграции SQLite применяются автоматически при запуске backend.
Дашборд (Overview)
Обзор состояния базы данных на одном экране
Live Metrics Banner NEW v0.20.0
Верхняя панель Overview показывает метрики в реальном времени через WebSocket-соединение:
- LIVE-индикатор — пульсирующий зелёный маркер + время последнего фрейма
- CPU / RAM / Connections — текущее значение + мини-sparkline за последние 2 минуты
- TPS — транзакций в секунду в реальном времени
- Авто-реконнект — при обрыве соединения переподключается автоматически
WebSocket endpoint: wss://your-host:8080/ws/metrics. Обновление каждые 2 секунды.
Страница Overview — главный дашборд DBWatch PRO. Здесь отображается общее состояние вашего PostgreSQL-сервера: ключевые метрики, Health Score, количество активных соединений и последние алерты.
Health Score
Интегральная оценка сервера
Health Score учитывает 7 факторов: CPU, RAM, Disk, Connections, Cache hit ratio, Deadlocks и Slow queries. Статусы: OK (≥80), Warning (60–79), Critical (<60).
Метрики на дашборде
- CPU % — текущая загрузка процессора хоста
- RAM % — использование оперативной памяти
- Disk % — занятость диска
- Active Connections — количество активных подключений / max_connections
- Cache Hit Ratio — процент попаданий в кеш PostgreSQL
- QPS — количество запросов в секунду (commits/sec)
- Deadlocks — текущее число дедлоков
Данные обновляются в реальном времени через WebSocket (push каждые 2 секунды). При Premium активирована панель All Instances Health — карточки всех серверов с индивидуальным Health Score.
Интерфейс
- Тёмная и светлая тема — дизайн-система «Obsidian Pulse»
- Полная локализация — русский и английский (686 ключей)
- Адаптивная вёрстка — desktop, tablet, mobile
- Skeleton-загрузки — плавное отображение при загрузке данных
Анализ запросов
pg_stat_statements, медленные запросы, EXPLAIN и Index Advisor
Страница Queries предоставляет полный инструментарий для анализа SQL-запросов вашей базы данных. Данные берутся из расширения pg_stat_statements.
Топ медленных запросов
Таблица показывает медленные запросы с фильтрацией, сортировкой и поиском. Для каждого запроса доступны:
- query — текст SQL-запроса
- calls — количество вызовов
- total_time / avg_time — суммарное и среднее время выполнения
- rows — количество возвращённых строк
- hit_ratio — процент попаданий в буфер
- Severity badges — визуальные индикаторы критичности
Таблица виртуализирована для производительности при 200+ запросах. Через QueryModal можно просмотреть полный SQL с возможностью копирования.
EXPLAIN-планы
Функция доступна в тарифах Professional и Enterprise.
Кнопка EXPLAIN на странице Queries позволяет получить план выполнения запроса. Поддерживаются параметризованные запросы через PREPARE/EXPLAIN EXECUTE. Результат отображается в ExplainModal с monospace-форматированием.
Index Advisor
Функция доступна в тарифах Professional и Enterprise.
Index Advisor анализирует запросы и индексы, выдавая два типа рекомендаций:
- Missing Index Candidates — запросы, которым не хватает индексов. Анализ pg_stat_statements + pg_index, парсинг FROM/WHERE для определения нужных колонок
- Unused Index Detection — неиспользуемые индексы (idx_scan = 0, size > 8 MB)
Для каждой рекомендации указана severity (high/medium/low) и генерируется готовый SQL:
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_orders_user_id
ON public.orders (user_id);
Доступны 3 пресета агрессивности: Conservative, Balanced и Aggressive.
История запросов
DBWatch PRO сохраняет снапшоты из pg_stat_statements (топ-100 по total_exec_time), что позволяет отслеживать изменения производительности запросов во времени. Срок хранения настраивается через QUERY_HISTORY_TTL_DAYS (по умолчанию 90 дней).
Query Trends NEW v0.20.0
При клике на любой запрос в списке — над EXPLAIN-планом появляется мини-график тренда:
- Avg time (ms) по дням — визуализация деградации или улучшения запроса
- Диапазон: 1 / 3 / 7 / 14 дней
- Помогает быстро понять: запрос деградировал после деплоя или нарастающий тренд?
/api/queries/trend?query_id=&days=7
Метрики
Реал-тайм мониторинг CPU, RAM, диска и подключений
Страница Metrics показывает детальные графики метрик сервера с возможностью выбора временного диапазона.
Системные метрики
- CPU % — загрузка процессора (psutil)
- RAM % — использование оперативной памяти
- Disk Used % — занятость диска
PostgreSQL-метрики
- Active Connections — активные подключения к БД
- Max Connections — лимит подключений
- Commits/sec (QPS) — количество коммитов в секунду
- Rollbacks — количество откатов
- Cache Hit Ratio — эффективность использования кеша
- Deadlocks — дедлоки
- Active Queries — активные запросы
Временные диапазоны
| Тариф | Доступные диапазоны |
|---|---|
| Standard | 15 минут, 1 час, 4 часа |
| Professional / Enterprise | 15 минут, 1 час, 4 часа, 24 часа, 7 дней, 30 дней |
WebSocket live-обновления
Метрики в реальном времени передаются через WebSocket /ws/live с интервалом push каждые 2 секунды. Данные включают текущие PG-метрики и системные показатели.
Хранение истории
Метрики сохраняются в SQLite (metrics.db) с TTL 30 дней. Агент собирает данные каждые 60 секунд (настраивается через COLLECT_INTERVAL, диапазон 5–3600 сек).
Планирование ресурсов
Прогнозирование загрузки и оценка «дней до заполнения»
Страница Capacity предоставляет прогнозы по ключевым ресурсам на основе линейного тренда.
Отслеживаемые ресурсы
- CPU — тренд %/день, headroom, прогноз дней до критического порога
- RAM — аналогично CPU
- Disk Space — использование по tablespace'ам, линейный прогноз заполнения
- Connections — прогноз достижения лимита подключений
Disk Space Monitoring
Мониторинг дискового пространства включает:
- Текущий процент использования диска
- Размеры по tablespace'ам (pg_default, pg_global и пользовательские)
- Топ таблиц по размеру
- Размеры баз данных
- Прогноз days_until_full — линейный тренд за 7 дней методом наименьших квадратов (минимум 3 точки)
Графики отображают пороговые линии (warning и critical), что позволяет визуально оценить приближение к лимитам.
Если тренд нулевой или отрицательный (slope ≤ 0), прогноз days_until_full недоступен (null). Для расчёта необходимы минимум 3 точки данных за 7 дней.
Мониторинг сессий
Новое в v0.18.0 — полный контроль над соединениями PostgreSQL
Обзор
Страница /sessions показывает все активные соединения к PostgreSQL в реальном времени. Доступна в Standard и Premium тарифах с разным уровнем детализации.
Standard
- Таблица сессий: PID, user, database, application_name, state, duration
- Фильтр по состоянию (active / idle / idle in transaction / aborted)
- Без текста SQL-запросов и без графиков
Premium
- Donut chart — визуальная разбивка по состояниям + progress bar занятости connection pool (total / max_connections)
- Quick Stats — цветные счётчики по каждому состоянию
- Drill-down — клик по строке раскрывает:
client_addr,backend_type,wait_event_type,wait_event,query_start,xact_start, полный текст SQL - Wait Events — агрегация текущих wait events по типу: IO, Lock, LWLock, Client и др.
- История — stacked area chart состояний + bar chart wait event types, диапазон 1 / 3 / 6 / 12 / 24 / 48 часов
API эндпоинты
/api/sessions
/api/sessions/wait-events
/api/sessions/history?hours=24
idle in transaction — сигнал незакрытых транзакций. Drill-down поможет найти виновный запрос.
Lock Tree Premium · NEW v0.19.0
Секция под историей сессий. Визуализирует цепочки блокировок в реальном времени — кто кого блокирует и почему.
- Дерево blocker → waiters — красные карточки для блокирующих процессов, жёлтые для ожидающих
- Узел содержит: PID, user/db, lock_mode badge, duration
- Drill-down по клику: lock_type, relation, wait_event, application_name, полный текст SQL
- Пустое состояние: No blocking queries с зелёным индикатором + кол-во системных блокировок
- Авторефреш каждые 10 секунд — не нужно обновлять страницу вручную
/api/sessions/locks
/api/sessions/breakdown
Connection Breakdown Standard · NEW v0.19.1
Секция доступна всем тарифам включая Standard. Показывает детализацию соединений без Premium gate.
- Pool utilization bar — прогресс бар занятости пула; цвет: зелёный → жёлтый при >60% → красный при >80%
- State Donut — donut chart с легендой по состояниям (active / idle / idle in tx / aborted)
- By User / By Database / By Application — горизонтальные bar charts top-10, ширина пропорциональна максимуму в группе
- Авторефреш каждые 15 секунд
Idle-in-Transaction Badge NEW v0.19.1
Индикатор в заголовке страницы Sessions — сразу видно есть ли зависшие транзакции:
- Жёлтый при 1–2 сессиях: показывает кол-во и максимальную duration, например
1 idle in tx (max 42s) - Красный при 3+ сессиях: сигнал критической ситуации
- Пропадает автоматически когда таких сессий нет
Анализ Bloat
Новое в v0.19.0 — мониторинг раздутия таблиц и индексов PostgreSQL
Обзор
Страница /bloat показывает накопленный bloat в таблицах и индексах. Bloat возникает из-за MVCC — удалённые и обновлённые строки остаются на диске до VACUUM. Большой bloat замедляет запросы и раздувает диск.
Summary Cards
- Total bloat таблиц (MB)
- Total bloat индексов (MB)
- Количество таблиц с bloat
- Количество индексов с bloat
Таблицы и индексы
Две таблицы с сортировкой по любому столбцу (кликабельные заголовки):
- Progress bar для bloat%
- Severity badge:
ok(<20%),warning(20–50%),critical(>50%) - Столбцы: schema, table/index, size, bloat size, bloat%, last vacuum
История
Stacked area chart — тренд bloat в MB за 7 / 14 / 30 / 90 дней. Помогает увидеть когда bloat начал расти и коррелировать с деплоями или нагрузкой.
API эндпоинты
/api/bloat/tables
/api/bloat/indexes
/api/bloat/history?days=30
VACUUM ANALYZE table_name. Если >50% — рассмотри VACUUM FULL в окно обслуживания (блокирует таблицу).
Обслуживание
VACUUM, реплики, блокировки и dead tuples
VACUUM мониторинг
DBWatch PRO отслеживает статистику autovacuum:
- Dead tuples — количество мёртвых строк по таблицам
- Autovacuum статистика — время и частота запусков
- Рекомендации — при накоплении dead tuples или пропуске autovacuum
Replication мониторинг
- Статус реплик — streaming, catchup, потенциальные проблемы
- Replication Lag — отставание реплик по WAL-позициям
- WAL-позиции — текущие позиции мастера и реплик
Управление блокировками
- Активные блокировки — текущие lock'и в системе
- Ожидающие процессы — запросы, заблокированные другими
Multi-Server мониторинг
Управление несколькими PostgreSQL-серверами из одного интерфейса
Multi-Server доступен в тарифах Professional и Enterprise. В Standard — мониторинг только 1 сервера.
Возможности
- CRUD инстансов — создание, редактирование, удаление и включение/выключение серверов
- Тест подключения — проверка DSN перед добавлением сервера
- Instance Selector — переключатель серверов, доступный на всех страницах
- Per-instance данные — метрики, алерты, запросы, disk space фильтруются по instance_id
- Health Score per instance — оценка здоровья для каждого сервера
Агент и сбор данных
Агент каждые 60 секунд обновляет список инстансов через GET /api/premium/instances и собирает метрики для каждого enabled-инстанса: PG-метрики, системные показатели, tablespace usage и снапшоты запросов. Все данные сохраняются с привязкой к instance_id.
Лимит серверов
Количество серверов ограничено лицензией (max_servers в JWT-токене). При попытке превысить лимит — HTTP 400.
Алерты
Настраиваемые уведомления о проблемах
Система алертов мониторит ключевые показатели и отправляет уведомления при превышении порогов.
Типы алертов
| Тип | Severity | Условие по умолчанию |
|---|---|---|
| CPU Critical | Critical | CPU ≥ 90% на протяжении 3 итераций |
| CPU Warning | Warning | CPU ≥ 75% |
| RAM Critical | Critical | RAM ≥ 90% |
| RAM Warning | Warning | RAM ≥ 80% |
| Disk Critical | Critical | Disk ≥ 95% |
| Disk Warning | Warning | Disk ≥ 85% |
| Connections High | Critical / Warning | ≥ max_connections / ≥ 500 |
| Hit Ratio Critical | Critical | Hit Ratio < 95% |
| Hit Ratio Warning | Warning | Hit Ratio < 98% |
| Deadlocks | Critical | Deadlocks ≥ 1 |
| Slow Query | Warning | avg_time ≥ 2000 ms AND calls ≥ 10 |
Каналы уведомлений
- Email (SMTP) — отправка алертов на email через настроенный SMTP-сервер
- Email/Webhook — уведомления через Email и Webhook (Standard и выше)
- Slack — отправка в каналы Slack (Professional и выше)
- Webhook — HTTP POST на произвольный URL (Professional и выше)
Дебаунс и дедупликация
- CPU debounce — CPU critical алерт срабатывает только после N последовательных превышений (
cpu_critical_streak, по умолчанию 3) - Дедупликация — алерт сохраняется в SQLite один раз, пока его ID присутствует в активных
- Acknowledge — подтверждение алертов через UI или API
- История — хранение истории алертов с настраиваемым TTL (по умолчанию 7 дней)
Экспорт данных
Выгрузка метрик и отчётов в CSV и Excel
DBWatch PRO позволяет экспортировать данные мониторинга для дальнейшего анализа или архивирования.
Форматы экспорта
- CSV — универсальный формат для импорта в любые аналитические инструменты
- Excel (.xlsx) — для работы в Microsoft Excel или Google Sheets
Что можно экспортировать
- Историю метрик за выбранный период
- Список медленных запросов с статистикой
- Историю алертов
- Рекомендации Index Advisor
PDF Отчёты
Генерация отчётов о состоянии базы данных
DBWatch PRO генерирует PDF-отчёты с полной информацией о состоянии базы данных — для передачи руководству, аудита или архивирования.
Содержание отчёта
- Health Score и его составляющие
- Графики ключевых метрик за выбранный период
- Топ медленных запросов
- Рекомендации Index Advisor
- Активные алерты и их история
- Информация о дисковом пространстве и прогнозы
PDF-отчёты удобны для регулярных ревью состояния инфраструктуры. Генерируйте их еженедельно или перед крупными релизами.
Docker Compose конфигурация
Полная конфигурация для production и разработки
Production (all-in-one образ)
Этот docker-compose.yml создаётся автоматически скриптом install.sh. Приведён для справки:
services:
dbwatch:
image: ghcr.io/leg1onary/dbwatch-pro:latest
ports:
- "8080:8080"
environment:
PG_DSN: "postgresql://user:password@host:5432/dbname"
LICENSE_KEY: ""
DBWATCH_API_KEY: "your-secure-key"
COLLECT_INTERVAL: "60"
volumes:
- dbwatch-data:/app/data
restart: unless-stopped
healthcheck:
test: curl -f http://localhost:8080/health
interval: 10s
timeout: 5s
retries: 3
start_period: 15s
volumes:
dbwatch-data:
Порты
| Порт | Сервис | Назначение |
|---|---|---|
8080 | DBWatch PRO | Единственный внешний порт — UI + API |
Внутренние сервисы (бэкенд, агент) не экспонируются на хост. Весь трафик проходит через порт 8080.
Переменные окружения
Полный справочник переменных для настройки DBWatch PRO
Основные переменные
| Переменная | По умолчанию | Обязательная | Описание |
|---|---|---|---|
PG_DSN | — | Да | DSN основного PostgreSQL |
DBWATCH_API_KEY | пусто | Нет * | X-API-Key для аутентификации. В production обязательно задать. |
LICENSE_KEY | пусто | Нет | JWT RS256 лицензия Premium. Пустой = Standard. |
DBWATCH_PORT | 8080 | Нет | Порт веб-интерфейса |
COLLECT_INTERVAL | 60 | Нет | Интервал сбора метрик (5–3600 сек) |
Email/Webhook и уведомления
| Переменная | По умолчанию | Описание |
|---|---|---|
WEBHOOK_URL | — | URL для Webhook-уведомлений |
TELEGRAM_CHAT_ID | — | ID чата для уведомлений |
Хранение данных
| Переменная | По умолчанию | Описание |
|---|---|---|
DATABASE_URL | sqlite:///./metrics.db | SQLite DSN для метрик |
DBWATCH_DATA_DIR | /app/data | Директория данных |
USE_SEPARATE_STATS_DB | false | Отдельная PG-БД для query_stats |
PG_DSN_STATS | = PG_DSN | DSN отдельной stats-БД |
QUERY_HISTORY_TTL_DAYS | 90 | Срок хранения истории запросов (дни) |
Пороги алертов (настраиваются в Settings UI)
| Переменная / поле | По умолчанию | Описание |
|---|---|---|
| Disk Warning | 70% | Предупреждение о заполнении диска |
| Disk Critical | 90% | Критическое заполнение диска |
| Deadlocks Critical | 5/мин | Порог критических дедлоков |
| Idle In Transaction Timeout | 300s | Порог для idle in transaction сессий (из v0.19.1) |
Прочие
| Переменная | По умолчанию | Описание |
|---|---|---|
BACKEND_URL | http://backend:8000 | URL backend для агента |
Настройка pg_stat_statements
Как включить расширение для анализа запросов
Расширение pg_stat_statements необходимо для работы раздела «Анализ запросов». Без него остальной мониторинг (метрики, алерты, capacity planning) работает в полном объёме.
Шаг 1: Добавьте в postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
Шаг 2: Перезапустите PostgreSQL
sudo systemctl restart postgresql
Шаг 3: Создайте расширение
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
Проверка
В DBWatch PRO перейдите в Settings → PG Extensions. Расширение pg_stat_statements должно показывать статус ✓.
Для Docker-контейнеров PostgreSQL расширение обычно уже включено. Достаточно выполнить CREATE EXTENSION.
Настройка уведомлений
Email и Webhook
Уведомления
Наиболее простой способ получать алерты. Доступен во всех тарифах.
Настройка через UI
- Создайте бота через @BotFather
- Получите токен бота и ID чата
- В DBWatch PRO: Settings → Уведомления
- Введите токен и Chat ID
- Нажмите «Send test notification» для проверки
Настройка через переменные окружения
TELEGRAM_TOKEN=your_bot_token
TELEGRAM_CHAT_ID=your_chat_id
Email (SMTP)
Настройте SMTP-сервер для отправки email-уведомлений в разделе Settings → Email. Укажите хост, порт, учётные данные и адреса получателей.
Slack
Slack-уведомления доступны начиная с тарифа Professional.
Для интеграции со Slack создайте Incoming Webhook в настройках вашего workspace и укажите URL в настройках DBWatch PRO.
Webhook
Webhook доступен начиная с тарифа Professional.
Webhook отправляет HTTP POST на указанный URL при каждом новом алерте. Тело запроса содержит JSON с информацией об алерте: тип, severity, сообщение и timestamp.
Настройка порогов
Пороги всех алертов настраиваются через Settings → Alert Thresholds или через API POST /api/settings/thresholds.
| Параметр | По умолчанию | Описание |
|---|---|---|
cpu_critical | 90 | CPU критический (%) |
cpu_warning | 75 | CPU предупреждение (%) |
cpu_critical_streak | 3 | Число итераций для дебаунса |
ram_critical | 90 | RAM критический (%) |
ram_warning | 80 | RAM предупреждение (%) |
disk_critical | 95 | Диск критический (%) |
disk_warning | 85 | Диск предупреждение (%) |
slow_query_ms | 2000 | Порог медленного запроса (ms) |
connections_threshold | 500 | Порог соединений |
deadlocks_critical | 1 | Порог дедлоков |
hit_ratio_warning | 98.0 | Hit Ratio предупреждение (%) |
hit_ratio_critical | 95.0 | Hit Ratio критический (%) |
Тарифы и лицензирование
Standard, Professional и Enterprise
Standard
- ✓ 1 сервер
- ✓ Health Score, метрики, алерты
- ✓ Email/Webhook-уведомления
- ✓ Медленные запросы (список)
- ✓ История 7 дней
- ✓ Сессии (Connection Breakdown, список)
- — EXPLAIN, Index Advisor
- — Capacity, VACUUM, Репликация
- — Slack алерты, Sessions drill-down, Bloat history
Professional
- ✓ Без ограничений серверов
- ✓ Всё из Standard
- ✓ EXPLAIN-планы, Index Advisor
- ✓ Capacity Planning, VACUUM, Репликация
- ✓ Multi-Server Dashboard
- ✓ CSV-экспорт, PDF-отчёты
- ✓ Email, Webhook, Slack алерты
- ✓ История 90 дней
Enterprise
- ✓ Всё из Professional
- ✓ История 365 дней
- ✓ SSO/LDAP
- ✓ White-label
- ✓ Полный API-доступ
- ✓ Персональный менеджер, SLA
14 дней без привязки карты. Скидки: от 10 серверов −10%, от 50 серверов −20%.
Активация лицензии
Лицензия активируется через переменную окружения LICENSE_KEY:
LICENSE_KEY=eyJhbGciOiJSUzI1NiIs...
Механизм лицензирования
Лицензия — JWT-токен с подписью RS256. Публичный RSA-ключ вшит в Docker-образ. Проверяются: подпись, issuer (dbwatch-pro), audience (dbwatch-pro-self-hosted), срок действия, tier и max_servers.
UX-граница Standard / Premium
Standard не выглядит как урезанный продукт. Premium-функции обозначены аккуратно:
- Кнопки EXPLAIN — серые с подсказкой «Available in Premium»
- Extended history — кнопки видны, но неактивны с tooltip
- Instance Selector — отображается как «Local / Standard» pill
- Health Score — доступен на всех тарифах
API Reference
40 REST-эндпоинтов + WebSocket. Версия 0.20.1
Аутентификация
Опциональная аутентификация по заголовку X-API-Key:
- Задаётся через переменную окружения
DBWATCH_API_KEY - Если не задана — аутентификация отключена
- При несовпадении → HTTP 403
GET /healthвсегда доступен без ключа
Формат ошибок
{
"detail": "Описание ошибки",
"code": "VALIDATION_ERROR"
}
Базовый URL
Все эндпоинты доступны по адресу http://your-host:8080. API проксируется через Nginx на /api/.
Системные эндпоинты
Healthcheck, версия, статус лицензии
/
Root: {"message": "DBWatch Pro Backend готов"}
/health
Docker healthcheck (без аутентификации)
/api/version
Версия из файла VERSION
/api/license/status
Статус лицензии: premium, tier, max_servers, expires_at, reason
/api/health-detail
CPU% и RAM%, предупреждение если > 85% (psutil)
/api/pg/extensions
Наличие расширений: pg_stat_statements, pgcrypto, pg_buffercache, pg_repack
API Метрики
Реал-тайм и исторические метрики
/api/metrics/realtime
Текущие PG + системные метрики. Параметр: instance_id (опц., Premium)
/api/metrics/history
История метрик из SQLite. Параметры: minutes (1–1440), instance_id (опц.)
/api/metrics/disk-space
Disk space: usage + прогноз заполнения по tablespace'ам
/api/metrics/ws-status
Статус WebSocket: enabled, path, send_interval
/ws/live
Push каждые 2 сек: PG + system метрики (только глобальный PG_DSN)
Пример ответа disk-space
{
"instance_id": null,
"summary": {
"current_percent": 42.5,
"days_until_full": 127.3
},
"tablespaces": [
{"tablespace": "pg_default", "used_bytes": 1073741824, "used_percent": 12.5},
{"tablespace": "pg_global", "used_bytes": 524288, "used_percent": 0.1}
]
}
API Запросы
Медленные запросы и история
/api/queries/top-slow
Топ медленных запросов из pg_stat_statements. Параметры: limit (1–200), instance_id, include_internal
/api/queries/history
История запросов (минутные бакеты). Параметры: minutes, instance_id
Поля ответа top-slow
| Поле | Тип | Описание |
|---|---|---|
queryid | bigint | ID запроса из pg_stat_statements |
query | text | Текст SQL-запроса |
calls | bigint | Количество вызовов |
total_time | float | Суммарное время выполнения (ms) |
avg_time | float | Среднее время выполнения (ms) |
rows | bigint | Количество строк |
shared_blks_hit | bigint | Попадания в буфер |
shared_blks_read | bigint | Чтения с диска |
hit_ratio | float | Процент попаданий в буфер |
dbid | oid | OID базы данных |
/api/queries/trend
API Алерты
Активные алерты, история и подтверждение
/api/alerts
Текущие активные алерты (вычисляются на лету). Параметр: instance_id (опц.)
/api/alerts/ack
Acknowledge алерта. Body: {"id": "...", "instance_id": ...}
/api/alerts/history
История алертов из SQLite. Параметры: days (1–90), limit (1–1000), instance_id
/api/alerts/history
Очистить историю алертов. Параметр: instance_id (опц.)
API Настройки
Конфигурация мониторинга и пороги алертов
/api/settings/monitoring
Текущие настройки мониторинга (webhook_url маскируется)
/api/settings/monitoring
Сохранить настройки (webhook_url обновляется только если передан)
/api/settings/monitoring/test-telegram
Тест Webhook (реальный HTTP-запрос к webhook endpoint)
/api/settings/monitoring/test-stats-db
Тест подключения к stats DB (SELECT 1)
/api/settings/thresholds
Получить пороги алертов
/api/settings/thresholds
Сохранить пороги с валидацией
Параметры настроек
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
collect_interval | int | 60 | Интервал сбора метрик (5–3600 сек) |
history_ttl_days | int | 90 | TTL истории запросов |
use_separate_stats_db | bool | false | Отдельная PG-БД для query stats |
stats_dsn | str | — | DSN отдельной stats-БД |
webhook_enabled | bool | true | Webhook-уведомления |
webhook_url | str | — | URL для Webhook |
email_recipient | str | — | Email получателя алертов |
alert_history_days | int | 7 | TTL истории алертов |
timezone | str | Europe/Moscow | Часовой пояс |
disk_path | str | / | Путь для мониторинга диска |
Часто задаваемые вопросы
FAQ по DBWatch PRO
DBWatch PRO поддерживает PostgreSQL 14 и выше. Рекомендуется PostgreSQL 16 для наилучшей совместимости. Для анализа запросов необходимо расширение pg_stat_statements.
DBWatch PRO распространяется как Docker-образ. Docker — единственный поддерживаемый способ установки. Скрипт install.sh автоматически установит Docker, если он отсутствует на сервере.
Убедитесь, что pg_stat_statements установлен и включён (shared_preload_libraries = 'pg_stat_statements' в postgresql.conf). После изменения этой настройки необходим перезапуск PostgreSQL.
Проверьте логи: docker compose logs dbwatch. Наиболее частая причина — некорректный PG_DSN или недоступность PostgreSQL из Docker-сети. Убедитесь, что хост указан правильно (не localhost, а внешний IP или host.docker.internal).
Проверьте: webhook_enabled = true или email_recipient указан в Settings. Нажмите «Send test notification» для проверки подключения.
Все данные хранятся в Docker volume dbwatch-data (файл metrics.db и settings.json). Скопируйте содержимое volume на новый сервер и запустите контейнер с тем же docker-compose.yml.
Рекомендуется: задайте DBWATCH_API_KEY для защиты API, используйте HTTPS через reverse proxy (Nginx, Caddy) и ограничьте доступ по IP через firewall. Backend (порт 8000) не экспонируется — весь трафик идёт через Nginx.
Проверьте логи: docker compose logs dbwatch. Убедитесь, что контейнер успешно запустился (прошёл healthcheck) и PG_DSN корректен. Агент сбора метрик стартует автоматически внутри контейнера после запуска бэкенда.
Установите USE_SEPARATE_STATS_DB=true и укажите PG_DSN_STATS с DSN отдельной PostgreSQL базы. DBWatch PRO автоматически создаст таблицу query_stats_history. Это полезно для снижения нагрузки на основную БД.
Да, это сигнал проблемы. Сессия idle in transaction держит транзакцию открытой и удерживает блокировки, что может блокировать VACUUM и другие запросы. Откройте страницу Sessions — в заголовке будет цветной badge с количеством и max duration. В Premium доступен drill-down с полным SQL виновного запроса и Lock Tree для поиска цепочки блокировок.
Bloat возникает из-за MVCC — удалённые и обновлённые строки накапливаются до VACUUM. Рекомендации по severity: ok (<20%) — норма, ничего делать не нужно. warning (20–50%) — запустите VACUUM ANALYZE table_name. critical (>50%) — рассмотрите VACUUM FULL table_name в окно обслуживания (блокирует таблицу). Следите за трендом на вкладке History.
Перейдите в Settings → License и введите ключ в поле активации. Лицензия применяется мгновенно без перезапуска. Ключ сохраняется в .env и .env.service — при следующем старте контейнера Premium активируется автоматически.
Используйте Command Palette — Cmd+K на macOS или Ctrl+K на Windows/Linux. Глобальный поиск по всем разделам с навигацией с клавиатуры.
Changelog
История изменений DBWatch PRO
- feat(Alerts/Actions) — actions стали объектами
{label, link}вместо строк; клик по action-кнопке в Notification Drawer теперь навигирует напрямую на нужную страницу - Маппинг алерт → страница: CPU high → /sessions, /queries, /capacity · RAM high → /sessions, /capacity · Connections → /sessions · Deadlocks → /sessions (Lock Tree), /queries · Slow queries → /queries · Disk → /metrics, /bloat, /capacity · Hit ratio low → /queries · Idle in tx → /sessions, /settings
- chore — мегакоммит 15f130a (88 файлов): Sessions, Bloat, LiveMetricsBanner, LockTree, ConnectionBreakdown, QueryTrends, Settings пороги, бэкенд-роутеры, CHANGELOG синхронизирован с main
- feat(Overview/LiveBanner) — настоящий WebSocket на Overview: пульсирующий LIVE-индикатор, CPU/RAM/Connections с мини-sparkline за 2 минуты, TPS счётчик, авто-реконнект при обрыве
- feat(Settings) — три новых порога: Disk Warning/Critical (был в схеме, отсутствовал в UI), Deadlocks Critical, Idle In Transaction Timeout (настраиваемый порог из v0.19.1)
- feat(Queries/Trends) — при клике на запрос в Queries появляется мини-график avg time (ms) по дням над EXPLAIN, диапазон 1/3/7/14 дней; новый эндпоинт
/api/queries/trend
- fix(licensing/spread) — в
get_license_status()spread-порядок вызывал перезапись явногоmax_serversзначением из tier_limits; исправлено:{**tier_limits, "max_servers": N} - fix(licensing/demo) — в DEMO_MODE
get_tier_max_servers()читал JWT из LICENSE_PAYLOAD вместо возврата professional default (50); добавлена проверкаif DEMO_MODE: return 50 - fix(licensing/env) — каждый deactivate/activate дописывал новую строку
LICENSE_KEY=в .env не удаляя предыдущую;load_dotenvбрал первую (устаревший JWT); теперь_update_env_license_key()оставляет только одну строку - fix(licensing/service) — deactivate обновлял только
.env, но не.env.serviceкоторый читает systemd; старый JWT оставался активным; теперь оба файла обновляются при activate/deactivate
- feat(Sessions/ConnectionBreakdown) — новая секция доступна в Standard: progress bar занятости пула с цветовыми порогами (60%→жёлтый, 80%→красный), State Donut chart с легендой, bar charts top-10 By User / By Database / By Application; авторефреш 15 секунд
- feat(Sessions/IdleTxBadge) — badge в заголовке страницы Sessions: жёлтый при 1–2 idle in transaction (показывает max duration), красный при 3+; пропадает когда таких сессий нет
- feat(Sessions/LockTree) — дерево блокировок blocker → waiters: красные карточки блокирующих, жёлтые ожидающих; PID, user/db, lock_mode, duration; drill-down с lock_type, relation, wait_event, SQL; авторефреш каждые 10 секунд; пустое состояние с green-индикатором
- feat(Bloat) — новая страница
/bloat: summary cards (total bloat таблиц/индексов), две таблицы с сортировкой и severity badge ok/warning/critical, history stacked area chart за 7/14/30/90 дней; Standard tier — UpgradePrompt gate - fix(DEMO_MODE) — DEMO_SECRET не был прописан в .env, из-за чего все Premium-фичи отдавали 403 в демо; исправлено
- feat(Sessions) — новая страница
/sessions: Donut chart занятости connection pool, Quick Stats по состояниям (active / idle / idle in tx / aborted), таблица сессий с фильтром - feat(Sessions Premium) — drill-down с полным текстом SQL-запроса, client_addr, wait_event; агрегированные Wait Events по типам (IO / Lock / LWLock / Client); история состояний stacked area chart 1–48 часов
- fix(routes_sessions) — задеплоен недостающий routes_sessions.py, подключён в main.py
- chore — Standard gate: без Premium виден только список сессий без query text, вместо charts — UpgradePrompt
- fix(NotificationDrawer) — корректное позиционирование дровера рядом с sidebar в свёрнутом (64px) и развёрнутом (256px) состоянии
- feat(NotificationDrawer) — skeleton-загрузка вместо спиннера; отображение actions[] компактными тегами с иконкой Play
- chore — удалён мусорный HealthScorePanel.jsx.bak
- fix(reports) — корректное отображение секции «Дисковое пространство» в PDF Health Report
- feat(retention) — автоматическая чистка устаревших данных (cron, TTL 90 дней)
- chore — удалены .bak файлы, добавлена ротация retention-лога
- Demo alerts — single source of truth, алерты генерируются на лету из метрик (Zabbix-style)
- Agent — нет записи alert_events в DEMO_MODE, устранены дубли
- Nginx — alias
/api/healthработает наравне с/health - Логирование — stdout для cron-задач, logrotate для demo-логов
- Notifications Centre — иконка Bell в сайдбаре, счётчик непрочитанных, drawer с активными алертами
- Command Palette — глобальный поиск Cmd+K / Ctrl+K, навигация с клавиатуры
- Reports — анимированный прогресс-бар PDF-генерации, UpgradePrompt для Standard
- UpgradePrompt — исправлена сломанная навигация (BrowserRouter)
- i18n — +16 новых ключей (notifications.*, palette.*, reports.progress*)
- PDF Reports — страница генерации Health Report
- Лицензирование — UI активации и деактивации лицензий
- Servers Dashboard — мультисерверный grid/table view
- Retention UI — управление сроками хранения данных
- UpgradePrompt, ExportButton — новые компоненты
- i18n — синхронизация ru/en, 816 ключей
- Docker-дистрибуция — приватный GHCR-образ с защитой исходного кода (.py → .pyc)
- Однокомандная установка —
curl | sudo bash, токен реестра вшит в скрипт - Лицензирование — RSA-ключ вшит в образ, офлайн-активация
- Яндекс.Метрика — цели view_demo, trial_key, purchase
- Оплата — ЮKassa-интеграция для trial/professional/enterprise
- Security Hardening — systemd sandboxing, WebSocket auth, SSRF защита, пользователь dbwatch
- Инфраструктура — rate limiting, security headers, HTTP/2, gzip, HSTS preload, fail2ban, swap 2GB
- Автобэкапы — PostgreSQL daily, SQLite hourly, configs weekly
- SSH hardening + UFW cleanup (14 правил → 3)
- Admin — responsive 768px, YooKassa CollapsibleSection, audit-log alias
- Landing — Яндекс.Метрика + Google Analytics, Tailwind CDN → production build (16KB)
- Demo — Health Score placeholder fix
- MySQL удалён, journald limits, disk monitoring
- 17 исправлений и улучшений — Landing, Demo, Admin, Docs
- Landing: бургер-меню, скриншоты, модалка оплаты со скидками
- Demo: сайдбар сворачивание растягивает контент, равномерные оси X в графиках
- Demo: исправлены DSN обрезка, CPU/RAM наложение текста, PDF отступы графиков
- Admin: продление лицензий, удаление, отзыв с причиной, сворачиваемые блоки настроек
- Admin: блок настроек ЮКасса
- Автообновление версии на всех страницах (landing, docs, legal)
- Документация: логотип, обновлённый changelog
- Trial лицензии — выдача 14-дневных Professional Trial из admin-панели с автоотправкой на email
- Admin: DashboardPage с графиками, последние лицензии, статистика по тарифам
- Обновлён инсталлятор install.sh на лендинге
- ESLint: исправлены 9 ошибок и 43 предупреждения во фронтенде
- Settings.jsx: исправлен ref alertThresholds (useRef вместо createAlertThresholdsRef)
- Юридические страницы: заполнены реальные данные правообладателя
- Overview: кнопки 24h/7d/30d теперь работают для Professional/Enterprise
- Capacity: исправлены диапазоны 7d/14d/30d, пунктирные линии warning/critical на CPU Headroom
- Capacity: читаемые даты на оси X графика Disk Trend
- Лендинг: фикс мобильного меню, горизонтальный скролл code-блоков, checkout модальное окно
- Документация: улучшена читаемость на широких экранах (2560px+)
- Мобильная адаптация: Overview (кнопки периода), Queries (хедер), Capacity (KPI-карточки)
- Queries: новые фильтры DDL и «Прочие» (CREATE, ALTER, DROP, TRUNCATE и т.д.)
- PDF Reports — генерация профессиональных PDF-отчётов о здоровье сервера (Professional/Enterprise)
- Титульная страница, Executive Summary, графики CPU/RAM/Connections, Top Slow Queries
- VACUUM статистика, репликация, диск — всё в одном PDF
- Новая страница /reports с выбором периода (6ч/12ч/24ч/7д/30д)
- Поддержка кириллицы (DejaVu Sans)
- CI/CD Pipeline — полный цикл lint → test → build для каждого push/PR
- Backend-тесты: 63 теста (pytest) — tier limits, enforcement, health score, config
- Frontend-тесты: 24 теста (vitest) — timeAgo, statusColors, fetcher, exportCsv
- Ruff линтинг (backend), ESLint (frontend)
- Docker publish только после прохождения всех проверок
- Enforcement тарифных ограничений — серверное применение лимитов по тарифам
- Retention по тарифам: Standard 7 дней, Professional 90 дней, Enterprise 365 дней
- API enforcement: 403 FEATURE_NOT_AVAILABLE для заблокированных функций
- Frontend Tier Awareness: useFeatureGate, UpgradePrompt, useLicenseStatus
- Email-алерты (SMTP) — новый канал уведомлений через SMTP-сервер клиента
- Поддержка STARTTLS (587), SSL (465) и plain (25)
- HTML-письма с DBWatch PRO брендингом
- Тестовая отправка из UI настроек
- Экспорт CSV — экспорт данных на страницах Запросы, Алерты, Метрики, Обслуживание
- BOM-маркер для корректного открытия в Excel/LibreOffice
- Кнопка экспорта с Premium-гейтом
- Серверы: PG Version + Uptime в карточках и таблице
- Top-3 медленных запросов на Overview (Premium)
- Детальная панель запроса — slide-over drawer на странице Queries
- Утилита timeAgo с поддержкой i18n
- Исправлен маппинг статуса ok → Healthy
- Multi-server Dashboard — сводный дашборд всех серверов на /servers
- Grid и Table view, сортировка worst-first
- Health Score, CPU/RAM/Disk мини-прогрессбары для каждого сервера
- Автообновление каждые 30 секунд
- Расширенный мониторинг диска: кольцевая диаграмма, топ таблиц, размеры БД
- Тренд использования диска за 7 дней
- Новые API: /api/metrics/disk-detail, /api/metrics/disk-history
- Страница лицензии: текущий план, сравнение тарифов, статистика использования
- Index Advisor v2: детекция дубликатов, уровень critical, карточный UI, copy SQL
- Webhooks & Slack — мульти-канальная система уведомлений
- HMAC-SHA256 подпись для Webhook, Block Kit для Slack
- Единый диспетчер уведомлений (Email + Webhook параллельно)
- VACUUM Monitoring — мониторинг VACUUM и репликации PostgreSQL
- XID Age progress bar, таблица vacuum-статистики, рекомендации
- Карточки реплик: lag, sync state, LSN
- Responsive фиксы для Queries, Capacity, Maintenance
- Новая тарифная модель: Standard / Professional / Enterprise
- Обратная совместимость: solo→standard, team→professional, custom→enterprise
- 32 REST-эндпоинта + 9 Premium-эндпоинтов
- Index Advisor: missing + unused indexes, severity, SQL-генерация
- Capacity Planning: CPU, RAM, Disk, Connections forecasting
- Disk Space Monitoring: tablespaces, прогноз days_until_full
- Extended History: 24h/7d/30d графики (Premium)
- Улучшенный UI: skeleton-загрузки, анимации, responsive
- Multi-Server Foundation: CRUD инстансов, InstanceSelector
- Health Score Dashboard: 7 факторов, statuses, recommendations
- EXPLAIN / Query Plans (Premium)
- License Key System (JWT RS256)
- Полная локализация: русский + английский (686 ключей)
- Первый публичный релиз
- Мониторинг одного PostgreSQL-сервера
- Реал-тайм метрики через WebSocket
- pg_stat_statements интеграция
- 12 типов алертов, Email/Webhook-уведомления
- Тёмная и светлая тема (Obsidian Pulse)
Дорожная карта
✅ Реализовано (v0.13–v0.19)
- Health Score, метрики, алерты, pg_stat_statements
- EXPLAIN-планы, Index Advisor, Capacity Planning
- Multi-Server, PDF-отчёты, CSV-экспорт
- Command Palette (Cmd+K), Notifications Centre
- Мониторинг сессий, Lock Tree, Wait Events
- Анализ Bloat таблиц и индексов
- Connection Breakdown, Idle-in-tx badge
- Лицензирование UI (activate/deactivate без перезапуска)
Фаза 2 — Продвинутый анализ
- Advanced Index Advisor (JOIN, partial indexes)
- Query Regression Detection — автообнаружение деградации запросов
- Anomaly Detection — ML-based выявление аномалий
- Query groups — группировка похожих запросов
Фаза 3 — Extension-aware мониторинг
- pgvector — index inventory, performance метрики
- TimescaleDB — hypertables, chunks, compression stats
- PostGIS, pg_cron мониторинг
Фаза 4 — Enterprise расширения
- PagerDuty, Opsgenie интеграции
- RBAC + SSO / LDAP
- Audit log export
- Grafana datasource plugin
- Telegram-уведомления