Files
2026-06-09 18:40:21 +02:00

8.0 KiB


title: Rybbit created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, web-analytics, privacy, self-hosted, analytics, typescript, nextjs, postgresql, clickhouse, modern] confidence: high contested: false sources: [https://selfh.st/apps/?tag=web-analytics]

🚀 Rybbit

Plateforme d'analyse web moderne écrite en TypeScript/Next.js — concurrent récent et ambitieux d'Umami, avec un focus sur la session replay et l'e-commerce tracking. Source : selfh.st

📋 Métadonnées

Métadonnée Valeur
Site web rybbit.io
GitHub github.com/rybbit-io/rybbit
License AGPL-3.0
Langage TypeScript / Next.js / ClickHouse / PostgreSQL
Étoiles 667
Dernière MAJ 2026-05
Catégorie cat-web-analytics

📝 Description

Rybbit est un projet d'analytics web open source lancé en 2024, qui s'est rapidement imposé comme l'un des concurrents les plus actifs d'Umami et Plausible. Sa stack moderne (Next.js 14, ClickHouse pour les événements haute volumétrie, PostgreSQL pour les métadonnées) lui permet de gérer des sites à fort trafic tout en proposant des fonctionnalités avancées que les autres outils privacy-first n'ont pas.

Différenciateurs clés : session replay (lecture vidéo des sessions anonymisées), heatmap de clics et scroll depth, tracking e-commerce enrichi (revenus, AOV, conversion par produit), funnels multi-étapes, cohortes et rétention, API complète, dashboards publics en lecture seule, multi-sites, multi-utilisateurs (avec organisations), live stats (rafraîchissement temps réel), intégrations natives (Slack, Discord, webhooks).

Rybbit est distribué sous AGPL-3.0, ce qui en fait une alternative commercialement utilisable tant qu'on auto-héberge (sans revendre le service en marque blanche). L'éditeur propose une offre cloud à venir. Le projet est en pleine expansion — c'est l'un des projets self-hosted analytics qui bouge le plus vite en 2025-2026.

L'interface est particulièrement soignée (Next.js App Router, animations, charts modernes), avec un mode sombre élégant et une navigation bien pensée. Les timezones sont gérées correctement, et l'export des données se fait en CSV ou via l'API.

🚀 Installation

Option 1 : Docker Compose (recommandé)

# docker-compose.yml
version: '3.8'

services:
  rybbit:
    image: ghcr.io/rybbit-io/rybbit:latest
    container_name: rybbit
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://rybbit:***@postgres:5432/rybbit
      CLICKHOUSE_URL: http://clickhouse:8123
      REDIS_URL: redis://redis:6379
      BETTER_AUTH_SECRET: changez-32-chars-min
      NEXT_PUBLIC_BASE_URL: https://rybbit.example.com
    depends_on:
      postgres:
        condition: service_healthy
      clickhouse:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - rybbit-net

  postgres:
    image: postgres:16-alpine
    container_name: rybbit-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: rybbit
      POSTGRES_USER: rybbit
      POSTGRES_PASSWORD: rybbit
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    networks:
      - rybbit-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U rybbit"]
      interval: 10s
      timeout: 5s
      retries: 5

  clickhouse:
    image: clickhouse/clickhouse-server:24-alpine
    container_name: rybbit-clickhouse
    restart: unless-stopped
    environment:
      CLICKHOUSE_DB: rybbit
      CLICKHOUSE_USER: rybbit
      CLICKHOUSE_PASSWORD: rybbit
      CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1
    volumes:
      - ./clickhouse-data:/var/lib/clickhouse
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    networks:
      - rybbit-net
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    container_name: rybbit-redis
    restart: unless-stopped
    volumes:
      - ./redis-data:/data
    networks:
      - rybbit-net
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

networks:
  rybbit-net:
    driver: bridge

Lancement :

docker compose up -d
# Accéder à http://localhost:3000 et créer le premier admin

Option 2 : Installation manuelle (Node.js)

git clone https://github.com/rybbit-io/rybbit.git
cd rybbit
pnpm install
# Configurer .env (DATABASE_URL, CLICKHOUSE_URL, REDIS_URL, BETTER_AUTH_SECRET)
pnpm db:migrate
pnpm build
pnpm start

Prérequis : Node.js 20+, pnpm 9+, PostgreSQL 16+, ClickHouse 24+, Redis 7+.

⚙️ Configuration

  • BETTER_AUTH_SECRET : clé secrète JWT, 32+ caractères, obligatoire en production.
  • DATABASE_URL : PostgreSQL pour les utilisateurs, orgs, metadata.
  • CLICKHOUSE_URL : URL HTTP du serveur ClickHouse (défaut : http://clickhouse:8123).
  • REDIS_URL : pour le rate limiting et la cache.
  • NEXT_PUBLIC_BASE_URL : URL publique servie par l'app.
  • ALLOWED_ORIGINS : liste CORS des sites autorisés à poster des events.
  • Snippet de tracking :
<script async defer src="https://rybbit.example.com/api/script.js"
  data-site-id="votre-site-id"></script>
  • Session replay : désactivé par défaut (charge CPU), à activer par site.
  • E-commerce : événements purchase, add_to_cart, checkout supportés nativement.
  • Multi-org : les organisations permettent de regrouper plusieurs sites et utilisateurs.

🔄 Alternatives

Open source :

Propriétaire (SaaS) :

  • Google Analytics 4 — leader, RGPD complexe
  • PostHog — analytics + session replay managé
  • Hotjar — heatmaps + replay
  • Plausible Cloud — payant
  • Matomo Cloud — version managée
  • Mixpanel — product analytics
  • Amplitude — product analytics enterprise
  • Umami Cloud — service officiel

🔒 Sécurité

  • BETTER_AUTH_SECRET : clé critique, à générer via openssl rand -base64 64 et stocker en secret manager.
  • HTTPS obligatoire : Traefik, Caddy ou Nginx avec certificats Let's Encrypt.
  • ALLOWED_ORIGINS : configurer strictement les domaines autorisés, sans wildcard.
  • ClickHouse : ne jamais exposer le port 8123/9000 sur Internet — bind sur réseau Docker interne uniquement.
  • PostgreSQL : idem, exposition interne uniquement.
  • Redis : bind interne, ou exiger un mot de passe (requirepass).
  • Sauvegardes : pg_dump quotidien (PostgreSQL), snapshots ClickHouse via BACKUP DATABASE.
  • Mettre à jour régulièrement — releases fréquentes, suivre les breaking changes (projet jeune).
  • Rate limiting sur /api/event : Rybbit dispose d'un rate limit Redis natif, surveiller les métriques.
  • Restreindre l'accès admin via IP allowlist ou VPN si possible.
  • Activer 2FA sur le compte admin (TOTP).

📚 Ressources

🔗 Pages Liées