Der Bad Guy Google ist übel. Nicht nur wegen Analyse-Taktiken, die unsere Privatsphäre einschränken oder der exzessiven Verwendung von Cookies. Aber habt ihr jemals versucht, schnell eine bestimmte Metrik in Google Analytics zu finden? Genau. Viel Spaß dabei. Es ist einfach, Stunden in den sogenannten »Properties« und ihren Werten zu versenken – zumindest wenn man das Tool nicht täglich nutzt. Google lebt davon, Dinge zu verändern. Es ist eine Industrie, neue Leute auf neue Schulungen für neue Dashboards zu schicken. Deswegen haben wir uns nach Alternativen umgeschaut. Und – Spoiler-Alert: Wir haben was gefunden …

Plausible Held:innen #

Im Gegensatz zu Google heißt unser Held Plausible. Plausible ist freundlich zur Privatsphäre, lightweight und ja: open-source. Aber es geht noch besser: Wie auch unsere Website verwendet Plausible keine Cookies. Das Tool ist darüber hinaus compliant mit den geltenden Datenschutzregulierungen wie GDPR, CCPA und PECR. Die Server von Plausible stehen in der EU. Aber das beste: Plausible ermöglicht es uns, einen eigenen Statistik-Server zu betreiben. Außerdem gibt’s einen Darkmode. Ticks all the right boxes also. Und das ist jetzt keine generische catchphrase, die sich eine KI ausgedacht hat. Es. Ist. Wahr.

Warum nutzt das nicht Jede:r? #

Weil die Installation und Wartung eines Statistik-Servers natürlich Arbeit bedeutet. Allerdings Arbeit seitens der Administrator:innen. Bei Google liegt die Arbeit dagegen bei den User:innen.

Wie übersichtlich ist das jetzt? #

So übersichtlich:

Plausibles übersichtliches Dashboard Plausibles übersichtliches Dashboard
Das Plausible Dashboard

Ich will das auch selber hosten #

Ok. Deswegen haben wir hier ein bisschen zusammengeschrieben, wie das geht. Das setzt allerdings ein wenig Grundwissen für Container voraus. Falls ihr also Erfahrung mit Docker bzw. Kubernetes habt und ihr Images von Github downloaded, als sei es ein App-Store für Servergeschichten, dann seid ihr hier richtig.

Notiz
Wir verwenden Kubernetes als unseren Container-Orchestrator. Deswegen gehen wir hier nur darauf ein. Für Docker sind die Deployments ohnehin etwas einfacher.

Installation #

Prinzipiell besteht Plausible aus drei Containern. Die Datenbank, die die Werte der einzelnen Websites speichert, ist ein Clickhouse-Cluster. Die Einstellungen des Plausible-Dashboards werden dagegen in einer Postgres-Datenbank abgelegt. Und zu guter Letzt braucht es den Plausible-Container selbst. Er ist mit den beiden Datenbanken verbunden und hat einen vierten, optionalen Container dabei, der für Weekly-Mails zuständig ist.

Clickhouse Deployment #

Die Clickhouse-Installation schaut bei uns circa so aus:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: clickhouse
  namespace: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: clickhouse
  template:
    metadata:
      labels:
        app: clickhouse
    spec:
      containers:
        - name: clickhouse
          image: clickhouse/clickhouse-server:24.12.2.29-alpine
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 8123
          envFrom:
            - secretRef:
                name: clickhouse-secret
          volumeMounts:
            - mountPath: /var/lib/clickhouse
              name: plausible-clickhouse-data
          resources:
            limits:
              cpu: 600m
              memory: 4Gi
            requests:
              cpu: 300m
              memory: 2Gi
      volumes:
        - name: plausible-clickhouse-data
          persistentVolumeClaim:
            claimName: plausible-clickhouse-data 

Die Datenbank muss Daten persistieren, also dauerhaft auf eine Festplatte schreiben. Dafür haben wir ein sogennantes PV mit dem Namen plausible-clickhouse-data angelegt. Das verknüpfen wir mit dem Container. Außerdem braucht die Datenbank einen User und Passwörter. In Kubernetes ist es üblich, Zugangsdaten in Secrets abzulegen. Unser Secret ist also eine Datei, in der folgende Informationen stehen:

apiVersion: v1
kind: Secret
metadata:
    name: clickhouse-secret
    namespace: web
type: Opaque
stringData:
    CLICKHOUSE_DB: plausible_events_db
    CLICKHOUSE_USER: username
    CLICKHOUSE_PASSWORD: password

Das Secret wird mit dem Clickhouse-Container per Environment-Variable verknüpft. Damit Plausible auf die Statistik-Datenbank, also Clickhouse, zugreifen kann, geben wir noch einen Service an:

apiVersion: v1
kind: Service
metadata:
  name: clickhouse
  namespace: web
  labels:
    app: clickhouse
spec:
  ports:
    - port: 8123
  selector:
    app: clickhouse

Als Port ist im Container und im Service die Nummer 8123 angeben. Und das ist eigentlich auch schon die gesamte Installation von Clickhouse.

Plausible Deployment #

Unser Deployment für Plausible selbst sieht so aus:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: plausible
  namespace: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: plausible
  template:
    metadata:
      labels:
        app: plausible
    spec:
      - name: plausible-migrate
        image: ghcr.io/plausible/community-edition:v2.1.5
        command:
          - '/bin/sh'
          - '-c'
        args:
          # Uncomment first line for initial deployment and then switch
          # - 'sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run'
          # - '/entrypoint.sh db migrate'
        envFrom:
          - secretRef:
              name: plausible-config
      containers:
        - name: plausible
          image: ghcr.io/plausible/community-edition:v2.1.5
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 8000
          envFrom: 
          - secretRef:
              name: plausible-config
        - name: mail
          image: bytemark/smtp
          imagePullPolicy: "IfNotPresent"
          envFrom:
          - secretRef:
              name: plausible-config

Bei der Erstinstallation muss die Datenbank erstellt werden. Deswegen gebt ihr dem Container das Kommando 'sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run' mit. Das ist aber nur bei der Erstinstallation notwendig. Nachdem ihr die Datenbank erstellt habt, könnt ihr das vorige Kommando löschen und stattdessen: '/entrypoint.sh db migrate' mitgeben.

Die letzten Zeilen im Manifest beschreiben den Mail-Container, der als Image bytemark/smtp verwendet. Er ist optional und kann auch weggelassen werden. Dann habt ihr halt nicht die Möglichkeit wöchentliche Update-Mails automatisch zu versenden.

Auch unsere zwei Plausible-Container benötigen diverse Einstellungen und Credentials. Das Secret-File sieht so aus:

apiVersion: v1
kind: Secret
metadata:
    name: plausible-config
    namespace: web
type: Opaque
stringData:
    CLICKHOUSE_DATABASE_URL: http://username:password@clickhouse.web.svc.cluster.local:8123/plausible_events_db
    DATABASE_URL: postgresql://plausible:password@postgres.web.svc.cluster.local/plausible
    BASE_URL: https://statistics.example.com
    SMTP_HOST_ADDR: smtp.example.com
    SMTP_HOST_PORT: "587"
    CRON_ENABLED: "true"
    LOG_LEVEL: info
    DISABLE_REGISTRATION: invite_only
    ENABLE_EMAIL_VERIFICATION: "true"
    TOTP_VAULT_KEY: abc12345678912345678912345678912345678912345
    MAILER_EMAIL: hello@example.com
    MAILER_NAME: Hello
    SMTP_USER_PWD: password
    SMTP_USER_NAME: user@example.com

Mit CLICKHOUSE_DATABASE_URL teilen wir Plausible mit, wo die Clickhouse-Datenbank zu finden ist. DATABASE_URL ist das selbe für die Postgres-Datenbank. Base-Url entspricht der Url, wo euer Statistik-Server erreichbar sein soll. CRON_ENABLED setzt ihr auf true, damit der Server wiederkehrende Aufgaben, wie zum Beispiel ein wöchentliches Info-Mail, erledigen kann. Dann folgen noch ein paar Passwörter – unter anderem eben auch für euren Mailserver – und ihr seid fertig.

Jetzt brauchen wir nur noch einen Service, der auf den Port 8000 verweist, damit man über den Browser auf die Plausible-App auch zugreifen kann. Bei uns sieht der Service so aus:

apiVersion: v1
kind: Service
metadata:
  name: plausible
  namespace: web
  labels:
    app: plausible
spec:
  ports:
    - port: 8000
  selector:
    app: plausible

Postgres Deployment #

Um Postgres zu deployen habt ihr mehrere Möglichkeiten. Vermutlich habt ihr die Datenbank aber eh schon bereits in eurem Stack laufen. Falls nicht, empfehlen wir das Deployment von Bitnami zu nutzen. Mit Helm oder eben ohne. Wie das genau geht, steht hier.

Test #

Euer Statistik-Server sollte jetzt unter der IP-Adresse eures Servers am Port 8000 erreichbar sein, also http://192.168.1.2:8000.

Branding #

Plausible bietet zudem die Möglichkeit, das Dashboard ohne Branding auf eurer eigenen Seite einzubinden. Wie super das aussieht? So super.

Notiz
Wir wissen natürlich, dass Viele sich dafür entscheiden, die Website-Statistik geheim zu halten. Wir bei Lightwaves stehen aber für radikale Transparenz. Deswegen teilen wir unsere Website-Statistiken mit euch. Vielleicht habt ihr ja ein adäquates Mittel, damit wir unsere Bounce-Rate verbessern.

Outro #

Ok. Ehrlich gesagt ist das schon ein wenig Arbeit, so einen Statistik-Server aufzusetzen. Aber ja. Bei Lightwaves könnt ihr Plausible einfach zu eurem Website-Paket dazubuchen. Dann übernehmen wir diese komplizierte Installation und Wartung. Und ihr habt dann den privatsphärefreundlichsten Analytics-Server der Welt.

Deswegen Plausible – eure User:innen werden es appreciaten.