Det här sätter du upp
Plausible räknar besökarna på dina webbplatser: vilka sidor de läser, var de kom ifrån och vilket land och vilken sorts enhet de använder. Den sätter inga kakor och sparar inga IP-adresser: i vårt test lämnade skriptet inga kakor eller annan lagring kvar i webbläsaren, och statistikdatabasen har ingen kolumn för en adress. Dina webbplatser behöver ingen cookie-banner för den. När den körs på din egen server i Sverige stannar statistiken på den servern.
Plausible Community Edition (CE) utvecklas av Plausible Insights OÜ, ett företag i Tartu i Estland, som också säljer Plausible som en tjänst. CE är öppen källkod under GNU Affero General Public License (AGPL) 3.0, och det lilla spårningsskriptet som läggs på dina sidor är under MIT-licensen. CE har ingen telemetri och letar inte efter uppdateringar. Som standard hämtar den däremot en spamlista och uppdateringar av tidszoner, och skickar namnen på hänvisande webbplatser till DuckDuckGo och en hash av din e-postadress till Gravatar, båda amerikanska företag. Steg 8 visar vad som går vart, och hur du stänger av de två sista.
Här körs den som en pod under en egen användare som heter plausible, bakom Caddy från Podman-guiden: Plausible själv, PostgreSQL för konton och inställningar, och ClickHouse för besöksstatistiken.
Varje steg nedan har körts på en nyinstallerad VC-P Alloy hos Melonslab (2 vCPU, 8 GB) med Debian 13:
- Plausible CE 3.2.1 startade med de versioner av PostgreSQL och ClickHouse som Plausibles egen installation använder.
- Ägarkontot skapades medan ingen annan kunde nå registreringssidan, och efter det skickade
/registeralla till inloggningssidan, över både IPv4 och IPv6. - En liten webbplats med Plausibles skript, besökt i en webbläsare, syntes i översikten med besökarens land, och Plausible såg besökarens riktiga IP-adress.
- En besökare som skickade en påhittad IP-adress i en header räknades ändå med sin riktiga.
- Båda databaserna återställdes från den nattliga säkerhetskopian, med alla konton, webbplatser och besök.
- Allt startade igen av sig självt efter en omstart av servern.
Podden använde omkring 600 MB minne: Plausible 330 MB, ClickHouse 230 MB och PostgreSQL 30 MB.
Innan du börjar
Du behöver:
- en server uppsatt som i Podman-guiden, med Caddy igång;
- en A-post och en AAAA-post för
plausible.example.comsom pekar på din server; - en webbplats att mäta, här
www.example.com.
Plausible rekommenderar minst 2 GB minne. ClickHouse behöver en processor med SSE 4.2, vilket alla servrar hos Melonslab har; grep -m1 -o sse4_2 /proc/cpuinfo skriver ut sse4_2 om din har det.
Byt genomgående ut plausible.example.com mot ditt eget namn. Exemplen använder 203.0.113.10 för din server och 198.51.100.7 för din egen adress hemma eller på kontoret.
1. Skapa användaren
Som root:
useradd -m -s /bin/bash plausible
loginctl enable-linger plausible
machinectl shell plausible@
Allt fram till steg 5 körs som plausible.
2. Skapa hemligheterna
pw=$(openssl rand -hex 24)
printf %s "$pw" | podman secret create plausible-db-password -
printf 'postgres://postgres:%s@127.0.0.1:5432/plausible_db' "$pw" | podman secret create plausible-database-url -
unset pw
openssl rand -base64 48 | tr -d '\n' | podman secret create plausible-secret-key-base -
De två första innehåller databaslösenordet, en gång för PostgreSQL och en gång i adressen Plausible ansluter till. Den tredje, SECRET_KEY_BASE, signerar inloggningar och krypterar tvåfaktorkoderna. Den måste följa med dina data om du någon gång flyttar Plausible till en annan server.
3. Hämta inställningarna för ClickHouse
Plausibles egen installation ger ClickHouse fyra små konfigurationsfiler: en håller loggarna korta, en får den att lyssna bara på IPv4 inne i podden, och två får den att använda mindre minne, som ClickHouse rekommenderar för servrar med mindre än 16 GB. Hämta dem från samma version:
mkdir -p ~/clickhouse && cd ~/clickhouse
for f in logs ipv4-only low-resources default-profile-low-resources-overrides; do
wget -q https://raw.githubusercontent.com/plausible/community-edition/v3.2.1/clickhouse/$f.xml
done
Lägg till en femte, ~/clickhouse/backups.xml, som låter ClickHouse skriva säkerhetskopior (steg 10):
<clickhouse>
<backups>
<allowed_path>/backups/</allowed_path>
</backups>
</clickhouse>
ClickHouse körs som användare 101 i sin container, så ge den katalogen för säkerhetskopior:
mkdir -p ~/backup/clickhouse
podman unshare chown 101:101 ~/backup/clickhouse
4. Definiera podden
mkdir -p ~/.config/containers/systemd
cd ~/.config/containers/systemd
Skapa plausible.pod:
[Pod]
PodName=plausible
# Only Caddy, on this server, can reach Plausible: the port is not open to the internet.
PublishPort=127.0.0.1:8110:8000
[Install]
WantedBy=default.target
Skapa plausible-db.container:
[Container]
ContainerName=plausible-db
Image=docker.io/library/postgres:16-alpine
Pod=plausible.pod
Volume=plausible-db:/var/lib/postgresql/data
Secret=plausible-db-password,type=env,target=POSTGRES_PASSWORD
HealthCmd=pg_isready -U postgres
Notify=healthy
AutoUpdate=registry
[Service]
Restart=always
Skapa plausible-events.container:
[Container]
ContainerName=plausible-events
Image=docker.io/clickhouse/clickhouse-server:24.12-alpine
Pod=plausible.pod
Volume=plausible-events:/var/lib/clickhouse
Volume=plausible-events-logs:/var/log/clickhouse-server
Volume=%h/clickhouse/logs.xml:/etc/clickhouse-server/config.d/logs.xml:ro
Volume=%h/clickhouse/ipv4-only.xml:/etc/clickhouse-server/config.d/ipv4-only.xml:ro
Volume=%h/clickhouse/low-resources.xml:/etc/clickhouse-server/config.d/low-resources.xml:ro
Volume=%h/clickhouse/default-profile-low-resources-overrides.xml:/etc/clickhouse-server/users.d/default-profile-low-resources-overrides.xml:ro
Volume=%h/clickhouse/backups.xml:/etc/clickhouse-server/config.d/backups.xml:ro
Volume=%h/backup/clickhouse:/backups
Environment=CLICKHOUSE_SKIP_USER_SETUP=1
Ulimit=nofile=262144:262144
HealthCmd=wget --no-verbose --tries=1 -O - http://127.0.0.1:8123/ping
Notify=healthy
AutoUpdate=registry
[Service]
Restart=always
Och plausible-app.container:
[Unit]
Requires=plausible-db.service plausible-events.service
After=plausible-db.service plausible-events.service
[Container]
ContainerName=plausible-app
Image=ghcr.io/plausible/community-edition:v3.2.1
Pod=plausible.pod
Exec=sh -c "/entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
Volume=plausible-data:/var/lib/plausible
Environment=TMPDIR=/var/lib/plausible/tmp
Environment=BASE_URL=https://plausible.example.com
Environment=CLICKHOUSE_DATABASE_URL=http://127.0.0.1:8123/plausible_events_db
Environment=DISABLE_REGISTRATION=invite_only
Secret=plausible-database-url,type=env,target=DATABASE_URL
Secret=plausible-secret-key-base,type=env,target=SECRET_KEY_BASE
Ulimit=nofile=65535:65535
[Service]
Restart=always
Avbilderna och versionerna är desamma som i Plausibles egen compose.yml för 3.2.1. Notify=healthy gör att varje databas räknas som startad först när den svarar, så Plausible startar efter att båda är redo. Vid varje start skapar Plausible sina databaser om de saknas och uppdaterar dem till sin version. PostgreSQL och ClickHouse följer uppdateringarna inom sina fastlåsta versioner av sig själva; Plausible ligger kvar på exakt den version du angett tills du ändrar den (steg 11).
Starta den:
systemctl --user daemon-reload
systemctl --user start plausible-pod
systemctl --user enable --now podman-auto-update.timer
Vid första starten laddas omkring 1 GB avbilder ner, och det tar några minuter. När wget -qO- http://127.0.0.1:8110/login | head -c 100 skriver ut början på en webbsida är Plausible igång.
5. Skapa ditt konto innan någon annan gör det
Tills det första kontot finns låter Plausible den som först öppnar sidan skapa ett konto, och det kontot äger installationen. DISABLE_REGISTRATION ändrar inte det: vi testade med värdet true, och /register var ändå öppen, eftersom Plausible tillämpar inställningen först när ett konto finns. Låt därför Caddy visa Plausible bara för dig tills ditt konto är skapat.
Ta reda på vilken adress servern ser för dig. I din SSH-session mot servern:
echo $SSH_CLIENT | cut -d' ' -f1
Gå tillbaka till root med exit, byt till Caddys användare med machinectl shell caddy@ och lägg till det här blocket sist i ~/Caddyfile, med den adressen:
plausible.example.com {
# Until your account exists, only your own address gets through.
@others not remote_ip 198.51.100.7
respond @others "Not yet" 403
reverse_proxy 127.0.0.1:8110
}
Om din dator också har IPv6 kan webbläsaren använda den i stället: lägg då till din IPv6-adress eller ditt IPv6-nät efter IPv4-adressen, med ett mellanslag emellan, till exempel 198.51.100.7 2001:db8:1234::/48. Starta om Caddy med systemctl --user restart caddy.
Öppna https://plausible.example.com. Du hamnar direkt på Register your Plausible CE account. Fyll i Full name, Email, Password (minst 12 tecken) och Confirm password, och välj Create my account. Alla andra får Not yet.
En SSH-tunnel till port 8110 fungerar inte för det här steget: registreringssidan behöver en WebSocket-anslutning, och Plausible vägrar den från alla andra adresser än BASE_URL (webbläsarens konsol visar Unexpected response code: 403).
6. Öppna Plausible för alla
Som caddy byter du ut blocket mot det här:
plausible.example.com {
# Plausible takes the visitor's address from the first of these headers it finds.
# Only X-Forwarded-For, which Caddy sets, may reach it.
request_header -X-Plausible-IP
request_header -CF-Connecting-IP
request_header -B-Forwarded-For
request_header -Forwarded
reverse_proxy 127.0.0.1:8110
}
Starta om Caddy med systemctl --user restart caddy.
Plausible har ingen inställning för betrodda proxyservrar. Den tror på headerna X-Plausible-IP, CF-Connecting-IP, B-Forwarded-For, X-Forwarded-For och Forwarded, i den ordningen, oavsett vem som skickar dem. Caddy ersätter en X-Forwarded-For som besökaren skickar med den adress besökaren verkligen ansluter från, och de fyra raderna med request_header tar bort de andra headerna. I vårt test räknades en händelse som skickades med X-Plausible-IP: 8.8.8.8 via Caddy som ett besök från Sverige, där den kom ifrån, medan samma anrop förbi Caddy, direkt till port 8110, räknades som ett besök från USA.
Med DISABLE_REGISTRATION=invite_only, som är Plausibles standard, kan bara de du bjuder in skapa ett konto. Kontrollera det från en annan dator än din egen, eller från servern:
curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n' https://plausible.example.com/register
302 https://plausible.example.com/login
Om du aldrig kommer att bjuda in någon kan du i stället sätta DISABLE_REGISTRATION=true i plausible-app.container: då fungerar inte heller inbjudningslänkar.
7. Lägg till din webbplats
I Plausible, under Add website info, anger du webbplatsens Domain, till exempel www.example.com, väljer Reporting timezone och sedan Install Plausible. Plausible visar ett kodstycke som det här, med ett eget id för varje webbplats:
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.example.com/js/pa-XXXXXXXXXXXXXXXXXXXXXX.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
Klistra in det i <head> på varje sida på din webbplats. Om webbplatsen serveras av samma Caddy räcker det för en statisk webbplats med ett block som:
www.example.com {
root * /srv/www
file_server
}
där webbplatsens katalog monteras i Caddys container, till exempel med Volume=%h/www:/srv/www:ro i caddy.container, följt av systemctl --user daemon-reload och en omstart av Caddy.
Öppna din webbplats i en webbläsare och sedan översikten i Plausible. Besöket syns inom några sekunder, under Top pages, Countries och Devices. För att kontrollera att Plausible ser din riktiga adress öppnar du webbplatsens Settings, Shields: IP addresses: där står Your current IP address is följt av din egen adress, inte serverns.
Skriptet skickar ingenting från webbläsare som anger att de styrs automatiskt, som headless Chrome, och Plausible slänger besök från webbläsaridentiteter som den känner igen som robotar. Testa med en vanlig webbläsare.
Plausible CE tar fram landet ur DB-IP:s fria landsdatabas, som byggs in i avbilden när Plausible ger ut en version. Den gör inga uppslag på nätet och ger bara länder: Regions och Cities förblir tomma. En nyare version av avbilden har en nyare databas. För regioner och städer kan Plausible i stället använda MaxMinds GeoLite2, som kräver ett gratis konto hos MaxMind och omkring 1 GB mer minne; sätt MAXMIND_LICENSE_KEY (som en hemlighet) och MAXMIND_EDITION=GeoLite2-City, så laddar Plausible ner och uppdaterar databasen från MaxMind. MaxMind har vi inte testat.
8. Vet vad den ansluter till
Vi följde serverns utgående anslutningar medan Plausible startade, räknade besök och visade översikten. Plausible CE skickar ingen telemetri och letar inte efter uppdateringar, och enligt dess kod skickar den felrapporter till Sentry bara om du sätter SENTRY_DSN. Däremot kontaktar den de här tjänsterna:
- raw.githubusercontent.com (GitHub, ett amerikanskt företag som ägs av Microsoft): vid varje start och sedan en gång i veckan hämtar den Matomos öppna lista över domäner som skickar hänvisningsspam, så att spambesök inte räknas. Den skickar ingenting utöver själva anropet.
- data.iana.org (IANA, som drivs av amerikanska ICANN): en gång om dygnet kontrollerar dess tidszonsbibliotek om det finns en ny tidszonsdatabas. Den skickar ingenting utöver själva anropet. Den här uppgiften kommer från Plausibles kod; den dagliga kontrollen hamnade inte inom vår mätning.
- icons.duckduckgo.com (DuckDuckGo, ett amerikanskt företag): när översikten visar var besökarna kom ifrån hämtar servern ikonen för varje hänvisande webbplats, så DuckDuckGo får veta namnen på de webbplatser som länkar till dig. Dina besökares webbläsare och adresser är inte inblandade.
- www.gravatar.com (Gravatar, som drivs av det amerikanska företaget Automattic): när du öppnar översikten hämtar servern din profilbild med en MD5-hash av din e-postadress.
För att stänga av de två sista lägger du till de här raderna i plausible.pod, under PublishPort:
# Keep account emails and referrer names away from Gravatar and DuckDuckGo.
AddHost=www.gravatar.com:127.0.0.1
AddHost=icons.duckduckgo.com:127.0.0.1
Kör sedan systemctl --user daemon-reload och systemctl --user restart plausible-pod. Källorna visar då en enkel ikon i stället, och din profilbild visas som en trasig bild. Spamlistan och tidszonskontrollen har ingen inställning, och dem lät vi vara på.
9. E-post
Plausible skickar e-post för inbjudningar, återställning av lösenord och vecko- eller månadsrapporter. Utan en SMTP-server försöker den leverera direkt till mottagarens mailserver på port 25, vilket misslyckas från de flesta servrar och hamnar i skräpposten från resten. På vår testserver:
- Forgot password? meddelade att e-posten hade skickats, och loggen,
podman logs plausible-app, visade(Mua.TransportError) timeouten halv minut senare. Ingenting kom fram. - Invite new guest väntade i omkring en minut, sparade inbjudan och skickade ingenting, så den inbjudna får aldrig länken.
Inloggning, spårning och översikten fungerar utan e-post. Glömmer du lösenordet utan e-post behöver du en säkerhetskopia, eller återställa det i databasen.
För att skicka via en mailserver, till exempel din egen, sparar du dess lösenord som en hemlighet och lägger till inställningarna i plausible-app.container:
printf %s 'the-smtp-password' | podman secret create plausible-smtp-password -
Environment=MAILER_EMAIL=plausible@example.com
Environment=SMTP_HOST_ADDR=mail.example.com
Environment=SMTP_HOST_PORT=587
Environment=SMTP_USER_NAME=plausible@example.com
Secret=plausible-smtp-password,type=env,target=SMTP_USER_PWD
För port 465 lägger du till Environment=SMTP_HOST_SSL_ENABLED=true. Kör sedan systemctl --user daemon-reload och systemctl --user restart plausible-app. Det här är Plausibles dokumenterade inställningar; vi har inte testat dem mot en mailserver.
10. Säkerhetskopiera
Plausible har konton och inställningar i PostgreSQL och statistiken i ClickHouse. Båda kan säkerhetskopieras medan Plausible körs. Som plausible skapar du ~/backup.sh:
#!/bin/sh
# Dumps Plausible's two databases and its secrets into ~/backup.
set -e
umask 077
cd ~/backup
podman exec plausible-db pg_dump -U postgres plausible_db > plausible-db.sql
podman unshare rm -rf clickhouse/events
podman exec plausible-events clickhouse-client -q "BACKUP DATABASE plausible_events_db TO File('events')" > /dev/null
for s in plausible-db-password plausible-database-url plausible-secret-key-base; do
printf '%s=%s\n' "$s" "$(podman secret inspect --showsecret --format '{{.SecretData}}' "$s")"
done > secrets.txt
Kör det varje natt med en timer. Skapa ~/.config/systemd/user/plausible-backup.service:
[Unit]
Description=Back up Plausible's databases
[Service]
Type=oneshot
ExecStart=%h/backup.sh
Och ~/.config/systemd/user/plausible-backup.timer:
[Unit]
Description=Back up Plausible every night
[Timer]
OnCalendar=*-*-* 03:00
Persistent=true
[Install]
WantedBy=timers.target
chmod 700 ~/backup.sh
systemctl --user daemon-reload
systemctl --user enable --now plausible-backup.timer
systemctl --user start plausible-backup.service
ls ~/backup
ls visar clickhouse, plausible-db.sql och secrets.txt. secrets.txt innehåller lösenorden och SECRET_KEY_BASE, så förvara säkerhetskopian lika säkert som servern. För att få ut den från servern varje natt använder du restic på /home/plausible/backup.
För att återställa lägger du tillbaka hemligheterna med podman secret create, startar podden så att Plausible skapar sina databaser, stoppar plausible-app och ersätter båda databaserna med säkerhetskopiorna:
systemctl --user stop plausible-app
podman exec plausible-db dropdb -U postgres plausible_db
podman exec plausible-db createdb -U postgres plausible_db
podman exec -i plausible-db psql -q -U postgres plausible_db < ~/backup/plausible-db.sql
podman exec plausible-events clickhouse-client -q "DROP DATABASE plausible_events_db SYNC"
podman exec plausible-events clickhouse-client -q "RESTORE DATABASE plausible_events_db FROM File('events')"
Starta den sedan igen med systemctl --user start plausible-app. Vi körde de här stegen på testservern: kontot, webbplatsen och alla besök kom tillbaka, och inloggningen fungerade.
11. Håll den uppdaterad
PostgreSQL och ClickHouse uppdateras inom sina fastlåsta versioner av podman-auto-update.timer, och podman auto-update --dry-run visar vad den skulle göra. Plausible själv ligger kvar på exakt den version som står i plausible-app.container, som Plausible rekommenderar, eftersom vissa versioner kräver extra steg. När en ny version har kommit läser du dess anteckningar på Plausibles sida för versioner, säkerhetskopierar (steg 10), byter version och startar om:
cd ~/.config/containers/systemd
sed -i 's|community-edition:v3.2.1|community-edition:v3.2.2|' plausible-app.container
systemctl --user daemon-reload
systemctl --user restart plausible-app
podman image rm ghcr.io/plausible/community-edition:v3.2.1
Plausible migrerar sina databaser själv när den startar. Jämför också versionerna av PostgreSQL och ClickHouse i den nya versionens compose.yml med dina: att flytta PostgreSQL till en ny huvudversion kräver att dess data dumpas och läses in igen. När det här skrevs var 3.2.1 den senaste versionen, så en uppdatering till en nyare version kunde vi inte testa.
Felsökning
Någon annan kan registrera sig. Inget konto fanns ännu när blocket utan raderna med remote_ip blev tillgängligt, så den som kom först blev ägare. Stoppa podden, radera volymerna med podman volume rm plausible-db plausible-events och börja om från steg 4, med steg 5 före steg 6.
Registreringssidan visar sitt formulär, men ingenting händer när du skickar det. Du når Plausible på en annan adress än BASE_URL, till exempel via en SSH-tunnel, och webbläsarens WebSocket-anslutning nekas med 403. Använd steg 5.
Alla besökare har samma land, eller serverns. Caddy skickar inte vidare besökarens adress, eller så gör något framför Caddy det inte. Kontrollera Shields: IP addresses i webbplatsens inställningar, där syns den adress Plausible ser för dig.
Besöken från ditt test syns inte. Skriptet skickar ingenting från automatiserade webbläsare, och Plausible slänger händelser från webbläsaridentiteter som den känner igen som robotar, men svarar ändå 202. Använd en vanlig webbläsare.
Plausible startar om gång på gång, och loggen visar could not open file "global/pg_filenode.map": Permission denied. Filerna i en volym har fått en annan ägare, till exempel av en chown -R på /home/plausible som root. Som plausible ger du tillbaka dem med podman unshare chown -R 70:70 ~/.local/share/containers/storage/volumes/plausible-db/_data, och på samma sätt med 101:101 för plausible-events och plausible-events-logs.
ClickHouses logg visar Listen [0.0.0.0]:9009 failed: ... Address already in use. ipv4-only.xml från steg 3 saknas. Utan den lyssnar ClickHouse på både IPv6 och IPv4 och varnar för det; den fungerar ändå.
Säkerhetskopieringen stoppar med filesystem error: in create_directories: Permission denied ["/backups/events"]. ClickHouse kan inte skriva i ~/backup/clickhouse. Kör podman unshare chown 101:101 ~/backup/clickhouse från steg 3.