Rybbit: Die Self-Hosted Analytics-Revolution

Eine Anleitung zur Installation der Analytics-Alternative Rybbit

Rybbit: Die Self-Hosted Analytics-Revolution

Ok. Meine erste Webseite war damals noch komplett unbeaufsichtigt. Das gebe ich ja zu. Doch ich habe experimentell mit Google-Analytics herumgespielt. Toll. Wirklich. Hat sich aber angefühlt, als hätte ich gerade meine Seele verkauft.

Eigener Webserver mit offiziellen Zertifikaten
Der Basis-Artikel für alle folgenden Services, die ich hier demonstrieren werde…

Dann kam goaccess, womit ich die Logfiles der Webseiten ausgewertet habe. Da alles lokal lief, fühlte sich das viel besser an. Ich hätte aber doch schon gerne die Menge an Informationen, die ich von Google bekommen hatte.

Selfhostet Analytics
Eine selbst gehostete Alternative zu Google-Analytics

Und hier kam ein echter Konkurrent ins Spiel: Matomo. Ja, das war wirklich ein Gewinn.

Analytics selfhosted
Matomo stellt eine leistungsstarke, datenschutzfreundliche Open-Source-Alternative zu Google Analytics dar

Jetzt bin ich bei rybbit gelandet. Und das gefällt mir bis jetzt sehr gut:

Natürlich habe ich mich gefragt, warum immer der Frosch auftaucht. In Config-Files oder als Icon: Der Frosch symbolisiert wohl die Fähigkeit zur Transformation (wie aus Ei → Kaulquappe → Frosch) und verbindet verschiedene Elemente wie Wasser, Erde und Luft miteinander. Man darf also gespannt sein, was einen noch alles erwartet.

Warum meine Abkehr von Matomo?

Matomo kann vieles. Doch es ist schon seltsam, wenn man ein Projekt komplett autonom aufsetzen will, und findet dann ständig Menüeinträge, die einem versuchen kostenpflichtige Addons anzudrehen:

Die Hälfte der Menüleiste enthält solche Lockangebote. Das passt absolut nicht in meine Philosophie.

Was ist Rybbit und was macht es besonders?

Rybbit positioniert sich als direkte, aber modernere Alternative zu Werkzeugen wie Google Analytics oder Matomo. Der entscheidende Unterschied liegt im Ansatz: Rybbit ist von Grund auf “Privacy-First” konzipiert. Das bedeutet, es kommt standardmäßig ohne Cookies aus und ist damit konform zu Datenschutzverordnungen wie der DSGVO (GDPR) und CCPA.

Zu den herausragenden Merkmalen gehören:

  • Session Replay: Die Möglichkeit, anonymisierte Benutzersitzungen als Video wiederzugeben, um das Nutzerverhalten und potenzielle Usability-Probleme zu verstehen.
  • Echtzeit-Analyse: Ein Live-Dashboard, das Besucheraktivitäten ohne Verzögerung anzeigt.
  • Leistungsstarke Datenbank-Architektur: Durch den Einsatz von ClickHouse für Event-Daten und PostgreSQL für Metadaten wird eine hohe Performance auch bei großen Datenmengen sichergestellt.
  • Umfassende Einblicke: Neben Standardmetriken wie Seitenaufrufen und einzigartigen Besuchern bietet Rybbit auch Analysen zu User Journeys, Conversion Goals und Web Vitals.
  • Vollständig Open Source: Das gesamte Projekt ist unter der AGPL-3.0-Lizenz verfügbar, was Transparenz und volle Kontrolle über die eigene Instanz gewährleistet.

Die Architektur: Ein Blick unter die Haube

Um die Funktionsweise von Rybbit zu verstehen, ist ein Blick auf die Container-Architektur hilfreich. Die bereitgestellte docker-compose.yml-Konfiguration startet vier spezialisierte Dienste, die perfekt aufeinander abgestimmt sind. Man könnte es mit einer gut organisierten Küche vergleichen, in der jeder Koch seine feste Aufgabe hat.

  1. rybbit-postgres (Der Archivar): PostgreSQL ist eine robuste, relationale Datenbank. In diesem Setup dient sie als “Gedächtnis” für alle Metadaten. Hier werden Benutzerkonten, angelegte Webseiten, Konfigurationen und Einstellungen gespeichert. Es ist die organisatorische Grundlage der gesamten Anwendung.
  2. rybbit-clickhouse (Der Analyst): ClickHouse ist eine spaltenorientierte Datenbank, die für analytische Abfragen (OLAP) optimiert ist. Alle anfallenden Tracking-Events – jeder Klick, jeder Seitenaufruf – landen hier. Durch seine spezielle Architektur kann ClickHouse riesige Datenmengen in Millisekunden durchsuchen und aggregieren. Es ist das Hochleistungs-Herzstück für die eigentliche Analyse.
  3. rybbit-backend (Der Chefkoch): Dieser Container beherbergt die API, das Gehirn von Rybbit. Er nimmt die Tracking-Daten von den Webseiten entgegen und leitet sie an ClickHouse weiter. Gleichzeitig stellt er die aufbereiteten Daten für das Frontend bereit, indem er Anfragen an PostgreSQL und ClickHouse stellt.
  4. rybbit-client (Das Schaufenster): Hierbei handelt es sich um die Weboberfläche, die im Browser angezeigt wird. Dieses Frontend, entwickelt mit Next.js, visualisiert die vom Backend gelieferten Daten in Form von Dashboards, Graphen und Tabellen.

Diese Aufteilung sorgt für eine klare Trennung der Aufgaben und ermöglicht eine hohe Skalierbarkeit und Performance.

Die Bereitstellung mit Docker Compose

Die Inbetriebnahme von Rybbit erfolgt elegant über eine docker-compose.yml-Datei. Diese definiert alle notwendigen Dienste und deren Zusammenspiel. Hier ist ein vollständiger Webserver mit SSL-Zertifikat und Analytics. Wer also nur rybbit hinzufügen will, benötigt natürlich nur die vier rybbit Container:

services:
###############################################
####        nginx-proxy-manager           #####
###############################################
  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: "nginx-proxy-manager"
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '127.0.0.1:81:81' # Admin Web Port only per ssh-tunnel
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"
      # Uncomment this if IPv6 is not enabled on your host
      DISABLE_IPV6: 'true'
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    volumes:
      - ./nginx-proxy-manager/data:/data
      - ./nginx-proxy-manager/letsencrypt:/etc/letsencrypt
    networks:
      - web

###############################################
  rybbit-client:
    image: 'ghcr.io/rybbit-io/rybbit-client:latest'
    container_name: rybbit-client
    restart: unless-stopped
    expose:
      - 3002
    environment:
      # Die URL wird aus der .env-Datei geladen
      NEXT_PUBLIC_BACKEND_URL: [https://Deine-Domain.de]
    depends_on:
      - rybbit-backend
    networks:
      - web
    labels:
      - com.centurylinklabs.watchtower.enable=true

  rybbit-backend:
    image: 'ghcr.io/rybbit-io/rybbit-backend:latest'
    container_name: rybbit-backend
    restart: unless-stopped
    expose:
      - 3001
    environment:
      - NODE_ENV=production
      - DISABLE_SIGNUP=false
      - CLICKHOUSE_HOST=http://rybbit-clickhouse:8123
      - CLICKHOUSE_DB=analytics
      - CLICKHOUSE_PASSWORD=[Hier muss das Clickhouse-Passwort hin]
      - POSTGRES_HOST=rybbit-postgres
      - POSTGRES_PORT=5432
      - POSTGRES_DB=analytics
      - POSTGRES_USER=frog
      - POSTGRES_PASSWORD=[Hier muss das POSTGRES-Passwort eingefügt werden]
      - BETTER_AUTH_SECRET=[Einfach nur eine lange zufällige Zeichenfolge]
      - BASE_URL=[https://Deine-Domain.de]
    depends_on:
      - rybbit-postgres
      - rybbit-clickhouse
    networks:
      - web
      - backend
    labels:
      - com.centurylinklabs.watchtower.enable=true

  rybbit-postgres:
    image: 'postgres:15'
    container_name: rybbit-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_USER=frog
      - POSTGRES_PASSWORD=[Hier muss das POSTGRES-Passwort eingefügt werden]
      - POSTGRES_DB=analytics
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    networks:
      - backend
    labels:
      - com.centurylinklabs.watchtower.enable=true

  rybbit-clickhouse:
    image: 'clickhouse/clickhouse-server:latest'
    container_name: rybbit-clickhouse
    restart: unless-stopped
    environment:
      - CLICKHOUSE_DB=analytics
      - CLICKHOUSE_USER=default
      - CLICKHOUSE_PASSWORD=[Hier muss das Clickhouse-Passwort hin]
    volumes:
      - ./clickhouse-data:/var/lib/clickhouse
    networks:
      - backend
    labels:
      - com.centurylinklabs.watchtower.enable=true
###############################################

  website:
    image: nginx:latest
    container_name: website
    volumes:
      - "./website:/usr/share/nginx/html"
    depends_on:
      - nginx-proxy-manager
    expose:
      - "80:80"
    restart: unless-stopped
    labels:
      - "com.centurylinklabs.watchtower.enable=true"
    networks:
      - web

  networks:
    web:
      external: true
    backend:
      external: true

Jetzt wird der Stack noch gestartet:

docker compose up -d

Nachdem die Container laufen, kann die Weboberfläche unter der in BASE_URL definierten Domain aufgerufen werden. Dort wird der erste Administrator-Account angelegt. Direkt danach sollte die Variable DISABLE_SIGNUP auf true gesetzt und der Stack mit docker compose up -d neugestartet werden, um zu verhindern, dass sich unbefugte Personen registrieren.

Reverse-Proxy konfigurieren

Wie bei allen Webseiten, brauch auch rybbit eine BASE_URL, die im NPM konfiguriert werden muss:

Hier noch ein wichtiger Zwischenschritt, den ich vergessen hatte:

Und schließlich noch das SSL-Zertifikat:

Und das soll es auch schon gewesen sein.

Erster Start

Ruft man die BASE_URL im Browser auf, wird man mit der Login-Page begrüßt:

Der erste User ist automatisch der Administrator. Und hat man diesen Angelegt, sollte man unbedingt, wie oben beschrieben, weitere Signups verhindern!

Und dann kann es auch schon losgehen. In den Site-Settings erhält man das Tracking-Script, das man in den <head>-Abschnitt seiner Webseite kopieren muss. Fertig!

Erste Auswertungen

Schon nach wenigen Sekunden sieht man die ersten Zugriffe auf die Webseite:

Der Realtime-Monitor zeigt, wo meine Leser hauptsächlich herkommen:

Der nächste Menüeintrag zeigt es etwas deutlicher:

Und dann kommen wir auch zu den interessanteren Themen: Erreichte Ziele.

Erreichte Ziele

Hier kann man zum Beispiel eine URL angeben. Sollte ein Nutzer beim Lesen von Artikeln am Ende dazu gebracht worden sein, einen Link zu klicken, wird dies registriert. Ich habe das aktuell für eine Umfrage genutzt, ob meine Seite auf englisch umgestellt werden soll. In matomo sah das so aus:

Jetzt, da ich es auch auf rybbit eingerichtet habe, sieht es dort so aus:

Mal schauen, wie sich das entwickelt.

Neue, sehr interessante Funktionen

Replay!
Ja. Man kann genau beobachten, wie ein User klickt und scrollt. Das wird einem auf Wunsch auch als Film präsentiert. Dabei sieht man auch genau, wo auf dem Smartphone getippt, gewischt oder auf dem Rechner geklickt wurde:

So kann man gut erkennen, wie sich User durch meine Webseiten bewegen. Und ich hätte nie gedacht, warum Suchmaschinen die User auf meine Seiten schicken. Es ist hauptsächlich wegen dieser Webseiten:

Keepass im Google-Drive
Sichere, zentrale Verwaltung aller Passwörter an einem Ort mit automatischen Backups.
Nie wieder Google Photos
Die beste Open-Source-Alternative zu Google Photos
Größte Passwort-Liste zum Download verfügbar
Die RockYou Liste gilt als beste Wortliste, um Passwörter zu knacken. Jetzt ist eine 10 Milliarden Einträge lange Liste online gestellt worden.
Medicat: Ein USB-Rettungs-Stick für alle Fälle
Ein Werkzeug für den Notfall. So hat man einfach alles bereit! Auch eigene ISO-Images!

Aber ich sehe nun auch, wenn Perplexity und OpenAI vorbeischauen, um meine Webseiten ihrer KI anzutrainieren. Einerseits cool. Andererseits auch ein wenig Abgraben meiner Arbeit.

Auf die üblichen Informationen gehe ich nicht im Detail ein. Denn natürlich erkenne ich, wieviele individuelle User meine Webseiten sehen, welche Geräte sie verwenden, aus welcher Region sie kommen, wie oft sie zurückkehren...

Fazit

Rybbit stellt eine beeindruckende, datenschutzkonforme und vollständig quelloffene Alternative im Bereich der Web-Analyse dar. Die durchdachte Architektur mit PostgreSQL und ClickHouse verspricht hohe Performance, während die einfache Bereitstellung via Docker Compose den Einstieg erleichtert. Wer volle Kontrolle über seine Analyse-Daten wünscht und auf moderne Features wie Session Replays nicht verzichten möchte, findet in Rybbit eine exzellente Lösung und wird nicht durch kostenpflichtige Angebote überrascht.