Valkey 值得拥有的监控层。
BetterDB 持久化保存 Valkey 丢弃的数据——慢日志、命令模式、客户端活动、异常信号——让你不仅能调试当前正在发生的事情,还能排查凌晨 3 点发生了什么。专为 Valkey 8.x 构建,原生支持 COMMANDLOG、CLUSTER SLOT-STATS 和每线程 I/O 指标。其余所有功能兼容 Redis 6+。
网站 | Docker Hub | npm | 文档 | 博客
BetterDB 由 BetterDB Inc. 构建,这是一家依据 OCV Open Charter 运营的公益公司。

docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest
在浏览器中访问 http://localhost:3001。要监控特定实例:
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
发布两个镜像变体,均支持多架构(linux/amd64、linux/arm64):
| 标签 | 说明 |
|---|---|
latest, X.Y.Z-no-ai | 默认镜像——包含所有监控功能,但不包含实验性本地 LLM AI Helper 的依赖 |
X.Y.Z | 添加实验性 AI Helper(自带 Ollama;默认通过 AI_ENABLED 禁用) |
有关持久化存储、自定义端口、许可和离线(air-gapped)部署,请参阅 Docker 生产部署。
无需 Docker 即可运行 BetterDB Monitor:
npx @betterdb/monitor
首次运行时,交互式设置向导会引导你完成数据库连接、存储后端(SQLite、PostgreSQL 或内存模式)以及服务器设置。配置将保存到 ~/.betterdb/config.json。
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。
@betterdb/mcp 为 Claude Code、Cursor 或任何 MCP 客户端提供 60 个工具。betterdb_* 指标。参见 docs/prometheus-metrics.md。注意:在生产构建(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 客户端的统一适配器,并通过 INFO 响应自动检测是 Valkey 还是 Redis(DB_TYPE=auto)。COMMANDLOG 和 SLOT-STATS 等功能按版本检测,当某个功能不可用时,UI 会优雅降级。
同样支持托管服务——AWS ElastiCache、MemoryDB、Redis Cloud 和 Upstash 的指南位于 docs/providers,@betterdb/agent 通过出站 WebSocket 连接仅限 VPC 的实例。
Docker 镜像包含监控应用程序(后端 + 前端)。它需要:
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 映射:
docker run -d \
--name betterdb-monitor \
-p 8080:8080 \
-e PORT=8080 \
-e DB_HOST=your-valkey-host \
betterdb/monitor
如果你的 Valkey 和 PostgreSQL 运行在同一台主机上:
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
完整参考,包括 AI、OTLP 导出、webhook 调优和健康门限阈值: docs/configuration.md。
BetterDB Monitor 根据主机是否有互联网访问权限,通过以下两种方式之一解锁 Pro/Enterprise 功能:
BETTERDB_LICENSE_KEY。监控器会向 betterdb.com 验证该密钥,并缓存一个本地验证的签名令牌,因此你的服务等级在短暂中断和重启期间仍能正常工作。每项授权都是一个有符号的 RS256 JWT。监控器使用镜像中内置的公钥在本地验证它——无需连接许可证服务器即可信任令牌。因此,离线主机可以在零连接的情况下运行付费版本:
.jwt,Pro/Enterprise)。它不包含任何机密信息,也
无法被篡改——任何修改都会破坏签名。BETTERDB_OFFLINE_LICENSE_FILE(路径)、BETTERDB_OFFLINE_LICENSE
(内联字符串)提供,或粘贴到 UI 的 设置 → 许可证 → “离线环境?
激活离线许可证。” 中。当配置了离线令牌且未设置 BETTERDB_LICENSE_KEY 时,监控器会发出零出站请求——许可证检查、遥测和更新探测全部禁用。它会以授予的服务等级运行,直到令牌过期(永久许可证每年重新下载),然后回退到 Community 版。
# 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。
有关完整流程、验证优先级和密钥轮换运行手册,请参阅 离线与隔离环境许可证 和 配置参考。
node:20-alpinelatest / -no-ai)/ 约 640MB(带实验性 AI Helper 本地 LLM 依赖的版本化镜像)linux/amd64、linux/arm64docker logs -f betterdb-monitor # follow logs
docker stop betterdb-monitor # stop
docker rm betterdb-monitor # remove
BetterDB Monitor 将审计追踪、分析、捕获和异常数据持久化到以下三种后端之一:
指标以 Prometheus 文本格式在 GET /api/prometheus/metrics 暴露:ACL 审计、客户端连接、慢日志/命令日志模式、内存、吞吐量、键空间、复制、集群槽位统计和 Node.js 运行时指标——均以 betterdb_ 为前缀。
scrape_configs:
- job_name: 'betterdb-monitor'
metrics_path: '/api/prometheus/metrics'
static_configs:
- targets: ['your-monitor-host:3001']
完整指标参考: docs/prometheus-metrics.md 和 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
该 monorepo 发布了多个独立软件包。完整列表请参见 packages/。
iovalkey 进行 Valkey/Redis 连接,TypeScript 严格模式。端口 3001。前置要求:Node.js >= 20.0.0、pnpm >= 9.0.0、Docker。
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,请在 .env 中设置 DB_PORT=6382。
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 镜像构建:
pnpm docker:build # local build
pnpm docker:publish # multi-arch build & push (requires buildx)
apps/api/src/ 中添加新端点apps/web/src/api/ 中添加相应的 API 调用packages/shared/src/types/ 中添加共享类型anydocs/ 下的内容采用 CC BY-SA 4.0 许可。proprietary/ 下的内容受商业许可保护(参见 proprietary/LICENSE)。这些功能在抢先体验期间免费。| 接口 | 详情 |
|---|
| Web UI | http://localhost:3001 |
| MCP 服务器 | npx @betterdb/mcp (stdio) - 在“设置 → MCP 令牌”下创建令牌 |
| Prometheus | http://localhost:3001/api/prometheus/metrics |
| REST API (OpenAPI) | http://localhost:3001/docs |
| 健康检查 | http://localhost:3001/api/health |
| 变量 | 必填 | 默认值 | 说明 |
|---|
DB_HOST | 是 | localhost | 要监控的 Valkey/Redis 主机 |
DB_PORT | 否 | 6379 | Valkey/Redis 端口 |
DB_PASSWORD | 否 | - | Valkey/Redis 密码 |
DB_USERNAME | 否 | default | Valkey/Redis ACL 用户名 |
DB_TYPE | 否 | auto | 数据库类型:auto、valkey 或 redis |
STORAGE_TYPE | 否 | memory | 存储后端:memory 或 postgres |
STORAGE_URL | 条件必填 | - | PostgreSQL 连接 URL(若 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 的路径,用于**离线(air-gapped)**主机(见下文) |
BETTERDB_OFFLINE_LICENSE | 否 | - | 作为内联 JWT 字符串的离线许可证令牌 |
BETTERDB_DATA_DIR | 否 | /app/data | 持久化许可证状态的目录(挂载可写卷) |
BETTERDB_TELEMETRY | 否 | true | 设为 false 可禁用匿名遥测 |
| 后端 | 使用场景 | 备注 |
|---|
memory | 测试、临时环境 | Docker 中默认;重启后所有数据丢失 |
postgres | 生产环境 | STORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db |
sqlite | 本地开发 / CLI | 不包含在 Docker 生产镜像中;STORAGE_SQLITE_FILEPATH 可选 |
| 软件包 | 语言 | 仓库 |
|---|
@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 | 用于对语义缓存进行基准测试的回放工具 |