Plausible Analytics zelf hosten op een VPS met Docker Compose
Installeer Plausible Community Edition op je VPS met Docker Compose. Complete handleiding voor installatie, tracking-script integratie, aangepaste events, backups en updates.
Plausible Analytics biedt webanalyse zonder cookies, zonder verzameling van persoonsgegevens en zonder toestemmingsbanners. De Community Edition zelf hosten betekent dat bezoekersgegevens nooit je server verlaten. Deze handleiding behandelt de volledige levenscyclus: deployment van Plausible CE v3.2.0 met Docker Compose, integratie van het tracking-script, instellen van aangepaste events, backups en updates.
Vereisten: Een VPS met minimaal 4 GB RAM waarop Docker en Docker Compose draaien Docker in productie op een VPS: wat er misgaat en hoe je het oplost, een domeinnaam die naar je server wijst, en een reverse proxy die TLS afhandelt Traefik vs Caddy vs Nginx: Docker reverse proxy vergeleken.
Wat is Plausible Community Edition en hoe verschilt het van de Cloud-versie?
Plausible CE is de gratis, AGPL-gelicentieerde, zelfgehoste versie van Plausible Analytics. Het draait als drie Docker-containers: de Plausible-webapplicatie (Elixir), PostgreSQL voor gebruikersaccounts en ClickHouse voor de opslag van analytics-events. Je krijgt hetzelfde privacyvriendelijke dashboard als de betaalde cloudversie. Je gegevens blijven op je server. De CE wordt twee keer per jaar uitgebracht als long-term release.
De verschillen:
| Functie | Cloud | Community Edition |
|---|---|---|
| Analytics-dashboard | Ja | Ja |
| Privacyvriendelijk (geen cookies) | Ja | Ja |
| Aangepaste events en doelen | Ja | Ja |
| Stats API (v2) | Ja | Ja |
| E-mailrapporten | Ja | Ja (vereist SMTP) |
| Funnels en omzetdoelen | Ja | Nee |
| Sites API | Ja | Nee |
| Looker Studio-connector | Ja | Nee |
| Google Search Console-integratie | Ja | Ja (vereist configuratie) |
| SSO / teambeheer | Ja | Nee |
| Premium support | Ja | Alleen community |
| Updatefrequentie | Wekelijks | Twee keer per jaar |
| Infrastructuurbeheer | Beheerd | Zelf regelen |
De cloudversie werkt met een abonnementsmodel. Bekijk de Plausible-prijspagina voor actuele tarieven. Zelf hosten kost je alleen de VPS-resources.
Wat zijn de systeemvereisten voor het zelf hosten van Plausible?
ClickHouse is het meest resource-intensieve component. Het heeft minimaal 2 GB RAM nodig in rust en verbruikt meer tijdens complexe queries over grote datasets. De CPU moet SSE 4.2-instructies ondersteunen (alle moderne x86_64-processors doen dat; ARM64 met NEON werkt ook). Plan je VPS dienovereenkomstig.
| Resource | Minimum | Aanbevolen |
|---|---|---|
| RAM | 2 GB | 4 GB |
| CPU | 1 vCPU (SSE 4.2) | 2 vCPU |
| Schijf | 10 GB | 20 GB+ |
| Docker | 20.10+ | Laatste stabiele versie |
| Docker Compose | v2.x | Laatste stabiele versie |
Schijfgroei hangt af van het verkeer. Reken op ongeveer 1 GB per 1-2 miljoen pageviews opgeslagen in ClickHouse. Bij lage verkeersvolumes (minder dan 100.000 pageviews per maand) is het schijfgebruik verwaarloosbaar.
Hoe installeer je Plausible Analytics met Docker Compose?
Kloon de officiële community-edition repository op de v3.2.0 tag, configureer je omgevingsvariabelen en start de containers. Het hele proces duurt ongeveer vijf minuten.
Kloon de repository:
git clone -b v3.2.0 --single-branch https://github.com/plausible/community-edition plausible-ce
cd plausible-ce
Dit geeft je het compose.yml-bestand, ClickHouse-configuratiebestanden en een README.
Hoe configureer je de omgevingsvariabelen?
Maak een .env-bestand in de plausible-ce-directory. Twee variabelen zijn verplicht. De rest is optioneel, maar sommige worden sterk aanbevolen.
Genereer eerst de secrets:
openssl rand -base64 48
Dit geeft een string van 64 tekens. Kopieer deze voor SECRET_KEY_BASE.
Genereer een aparte sleutel voor TOTP-encryptie:
openssl rand -base64 32
Maak nu het .env-bestand:
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
Vergrendel de bestandsrechten aangezien het secrets bevat:
chmod 600 .env
ls -la .env
-rw------- 1 root root 412 Mar 20 10:00 .env
Wat elke variabele doet:
- BASE_URL: De publieke URL waar Plausible bereikbaar is. Moet overeenkomen met je reverse proxy-configuratie.
- SECRET_KEY_BASE: Versleutelt sessies en genereert afgeleide sleutels. Minimaal 64 bytes. Deel deze nooit.
- TOTP_VAULT_KEY: Versleutelt tweefactorauthenticatie-secrets met AES256-GCM. Indien weggelaten, wordt deze afgeleid van
SECRET_KEY_BASEvia PBKDF2, maar expliciet instellen is veiliger voor sleutelrotatie. - DISABLE_REGISTRATION: Stel in op
invite_only(standaard) oftruenadat je je account hebt aangemaakt. Voorkomt dat onbekenden zich op je instantie registreren. - SMTP-variabelen: Nodig voor e-mailrapporten, wachtwoordreset en uitnodigingsmails. Zonder SMTP werkt Plausible, maar zijn e-mailfuncties uitgeschakeld.
Hoe stel je een reverse proxy met TLS in voor Plausible?
Plausible luistert standaard op poort 8000. Je reverse proxy stuurt HTTPS-verkeer daarheen door. Als je al Caddy of Traefik draait vanuit Traefik vs Caddy vs Nginx: Docker reverse proxy vergeleken, voeg Plausible toe als nieuwe upstream.
Maak een compose.override.yml om Plausible te verbinden met je reverse proxy-netwerk:
services:
plausible:
networks:
- proxy
- default
networks:
proxy:
external: true
Als je Caddy gebruikt, voeg dit toe aan je Caddyfile:
plausible.example.com {
reverse_proxy plausible:8000
}
Als je Traefik gebruikt, voeg labels toe aan de override:
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
Plausible heeft ook ingebouwde Let's Encrypt-ondersteuning. Stel HTTP_PORT=80 en HTTPS_PORT=443 in je .env-bestand in, en stel deze poorten beschikbaar in de override:
services:
plausible:
ports:
- 80:80
- 443:443
Deze aanpak is eenvoudiger, maar betekent dat Plausible TLS zelf afhandelt. Dat kan conflicteren als andere services dezelfde server delen.
Containers starten
docker compose up -d
Drie containers starten: plausible_db (PostgreSQL 16), plausible_events_db (ClickHouse 24.12) en plausible (de webapplicatie). De Plausible-container voert automatisch databasemigraties uit bij het opstarten.
Controleer of alle drie gezond zijn:
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 drie moeten (healthy) tonen. Als ClickHouse (health: starting) toont, wacht nog een minuut. Het voert een healthcheck uit via wget op zijn HTTP-interface.
Je beheerdersaccount aanmaken
Open https://plausible.example.com in je browser. Je ziet het registratieformulier. Maak je account aan. Met DISABLE_REGISTRATION=invite_only kunnen nieuwe gebruikers zich alleen registreren als je ze expliciet uitnodigt via het dashboard.
Na registratie kun je registratie volledig blokkeren als je de enige gebruiker bent:
Bewerk .env en wijzig:
DISABLE_REGISTRATION=true
Herstart daarna:
docker compose up -d
Hoe voeg je het Plausible tracking-script toe aan je site?
Na het inloggen klik je op "Add a website" en voer je je domein in. Plausible genereert een tracking-snippet. De standaard script-tag ziet er zo uit:
<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.js"></script>
Vervang plausible.example.com door de werkelijke URL van je Plausible-instantie. Voeg deze tag toe aan de <head> van elke pagina die je wilt tracken.
Hoe voeg je Plausible toe aan een statische HTML-site?
Plak de script-tag direct in je HTML-<head>:
<!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>
Voor statische sitegeneratoren (Hugo, Jekyll, 11ty), voeg de script-tag toe aan je basistemplate of head-partial.
Hoe voeg je Plausible toe aan een WordPress-site?
De officiële Plausible Analytics WordPress-plugin (v2.5.4, meer dan 10.000 actieve installaties) regelt alles via het WordPress-dashboard.
- Installeer de plugin: Plugins > Nieuwe plugin > Zoek "Plausible Analytics"
- Ga naar Instellingen > Plausible Analytics
- Voer de URL van je zelfgehoste instantie in (bijv.
https://plausible.example.com) - Voer de domeinnaam in die je wilt tracken
- Sla op
De plugin injecteert automatisch het tracking-script. Het ondersteunt ook WooCommerce-conversietracking en automatische formuliertracking voor Contact Form 7, WPForms en Ninja Forms.
Hoe voeg je Plausible toe aan een Next.js-app?
Gebruik het next-plausible-pakket (v3.12.5, 36.000 wekelijkse downloads).
npm i next-plausible
Voor de App Router (Next.js 13+), voeg de provider toe in je root-layout:
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>
);
}
Voor het tracken van aangepaste events in componenten, gebruik de usePlausible-hook:
"use client";
import { usePlausible } from "next-plausible";
export default function SignupButton() {
const plausible = usePlausible();
return (
<button onClick={() => plausible("Signup")}>
Sign up
</button>
);
}
Hoe voeg je Plausible toe aan een single-page application?
Voor React, Vue, Svelte of elke andere SPA, voeg de script-tag toe aan je index.html. Plausible detecteert automatisch routewijzigingen via de History API. Geen extra configuratie nodig.
Als je SPA hash-gebaseerde routing gebruikt (/#/path), gebruik de hash-extensie:
<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.hash.js"></script>
Hoe track je aangepaste events en doelen in Plausible?
Aangepaste events laten je acties tracken voorbij pageviews: knopklikken, formulierinzendingen, bestandsdownloads, registraties. Plausible biedt twee methoden: een no-code CSS-klasse-aanpak en een JavaScript API voor dynamische tracking.
Schakel eerst het uitgebreide script in dat aangepaste events ondersteunt. Vervang de standaard scriptbron:
<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.tagged-events.js"></script>
CSS-klassemethode (geen JavaScript nodig)
Voeg een CSS-klasse toe in het formaat plausible-event-name=EventName aan elk HTML-element:
<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>
Gebruik + voor spaties in eventnamen. Sommige CMS'en (Webflow) vervangen = door -. Gebruik in dat geval een dubbel streepje --: plausible-event-name--Signup.
JavaScript API voor dynamische events
Roep de functie plausible() direct aan voor events die conditionele logica of dynamische eigenschappen nodig hebben:
// 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"; }
});
Het doel aanmaken in je dashboard
Events verschijnen pas in je dashboard als je een bijbehorend doel hebt aangemaakt. Ga naar Site Settings > Goals > Add Goal. Selecteer "Custom event" en voer de exacte eventnaam in (bijv. Signup). De naam is hoofdlettergevoelig en moet overeenkomen met je code.
Hoe gebruik je de Plausible Stats API?
Plausible bevat een Stats API (v2) voor programmatische toegang tot je analytische gegevens. Op je zelfgehoste instantie is de API-basis-URL https://plausible.example.com/api/v2/query.
Maak een API-sleutel aan: ga naar Account Settings > API Keys > New API Key > Stats API.
Vraag het aantal bezoekers op van de afgelopen 7 dagen:
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"]
}
}
Uitsplitsing van bezoekers per pagina:
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}
}'
De API ondersteunt filtering, tijdsgebaseerde dimensies (time:day, time:month) en sortering. De rate limit is 600 verzoeken per uur. Bekijk de volledige Stats API-referentie voor alle beschikbare metrics en dimensies.
Hoe stel je e-mailrapporten in?
E-mailrapporten vereisen een werkende SMTP-configuratie in je .env-bestand (behandeld in de setupsectie hierboven). Zodra SMTP is geconfigureerd, kan elke gebruiker wekelijkse of maandelijkse e-mailrapporten inschakelen vanuit het Plausible-dashboard.
Ga naar Site Settings > Email Reports. Voeg ontvangeradressen toe. Plausible stuurt een samenvatting van bezoekers, populairste pagina's en verkeersbronnen op de frequentie die je kiest.
Als e-mails niet aankomen, controleer de Plausible-containerlogs:
docker compose logs plausible | grep -i mail
Veelvoorkomende problemen: verkeerde SMTP-poort (gebruik 587 voor STARTTLS, 465 voor impliciete TLS met SMTP_HOST_SSL_ENABLED=true), of authenticatiefouten.
Hoe maak je een backup van een zelfgehoste Plausible-instantie?
Plausible slaat gegevens op in twee databases en één volume. Het verlies van een daarvan betekent dataverlies. Maak van alle drie een backup.
| Gegevens | Opslag | Backupmethode |
|---|---|---|
| Gebruikersaccounts, siteconfiguratie | PostgreSQL | pg_dump |
| Analytics-events | ClickHouse | Volume-backup of BACKUP-commando |
| Certificaten, uploads | Volume plausible-data |
Volumekopie |
Backup van PostgreSQL
docker compose exec plausible_db pg_dump -U postgres plausible_db | gzip > backup-postgres-$(date +%F).sql.gz
Backup van ClickHouse
ClickHouse 24.12 ondersteunt het BACKUP-commando native. Voer het uit in de container:
docker compose exec plausible_events_db clickhouse-client \
--query "BACKUP DATABASE plausible_events_db TO Disk('backups', 'plausible-$(date +%F).zip')"
Als de backups-disk niet is geconfigureerd, gebruik een 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
Dit stopt ClickHouse kort. Voor backups zonder downtime, configureer de backups-disk in ClickHouse of gebruik clickhouse-backup.
Automatisering
Maak een script op /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
Plan dagelijkse uitvoering met cron:
crontab -e
Voeg toe:
0 3 * * * /opt/plausible-backup.sh >> /var/log/plausible-backup.log 2>&1
Voor meer over Docker volume-backupstrategieën, zie Docker-volumes back-uppen en herstellen op een VPS.
Hoe update je Plausible Community Edition veilig?
Plausible CE wordt twee keer per jaar uitgebracht. Pin je versie op een specifieke tag in compose.yml voor voorspelbare upgrades. De standaardconfiguratie pint al op v3.2.0.
Versiepinning-strategieën:
| Niveau | Tag-voorbeeld | Wat automatisch wordt bijgewerkt |
|---|---|---|
| Patch (veiligst) | v3.2.0 |
Niets. Alleen handmatige upgrades. |
| Minor | v3.2 |
Patchreleases (bugfixes) |
| Major | v3 |
Minor- en patchreleases |
Aanbevolen: pin op patchniveau en update handmatig na het lezen van de release notes.
Upgradeprocedure
-
Lees de release notes voor breaking changes
-
Maak een backup van je databases (voer het backupscript hierboven uit)
-
Haal de nieuwe versie op:
cd /opt/plausible-ce
git fetch --tags
git checkout v3.3.0 # replace with the target version
- Start de bijgewerkte containers:
docker compose up -d
Plausible voert automatisch databasemigraties uit bij het opstarten. Bekijk de logs tijdens de eerste start:
docker compose logs -f plausible
Zoek naar [info] Migrations up to XXXXXXXX applied successfully in de output. Als je migratiefouten ziet, gooi de oude gegevens niet weg. Raadpleeg de upgrade-wikipagina voor versiespecifieke instructies.
- Ruim de oude image op:
docker image prune -f
Beveiligingspatches worden niet gebackport naar oudere versies. Abonneer je op releasenotificaties op GitHub: ga naar de repository, klik op Watch > Custom > Releases.
Is zelfgehost Plausible AVG-conform zonder cookies?
Ja. Plausible plaatst geen cookies. Het verzamelt of bewaart geen persoonsgegevens. Unieke bezoekers worden geteld met een hash van het IP-adres van de bezoeker gecombineerd met de User-Agent-string. Deze hash wordt elke 24 uur geroteerd en wordt nooit in ruwe vorm opgeslagen. Het ruwe IP-adres wordt na hashing verwijderd.
Dit betekent:
- Geen cookie-toestemmingsbanner nodig onder de AVG, CCPA of PECR
- Geen verwerking van persoonsgegevens, dus de vereisten voor een rechtsgrondslag onder artikel 6 AVG zijn niet van toepassing
- Zelf hosten zorgt ervoor dat gegevens nooit je server verlaten en nooit bij een derde verwerker terechtkomen
- Je blijft de enige verwerkingsverantwoordelijke, zonder verwerkersovereenkomsten nodig voor analytics
Als je je VPS in de EU host (Virtua Cloud-servers staan in Europese datacenters), blijven je analytische gegevens in de EU. Geen Schrems II-transferproblemen.
Daarom stappen veel indie hackers en privacybewuste ontwikkelaars over van Google Analytics. Geen toestemmingsbanners, geen frictie voor bezoekers en geen verwerkersovereenkomsten om te beheren.
ClickHouse-resourcegebruik monitoren
ClickHouse is het meest resource-intensieve component. In rust bij laag verkeer gebruikt het ongeveer 500 MB RAM. Tijdens queries over grote datasets kan het oplopen tot 2-3 GB. Als je VPS slechts 2 GB RAM totaal heeft, kun je OOM-kills tegenkomen tijdens drukke periodes.
Monitor het geheugengebruik:
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%
De ClickHouse-configuratie die met Plausible CE wordt meegeleverd, bevat al low-resource overrides (via low-resources.xml en default-profile-low-resources-overrides.xml). Deze beperken het geheugengebruik voor merges en queries.
Als je verder wilt tunen, maak een clickhouse/custom.xml-override en mount het in compose.override.yml. Voor resourcelimieten in Docker Compose, zie Docker Compose resourcelimieten, healthchecks en herstartbeleid.
Controleer de ClickHouse-logs op waarschuwingen:
docker compose logs plausible_events_db | grep -i "memory\|oom"
Iets werkt niet?
Containers starten niet: Controleer docker compose logs <service>. Veelvoorkomende oorzaken: poortconflicten, ontbrekende .env-variabelen, ClickHouse faalt de SSE 4.2-check op oudere CPU's.
"Bad Request" op de loginpagina: Je BASE_URL komt niet overeen met de URL die je bezoekt. Plausible controleert de origin-header tegen BASE_URL om cross-site request forgery te voorkomen.
Tracking-script registreert geen bezoeken: Open de browserontwikkelaarstools, controleer het Netwerk-tabblad op verzoeken naar /api/event. Een 202-respons betekent dat het event is geaccepteerd. Als je CORS-fouten ziet, verwijdert je reverse proxy headers. Zorg ervoor dat de proxy de Host-header doorgeeft.
E-mailrapporten worden niet verzonden: Controleer de SMTP-inloggegevens. Bekijk de logs met docker compose logs plausible | grep -i smtp. Test je SMTP-server onafhankelijk met swaks of openssl s_client.
ClickHouse door OOM-killer gestopt: Je VPS heeft niet genoeg RAM. Upgrade naar minimaal 4 GB, of verlaag max_memory_usage in een ClickHouse-configuratie-override.
Dashboard toont nul bezoekers na setup: Het tracking-script wordt mogelijk geblokkeerd door adblockers. Overweeg het script te proxyen via je hoofddomein. Plausible's documentatie noemt dit een proxy setup.
Voor het monitoren van de uptime van je Plausible-instantie, zie Uptime Kuma en Beszel zelf hosten op een VPS met Docker Compose.
Klaar om het zelf te proberen?
Deploy uw eigen server in seconden. Linux, Windows of FreeBSD. →