Назад к обновлениям
New releaseSep 3, 2026

monitor v0.41.0

Мониторинг в реальном времени и анализ slowlog для баз данных Valkey и Redis с обнаружением аномалий, аудитом ACL и экспортом метрик в Prometheus.

Поделиться

BetterDB Monitor

Docker Pulls Docker Image Version Artifact Hub npm npm downloads API Tests License Valkey Redis

Уровень мониторинга, которого заслуживает 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.

BetterDB Monitor - Key Analytics with per-type key size distribution histograms

Быстрый старт (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Нет3001HTTP-порт приложения
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. Монитор проверяет его локально по открытым ключам, встроенным в образ — ему никогда не нужно обращаться к серверу лицензий, чтобы доверять токену. Таким образом, хост в изолированной сети может работать на платных тарифах с нулевым подключением:

  1. На машине с доступом в интернет войдите в систему на betterdb.com/account/licenses и скачайте свой офлайн-токен лицензии (.jwt, Pro/Enterprise). Он не содержит секретов и не может быть изменён — любая правка нарушает подпись.
  2. Передайте его на хост в изолированной сети любым удобным способом (USB, управление конфигурацией, подключение секрета Docker/Kubernetes).
  3. Укажите его через 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Продакшн / серверный SQLiteSTORAGE_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/monitorTypeScriptnpm
@betterdb/mcpTypeScriptnpm
@betterdb/agentTypeScriptnpm
@betterdb/semantic-cacheTypeScriptnpm
betterdb-semantic-cachePythonPyPI
@betterdb/agent-cacheTypeScriptnpm
betterdb-agent-cachePythonPyPI
cache-benchmarkPythonТестовый стенд для бенчмаркинга семантических кэшей

Технологический стек

  • Бэкенд: 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).

Категории