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:

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.
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: passwordDas 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: clickhouseAls 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-configBei 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.comMit 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: plausiblePostgres 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.
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.

