# Warum Plausible?! 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 {class=text-accented} 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? {class=text-accented} 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? {class=text-accented} So übersichtlich: ## Ich will das auch selber hosten {class=text-accented} 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 {class=text-accented} 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 {class=text-accented} Die Clickhouse-Installation schaut bei uns circa so aus: ```yaml { title = "clickhouse-deployment.yaml" } 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: ```yaml { title = "clickhouse-secret.yaml" } 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: ```yaml { title = "clickhouse-service.yaml" } 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 {class=text-accented} Unser Deployment für Plausible selbst sieht so aus: ```yaml { title = "plausible-deployment.yaml" } --- 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: ```yaml { title = "plausible-config.yaml" } 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: ```yaml { title = "plausible-service.yaml" } apiVersion: v1 kind: Service metadata: name: plausible namespace: web labels: app: plausible spec: ports: - port: 8000 selector: app: plausible ``` ### Postgres Deployment {class=text-accented} 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](https://github.com/bitnami/charts/blob/main/bitnami/postgresql/README.md). ## Test {class=text-accented} Euer Statistik-Server sollte jetzt unter der IP-Adresse eures Servers am Port 8000 erreichbar sein, also `http://192.168.1.2:8000`. ## Branding {class=text-accented} Plausible bietet zudem die Möglichkeit, das Dashboard ohne Branding auf eurer eigenen Seite einzubinden. Wie super das aussieht? So [super](/de/statistiken). ## Outro {class=text-accented} 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.**