
Monitoreo en tiempo real y análisis de slowlog para bases de datos Valkey y Redis con detección de anomalías, auditoría de ACL y exportación de métricas de Prometheus.
La capa de monitoreo que Valkey se merece.
BetterDB persiste lo que Valkey descarta: slowlogs, patrones de comandos, actividad de clientes, señales de anomalías... para que puedas depurar qué ocurrió a las 3 de la madrugada, no solo lo que está pasando ahora. Diseñado para Valkey 8.x con soporte nativo para COMMANDLOG, CLUSTER SLOT-STATS y métricas de E/S por hilo. Compatible con Redis 6+ para todo lo demás.
Sitio web | Docker Hub | npm | Documentación | Blog
BetterDB es desarrollado por BetterDB Inc., una empresa de beneficio público que opera bajo la OCV Open Charter.

docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest
Apunta tu navegador a http://localhost:3001. Para monitorear una instancia específica:
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
Se publican dos variantes de imagen, ambas multi-arquitectura (linux/amd64, linux/arm64):
| Etiqueta | Qué es |
|---|---|
latest, X.Y.Z-no-ai | Imagen predeterminada: incluye todas las funciones de monitoreo, sin las dependencias del asistente de IA experimental con LLM local |
X.Y.Z | Añade el asistente de IA experimental (trae tu propio Ollama; desactivado por defecto mediante AI_ENABLED) |
Consulta Implementación de producción con Docker para almacenamiento persistente, puertos personalizados, licencias y entornos aislados (air-gapped).
Ejecuta BetterDB Monitor sin Docker:
npx @betterdb/monitor
En la primera ejecución, un asistente de configuración interactivo te guía a través de la conexión a la base de datos, el backend de almacenamiento (SQLite, PostgreSQL o en memoria) y los ajustes del servidor. La configuración se guarda en ~/.betterdb/config.json.
npm install -g @betterdb/monitor # instalación global
betterdb --setup # re-ejecutar el asistente de configuración
betterdb --port 8080 # sobrescribir el puerto del servidor
betterdb --db-host 1.2.3.4 # sobrescribir el host de la base de datos
betterdb --help # todas las opciones
Requiere Node.js >= 20.0.0 y una instancia de Valkey o Redis para monitorear. Para almacenamiento SQLite, ejecuta también npm install -g better-sqlite3.
@betterdb/mcp.betterdb_*. Consulta docs/prometheus-metrics.md.Nota: En las compilaciones de producción (Docker, CLI), las rutas de la API se sirven bajo el prefijo
/api. En el desarrollo local (pnpm dev) no hay prefijo; por ejemplo,http://localhost:3001/health.
| Base de datos | Versión mínima | Funciones compatibles |
|---|---|---|
| Valkey | 8.0+ | Todas las funciones, incluyendo COMMANDLOG (8.1+) y CLUSTER SLOT-STATS |
| Redis | 6+ | Todas las funciones excepto COMMANDLOG y CLUSTER SLOT-STATS, exclusivos de Valkey |
El backend utiliza un adaptador unificado sobre el cliente compatible por cable iovalkey y detecta automáticamente Valkey vs Redis a partir de la respuesta INFO (DB_TYPE=auto). Capacidades como COMMANDLOG y SLOT-STATS se detectan según la versión, y la interfaz degrada con elegancia cuando una función no está disponible.
Los servicios gestionados también son compatibles: hay guías para AWS ElastiCache, MemoryDB, Redis Cloud y Upstash en docs/providers, y @betterdb/agent llega a instancias solo-VPC mediante un WebSocket de salida.
La imagen de Docker contiene la aplicación de monitoreo (backend + frontend). Requiere:
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
Establece la variable de entorno PORT y haz coincidir el mapeo -p:
docker run -d \
--name betterdb-monitor \
-p 8080:8080 \
-e PORT=8080 \
-e DB_HOST=your-valkey-host \
betterdb/monitor
Si tu Valkey y PostgreSQL se ejecutan en el mismo host:
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
Referencia completa, incluyendo IA, exportación OTLP, ajuste de webhooks y umbrales de compuerta de salud: docs/configuration.md.
BetterDB Monitor desbloquea las funciones Pro/Enterprise de una de dos maneras, según si el host tiene acceso a internet:
BETTERDB_LICENSE_KEY. El monitor la valida
contra betterdb.com y almacena en caché un token firmado verificado localmente, de
modo que tu nivel sigue funcionando durante cortes y reinicios breves.Cada derecho es un JWT RS256 firmado. El monitor lo verifica localmente contra las claves públicas integradas en la imagen: nunca necesita contactar con un servidor de licencias para confiar en un token. Así, un host aislado puede ejecutar niveles de pago con cero conectividad:
.jwt, Pro/Enterprise). No contiene
secretos y no puede ser manipulado: cualquier edición rompe la firma.BETTERDB_OFFLINE_LICENSE_FILE (ruta), BETTERDB_OFFLINE_LICENSE
(cadena en línea), o pégalo en la interfaz en Settings → License → "Air-gapped
environment? Activate an offline license."Cuando se configura un token offline y no se establece BETTERDB_LICENSE_KEY, el
monitor realiza cero solicitudes salientes: las comprobaciones de licencia, la telemetría
y los avisos de actualización están todos desactivados. Ejecuta el nivel concedido hasta que
el token expire (las licencias perpetuas se vuelven a descargar anualmente) y luego vuelve a Community.
# totalmente offline: no se requiere red
docker volume create betterdb-data
docker run --rm -v betterdb-data:/d alpine chown 1001:1001 /d # volumen escribible por UID 1001 (una sola vez)
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
Verifica con GET /api/license/status → source: offline-token, mode: offline,
airGapped: true.
Persistencia: monta un volumen escribible en
/app/datapara que la licencia offline y el token de gracia por cortes en línea sobrevivan a los reinicios. El contenedor se ejecuta como UID 1001, por lo que un volumen recién creado debe serchowneado al mismo (se muestra arriba); de lo contrario, la persistencia falla conEACCES … license.jwt.
Para el flujo completo, la precedencia de verificación y el runbook de rotación de claves, consulta Offline & Air-Gapped Licenses y la referencia de configuración.
node:20-alpinelatest / -no-ai) / ~640MB (imagen versionada con las dependencias de LLM local del asistente de IA experimental)linux/amd64, linux/arm64docker logs -f betterdb-monitor # seguir logs
docker stop betterdb-monitor # detener
docker rm betterdb-monitor # eliminar
BetterDB Monitor persiste el registro de auditoría, analíticas, capturas y datos de anomalías en uno de tres backends:
Las métricas se exponen en GET /api/prometheus/metrics en formato de texto Prometheus: auditoría ACL, conexiones de clientes, patrones de slowlog/commandlog, memoria, rendimiento, keyspace, replicación, estadísticas de slots del clúster y métricas del runtime de Node.js, todas con el prefijo betterdb_.
scrape_configs:
- job_name: 'betterdb-monitor'
metrics_path: '/api/prometheus/metrics'
static_configs:
- targets: ['your-monitor-host:3001']
Referencia completa de métricas: docs/prometheus-metrics.md y docs/prometheus-integration.md.
betterdb-monitor/
├── apps/
│ ├── api/ # Backend NestJS (Fastify)
│ └── web/ # Frontend React (Vite)
├── packages/ # Paquetes publicados (ver más abajo)
├── docs/ # Sitio de documentación (Jekyll)
├── docker-compose.yml # Valkey local (puerto 6380) y Redis (puerto 6382) para pruebas
└── package.json # Raíz del workspace
Este monorepo incluye varios paquetes independientes. Consulta packages/ para la lista completa.
iovalkey para conexiones Valkey/Redis, TypeScript en modo estricto. Puerto 3001.Requisitos previos: Node.js >= 20.0.0, pnpm >= 9.0.0, Docker.
pnpm install
cp .env.example .env
pnpm docker:dev # Valkey local (6380) y Redis (6382)
pnpm dev # web en :5173, api en :3001
Para conectarte a Redis en lugar de Valkey, establece DB_PORT=6382 en .env.
pnpm dev:api # solo API
pnpm dev:web # solo frontend
pnpm docker:dev:down # detener bases de datos locales
pnpm build # compilación de producción
pnpm test # pruebas de API
Compilación de imágenes Docker:
pnpm docker:build # compilación local
pnpm docker:publish # compilación y publicación multi-arquitectura (requiere buildx)
apps/api/src/apps/web/src/api/packages/shared/src/types/anydocs/ está licenciado bajo CC BY-SA 4.0.proprietary/ está cubierto por una licencia comercial (consulta proprietary/LICENSE). Estas funciones son gratuitas durante el acceso anticipado.| Interfaz | Detalles |
|---|
| Web UI | http://localhost:3001 |
| Servidor MCP | npx @betterdb/mcp (stdio): crea un token en Settings → MCP Tokens |
| Prometheus | http://localhost:3001/api/prometheus/metrics |
| API REST (OpenAPI) | http://localhost:3001/docs |
| Comprobación de salud | http://localhost:3001/api/health |
| Variable | Requerida | Valor por defecto | Descripción |
|---|
DB_HOST | Sí | localhost | Host de Valkey/Redis a monitorear |
DB_PORT | No | 6379 | Puerto de Valkey/Redis |
DB_PASSWORD | No | - | Contraseña de Valkey/Redis |
DB_USERNAME | No | default | Usuario ACL de Valkey/Redis |
DB_TYPE | No | auto | Tipo de base de datos: auto, valkey o redis |
STORAGE_TYPE | No | memory | Backend de almacenamiento: memory o postgres |
STORAGE_URL | Condicional | - | URL de conexión a PostgreSQL (requerida si STORAGE_TYPE=postgres) |
PORT | No | 3001 | Puerto HTTP de la aplicación |
NODE_ENV | No | production | Entorno de Node |
ANOMALY_DETECTION_ENABLED | No | true | Habilita la detección de anomalías |
ANOMALY_PROMETHEUS_INTERVAL_MS | No | 30000 | Intervalo de actualización del resumen de Prometheus (ms) |
BETTERDB_LICENSE_KEY | No | - | Clave de licencia en línea (Pro/Enterprise), validada a través de la red |
BETTERDB_OFFLINE_LICENSE_FILE | No | - | Ruta a una licencia offline firmada .jwt para hosts aislados (air-gapped) (ver más abajo) |
BETTERDB_OFFLINE_LICENSE | No | - | Token de licencia offline como cadena JWT en línea |
BETTERDB_DATA_DIR | No | /app/data | Directorio para el estado de licencia persistido (monta un volumen escribible) |
BETTERDB_TELEMETRY | No | true | Establece false para desactivar la telemetría anónima |
| Backend | Caso de uso | Notas |
|---|
memory | Pruebas, entornos efímeros | Predeterminado en Docker; todos los datos se pierden al reiniciar |
postgres | Producción | STORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db |
sqlite | Desarrollo local / CLI | No incluido en las imágenes de producción de Docker; STORAGE_SQLITE_FILEPATH opcional |
| Paquete | Lenguaje | Registro |
|---|
@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 | Harness de reproducción para comparar cachés semánticas |