
monitor v0.41.0
Мониторинг в реальном времени и анализ slowlog для баз данных Valkey и Redis с обнаружением аномалий, аудитом ACL и экспортом метрик в Prometheus.
BetterDB Monitor
Слой мониторинга, которого заслуживает 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.

Быстрый старт (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 | Нет | 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, чтобы отключить анонимную телеметрию |
Полный справочник, включая 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. Монитор проверяет его локально с помощью открытых ключей, встроенных в образ — ему никогда не нужно обращаться к лицензионному серверу, чтобы доверять токену. Таким образом, изолированный хост может работать на платных уровнях при нулевом подключении:
- На машине с доступом в интернет войдите на
betterdb.com/account/licenses и
скачайте токен офлайн-лицензии (
.jwt, Pro/Enterprise). Он не содержит секретов и не может быть подделан — любое изменение нарушает подпись. - Перенесите его на изолированный хост любым удобным способом (USB, управление конфигурацией, монтирование секрета Docker/Kubernetes).
- Предоставьте его через
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 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. Дев-сервер на порту 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).