Назад к обновлениям
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 и метрик ввода-вывода по потокам. Совместим с Redis 6+ для всего остального.

Сайт | Docker Hub | npm | Документация | Блог

BetterDB создан компанией BetterDB Inc. — public benefit company, работающей в соответствии с 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, чтобы это имя разрешалось. Кнопка «подключиться к локальному экземпляру» в дашборде автоматически определяет это и подставляет нужный хост за вас.

Публикуются два варианта образа, оба мультиархитектурные (linux/amd64, linux/arm64):

ТегЧто это
latest, X.Y.Z-no-aiОбраз по умолчанию — все функции мониторинга включены, без зависимостей для экспериментального локального LLM AI Helper
X.Y.ZДобавляет экспериментальный AI Helper (используйте свой Ollama; отключён по умолчанию через AI_ENABLED)

См. Docker Production Deployment для постоянного хранилища, пользовательских портов, лицензирования и изолированных сред.

Быстрый старт (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 или in-memory) и настройку сервера. Конфигурация сохраняется в ~/.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 детекторов, без ручных порогов.
- **Прогнозирование ёмкости** — прогнозируемое время до достижения предела для памяти, ops/sec, CPU и фрагментации.
- **Вебхуки** — доставка оповещений с подписью HMAC, с повторными попытками и полным журналом доставки.
- **Живая миграция** — переход между Redis и Valkey с трёхфазным рабочим процессом анализа, выполнения и валидации.

### Создано для эпохи ИИ

- **Наблюдаемость векторного поиска** — ops/sec и задержки 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, бесплатно в раннем доступе) — состояние hit-rate, рекомендации по порогу схожести и рабочий процесс предложений с одобрением/отклонением. Включает наблюдаемость памяти агента.
- **Трассировки ИИ** — водопады спанов 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** — всё в UI является вызовом API, документированным через OpenAPI.

## Доступ к данным на ваших условиях

| Интерфейс | Детали |
|-----------|---------|
| Веб-интерфейс | `http://localhost:3001` |
| MCP-сервер | `npx @betterdb/mcp` (stdio) — создайте токен в разделе Settings → MCP Tokens (обязательно в облаке, опционально при самостоятельном размещении) |
| Prometheus | `http://localhost:3001/api/prometheus/metrics` |
| REST API (OpenAPI) | `http://localhost:3001/docs` |
| Проверка работоспособности | `http://localhost:3001/api/health` |

> **Примечание**: В production-сборках (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, определяются по версии, и UI корректно деградирует, когда возможность недоступна.

Управляемые сервисы также поддерживаются — руководства для 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.

## Production-развёртывание в 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

### Запуск с сетью хоста (доступ к локальным сервисам)

Если ваш 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
DB_TLSНетfalseУстановите true для подключения к отслеживаемой базе данных по TLS (требуется управляемыми провайдерами, такими как Aiven или ElastiCache Serverless)
STORAGE_TYPEНетmemoryБэкенд хранилища: memory или postgres
STORAGE_URLУсловно-URL подключения к PostgreSQL (требуется, если STORAGE_TYPE=postgres)
STORAGE_SSL_CAНет-Путь (или доверенный HTTPS URL) к сертификату CA, используемому для проверки сервера PostgreSQL. Для управляемых провайдеров с собственным CA (например, Aiven) укажите здесь CA проекта для полной проверки цепочки и имени хоста. Имеет приоритет над STORAGE_SSL_NO_VERIFY
STORAGE_SSL_NO_VERIFYНетfalseПодключение к PostgreSQL по TLS без проверки сертификата сервера (шифрование без аутентификации). Удобство для управляемых провайдеров, которые предоставляют собственный CA и принудительно используют sslmode=require, когда вы не можете указать STORAGE_SSL_CA. В продакшене предпочитайте STORAGE_SSL_CA
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, чтобы отключить анонимную телеметрию

Полный справочник, включая AI, настройку вебхуков и пороги health-gate: docs/configuration.md. О приёме трассировок OTLP и экспорте метрик/событий см. docs/opentelemetry.md.

SSH-туннели

Подключения могут достигать базы данных через SSH-бастион/jump-хост вместо прямого подключения — это полезно для Valkey/Redis в приватной подсети, ElastiCache или MemoryDB. Включите Connect via SSH tunnel при добавлении подключения и укажите SSH-хост, порт и имя пользователя. Поддерживается один переход.

Аутентификация выполняется либо по паролю, либо по приватному ключу. Приватные ключи берутся из одного из двух источников:

  • Вставить ключ (встроенный): содержимое PEM-ключа передаётся вместе с подключением. Оно хранится зашифрованным при хранении только если задан ENCRYPTION_KEY (конвертное шифрование); без этого ключа оно хранится в открытом виде, как и пароли подключений. Работает везде, включая управляемые/облачные развёртывания.
  • Путь к файлу на сервере: ключ уже находится в файловой системе сервера мониторинга и указывается по пути. Для этого требуется задать переменную окружения BETTERDB_SSH_KEY_DIR с каталогом, содержащим разрешённые ключи, и указанный путь должен разрешаться внутри него, чтобы API никогда не мог быть принуждён к чтению произвольных файлов. Оставьте BETTERDB_SSH_KEY_DIR незаданной, чтобы отключить эту опцию.

При необходимости закрепите отпечаток ключа хоста 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 (встроенная строка) или вставьте его в UI в разделе Settings → License → "Air-gapped environment? Activate an 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` на этот UID (показано выше) — иначе
> сохранение состояния завершится ошибкой `EACCES … license.jwt`.

Полный порядок действий, приоритет проверки и инструкцию по ротации ключей см. в
**[Офлайн- и air-gapped-лицензии](https://github.com/betterdb-inc/monitor/blob/master/docs/offline-licenses.md)** и
**[Справочнике по конфигурации](https://github.com/betterdb-inc/monitor/blob/master/docs/configuration.md#license-configuration)**.

### Сведения об образе Docker

- **Базовый образ**: `node:20-alpine`
- **Сжатый размер**: ~360MB (`latest` / `-no-ai`) / ~640MB (версионированный образ с локальными LLM-зависимостями экспериментального AI Helper)
- **Платформы**: `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Продакшен / serverless 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. Дев-сервер на порту 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-образов:```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 strict mode, явные возвращаемые типы, без `any`
- Настроены ESLint + Prettier

## Лицензия

- Содержимое в `docs/` лицензировано под CC BY-SA 4.0.
- Содержимое в `proprietary/` покрывается коммерческой лицензией (см. `proprietary/LICENSE`). Эти функции бесплатны в период раннего доступа.
- Всё остальное — [MIT](https://github.com/betterdb-inc/monitor/blob/master/LICENSE).

Категории