Plausible Analytics auf einem VPS mit Docker Compose selbst hosten

12 Min. Lesezeit·Matthieu·privacygdprdocker-composeanalyticsplausibleclickhouse|

Installieren Sie Plausible Community Edition auf Ihrem VPS mit Docker Compose. Vollständige Anleitung zu Einrichtung, Tracking-Integration, benutzerdefinierten Events, Backups und Updates.

Plausible Analytics bietet Webanalyse ohne Cookies, ohne Erfassung personenbezogener Daten und ohne Consent-Banner. Wenn Sie die Community Edition selbst hosten, verlassen Ihre Besucherdaten niemals Ihren Server. Diese Anleitung behandelt den gesamten Lebenszyklus: Deployment von Plausible CE v3.2.0 mit Docker Compose, Integration des Tracking-Scripts, Einrichtung benutzerdefinierter Events, Backups und Updates.

Voraussetzungen: Ein VPS mit mindestens 4 GB RAM, auf dem Docker und Docker Compose laufen Docker in Produktion auf einem VPS: Was schiefgeht und wie Sie es beheben, ein Domainname, der auf Ihren Server zeigt, und ein Reverse Proxy für TLS Traefik vs Caddy vs Nginx: Docker Reverse Proxy im Vergleich.

Was ist Plausible Community Edition und wie unterscheidet sie sich von der Cloud-Version?

Plausible CE ist die kostenlose, unter AGPL lizenzierte, selbst gehostete Version von Plausible Analytics. Sie besteht aus drei Docker-Containern: der Plausible-Webanwendung (Elixir), PostgreSQL für Benutzerkonten und ClickHouse für die Speicherung von Analytics-Events. Sie erhalten dasselbe datenschutzfreundliche Dashboard wie bei der kostenpflichtigen Cloud-Version. Ihre Daten bleiben auf Ihrem Server. Die CE wird zweimal pro Jahr als Long-Term-Release veröffentlicht.

Die Unterschiede:

Funktion Cloud Community Edition
Analytics-Dashboard Ja Ja
Datenschutzfreundlich (ohne Cookies) Ja Ja
Benutzerdefinierte Events und Ziele Ja Ja
Stats API (v2) Ja Ja
E-Mail-Berichte Ja Ja (erfordert SMTP)
Funnels und Umsatzziele Ja Nein
Sites API Ja Nein
Looker Studio Connector Ja Nein
Google Search Console Integration Ja Ja (erfordert Konfiguration)
SSO / Teamverwaltung Ja Nein
Premium-Support Ja Nur Community
Update-Frequenz Wöchentlich Zweimal pro Jahr
Infrastrukturverwaltung Verwaltet Eigenverantwortlich

Die Cloud-Version basiert auf einem Abomodell. Aktuelle Preise finden Sie auf der Plausible-Preisseite. Selbst hosten kostet Sie nur die VPS-Ressourcen.

Welche Systemanforderungen gibt es für das Selbsthosting von Plausible?

ClickHouse ist die ressourcenhungrigste Komponente. Im Leerlauf benötigt es mindestens 2 GB RAM und verbraucht bei komplexen Abfragen über große Datenbestände deutlich mehr. Die CPU muss SSE-4.2-Instruktionen unterstützen (alle modernen x86_64-Prozessoren tun das; ARM64 mit NEON funktioniert ebenfalls). Planen Sie Ihren VPS entsprechend.

Ressource Minimum Empfohlen
RAM 2 GB 4 GB
CPU 1 vCPU (SSE 4.2) 2 vCPU
Festplatte 10 GB 20 GB+
Docker 20.10+ Aktuelle stabile Version
Docker Compose v2.x Aktuelle stabile Version

Das Festplattenwachstum hängt vom Traffic ab. Rechnen Sie mit etwa 1 GB pro 1-2 Millionen Seitenaufrufe in ClickHouse. Bei niedrigem Trafficvolumen (unter 100.000 Seitenaufrufe/Monat) ist die Festplattennutzung vernachlässigbar.

Wie installieren Sie Plausible Analytics mit Docker Compose?

Klonen Sie das offizielle Community-Edition-Repository beim Tag v3.2.0, konfigurieren Sie Ihre Umgebungsvariablen und starten Sie die Container. Der gesamte Vorgang dauert etwa fünf Minuten.

Klonen Sie das Repository:

git clone -b v3.2.0 --single-branch https://github.com/plausible/community-edition plausible-ce
cd plausible-ce

Sie erhalten die compose.yml, die ClickHouse-Konfigurationsdateien und eine README.

Wie konfigurieren Sie die Umgebungsvariablen?

Erstellen Sie eine .env-Datei im Verzeichnis plausible-ce. Zwei Variablen sind erforderlich. Die übrigen sind optional, einige werden aber dringend empfohlen.

Generieren Sie zunächst die Secrets:

openssl rand -base64 48

Dies gibt einen 64 Zeichen langen String aus. Kopieren Sie ihn für SECRET_KEY_BASE.

Generieren Sie einen separaten Schlüssel für die TOTP-Verschlüsselung:

openssl rand -base64 32

Erstellen Sie nun die .env-Datei:

cat > .env << 'EOF'
BASE_URL=https://plausible.example.com
SECRET_KEY_BASE=<your-64-char-secret>
TOTP_VAULT_KEY=<your-32-char-key>
DISABLE_REGISTRATION=invite_only

# SMTP for email reports and password resets
MAILER_EMAIL=plausible@example.com
SMTP_HOST_ADDR=mail.example.com
SMTP_HOST_PORT=587
SMTP_USER_NAME=plausible@example.com
SMTP_USER_PWD=<your-smtp-password>
SMTP_HOST_SSL_ENABLED=false
EOF

Schränken Sie die Dateiberechtigungen ein, da die Datei Secrets enthält:

chmod 600 .env
ls -la .env
-rw------- 1 root root 412 Mar 20 10:00 .env

Was jede Variable bewirkt:

  • BASE_URL: Die öffentliche URL, unter der Plausible erreichbar ist. Muss mit Ihrer Reverse-Proxy-Konfiguration übereinstimmen.
  • SECRET_KEY_BASE: Verschlüsselt Sessions und erzeugt abgeleitete Schlüssel. Mindestens 64 Bytes. Niemals weitergeben.
  • TOTP_VAULT_KEY: Verschlüsselt Zwei-Faktor-Authentifizierungs-Secrets mit AES256-GCM. Wenn nicht gesetzt, wird der Wert über PBKDF2 aus SECRET_KEY_BASE abgeleitet. Explizites Setzen ist sicherer für die Schlüsselrotation.
  • DISABLE_REGISTRATION: Setzen Sie den Wert auf invite_only (Standard) oder true, nachdem Sie Ihr Konto erstellt haben. Verhindert, dass Fremde sich auf Ihrer Instanz registrieren.
  • SMTP-Variablen: Erforderlich für E-Mail-Berichte, Passwort-Zurücksetzung und Einladungs-E-Mails. Ohne SMTP funktioniert Plausible, aber E-Mail-Funktionen sind deaktiviert.

Wie richten Sie einen Reverse Proxy mit TLS für Plausible ein?

Plausible lauscht standardmäßig auf Port 8000. Ihr Reverse Proxy leitet HTTPS-Traffic dorthin weiter. Wenn Sie bereits Caddy oder Traefik aus Traefik vs Caddy vs Nginx: Docker Reverse Proxy im Vergleich betreiben, fügen Sie Plausible als neues Upstream hinzu.

Erstellen Sie eine compose.override.yml, um Plausible mit Ihrem Reverse-Proxy-Netzwerk zu verbinden:

services:
  plausible:
    networks:
      - proxy
      - default

networks:
  proxy:
    external: true

Wenn Sie Caddy verwenden, fügen Sie dies zu Ihrem Caddyfile hinzu:

plausible.example.com {
    reverse_proxy plausible:8000
}

Wenn Sie Traefik verwenden, fügen Sie Labels zum Override hinzu:

services:
  plausible:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.plausible.rule=Host(`plausible.example.com`)"
      - "traefik.http.routers.plausible.tls.certresolver=letsencrypt"
      - "traefik.http.services.plausible.loadbalancer.server.port=8000"
    networks:
      - proxy
      - default

networks:
  proxy:
    external: true

Alternativ bietet Plausible eine eingebaute Let's-Encrypt-Unterstützung. Setzen Sie HTTP_PORT=80 und HTTPS_PORT=443 in Ihrer .env-Datei und geben Sie diese Ports im Override frei:

services:
  plausible:
    ports:
      - 80:80
      - 443:443

Dieser Ansatz ist einfacher, bedeutet aber, dass Plausible TLS selbst verwaltet. Das kann zu Konflikten führen, wenn andere Dienste denselben Server nutzen.

Container starten

docker compose up -d

Drei Container starten: plausible_db (PostgreSQL 16), plausible_events_db (ClickHouse 24.12) und plausible (die Webanwendung). Der Plausible-Container führt beim Start automatisch Datenbankmigrationen durch.

Prüfen Sie, ob alle drei gesund sind:

docker compose ps
NAME                  IMAGE                                          STATUS
plausible             ghcr.io/plausible/community-edition:v3.2.0     Up 30s (healthy)
plausible_db          postgres:16-alpine                             Up 35s (healthy)
plausible_events_db   clickhouse/clickhouse-server:24.12-alpine      Up 35s (healthy)

Alle drei sollten (healthy) anzeigen. Wenn ClickHouse (health: starting) zeigt, warten Sie eine weitere Minute. Es führt einen Healthcheck per wget gegen sein HTTP-Interface durch.

Administratorkonto erstellen

Öffnen Sie https://plausible.example.com in Ihrem Browser. Das Registrierungsformular erscheint. Erstellen Sie Ihr Konto. Mit DISABLE_REGISTRATION=invite_only können sich neue Benutzer nur registrieren, wenn Sie sie explizit über das Dashboard einladen.

Sperren Sie die Registrierung nach der Anmeldung vollständig, wenn Sie der einzige Benutzer sind:

Bearbeiten Sie .env und ändern Sie:

DISABLE_REGISTRATION=true

Dann starten Sie neu:

docker compose up -d

Wie fügen Sie das Plausible-Tracking-Script zu Ihrer Website hinzu?

Nach dem Login klicken Sie auf „Add a website" und geben Ihre Domain ein. Plausible generiert ein Tracking-Snippet. Das Standard-Script-Tag sieht so aus:

<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.js"></script>

Ersetzen Sie plausible.example.com durch die tatsächliche URL Ihrer Plausible-Instanz. Fügen Sie dieses Tag in den <head> jeder Seite ein, die Sie tracken möchten.

Wie fügen Sie Plausible zu einer statischen HTML-Website hinzu?

Fügen Sie das Script-Tag direkt in Ihren HTML-<head> ein:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>My Site</title>
    <script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.js"></script>
</head>
<body>
    <!-- content -->
</body>
</html>

Für statische Seitengeneratoren (Hugo, Jekyll, 11ty) fügen Sie das Script-Tag in Ihr Basis-Template oder Head-Partial ein.

Wie fügen Sie Plausible zu einer WordPress-Website hinzu?

Das offizielle Plausible Analytics WordPress-Plugin (v2.5.4, über 10.000 aktive Installationen) erledigt alles über das WordPress-Dashboard.

  1. Installieren Sie das Plugin: Plugins > Installieren > Suche „Plausible Analytics"
  2. Gehen Sie zu Einstellungen > Plausible Analytics
  3. Geben Sie die URL Ihrer selbst gehosteten Instanz ein (z. B. https://plausible.example.com)
  4. Geben Sie den zu trackenden Domainnamen ein
  5. Speichern

Das Plugin fügt das Tracking-Script automatisch ein. Es unterstützt auch WooCommerce-Conversion-Tracking und automatisches Formular-Tracking für Contact Form 7, WPForms und Ninja Forms.

Wie fügen Sie Plausible zu einer Next.js-App hinzu?

Verwenden Sie das Paket next-plausible (v3.12.5, 36.000 wöchentliche Downloads).

npm i next-plausible

Für den App Router (Next.js 13+) fügen Sie den Provider in Ihr Root-Layout ein:

import PlausibleProvider from "next-plausible";

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html>
      <head>
        <PlausibleProvider
          domain="yoursite.com"
          customDomain="https://plausible.example.com"
          selfHosted
        />
      </head>
      <body>{children}</body>
    </html>
  );
}

Für das Tracking benutzerdefinierter Events in Komponenten verwenden Sie den usePlausible-Hook:

"use client";
import { usePlausible } from "next-plausible";

export default function SignupButton() {
  const plausible = usePlausible();
  return (
    <button onClick={() => plausible("Signup")}>
      Sign up
    </button>
  );
}

Wie fügen Sie Plausible zu einer Single-Page-Application hinzu?

Für React, Vue, Svelte oder jede andere SPA fügen Sie das Script-Tag in Ihre index.html ein. Plausible erkennt Routenwechsel automatisch über die History API. Keine zusätzliche Konfiguration nötig.

Wenn Ihre SPA hashbasiertes Routing verwendet (/#/path), nutzen Sie die Hash-Erweiterung:

<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.hash.js"></script>

Wie tracken Sie benutzerdefinierte Events und Ziele in Plausible?

Benutzerdefinierte Events ermöglichen das Tracking von Aktionen über Seitenaufrufe hinaus: Buttonklicks, Formularübermittlungen, Dateidownloads, Registrierungen. Plausible bietet zwei Methoden: einen No-Code-Ansatz mit CSS-Klassen und eine JavaScript-API für dynamisches Tracking.

Aktivieren Sie zunächst das erweiterte Script, das benutzerdefinierte Events unterstützt. Ersetzen Sie die Standard-Script-Quelle:

<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.tagged-events.js"></script>

CSS-Klassen-Methode (ohne JavaScript)

Fügen Sie eine CSS-Klasse im Format plausible-event-name=EventName zu einem beliebigen HTML-Element hinzu:

<a href="/signup" class="plausible-event-name=Signup">Create Account</a>

<button class="plausible-event-name=Download+PDF">Download Report</button>

<form class="plausible-event-name=Contact+Form+Submit">
  <!-- form fields -->
</form>

Verwenden Sie + für Leerzeichen in Event-Namen. Einige CMS (Webflow) ersetzen = durch -. Verwenden Sie in dem Fall einen doppelten Bindestrich --: plausible-event-name--Signup.

JavaScript-API für dynamische Events

Rufen Sie die Funktion plausible() direkt auf, wenn Events bedingte Logik oder dynamische Eigenschaften benötigen:

// Simple event
plausible("Signup");

// Event with custom properties
plausible("Download", {
  props: { format: "PDF", document: "annual-report" }
});

// Event with a callback (useful for redirects)
plausible("Outbound Link", {
  props: { url: "https://example.com" },
  callback: () => { window.location = "https://example.com"; }
});

Ziel im Dashboard erstellen

Events erscheinen erst in Ihrem Dashboard, wenn Sie ein passendes Ziel erstellt haben. Gehen Sie zu Site Settings > Goals > Add Goal. Wählen Sie „Custom event" und geben Sie den exakten Event-Namen ein (z. B. Signup). Der Name ist case-sensitive und muss mit Ihrem Code übereinstimmen.

Wie nutzen Sie die Plausible Stats API?

Plausible enthält eine Stats API (v2) für den programmatischen Zugriff auf Ihre Analysedaten. Auf Ihrer selbst gehosteten Instanz ist die API-Basis-URL https://plausible.example.com/api/v2/query.

Erstellen Sie einen API-Schlüssel: Gehen Sie zu Account Settings > API Keys > New API Key > Stats API.

Fragen Sie die Besucherzahl der letzten 7 Tage ab:

curl --request POST \
  --header 'Authorization: Bearer YOUR-API-KEY' \
  --header 'Content-Type: application/json' \
  --url 'https://plausible.example.com/api/v2/query' \
  --data '{
    "site_id": "yoursite.com",
    "metrics": ["visitors", "pageviews", "bounce_rate"],
    "date_range": "7d"
  }'
{
  "results": [
    {
      "metrics": [1423, 3847, 42],
      "dimensions": []
    }
  ],
  "query": {
    "site_id": "yoursite.com",
    "metrics": ["visitors", "pageviews", "bounce_rate"],
    "date_range": ["2026-03-13", "2026-03-20"]
  }
}

Aufschlüsselung der Besucher nach Seite:

curl --request POST \
  --header 'Authorization: Bearer YOUR-API-KEY' \
  --header 'Content-Type: application/json' \
  --url 'https://www.example.com/api/v2/query' \
  --data '{
    "site_id": "yoursite.com",
    "metrics": ["visitors", "pageviews"],
    "date_range": "30d",
    "dimensions": ["event:page"],
    "pagination": {"limit": 5}
  }'

Die API unterstützt Filterung, zeitbasierte Dimensionen (time:day, time:month) und Sortierung. Das Ratenlimit beträgt 600 Anfragen pro Stunde. Die vollständige Stats-API-Referenz enthält alle verfügbaren Metriken und Dimensionen.

Wie richten Sie E-Mail-Berichte ein?

E-Mail-Berichte erfordern eine funktionierende SMTP-Konfiguration in Ihrer .env-Datei (oben im Abschnitt zur Einrichtung beschrieben). Sobald SMTP konfiguriert ist, kann jeder Benutzer wöchentliche oder monatliche E-Mail-Berichte über das Plausible-Dashboard aktivieren.

Gehen Sie zu Site Settings > Email Reports. Fügen Sie Empfängeradressen hinzu. Plausible sendet eine Zusammenfassung von Besuchern, meistbesuchten Seiten und Trafficquellen im gewählten Rhythmus.

Wenn E-Mails nicht ankommen, prüfen Sie die Plausible-Container-Logs:

docker compose logs plausible | grep -i mail

Häufige Probleme: falscher SMTP-Port (verwenden Sie 587 für STARTTLS, 465 für implizites TLS mit SMTP_HOST_SSL_ENABLED=true) oder Authentifizierungsfehler.

Wie sichern Sie eine selbst gehostete Plausible-Instanz?

Plausible speichert Daten in zwei Datenbanken und einem Volume. Wenn eines davon verloren geht, sind Daten unwiederbringlich weg. Sichern Sie alle drei.

Daten Speicher Backup-Methode
Benutzerkonten, Sitekonfiguration PostgreSQL pg_dump
Analytics-Events ClickHouse Volume-Backup oder BACKUP-Befehl
Zertifikate, Uploads Volume plausible-data Volume-Kopie

PostgreSQL sichern

docker compose exec plausible_db pg_dump -U postgres plausible_db | gzip > backup-postgres-$(date +%F).sql.gz

ClickHouse sichern

ClickHouse 24.12 unterstützt den BACKUP-Befehl nativ. Führen Sie ihn im Container aus:

docker compose exec plausible_events_db clickhouse-client \
  --query "BACKUP DATABASE plausible_events_db TO Disk('backups', 'plausible-$(date +%F).zip')"

Wenn die backups-Disk nicht konfiguriert ist, verwenden Sie ein Volume-Level-Backup:

docker compose stop plausible_events_db
docker run --rm \
  -v plausible-ce_event-data:/source:ro \
  -v $(pwd)/backups:/backup \
  alpine tar czf /backup/clickhouse-$(date +%F).tar.gz -C /source .
docker compose start plausible_events_db

Dies stoppt ClickHouse kurzzeitig. Für Backups ohne Ausfallzeit konfigurieren Sie die backups-Disk in ClickHouse oder verwenden Sie clickhouse-backup.

Automatisierung

Erstellen Sie ein Script unter /opt/plausible-backup.sh:

#!/bin/bash
set -euo pipefail
BACKUP_DIR=/opt/backups/plausible
mkdir -p "$BACKUP_DIR"
cd /opt/plausible-ce

# PostgreSQL
docker compose exec -T plausible_db pg_dump -U postgres plausible_db \
  | gzip > "$BACKUP_DIR/postgres-$(date +%F).sql.gz"

# ClickHouse volume
docker run --rm \
  -v plausible-ce_event-data:/source:ro \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf "/backup/clickhouse-$(date +%F).tar.gz" -C /source .

# Plausible data volume
docker run --rm \
  -v plausible-ce_plausible-data:/source:ro \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf "/backup/plausible-data-$(date +%F).tar.gz" -C /source .

# Rotate: keep 14 days
find "$BACKUP_DIR" -name "*.gz" -mtime +14 -delete

echo "Backup complete: $(ls -lh $BACKUP_DIR/*$(date +%F)*)"
chmod 700 /opt/plausible-backup.sh

Planen Sie die tägliche Ausführung mit cron:

crontab -e

Fügen Sie hinzu:

0 3 * * * /opt/plausible-backup.sh >> /var/log/plausible-backup.log 2>&1

Mehr zu Docker-Volume-Backup-Strategien finden Sie unter Docker-Volumes auf einem VPS sichern und wiederherstellen.

Wie aktualisieren Sie Plausible Community Edition sicher?

Plausible CE wird zweimal pro Jahr veröffentlicht. Pinnen Sie Ihre Version auf einen bestimmten Tag in compose.yml für vorhersagbare Upgrades. Die Standardkonfiguration pinnt bereits auf v3.2.0.

Versionspinning-Strategien:

Ebene Tag-Beispiel Was automatisch aktualisiert wird
Patch (sicherste) v3.2.0 Nichts. Nur manuelle Upgrades.
Minor v3.2 Patch-Releases (Bugfixes)
Major v3 Minor- und Patch-Releases

Empfohlen: Pinnen Sie auf Patch-Ebene und aktualisieren Sie manuell, nachdem Sie die Release Notes gelesen haben.

Upgrade-Verfahren

  1. Lesen Sie die Release Notes auf Breaking Changes

  2. Sichern Sie Ihre Datenbanken (führen Sie das Backup-Script oben aus)

  3. Laden Sie die neue Version herunter:

cd /opt/plausible-ce
git fetch --tags
git checkout v3.3.0  # replace with the target version
  1. Starten Sie die aktualisierten Container:
docker compose up -d

Plausible führt beim Start automatisch Datenbankmigrationen durch. Beobachten Sie die Logs beim ersten Start:

docker compose logs -f plausible

Suchen Sie nach [info] Migrations up to XXXXXXXX applied successfully in der Ausgabe. Wenn Migrationsfehler auftreten, löschen Sie nicht die alten Daten. Prüfen Sie die Upgrade-Wikiseite für versionsspezifische Anweisungen.

  1. Räumen Sie das alte Image auf:
docker image prune -f

Sicherheitspatches werden nicht auf ältere Versionen zurückportiert. Abonnieren Sie Release-Benachrichtigungen auf GitHub: Gehen Sie zum Repository, klicken Sie auf Watch > Custom > Releases.

Ist selbst gehostetes Plausible ohne Cookies DSGVO-konform?

Ja. Plausible setzt keine Cookies. Es erfasst und speichert keine personenbezogenen Daten. Eindeutige Besucher werden anhand eines Hashes aus der IP-Adresse des Besuchers und dem User-Agent-String gezählt. Dieser Hash wird alle 24 Stunden rotiert und niemals in Rohform gespeichert. Die Roh-IP-Adresse wird nach dem Hashing verworfen.

Das bedeutet:

  • Kein Cookie-Consent-Banner erforderlich nach DSGVO, CCPA oder PECR
  • Keine Verarbeitung personenbezogener Daten, daher gelten die Anforderungen an die Rechtsgrundlage nach Art. 6 DSGVO nicht
  • Selbsthosting stellt sicher, dass Daten niemals Ihren Server verlassen und nie an einen Auftragsverarbeiter übertragen werden
  • Sie bleiben der alleinige Verantwortliche, ohne Auftragsverarbeitungsverträge für Analytics

Wenn Sie Ihren VPS in der EU hosten (die Virtua Cloud Server befinden sich in europäischen Rechenzentren), bleiben Ihre Analysedaten in der EU. Keine Schrems-II-Transferprobleme.

Deshalb wechseln viele Indie-Hacker und datenschutzbewusste Entwickler von Google Analytics. Keine Consent-Banner, keine Reibung für Besucher und keine Auftragsverarbeitungsverträge.

ClickHouse-Ressourcenverbrauch überwachen

ClickHouse ist die ressourcenhungrigste Komponente. Im Leerlauf bei niedrigem Traffic verbraucht es etwa 500 MB RAM. Bei Abfragen über große Datenbestände kann es auf 2-3 GB ansteigen. Wenn Ihr VPS nur 2 GB RAM hat, kann es während Lastspitzen zu OOM-Kills kommen.

Überwachen Sie den Speicherverbrauch:

docker stats plausible_events_db --no-stream
CONTAINER ID   NAME                  CPU %   MEM USAGE / LIMIT   MEM %
a1b2c3d4e5f6   plausible_events_db   0.50%   487MiB / 3.84GiB    12.38%

Die mit Plausible CE ausgelieferte ClickHouse-Konfiguration enthält bereits Low-Resource-Overrides (über low-resources.xml und default-profile-low-resources-overrides.xml). Diese begrenzen den Speicherverbrauch für Merges und Abfragen.

Wenn Sie weiter optimieren müssen, erstellen Sie eine clickhouse/custom.xml-Override-Datei und binden Sie sie in compose.override.yml ein. Zu Ressourcenlimits in Docker Compose siehe Docker Compose Ressourcenlimits, Healthchecks und Neustartrichtlinien.

Prüfen Sie die ClickHouse-Logs auf Warnungen:

docker compose logs plausible_events_db | grep -i "memory\|oom"

Etwas funktioniert nicht?

Container starten nicht: Prüfen Sie docker compose logs <service>. Häufige Ursachen: Portkonflikte, fehlende .env-Variablen, ClickHouse scheitert an der SSE-4.2-Prüfung bei älteren CPUs.

„Bad Request" auf der Login-Seite: Ihre BASE_URL stimmt nicht mit der aufgerufenen URL überein. Plausible prüft den Origin-Header gegen BASE_URL, um Cross-Site-Request-Forgery zu verhindern.

Tracking-Script zeichnet keine Besuche auf: Öffnen Sie die Browser-Entwicklertools, prüfen Sie im Netzwerk-Tab die Anfragen an /api/event. Eine 202-Antwort bedeutet, dass das Event akzeptiert wurde. Bei CORS-Fehlern entfernt Ihr Reverse Proxy Header. Stellen Sie sicher, dass der Proxy den Host-Header weiterleitet.

E-Mail-Berichte werden nicht gesendet: Überprüfen Sie die SMTP-Zugangsdaten. Prüfen Sie die Logs mit docker compose logs plausible | grep -i smtp. Testen Sie Ihren SMTP-Server unabhängig mit swaks oder openssl s_client.

ClickHouse durch OOM-Killer beendet: Ihr VPS hat nicht genug RAM. Upgraden Sie auf mindestens 4 GB oder reduzieren Sie max_memory_usage in einem ClickHouse-Konfigurations-Override.

Dashboard zeigt nach dem Setup null Besucher: Das Tracking-Script wird möglicherweise von Adblockern blockiert. Erwägen Sie, das Script über Ihre Hauptdomain zu proxyen. In der Plausible-Dokumentation wird dies als Proxy-Setup bezeichnet.

Zur Überwachung der Verfügbarkeit Ihrer Plausible-Instanz siehe Uptime Kuma und Beszel auf einem VPS mit Docker Compose selbst hosten.