
monitor v0.41.0
Мониторинг в реальном времени и анализ slowlog для баз данных Valkey и Redis с обнаружением аномалий, аудитом ACL и экспортом метрик в Prometheus.
BetterDB Monitor
Уровень мониторинга, которого заслуживает Valkey.
BetterDB сохраняет то, что Valkey выбрасывает — slowlog-и, паттерны команд, активность клиентов, сигналы аномалий — чтобы вы могли разобраться, что произошло в 3 часа ночи, а не только видеть, что происходит сейчас. Создан для Valkey 8.x с нативной поддержкой COMMANDLOG, CLUSTER SLOT-STATS и метрик I/O на поток. Совместим с Redis 6+ для всего остального.
Website | Docker Hub | npm | Documentation | Blog
BetterDB создан компанией BetterDB Inc., публичной компанией с общественной пользой, действующей в рамках OCV Open Charter.

Быстрый старт (Docker)```bash
docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest
Направьте браузер на `http://localhost:3001`. Чтобы отслеживать конкретный экземпляр:```bash
docker run -d \
--name betterdb \
-p 3001:3001 \
-e DB_HOST=your-valkey-host \
-e DB_PORT=6379 \
-e DB_PASSWORD=your-password \
betterdb/monitor:latest
Подключаетесь к базе данных на вашей хост-машине? Внутри контейнера
localhost— это сам контейнер, а не ваш хост, поэтому используйтеhost.docker.internalв качестве хоста базы данных. В Docker Desktop (macOS/Windows) это работает из коробки; в Linux добавьте--add-host=host.docker.internal:host-gatewayк командеdocker run, чтобы имя разрешалось. Кнопка панели управления «подключиться к локальному экземпляру» автоматически определяет это и заранее подставляет правильный хост.
Публикуются два варианта образа, оба multi-arch (linux/amd64, linux/arm64):
| Тег | Что это |
|---|---|
latest, X.Y.Z-no-ai | Образ по умолчанию — включает все функции мониторинга, без зависимостей для экспериментального локального LLM AI-помощника |
X.Y.Z | Добавляет экспериментальный AI-помощник (используйте свой Ollama; отключен по умолчанию через AI_ENABLED) |
См. Docker Production Deployment для постоянного хранения, пользовательских портов, лицензирования и автономных (air-gapped) конфигураций.
Быстрый старт (Kubernetes / Helm)```bash
helm repo add betterdb https://docs.betterdb.com/charts
helm repo update
helm install betterdb-monitor betterdb/betterdb-monitor
--namespace betterdb --create-namespace
--set db.host=my-valkey.default.svc.cluster.local
--set db.password=yourpassword
Тогда выполните `kubectl port-forward -n betterdb svc/betterdb-monitor 3001:3001` и откройте `http://localhost:3001`, либо включите ingress в чарте. История на базе PostgreSQL, собственные Secrets и лицензирование в изолированной сети описаны в [руководстве по Kubernetes](https://docs.betterdb.com/kubernetes) и [README чарта](https://github.com/betterdb-inc/monitor/blob/master/charts/betterdb-monitor/README.md).
## Быстрый старт (CLI)
Запустите BetterDB Monitor без Docker:```bash
npx @betterdb/monitor
При первом запуске интерактивный мастер настройки проведёт вас через подключение к базе данных, выбор хранилища (SQLite, PostgreSQL или в памяти) и настройки сервера. Конфигурация сохраняется в ~/.betterdb/config.json.```bash
npm install -g @betterdb/monitor # global install
betterdb --setup # re-run setup wizard
betterdb --port 8080 # override server port
betterdb --db-host 1.2.3.4 # override database host
betterdb --help # all options
Требуется Node.js >= 20.0.0 и экземпляр Valkey или Redis для мониторинга. Для хранения в SQLite также выполните `npm install -g better-sqlite3`.
## Что вы получаете
### Видите всё, сохраняете всё
- **Историческая аналитика** — запросы к slowlog, паттерны команд, активность клиентов и задержки за любой период времени. Данные, которые раньше исчезали после ротации логов.
- **Поддержка COMMANDLOG** — эксклюзивно для Valkey 8.1+. Большие запросы и большие ответы, а не только медленные.
- **Сеансы захвата MONITOR** — запись реального трафика по требованию: живой просмотр, фильтрация, воспроизведение, экспорт в JSON/CSV и перекрёстная проверка с историей подключений.
- **Отслеживание горячих ключей** — топ ключей по частоте доступа с динамикой изменения ранга. Key Analytics (Pro, бесплатно в раннем доступе) добавляет распределение типов, TTL и размеров на основе живых выборок.
- **Видимость кластера** — графы топологии, тепловые карты SLOT-STATS, распределение CPU и ключей по слотам.
- **Метрики CPU и I/O потоков** — видимость по каждому потоку, которую не может предоставить ни один инструмент для Redis.
- **Аналитика клиентов** — точное определение того, какой сервис за что отвечает, с атрибуцией по имени клиента и паттерну.
- **Журнал аудита ACL** — отслеживание того, кто и к чему обращался, с сохранением для соответствия требованиям и отладки после инцидентов.
### Понимайте и действуйте
- **Обнаружение аномалий** (Pro, бесплатно в раннем доступе) — автоматическое обучение базовому уровню с коррелированными событиями и диагностикой на простом языке. Более 20 детекторов, без ручных порогов.
- **Прогнозирование ёмкости** — прогнозируемое время до предела для памяти, операций/сек, CPU и фрагментации.
- **Вебхуки** — доставка оповещений с HMAC-подписью, повторами и полным журналом доставки.
- **Живая миграция** — переход между Redis и Valkey с трёхфазным рабочим процессом анализа, выполнения и проверки.
### Создан для эпохи ИИ
- **Наблюдаемость векторного поиска** — операции/сек и задержки FT.SEARCH с проверкой здоровья по каждому индексу для [valkey-search](https://github.com/valkey-io/valkey-search) и RediSearch. См. [docs/vector-ai](https://github.com/betterdb-inc/monitor/blob/master/docs/vector-ai/README.md).
- **Задержка инференса** — p50/p95/p99 по каждому индексу с оповещениями о нарушении SLA (Pro, бесплатно в раннем доступе).
- **Интеллект семантического кэша** (Pro, бесплатно в раннем доступе) — проверка здоровья коэффициента попаданий, рекомендации по порогам схожести и рабочий процесс предложений с одобрением/отклонением. Включает наблюдаемость памяти агента.
- **Трассировки ИИ** — водопадные диаграммы спанов OTLP из вашего ИИ-приложения, коррелируемые с живым состоянием Valkey под каждым запросом. См. [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).
### Интегрируется со всем
- **MCP-сервер** — 60 инструментов для Claude Code, Cursor или любого MCP-клиента через [`@betterdb/mcp`](https://github.com/betterdb-inc/monitor/blob/master/packages/mcp).
- **Конечная точка Prometheus** — более 100 метрик `betterdb_*`. См. [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md).
- **OpenTelemetry** — приём OTLP-трассировок, зеркалирование метрик и событий в любой OTLP-бэкенд. См. [docs/opentelemetry.md](https://github.com/betterdb-inc/monitor/blob/master/docs/opentelemetry.md).
- **REST API** — всё в интерфейсе является вызовом API, документировано через OpenAPI.
## Доступ к данным на ваш выбор
| Интерфейс | Подробности |
|-----------|-------------|
| Веб-интерфейс | `http://localhost:3001` |
| MCP-сервер | `npx @betterdb/mcp` (stdio) — создайте токен в разделе Настройки → MCP Tokens |
| Prometheus | `http://localhost:3001/api/prometheus/metrics` |
| REST API (OpenAPI) | `http://localhost:3001/docs` |
| Проверка состояния | `http://localhost:3001/api/health` |
> **Примечание**: В производственных сборках (Docker, CLI) маршруты API обслуживаются с префиксом `/api`. В локальной разработке (`pnpm dev`) префикса нет — например, `http://localhost:3001/health`.
## Поддерживаемые базы данных
| База данных | Минимальная версия | Поддерживаемые функции |
|----------|----------------|-------------------|
| **Valkey** | 8.0+ | Все функции, включая COMMANDLOG (8.1+) и CLUSTER SLOT-STATS |
| **Redis** | 6+ | Все функции, кроме эксклюзивных для Valkey COMMANDLOG и CLUSTER SLOT-STATS |
Бэкенд использует унифицированный адаптер поверх совместимого по протоколу клиента `iovalkey` и автоматически определяет Valkey или Redis по ответу `INFO` (`DB_TYPE=auto`). Возможности, такие как COMMANDLOG и SLOT-STATS, определяются по версии, а интерфейс корректно деградирует, когда функция недоступна.
Управляемые сервисы также поддерживаются — руководства для AWS ElastiCache, MemoryDB, Redis Cloud и Upstash находятся в [docs/providers](https://github.com/betterdb-inc/monitor/blob/master/docs/providers), а [`@betterdb/agent`](https://github.com/betterdb-inc/monitor/blob/master/packages/agent) подключается к экземплярам, доступным только через VPC, по исходящему WebSocket.
## Развёртывание в Docker для продакшена
Образ Docker содержит приложение для мониторинга (бэкенд + фронтенд). Он требует:
1. Экземпляр Valkey/Redis для мониторинга
2. Экземпляр PostgreSQL для хранения данных (или используйте хранение в памяти)
### Запуск с хранением в PostgreSQL```bash
docker run -d \
--name betterdb-monitor \
-p 3001:3001 \
-e DB_HOST=your-valkey-host \
-e DB_PORT=6379 \
-e DB_PASSWORD=your-password \
-e STORAGE_TYPE=postgres \
-e STORAGE_URL=postgresql://user:pass@postgres-host:5432/dbname \
betterdb/monitor
Запуск на нестандартном порту
Задайте переменную окружения PORT и укажите соответствующее сопоставление -p:```bash
docker run -d
--name betterdb-monitor
-p 8080:8080
-e PORT=8080
-e DB_HOST=your-valkey-host
betterdb/monitor
### Запуск с сетью хоста (доступ к сервисам localhost)
Если ваш Valkey и PostgreSQL работают на одном хосте:```bash
docker run -d \
--name betterdb-monitor \
--network host \
-e DB_HOST=localhost \
-e DB_PORT=6380 \
-e DB_PASSWORD=devpassword \
-e STORAGE_TYPE=postgres \
-e STORAGE_URL=postgresql://dev:devpass@localhost:5432/postgres \
betterdb/monitor
Переменные окружения
| Переменная | Обязательная | По умолчанию | Описание |
|---|---|---|---|
DB_HOST | Да | localhost | Хост Valkey/Redis для мониторинга |
DB_PORT | Нет | 6379 | Порт Valkey/Redis |
DB_PASSWORD | Нет | - | Пароль Valkey/Redis |
DB_USERNAME | Нет | default | Имя пользователя ACL Valkey/Redis |
DB_TYPE | Нет | auto | Тип базы данных: auto, valkey или redis |
STORAGE_TYPE | Нет | memory | Бэкенд хранилища: memory или postgres |
STORAGE_URL | Условно | - | URL подключения PostgreSQL (обязателен, если STORAGE_TYPE=postgres) |
PORT | Нет | 3001 | HTTP-порт приложения |
NODE_ENV | Нет | production | Окружение Node |
ANOMALY_DETECTION_ENABLED | Нет | true | Включить обнаружение аномалий |
ANOMALY_PROMETHEUS_INTERVAL_MS | Нет | 30000 | Интервал обновления сводки Prometheus (мс) |
BETTERDB_LICENSE_KEY | Нет | - | Онлайн-лицензионный ключ (Pro/Enterprise), проверяется через сеть |
BETTERDB_OFFLINE_LICENSE_FILE | Нет | - | Путь к подписанной офлайн-лицензии .jwt для хостов в изолированной сети (см. ниже) |
BETTERDB_OFFLINE_LICENSE | Нет | - | Офлайн-лицензионный токен в виде встроенной строки JWT |
BETTERDB_DATA_DIR | Нет | /app/data | Каталог для сохранённого состояния лицензии (подключите записываемый том) |
ENCRYPTION_KEY | Нет | - | Ключ (мин. 16 символов), используемый для конвертной шифрования сохранённых паролей подключений и секретов SSH-туннелей в состоянии покоя. Без него секреты хранятся в открытом виде |
BETTERDB_SSH_KEY_DIR | Нет | - | Каталог, в котором должны находиться серверные закрытые ключи SSH. Включает источник ключей «путь к файлу на сервере» для SSH-туннелей; путь к ключу подключения должен разрешаться внутри него. Если не задано, файловые ключи отключены (встроенные вставленные ключи по-прежнему работают) |
BETTERDB_TELEMETRY | Нет | true | Установите false, чтобы отключить анонимную телеметрию |
Полный справочник, включая настройку ИИ, вебхуков и пороговых значений шлюза работоспособности: docs/configuration.md. По приёму трассировок OTLP и экспорту метрик/событий см. docs/opentelemetry.md.
SSH-туннели
Подключения могут достигать базы данных через SSH-бастион/прыжковый хост вместо прямого подключения — это полезно для Valkey/Redis в частной подсети, ElastiCache или MemoryDB. Включите Подключение через SSH-туннель при добавлении подключения и укажите SSH-хост, порт и имя пользователя. Поддерживается один переход.
Аутентификация выполняется либо по паролю, либо по закрытому ключу. Закрытые ключи поступают из одного из двух источников:
- Вставить ключ (встроенный): содержимое PEM-ключа отправляется вместе с подключением. Он хранится зашифрованным в состоянии покоя только когда задан
ENCRYPTION_KEY(конвертное шифрование); без этого ключа он хранится в открытом виде, как и пароли подключений. Работает везде, включая управляемые/облачные развёртывания. - Путь к файлу на сервере: ключ уже находится в файловой системе сервера мониторинга и указывается по пути. Для этого требуется задать переменную окружения
BETTERDB_SSH_KEY_DIRкак каталог, содержащий разрешённые ключи, и указанный путь должен разрешаться внутри него, чтобы API никогда не мог быть принуждён к чтению произвольных файлов. ОставьтеBETTERDB_SSH_KEY_DIRнезаданным, чтобы отключить эту опцию.
При желании можно закрепить отпечаток host-ключа SSH-сервера (SHA256:...) в подключении; если он задан, туннель отклоняется, если сервер не предоставляет соответствующий ключ, что предотвращает атаки «человек посередине» на пути через бастион. Если оставить поле пустым, идентичность сервера не проверяется (в журнал записывается предупреждение).
Туннель пересылает трафик к базе данных через 127.0.0.1; когда TLS включён, сертификат по-прежнему проверяется на соответствие реальному имени хоста базы данных. Задайте ENCRYPTION_KEY, чтобы SSH-пароли, парольные фразы ключей и встроенные ключи шифровались в состоянии покоя.
Известное ограничение — топологии кластера/Sentinel: туннелируется только то подключение, которое вы настраиваете. Мониторинг кластера и Sentinel распространяется на другие узлы, используя адреса, которые эти узлы объявляют (CLUSTER NODES / Sentinel), и эти подключения к отдельным узлам выполняются напрямую, а не через туннель. Если другие узлы доступны только через бастион (например, ElastiCache/MemoryDB в частной подсети), представления отдельных узлов будут недоступны. Используйте SSH-туннели для мониторинга одного узла/основного узла или разместите монитор там, где он может напрямую достигать узлов кластера.
Лицензирование и поддержка изолированных сетей
BetterDB Monitor разблокирует функции Pro/Enterprise одним из двух способов, в зависимости от того, имеет ли хост доступ в интернет:
- Онлайн-лицензионный ключ — задайте
BETTERDB_LICENSE_KEY. Монитор проверяет его наbetterdb.comи кэширует локально проверенный подписанный токен, поэтому ваш тариф продолжает работать при кратковременных сбоях и перезапусках. - Офлайн-токен лицензии / для изолированной сети — для хостов вообще без доступа в интернет (см. ниже).
Как работает лицензирование в изолированной сети
Каждое право доступа — это подписанный RS256 JWT. Монитор проверяет его локально по открытым ключам, встроенным в образ — ему никогда не нужно обращаться к серверу лицензий, чтобы доверять токену. Таким образом, хост в изолированной сети может работать на платных тарифах с нулевым подключением:
- На машине с доступом в интернет войдите в систему на
betterdb.com/account/licenses и
скачайте свой офлайн-токен лицензии (
.jwt, Pro/Enterprise). Он не содержит секретов и не может быть изменён — любая правка нарушает подпись. - Передайте его на хост в изолированной сети любым удобным способом (USB, управление конфигурацией, подключение секрета Docker/Kubernetes).
- Укажите его через
BETTERDB_OFFLINE_LICENSE_FILE(путь),BETTERDB_OFFLINE_LICENSE(встроенная строка) или вставьте его в интерфейсе в разделе Настройки → Лицензия → «Изолированная сеть? Активировать офлайн-лицензию».
Когда настроен офлайн-токен и не задан BETTERDB_LICENSE_KEY, монитор
совершает ноль исходящих запросов — проверки лицензии, телеметрия и
уведомления об обновлениях полностью отключены. Он работает на предоставленном тарифе до истечения
срока действия токена (бессрочные лицензии перезагружаются ежегодно), затем возвращается к Community.```bash
fully offline - no network required
docker volume create betterdb-data docker run --rm -v betterdb-data:/d alpine chown 1001:1001 /d # volume writable by UID 1001 (one-time)
docker run -d --name betterdb-monitor -p 3001:3001
-e DB_HOST=your-valkey-host -e DB_PORT=6379 -e DB_PASSWORD=your-password
-v /path/to/betterdb-license.jwt:/run/secrets/betterdb-license.jwt:ro
-e BETTERDB_OFFLINE_LICENSE_FILE=/run/secrets/betterdb-license.jwt
-v betterdb-data:/app/data
betterdb/monitor
Проверьте с помощью `GET /api/license/status` → `source: offline-token`, `mode: offline`,
`airGapped: true`.
> **Постоянство данных:** смонтируйте записываемый том в `/app/data`, чтобы офлайн-лицензия и
> токен отсрочки при сбоях онлайн-режима переживали перезапуски. Контейнер работает под **UID 1001**,
> поэтому вновь созданный том должен быть передан ему через `chown` (показано выше) — в противном случае
> постоянство данных завершится ошибкой `EACCES … license.jwt`.
Полный процесс, порядок приоритета проверки и инструкцию по ротации ключей см. в
**[Offline & Air-Gapped Licenses](https://github.com/betterdb-inc/monitor/blob/master/docs/offline-licenses.md)** и
**[Configuration reference](https://github.com/betterdb-inc/monitor/blob/master/docs/configuration.md#license-configuration)**.
### Сведения об образе Docker
- **Базовый образ**: `node:20-alpine`
- **Сжатый размер**: ~360MB (`latest` / `-no-ai`) / ~640MB (версионный образ с локальными LLM-зависимостями экспериментального AI-помощника)
- **Платформы**: `linux/amd64`, `linux/arm64`
- **Содержит**: Backend API + статические файлы Frontend (обслуживаются Fastify)
- **Исключено**: поддержка SQLite (используйте PostgreSQL или Memory storage)
### Операции с контейнером```bash
docker logs -f betterdb-monitor # follow logs
docker stop betterdb-monitor # stop
docker rm betterdb-monitor # remove
Бэкенды хранения
BetterDB Monitor сохраняет данные аудита, аналитики, захватов и аномалий в одном из четырёх бэкендов:
| Бэкенд | Сценарий использования | Примечания |
|---|---|---|
memory | Тестирование, эфемерные среды | По умолчанию в Docker; все данные теряются при перезапуске |
postgres | Продакшн | STORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db |
turso | Продакшн / серверный SQLite | STORAGE_TYPE=turso + STORAGE_URL=libsql://... + STORAGE_AUTH_TOKEN; работает в Docker |
sqlite | Локальная разработка / CLI | Нативный модуль удалён из образа Docker latest; STORAGE_SQLITE_FILEPATH необязателен |
Метрики Prometheus
Метрики доступны по адресу GET /api/prometheus/metrics в текстовом формате Prometheus: аудит ACL, клиентские подключения, паттерны slowlog/commandlog, память, пропускная способность, keyspace, репликация, статистика слотов кластера и метрики среды выполнения Node.js — все с префиксом betterdb_.```yaml
scrape_configs:
- job_name: 'betterdb-monitor'
metrics_path: '/api/prometheus/metrics'
static_configs:
- targets: ['your-monitor-host:3001']
Полная справка по метрикам: [docs/prometheus-metrics.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-metrics.md) и [docs/prometheus-integration.md](https://github.com/betterdb-inc/monitor/blob/master/docs/prometheus-integration.md).
## Разработка
### Структура проекта```
betterdb-monitor/
├── apps/
│ ├── api/ # NestJS backend (Fastify)
│ └── web/ # React frontend (Vite)
├── packages/ # Published packages (see below)
├── docs/ # Documentation site (Jekyll)
├── docker-compose.yml # Local Valkey (port 6380) and Redis (port 6382) for testing
└── package.json # Workspace root
Пакеты
Этот монорепозиторий содержит несколько автономных пакетов. Полный список см. в packages/.
| Пакет | Язык | Реестр |
|---|---|---|
@betterdb/monitor | TypeScript | npm |
@betterdb/mcp | TypeScript | npm |
@betterdb/agent | TypeScript | npm |
@betterdb/semantic-cache | TypeScript | npm |
betterdb-semantic-cache | Python | PyPI |
@betterdb/agent-cache | TypeScript | npm |
betterdb-agent-cache | Python | PyPI |
cache-benchmark | Python | Тестовый стенд для бенчмаркинга семантических кэшей |
Технологический стек
- Бэкенд: NestJS с адаптером Fastify,
iovalkeyдля подключений Valkey/Redis, строгий режим TypeScript. Порт 3001. - Фронтенд: React + TypeScript, Vite, TailwindCSS, Recharts. Dev-сервер на порту 5173.
- Монорепозиторий: pnpm workspaces + Turborepo.
Локальная настройка
Предварительные требования: Node.js >= 20.0.0, pnpm >= 9.0.0, Docker.```bash pnpm install cp .env.example .env pnpm docker:dev # local Valkey (6380) and Redis (6382) pnpm dev # web on :5173, api on :3001
Чтобы подключиться к Redis вместо Valkey, задайте `DB_PORT=6382` в файле `.env`.```bash
pnpm dev:api # API only
pnpm dev:web # frontend only
pnpm docker:dev:down # stop local databases
pnpm build # production build
pnpm test # API tests
Docker image builds:```bash pnpm docker:build # local build pnpm docker:publish # multi-arch build & push (requires buildx)
### Добавление новых функций
1. Добавляйте новые конечные точки в `apps/api/src/`
2. Добавляйте соответствующие вызовы API в `apps/web/src/api/`
3. Добавляйте общие типы в `packages/shared/src/types/`
### Стиль кода
- TypeScript в строгом режиме, явные типы возвращаемых значений, без `any`
- Настроены ESLint + Prettier
## Лицензия
- Контент в `docs/` распространяется по лицензии CC BY-SA 4.0.
- Контент в `proprietary/` покрывается коммерческой лицензией (см. `proprietary/LICENSE`). Эти функции бесплатны в период раннего доступа.
- Всё остальное — [MIT](https://github.com/betterdb-inc/monitor/blob/master/LICENSE).