Plausible past goed als je bruikbare verkeerscijfers wilt zonder elke paginaweergave naar Googles advertentiestack te sturen. Community Edition draait dezelfde kernapplicatie op je eigen server, dus je bepaalt zelf waar de databases en back-ups staan.
Plausible is open source en biedt cookievrije webanalytics. Het dashboard toont paginaweergaven, bezoekers, verwijzende sites, instap- en uitstappagina's, landen, apparaten, doelen en aangepaste gebeurtenissen, zonder voor elke bezoeker een advertentieprofiel op te bouwen.
Op een Linux-VPS draait de stack met Docker Compose achter Nginx en Let's Encrypt. We binden de applicatiepoort aan localhost en sluiten af met updates en back-ups. De analyticsgegevens blijven bij jou, maar het serveronderhoud ook.
Wat Plausible op je server bewaart
Plausible verdeelt de gegevens over twee databases. PostgreSQL bewaart accounts en site-instellingen; ClickHouse bewaart de analyticsgebeurtenissen. Volgens de beveiligings- en privacydocumentatie van Plausible gebruikt de normale tracker geen cookies en slaat hij geen ruwe IP-adressen of User-Agent-strings op. Plausible maakt in plaats daarvan een dagelijkse identifier met een roterende salt.
Dat is een veel kleinere hoeveelheid bezoekersgegevens dan bij advertentiegerichte analytics. Toch is een zelfgehoste installatie niet automatisch compliant. De hostinglocatie, Nginx-logs, eigenschappen van aangepaste gebeurtenissen, bewaartermijnen, toegangsrechten en je privacyverklaring blijven meetellen. Zet geen namen, e-mailadressen, account-ID's of andere persoonsgegevens in aangepaste eigenschappen.
ClickHouse bepaalt de ondergrens voor de server. De officiële Plausible Community Edition-repository adviseert minimaal 2 GB RAM en een processor met ondersteuning voor SSE 4.2 of NEON. Voor een kleine website is een QDE KVM VPS met ten minste 2 GB RAM een logisch vertrekpunt en krijg je de root-toegang die Docker nodig heeft. Begin groter bij drukbezochte sites, lange bewaartermijnen of meerdere websites op één installatie.
Voordat je begint
Zorg dat je dit klaar hebt:
- Een verse Debian-, Ubuntu-, CentOS Stream-, Rocky Linux- of AlmaLinux-server
- Root-toegang of een gebruiker met
sudo-rechten - Minimaal 2 GB RAM
- Een domein of subdomein, bijvoorbeeld
plausible.example.com - DNS A-records en, als je IPv6 gebruikt, AAAA-records die naar de server wijzen
- Open poorten 80 en 443 in de firewall van de server en hostingprovider
In de voorbeelden gebruiken we plausible.example.com. Vervang dit door je echte hostnaam en wacht tot DNS werkt voordat je Certbot om een certificaat vraagt.
1. Installeer de benodigde systeempakketten
Op Debian of Ubuntu:
sudo apt update
sudo apt install -y git curl openssl ca-certificates
Op CentOS Stream, Rocky Linux of AlmaLinux:
sudo dnf install -y git curl openssl ca-certificates
Geen verrassingen hier: Git beheert de repository, curl downloadt de Docker-installer en controleert lokale eindpunten, OpenSSL genereert de geheime waarden en het CA-pakket houdt HTTPS-downloads werkend.
2. Installeer Docker en Docker Compose
Het installatiescript van Docker is de snelste route. Controleer het eerst als je serverbeleid dat vereist en voer het daarna uit:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo bash get-docker.sh
Gebruik op een productieserver met strikter pakketbeheer liever de repository-instructies voor jouw distributie uit de installatiehandleiding van Docker Engine.
Als je niet als root bent ingelogd, voeg je huidige gebruiker dan toe aan de groep docker:
sudo usermod -aG docker $USER
De groepswijziging werkt nadat je bent uit- en weer ingelogd. Wil je in de huidige sessie doorgaan, start dan een nieuwe shell:
newgrp docker
Behandel lidmaatschap van de groep docker als root-toegang, want dat is feitelijk wat het geeft. Voeg alleen vertrouwde beheerders toe. Docker legt dit uit in de Linux-handleiding voor stappen na installatie.
Laat Docker automatisch opstarten en controleer of Docker Engine en de Compose-plugin beschikbaar zijn:
sudo systemctl enable --now docker
docker version
docker compose version
Werkt een van beide versiecommando's niet, los Docker dan eerst op. De rest van de handleiding gaat ervan uit dat Engine en Compose allebei werken.
3. Clone Plausible Community Edition
Clone de officiële repository en laat Git zien welke branch is uitgecheckt:
git clone https://github.com/plausible/community-edition plausible
cd plausible
git branch --show-current
Plausible CE gebruikt voor elke release een aparte branch en compose.yml pint de bijbehorende applicatie-image. Het clonecommando laat -b weg, zodat Git de versiebranch uitcheckt die de repository op dat moment als standaard aanwijst. Vergelijk de getoonde branch met de actuele officiële quickstart voordat je verdergaat. Onthoud die branchnaam: een gewone git pull springt later niet vanzelf naar de volgende release.
De repository bevat Plausible, PostgreSQL, ClickHouse en resourcezuinige ClickHouse-instellingen. Zet je lokale configuratie in .env en compose.override.yml en laat het bijgehouden compose.yml met rust. Dat scheelt onnodige mergeconflicten bij een upgrade.
4. Configureer de omgeving
Begin met een leeg omgevingsbestand:
touch .env
Voeg de publieke URL toe en genereer daarna aparte geheime waarden voor sessies en versleutelde TOTP-gegevens:
echo "BASE_URL=https://plausible.example.com" >> .env
echo "SECRET_KEY_BASE=$(openssl rand -base64 48)" >> .env
echo "TOTP_VAULT_KEY=$(openssl rand -base64 32)" >> .env
chmod 600 .env
SECRET_KEY_BASE moet na de installatie gelijk blijven. Plausible gebruikt deze waarde voor sessies en andere afgeleide geheimen. TOTP_VAULT_KEY beschermt opgeslagen geheimen voor tweefactorauthenticatie.
De TOTP-sleutel is optioneel. Zonder deze variabele leidt Plausible via PBKDF2 een sleutel af van SECRET_KEY_BASE. We stellen toch een aparte willekeurige waarde in. Maak een veilige back-up van .env en plak geen van beide geheimen in een ticket, chatbericht of schermafbeelding.
Een klein detail: de toewijzing van TOTP_VAULT_KEY heeft één gelijkteken vóór de gegenereerde waarde. Eindigt de uitvoer van OpenSSL op =, dan hoort dat teken bij de Base64-waarde.
De officiële configuratiereferentie beschrijft de overige opties, waaronder registratie, SMTP, geolocatie, database-URL's en Docker secrets.
5. Bind Plausible aan localhost-poort 8000
Schrijf de interne HTTP-poort naar .env:
echo "HTTP_PORT=8000" >> .env
Plausible gebruikt standaard al poort 8000. Door de waarde toch op te schrijven, zie je ook maanden later meteen hoe .env en het overridebestand bij elkaar horen.
Maak compose.override.yml zodat Docker deze poort alleen op 127.0.0.1 publiceert:
cat > compose.override.yml <<'EOF'
services:
plausible:
ports:
- "127.0.0.1:8000:${HTTP_PORT}"
EOF
De quotes rond 'EOF' doen echt werk. Ze laten ${HTTP_PORT} ongemoeid totdat Docker Compose .env leest. Zonder de quotes kan je shell eerst een niet-ingestelde variabele expanderen en zo een kapotte poortkoppeling opslaan.
Laat Compose de samengevoegde configuratie controleren voordat je iets start. Met --quiet worden de geheime waarden niet afgedrukt:
docker compose config --quiet
Plausible luistert nu op 127.0.0.1:8000, waar alleen de server zelf bij kan. Dat is precies de bedoeling. Nginx handelt straks het publieke verkeer af.
6. Start Plausible
Download de containerimages en start de stack:
docker compose pull
docker compose up -d
De eerste start is niet direct klaar. PostgreSQL en ClickHouse moeten eerst hun statuscontroles doorstaan voordat Plausible de databases kan instellen. Geef de stack even tijd en controleer hem daarna:
docker compose ps
docker compose logs --tail=100 plausible
Test het lokale HTTP-eindpunt zodra de containers draaien:
curl --head http://127.0.0.1:8000
Elke HTTP-reactie bevestigt dat de host Plausible kan bereiken. Mislukt de verbinding, voer dan docker compose logs --tail=200 uit en los de containerfout op voordat je Nginx erbij betrekt.
7. Configureer Nginx als reverse proxy
Installeer Nginx, Certbot en de Nginx-plugin van Certbot.
Op Debian of Ubuntu:
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
Op CentOS Stream, Rocky Linux of AlmaLinux:
sudo dnf install -y epel-release
sudo dnf install -y nginx certbot python3-certbot-nginx
Het configuratiepad verschilt per distributie. Maak op Debian of Ubuntu dit bestand:
/etc/nginx/sites-available/plausible.example.com.conf
Maak op CentOS Stream, Rocky Linux of AlmaLinux dit bestand:
/etc/nginx/conf.d/plausible.example.com.conf
Plaats hetzelfde serverblok in een van beide bestanden:
upstream plausible {
server 127.0.0.1:8000;
}
server {
listen 80;
listen [::]:80;
server_name plausible.example.com;
location / {
proxy_pass http://plausible;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /live/websocket {
proxy_pass http://plausible;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
Het blok voor /live/websocket wordt makkelijk vergeten, maar het live dashboard heeft het nodig. De andere headers geven de oorspronkelijke hostnaam, clientketen en het gebruikte protocol door aan Plausible. Deze opzet volgt de reverse-proxyhandleiding van Plausible en voegt de gebruikelijke forwarded headers toe.
Activeer op Debian of Ubuntu de site:
sudo ln -s /etc/nginx/sites-available/plausible.example.com.conf /etc/nginx/sites-enabled/
Bestaat deze symlink al, laat hem dan staan.
Op CentOS Stream, Rocky Linux of AlmaLinux met SELinux in enforcing-modus heeft Nginx ook toestemming nodig om de lokale upstream te bereiken:
sudo setsebool -P httpd_can_network_connect 1
Controleer de configuratie, laat Nginx automatisch opstarten en herlaad de dienst:
sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx
Gebruik nginx -t als harde controle. Los elke gemelde fout op voordat je een certificaat aanvraagt.
8. Voeg HTTPS toe met Certbot
Zodra DNS werkt en poorten 80 en 443 bereikbaar zijn, laat je Certbot het certificaat aanvragen en de virtuele Nginx-host aanpassen:
sudo certbot --nginx -d plausible.example.com
Controleer de configuratie nog een keer voordat je Nginx herlaadt:
sudo nginx -t
sudo systemctl reload nginx
Controleer het publieke eindpunt vanaf de opdrachtregel:
curl --head https://plausible.example.com
Test ook meteen de certificaatverlenging, nu de configuratie nog vers in je geheugen zit:
sudo certbot renew --dry-run
9. Maak de eerste gebruiker en beperk registratie
Open https://plausible.example.com en registreer de eerste gebruiker. Voeg je website toe in het dashboard en kopieer daarna de trackingcode van Plausible naar de <head> van je site.
Nadat het eerste account is ingesteld, staat Plausible nieuwe registraties standaard alleen op uitnodiging toe. We schrijven de waarde toch naar .env, zodat de bedoeling duidelijk is voor de volgende persoon die het bestand leest:
echo "DISABLE_REGISTRATION=invite_only" >> .env
docker compose up -d
Uitgenodigde gebruikers kunnen zich met deze instelling nog steeds registreren. Gebruik DISABLE_REGISTRATION=true alleen als je ieder nieuw account wilt blokkeren, ook via uitnodigingen.
Bekijk de stack nog één keer:
docker compose ps
docker compose logs --tail=100 plausible
Plausible bijwerken
Bij Plausible-updates is één detail makkelijk te missen: elke release krijgt een eigen versiebranch en beveiligingsupdates worden niet naar oude versies teruggeport. Een gewone git pull blijft op de branch die je al hebt; docker compose pull leest daarna de image-tags uit diezelfde branch. Beide commando's kunnen zonder foutmelding eindigen terwijl Plausible gewoon op de oude release blijft staan.
Lees voor elke upgrade de releasepagina van het project en de upgradehandleiding. Sommige releases hebben extra stappen voor PostgreSQL of ClickHouse. Maak eerst een back-up en vervang daarna vX.Y.Z hieronder door de exacte doelbranch uit de release notes:
cd plausible
git status --short
git pull origin vX.Y.Z
docker compose pull
docker compose up -d
docker compose pull is hier optioneel. Het haalt alle images uit het nieuwe Compose-bestand op, maar git pull origin vX.Y.Z kiest de Plausible-release door de vastgepinde image bij te werken. Meldt Git een conflict, stop dan en los het op. Hetzelfde geldt voor een extra migratiestap uit de release notes.
Controleer na de upgrade de containers en de Plausible-log:
docker compose ps
docker compose logs --tail=100 plausible
Doordat de lokale poortkoppeling in compose.override.yml staat, blijft het bijgehouden compose.yml schoon en is de kans op een conflict tijdens git pull origin vX.Y.Z kleiner.
Bewaar back-ups op applicatieniveau
Een serversnapshot is nuttig, maar Plausible bewaart belangrijke gegevens in zowel PostgreSQL- als ClickHouse-volumes. Maak van beide databases een back-up, bewaar een kopie buiten de VPS en voer minstens één testherstel uit. Pas na een storing ontdekken dat een back-up onvolledig is, is rijkelijk laat.
QDE levert dagelijkse externe VPS-back-ups en geeft je daarmee een extra herstelpunt voor fouten die de hele server raken. Zie ze als een extra laag onder je databaseback-ups, niet als vervanging.
Zodra deze controles slagen, kun je de trackingcode toevoegen en wachten tot de eerste bezoeken verschijnen. Daarna komt het neer op gewoon serverbeheer: lees de release notes, voer updates uit, houd de opslag in de gaten en controleer of je back-ups nog steeds kunnen worden hersteld.

