
Surveillance en temps réel et analyse des slowlogs pour les bases de données Valkey et Redis avec détection d'anomalies, audit des ACL et export des métriques Prometheus.
La couche de supervision que Valkey mérite.
BetterDB persiste ce que Valkey jette - slowlogs, motifs de commandes, activité client, signaux d'anomalie - afin que vous puissiez déboguer ce qui s'est passé à 3 h du matin, pas seulement ce qui se passe maintenant. Conçu pour Valkey 8.x avec prise en charge native de COMMANDLOG, CLUSTER SLOT-STATS et des métriques I/O par thread. Compatible Redis 6+ pour tout le reste.
Site web | Docker Hub | npm | Documentation | Blog
BetterDB est développé par BetterDB Inc., une société à but d'intérêt public opérant sous l'OCV Open Charter.

docker run -d --name betterdb -p 3001:3001 betterdb/monitor:latest
Ouvrez votre navigateur sur http://localhost:3001. Pour surveiller une instance spécifique :
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
Deux variantes d'image sont publiées, toutes deux multi-architectures (linux/amd64, linux/arm64) :
| Tag | Description |
|---|---|
latest, X.Y.Z-no-ai | Image par défaut - toutes les fonctionnalités de supervision incluses, sans les dépendances de l'Assistant IA local-LLM expérimental |
X.Y.Z | Ajoute l'Assistant IA expérimental (apportez votre propre Ollama ; désactivé par défaut via AI_ENABLED) |
Voir Déploiement en production avec Docker pour le stockage persistant, les ports personnalisés, les licences et les configurations air-gapped.
Exécutez BetterDB Monitor sans Docker :
npx @betterdb/monitor
Au premier lancement, un assistant de configuration interactif vous guide à travers la connexion à la base de données, le backend de stockage (SQLite, PostgreSQL ou en mémoire) et les paramètres du serveur. La configuration est enregistrée dans ~/.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
Nécessite Node.js >= 20.0.0 et une instance Valkey ou Redis à surveiller. Pour le stockage SQLite, exécutez également npm install -g better-sqlite3.
@betterdb/mcp.betterdb_*. Voir docs/prometheus-metrics.md.Remarque : Dans les builds de production (Docker, CLI), les routes API sont servies sous le préfixe
/api. En développement local (pnpm dev), il n'y a pas de préfixe - par ex.http://localhost:3001/health.
| Base de données | Version minimale | Fonctionnalités prises en charge |
|---|---|---|
| Valkey | 8.0+ | Toutes les fonctionnalités, y compris COMMANDLOG (8.1+) et CLUSTER SLOT-STATS |
| Redis | 6+ | Toutes les fonctionnalités, à l'exception de COMMANDLOG et CLUSTER SLOT-STATS, exclusifs à Valkey |
Le backend utilise un adaptateur unifié reposant sur le client iovalkey compatible au niveau du protocole et fait la différence entre Valkey et Redis à partir de la réponse INFO (DB_TYPE=auto). Les capacités comme COMMANDLOG et SLOT-STATS sont détectées par version, et l'interface se dégrade élégamment lorsqu'une fonctionnalité n'est pas disponible.
Les services managés sont également pris en charge - des guides pour AWS ElastiCache, MemoryDB, Redis Cloud et Upstash se trouvent dans docs/providers, et @betterdb/agent atteint les instances VPC-only via un WebSocket sortant.
L'image Docker contient l'application de supervision (backend + frontend). Elle nécessite :
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
Définissez la variable d'environnement PORT et faites correspondre le mappage -p :
docker run -d \
--name betterdb-monitor \
-p 8080:8080 \
-e PORT=8080 \
-e DB_HOST=your-valkey-host \
betterdb/monitor
Si votre Valkey et PostgreSQL s'exécutent sur le même hôte :
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
Référence complète, incluant l'IA, l'export OTLP, le réglage des webhooks et les seuils de health-gate : docs/configuration.md.
BetterDB Monitor débloque les fonctionnalités Pro/Enterprise de deux manières, selon que l'hôte dispose ou non d'un accès Internet :
BETTERDB_LICENSE_KEY. Le moniteur la valide auprès de betterdb.com et met en cache un jeton signé vérifié localement, afin que votre offre continue de fonctionner pendant les pannes courtes et les redémarrages.Chaque droit est un JWT RS256 signé. Le moniteur le vérifie localement à l'aide des clés publiques intégrées à l'image - il n'a jamais besoin de contacter un serveur de licences pour faire confiance à un jeton. Ainsi, un hôte air-gapped peut exécuter les offres payantes avec zéro connectivité :
.jwt, Pro/Enterprise). Il ne contient aucun secret et ne peut pas être falsifié - toute modification casse la signature.BETTERDB_OFFLINE_LICENSE_FILE (chemin), BETTERDB_OFFLINE_LICENSE (chaîne intégrée), ou collez-le dans l'interface sous Paramètres → Licence → « Environnement air-gapped ? Activer une licence hors ligne. »Lorsqu'un jeton hors ligne est configuré et qu'aucun BETTERDB_LICENSE_KEY n'est défini, le moniteur n'effectue aucune requête sortante - les vérifications de licence, la télémétrie et les pings de mise à jour sont tous désactivés. Il exécute l'offre accordée jusqu'à l'expiration du jeton (les licences perpétuelles sont re-téléchargées chaque année), puis revient à 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
Vérifiez avec GET /api/license/status → source: offline-token, mode: offline, airGapped: true.
Persistance : montez un volume accessible en écriture sur
/app/dataafin que la licence hors ligne et le jeton de grâce en ligne pour pannes survivent aux redémarrages. Le conteneur s'exécute en tant qu'UID 1001 ; un volume fraîchement créé doit donc êtrechowné vers cet UID (comme montré ci-dessus) - sinon la persistance échoue avecEACCES … license.jwt.
Pour le flux complet, la précédence de vérification et le runbook de rotation des clés, consultez Offline & Air-Gapped Licenses et la référence de configuration.
node:20-alpinelatest / -no-ai) / ~640 Mo (image versionnée avec les dépendances LLM locales de l'Assistant IA expérimental)linux/amd64, linux/arm64docker logs -f betterdb-monitor # follow logs
docker stop betterdb-monitor # stop
docker rm betterdb-monitor # remove
BetterDB Monitor persiste la piste d'audit, les analyses, les captures et les données d'anomalies dans l'un de ces trois backends :
Les métriques sont exposées sur GET /api/prometheus/metrics au format texte Prometheus : audit ACL, connexions clientes, motifs slowlog/commandlog, mémoire, débit, keyspace, réplication, statistiques des slots de cluster et métriques d'exécution Node.js - toutes préfixées betterdb_.
scrape_configs:
- job_name: 'betterdb-monitor'
metrics_path: '/api/prometheus/metrics'
static_configs:
- targets: ['your-monitor-host:3001']
Référence complète des métriques : docs/prometheus-metrics.md et 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
Ce monorepo fournit plusieurs paquets autonomes. Voir packages/ pour la liste complète.
iovalkey pour les connexions Valkey/Redis, mode strict TypeScript. Port 3001.Prérequis : 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
Pour vous connecter à Redis au lieu de Valkey, définissez DB_PORT=6382 dans .env.
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
Builds d'images Docker :
pnpm docker:build # local build
pnpm docker:publish # multi-arch build & push (requires buildx)
apps/api/src/apps/web/src/api/packages/shared/src/types/anydocs/ est sous licence CC BY-SA 4.0.proprietary/ est couvert par une licence commerciale (voir proprietary/LICENSE). Ces fonctionnalités sont gratuites pendant l'accès anticipé.| Interface | Détails |
|---|
| Interface Web | http://localhost:3001 |
| Serveur MCP | npx @betterdb/mcp (stdio) - créez un jeton sous Paramètres → Jetons MCP |
| Prometheus | http://localhost:3001/api/prometheus/metrics |
| API REST (OpenAPI) | http://localhost:3001/docs |
| Vérification de santé | http://localhost:3001/api/health |
| Variable | Requise | Défaut | Description |
|---|
DB_HOST | Oui | localhost | Hôte Valkey/Redis à surveiller |
DB_PORT | Non | 6379 | Port Valkey/Redis |
DB_PASSWORD | Non | - | Mot de passe Valkey/Redis |
DB_USERNAME | Non | default | Nom d'utilisateur ACL Valkey/Redis |
DB_TYPE | Non | auto | Type de base de données : auto, valkey ou redis |
STORAGE_TYPE | Non | memory | Backend de stockage : memory ou postgres |
STORAGE_URL | Conditionnelle | - | URL de connexion PostgreSQL (requise si STORAGE_TYPE=postgres) |
PORT | Non | 3001 | Port HTTP de l'application |
NODE_ENV | Non | production | Environnement Node |
ANOMALY_DETECTION_ENABLED | Non | true | Activer la détection d'anomalies |
ANOMALY_PROMETHEUS_INTERVAL_MS | Non | 30000 | Intervalle de mise à jour du résumé Prometheus (ms) |
BETTERDB_LICENSE_KEY | Non | - | Clé de licence en ligne (Pro/Enterprise), validée sur le réseau |
BETTERDB_OFFLINE_LICENSE_FILE | Non | - | Chemin vers une licence hors ligne signée .jwt pour les hôtes air-gapped (voir ci-dessous) |
BETTERDB_OFFLINE_LICENSE | Non | - | Jeton de licence hors ligne sous forme de chaîne JWT intégrée |
BETTERDB_DATA_DIR | Non | /app/data | Répertoire pour l'état de licence persisté (montez un volume accessible en écriture) |
BETTERDB_TELEMETRY | Non | true | Définissez false pour désactiver la télémétrie anonyme |
| Backend | Cas d'usage | Notes |
|---|
memory | Tests, environnements éphémères | Défaut dans Docker ; toutes les données sont perdues au redémarrage |
postgres | Production | STORAGE_TYPE=postgres + STORAGE_URL=postgresql://user:pass@host:port/db |
sqlite | Développement local / CLI | Non inclus dans les images Docker de production ; STORAGE_SQLITE_FILEPATH optionnel |
| Paquet | Langage | Registre |
|---|
@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 relecture pour benchmarker les caches sémantiques |