Webanalyse auf dem VPS: Tools und Ressourcen im Vergleich
Plausible, Umami, Matomo, GoatCounter und GoAccess im Vergleich: RAM-Bedarf, Datenbank, wachsende Logs, Reverse Proxy und die Lücke durch Adblocker.
Welches selbst gehostete Webanalyse-Tool sollten Sie auf einem VPS betreiben?
Selbst gehostete Webanalyse-Tools gehören zu zwei Gruppen. Die falsche Gruppe zu wählen kostet Sie mehr, als das falsche Produkt zu wählen. Die eine Gruppe führt ein kleines Script im Browser des Besuchers aus und speichert die von diesem Script gemeldeten Daten. Die andere Gruppe liest das Access-Log, das Ihr Webserver bereits schreibt. Alles Weitere, einschließlich der Datenbank und des benötigten Arbeitsspeichers, ergibt sich aus dieser einen Entscheidung.
Die kurze Antwort für einen kleinen Server: GoatCounter und Medama laufen mit 1 GB, weil jedes Tool aus einem Prozess besteht und eine Datei verwendet. Umami fügt einen Postgres-Container hinzu und bietet ein Dashboard, das auch technisch nicht versierte Personen verstehen. Plausible Community Edition und Rybbit verwenden beide ClickHouse. Planen Sie daher 2 GB RAM oder mehr ein. Matomo ist das vollständige Produkt und erfordert einen Server, dessen Größe an den Datenverkehr angepasst ist. GoAccess fügt der Seite überhaupt nichts hinzu, weil es ein bereits vorhandenes Log liest.
Skript-Tag oder Server-Log: Was die jeweilige Methode sehen kann
Ein Skript-Tag misst Browser. Die Seite wird geladen, das Skript wird ausgeführt und sendet eine Anfrage an Ihren Collector. Alles, was diese Kette unterbricht, bleibt für Sie unsichtbar: deaktiviertes JavaScript, eine Filterliste, die die Anfrage blockiert, eine fehlgeschlagene Anfrage an den Collector oder ein Crawler, der keine Skripte ausführt.
Ein Log-Parser misst Anfragen. Ihr Webserver schreibt für jede Anfrage eine Zeile, unabhängig davon, ob Sie zusätzliche Software installieren. Die Daten liegen daher bereits auf der Festplatte. Der Parser erfasst jeden Crawler und jeden Aufruf einer Datei, die kein Skript-Tag enthält. Er kann nicht sehen, was im Browser passiert ist. Er kann auch keine Seite erfassen, die aus dem Browser-Cache oder von einem vorgeschalteten CDN (Content Delivery Network) ausgeliefert wird, weil diese Anfrage Ihren Server nie erreicht hat.
Die beiden Zahlen werden nicht übereinstimmen, und keine der beiden Zahlen ist deshalb falsch. Matomo kann beides. In der Dokumentation wird erläutert, welche Daten beim Log-Import im Vergleich zum JavaScript-Tracker fehlen: Bildschirmauflösung und Seitentitel, Ereignisse, Content-Tracking, Heatmaps, Sitzungsaufzeichnungen und Formularanalysen. Diese Einschränkungen entstehen, weil Anfragen statt Browser gezählt werden.
Bot-Traffic erklärt die andere Hälfte der Abweichung. Log-basierte Zählungen schließen Crawler ein, sofern Sie sie nicht filtern. Auf einer gewöhnlichen Website ist der Crawler-Anteil groß genug, um Ihre Schlussfolgerungen zu verändern. GoAccess und Matomos Log-Import filtern bekannte Bots. Beide können jedoch keinen Crawler herausfiltern, der seinen User-Agent fälscht. Deshalb sollten Sie jede log-basierte Zählung mit dem Blockieren von AI-Crawlern auf dem Server kombinieren und das Log erst nach der Sperre statt davor auswerten.
GoAccess: Analysen aus den vorhandenen Logs
Installieren Sie GoAccess aus dem eigenen Debian- und Ubuntu-Repository des Projekts, weil die Distributionspakete hinter den Releases zurückliegen.
wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update
sudo apt-get install goaccessVerweisen Sie anschließend auf das Log und schreiben Sie einen statischen Bericht.
goaccess /var/log/nginx/access.log -o ~/report.html --log-format=COMBINEDDieser Befehl schlägt für einen normalen Benutzer mit Permission denied fehl, weil das nginx-Log unter Ubuntu root gehört und die Gruppe adm verwendet. Fügen Sie sich mit sudo usermod -aG adm $USER dieser Gruppe hinzu. Melden Sie sich anschließend ab und wieder an, weil die Gruppenmitgliedschaft beim Anmelden eingelesen wird. Führen Sie id aus und prüfen Sie, ob adm in der Liste erscheint, bevor Sie den Vorgang wiederholen.
Ein Bericht über das aktuelle Log umfasst nur Einträge, die logrotate noch nicht verschoben hat. Die Anfragen vom Vortag stehen in access.log.1, ältere Logs sind komprimiert. Eine Wochenansicht muss daher auch die rotierten Dateien einlesen.
zcat /var/log/nginx/access.log.*.gz | goaccess - --log-format=COMBINED -o ~/last-week.htmlEs gibt außerdem den Live-Modus --real-time-html, der die Seite über einen WebSocket aktualisiert. Dafür sind ein zweiter Port und eine eigene Proxy-Regel erforderlich. Für die meisten Websites reicht ein stündlicher, per cron geschriebener Bericht aus. Außerdem gibt es dann weniger abzusichern.
GoatCounter: eine Go-Binärdatei und eine SQLite-Datei
GoatCounter wird als statisch kompiliertes Binärprogramm veröffentlicht. Daher muss keine Laufzeitumgebung installiert werden. Laden Sie einen Build von der Release-Seite herunter und starten Sie ihn, oder verwenden Sie das Image.
docker run -p 8080:8080 -v goatcounter-data:/home/goatcounter/goatcounter-data arp242/goatcounterWenn GoatCounter als Binärprogramm ausgeführt wird, lauscht goatcounter serve auf Port 8080 und erstellt die SQLite-Datenbank unter ./goatcounter-data/db.sqlite3. Legen Sie die erste Website über die Befehlszeile anstelle des Webassistenten an, wenn die Instanz bereits hinter einem Proxy läuft.
goatcounter db create site -vhost=stats.example.com -user.email=me@example.comGoatCounter kann sein eigenes Zertifikat mit goatcounter serve -listen=:443 -tls=tls,rdr,acme verwalten und dabei ACME (Automatic Certificate Management Environment) verwenden. Das ist auf einem Server sinnvoll, auf dem keine weiteren Dienste laufen. Wenn nginx oder Caddy Port 443 bereits verwaltet, lassen Sie GoatCounter auf Port 8080 lauschen und leiten Sie den Datenverkehr stattdessen per Proxy weiter. Das Tracking-Skript ist nach Angaben des Projekts etwa 3.5K groß. Für Seiten ohne JavaScript gibt es außerdem ein Tracking-Pixel. Wenn SQLite bei einer stark ausgelasteten Website zum begrenzenden Faktor wird, kann dieselbe Binärdatei mit goatcounter serve -db 'postgresql+dbname=goatcounter' auch PostgreSQL verwenden. Backups bestehen aus einer Dateikopie. Das ist der entscheidende Vorteil dieses Aufbaus.
Medama: ein einzelner Container mit einem angegebenen Speicherbedarf von 256 MB
Medama ist hier die neueste Option als einzelne Binärdatei. Das Programm verwendet standardmäßig keine Cookies. Laut Projekt bleibt der Tracker unter 1 KB. Außerdem sollen kleine Websites auf virtuellen Maschinen mit 256 MB Arbeitsspeicher laufen. Das sind veröffentlichte Angaben des Projekts und keine Werte, die für diese Anleitung gemessen wurden.
docker volume create medama-data
docker run -d -p 127.0.0.1:8080:8080 -v medama-data:/app/data ghcr.io/medama-io/medama:latestDer offizielle Befehl veröffentlicht den Port als 8080:8080. Das Loopback-Präfix oben ist absichtlich gesetzt. Der Abschnitt zum Reverse Proxy erklärt den Grund. Die erste Anmeldung erfolgt mit admin und dem Passwort CHANGE_ME_ON_FIRST_LOGIN. Der Name dieses Passworts ist die Anweisung.
Ein dokumentierter Fehlerfall ist besonders relevant. Die Anmeldung funktioniert nur über HTTPS oder auf localhost. Wenn Sie den Proxy vor dem Zertifikat einrichten, weist das Formular ein korrektes Passwort zurück. Der Grund wird nicht angezeigt. Richten Sie zuerst TLS (Transport Layer Security) ein. Melden Sie sich danach an.
Umami: PostgreSQL und ein Dashboard, das viele erkennen
git clone https://github.com/umami-software/umami.git
cd umami
docker compose up -dDamit wird die Anwendung auf Port 3000 zusammen mit einem PostgreSQL-Container gestartet. Die Dokumentation nennt PostgreSQL v12.14 als Mindestversion. Wenn Sie die Anwendung stattdessen aus dem Quellcode erstellen, benötigen Sie Node.js 18.18 oder neuer. Es gibt ein vorgefertigtes Image, docker.umami.is/umami-software/umami:postgresql-latest. Dafür muss DATABASE_URL auf eine bereits betriebene Datenbank zeigen.
Die erste Anmeldung erfolgt mit admin und dem Passwort umami. Ändern Sie das Passwort, bevor Sie DNS auf den Server zeigen lassen. Sobald der DNS-Eintrag aufgelöst wird und der Proxy antwortet, ist die Instanz aus dem Internet erreichbar. Einzelheiten zu Compose, Umgebungsdateien und der Neustartrichtlinie finden Sie unter einem Docker-Compose-Stack auf einem VPS, anstatt einen Stack zu kopieren, den Sie nicht gelesen haben.
Die Installation besteht aus einem Node-Prozess und Postgres. Sie benötigt mehr Ressourcen als ein einzelnes Binary und deutlich weniger als jede Anwendung, die ClickHouse verwendet.
Plausible Community Edition: ClickHouse bestimmt den RAM-Mindestbedarf
git clone -b v3.2.1 --single-branch https://github.com/plausible/community-edition plausible-ce
cd plausible-ce
touch .env
echo "BASE_URL=https://stats.example.com" >> .env
echo "SECRET_KEY_BASE=$(openssl rand -base64 48)" >> .env
docker compose up -dVersion v3.2.1 ist im August 2026 aktuell. Der Clone-Befehl pinnt diese Version absichtlich. Der Stack besteht aus drei Teilen: der Anwendung, Postgres für Konten und Einstellungen sowie ClickHouse für die Ereignisdaten. SECRET_KEY_BASE muss mindestens eine Zeichenkette mit 64 Byte sein. Genau das erzeugt der Aufruf openssl.
Die Anforderungen von Plausible nennen mindestens 2 GB RAM, damit ClickHouse und die Anwendung nicht vom Out-of-Memory-Killer beendet werden. Außerdem wird eine CPU mit Unterstützung für SSE 4.2 oder NEON benötigt. ClickHouse setzt diese Unterstützung voraus. Diese zweite Anforderung sollten Sie vor dem Kauf prüfen. Sie ist ein praktischer Unterschied bei der Auswahl zwischen einem ARM- und einem x86-VPS. ClickHouse verwendet außerdem so viel Speicher, wie verfügbar zu sein scheint. Legen Sie auf einem gemeinsam genutzten Server daher eine Obergrenze fest, wie unter Begrenzen des Container-Speichers in Compose beschrieben.
BASE_URL muss exakt der öffentlichen URL entsprechen. Ist das nicht der Fall, melden Sie sich an, die Anwendung leitet auf den falschen Host um und das Sitzungs-Cookie wird für eine Domain geschrieben, die Ihr Browser nicht verwendet. Dadurch landen Sie ohne Fehlermeldung wieder beim Anmeldeformular.
Die mitgelieferte Compose-Datei veröffentlicht keinen Port, da ein Proxy davor vorgesehen ist. Fügen Sie eine Override-Datei hinzu, die den Standardport der Anwendung ausschließlich auf dem Loopback-Interface veröffentlicht.
cat > compose.override.yml << EOF
services:
plausible:
ports:
- 127.0.0.1:8000:8000
EOFMatomo: das vollständige Produkt und der dafür erforderliche Server
Matomo läuft mit PHP und MySQL oder MariaDB. Damit gehört es zum klassischen Webstack und nicht zu einem Container-Stack. Außerdem ist es das einzige Tool in dieser Übersicht, das Hardware-Empfehlungen nach dem Datenverkehr veröffentlicht.
The data behind this chart
[
{
"label": "100K/month",
"cpu_cores": 2,
"ram_gb": 2,
"disk_gb": 50
},
{
"label": "1M/month",
"cpu_cores": 4,
"ram_gb": 8,
"disk_gb": 250
},
{
"label": "10M/month",
"cpu_cores": 8,
"ram_gb": 16,
"disk_gb": 400
}
]Das sind die von Matomo veröffentlichten Mindestanforderungen im August 2026, keine Messwerte aus diesem Leitfaden. Bis zu 100,000 Seitenaufrufen pro Monat benötigt Matomo 2 CPU-Kerne, 2 GB RAM und 50 GB SSD-Speicher. Ein Server übernimmt dabei sowohl die Anwendung als auch die Datenbank. Bei 1M/month sind es 8 GB RAM und 250 GB Speicher. Bei 10M/month empfiehlt Matomo zwei Server. Die letzte Zeile zeigt die Anforderungen an den Datenbankserver: 16 GB RAM und 400 GB Speicher. Vergleichen Sie diese Speicherwerte mit den Optionen für einzelne Binärdateien. Dort befindet sich der gesamte Datensatz in einer SQLite-Datei.
Die Archivierung überrascht viele Benutzer. Standardmäßig erstellt Matomo seine Berichte, wenn jemand das Dashboard öffnet. Mit zunehmender Datenmenge wird das Dashboard dadurch langsamer und läuft schließlich in einen Timeout. Die dokumentierte Lösung besteht darin, die durch den Browser ausgelöste Archivierung in den allgemeinen Einstellungen zu deaktivieren und den Archiver stattdessen über cron aus dem Matomo-Verzeichnis auszuführen. Verwenden Sie dafür den Benutzer, dem die Matomo-Dateien gehören.
php console core:archive --url=https://analytics.example.comMatomo speichert außerdem Tabellen mit Rohdaten neben den verarbeiteten Berichtstabellen. Alte Rohdaten und alte Berichte können nach einem Zeitplan gelöscht werden. Aktivieren Sie diese Funktion bei der Installation und nicht erst, wenn der Speicher voll ist. Matomo kann auch Serverzugriffslogs importieren. Damit deckt es als einziges Produkt in dieser Übersicht beide Produktfamilien ab.
Rybbit und neuere Stacks
git clone https://github.com/rybbit-io/rybbit.git
cd rybbit
chmod +x *.sh
./setup.sh your.domain.nameRybbit ist ein neueres Projekt mit einem modernen Dashboard. Das Setup-Skript schreibt die Umgebungsdatei und startet den Stack mit Docker Compose. Rybbit verwendet ClickHouse und bringt Caddy als eigenen Webserver mit. Caddy verwendet Port 443 und fordert ein Zertifikat für die angegebene Domain an. Wenn nginx auf dem Server bereits Port 443 verwendet, kann das Skript den Port nicht binden. Verwenden Sie in diesem Fall den manuellen Compose-Weg des Projekts und schalten Sie Rybbit hinter Ihren bestehenden Proxy. Die Dokumentation nennt mindestens 2 GB RAM, Tests unter Ubuntu 24 LTS sowie ARMv8.2-A oder neuer auf ARM-Systemen, da ClickHouse diese Architektur voraussetzt.
Bei jedem jungen Projekt gilt eine wichtige Einschränkung: Neue Funktionen werden schnell veröffentlicht, ebenso schnell können sich inkompatible Änderungen ergeben. Pinnen Sie ein Tag, lesen Sie vor dem Pull die Release Notes und erstellen Sie vorher ein Datenbank-Backup.
Aufbewahrung und Speicherwachstum: Messen Sie selbst auf Ihrem Server
Das Speicherwachstum hängt davon ab, welche Daten das Tool pro Ereignis speichert. GoatCounter fasst Zugriffe in Zählern zusammen. Daher wächst seine Datei stärker mit der Anzahl unterschiedlicher Seiten und Tage als mit dem reinen Datenvolumen. Umami und Matomo speichern pro Ereignis eine Zeile. Matomo speichert zusätzlich zu den Rohdaten verarbeitete Berichtstabellen. ClickHouse speichert Ereignisse spaltenorientiert und komprimiert sie stark. Deshalb kommt Plausible mit einem Datenvolumen zurecht, das einen zeilenorientierten Speicher stark belasten würde.
Dieser Leitfaden nennt keinen Wert in Megabyte pro 1 Million Seitenaufrufe, weil dieser Wert nicht mit Ihrem Datenverkehr gemessen wurde. Führen Sie die Messung selbst durch. Passen Sie die Namen des Dienstes und des Benutzers an Ihre eigene Compose-Datei an.
du -h goatcounter-data/db.sqlite3
docker compose exec db psql -U umami -d umami -c "SELECT pg_size_pretty(pg_database_size('umami'));"
docker compose exec plausible_events_db clickhouse-client -q "SELECT formatReadableSize(sum(bytes_on_disk)) FROM system.parts WHERE active"Notieren Sie den Wert, warten Sie eine Woche, und notieren Sie ihn erneut. Teilen Sie die Differenz durch die Seitenaufrufe, die das Dashboard für diese Woche meldet. Dieser Wert bezieht sich auf Ihre Website und Ihre Bot-Filterung. Er ist daher aussagekräftiger als jeder veröffentlichte Durchschnittswert. Legen Sie anschließend ein Aufbewahrungslimit fest, solange der Wert noch niedrig ist. Ein voller Datenträger legt jeden Dienst auf dem VPS lahm, nicht nur die Analyse. Das ist das stärkste Argument dafür, das Datenbank-Volume an einem Ort zu speichern, vor dem df -h Sie warnen wird. Dieses Risiko verdient auf einem Server, der bereits etwas Speicherintensives enthält, besondere Beachtung. Ein selbst gehosteter Fotoserver wird den Datenträger lange vor einer kritischen Größe der Analysedatenbank vollständig belegen.
Verhalten hinter einem Reverse Proxy auf einer Subdomain
Richten Sie den Collector auf einer Subdomain der gemessenen Website ein, zum Beispiel stats.example.com. Dadurch wird die Anfrage an den Collector als First-Party-Anfrage eingestuft. Sie wird daher nicht von den Browserregeln blockiert, die Third-Party-Anfragen verhindern.
Binden Sie die Anwendung an die Loopback-Adresse, wenn Sie den Container-Port veröffentlichen. Docker schreibt seine eigenen Firewall-Regeln vor den ufw-Regeln. Ein Container, der als -p 3000:3000 veröffentlicht wird, ist daher aus dem Internet erreichbar, obwohl ufw status meldet, dass der Port abgewiesen wird. Testen Sie den Zugriff von einem anderen Rechner mit curl http://SERVER_IP:3000. Sie erhalten dann das Dashboard. Bei einer Veröffentlichung als -p 127.0.0.1:3000:3000 liefert derselbe Test Connection refused. Nur der Proxy kann die Anwendung erreichen.
server {
listen 443 ssl;
server_name stats.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}Die Weiterleitungs-Header sind hier erforderlich. Ohne X-Forwarded-For kommt jeder Zugriff von 127.0.0.1. Dadurch bleibt der Länderbericht leer, und die Zahl der eindeutigen Besucher fällt in Richtung eins. Jedes Projekt legt selbst fest, welchem Header es vertraut und unter welcher Einstellung. Lesen Sie daher einmal die Proxy-Dokumentation des jeweiligen Projekts, statt dies vorauszusetzen. Caddy setzt diese Header selbst. Ein Caddyfile für dieselbe Aufgabe umfasst zwei Zeilen.
stats.example.com {
reverse_proxy 127.0.0.1:3000
}Wenn Sie noch keinen Proxy ausgewählt haben, zeigt der Vergleich von nginx, Caddy und Traefik, welcher sich für einen einzelnen Server mit einigen Subdomains eignet.
Benötigen Sie beim Self-Hosting weiterhin ein Cookie-Banner?
Self-Hosting ändert, wer die Daten verwaltet. Es ändert nicht, was das Gesetz über diese Daten sagt. Halten Sie zwei Regeln getrennt. Die Einwilligungsregel der ePrivacy-Richtlinie betrifft das Speichern oder Auslesen von Daten auf dem Gerät des Besuchers. Ein Tool, das keine Cookies setzt und nichts im lokalen Speicher ablegt, fällt daher nicht unter diese spezielle Anforderung. Die DSGVO betrifft die Verarbeitung personenbezogener Daten. Eine IP-Adresse gilt als personenbezogenes Datum. Sie benötigen daher weiterhin eine Rechtsgrundlage, eine Löschfrist und eine Auskunft darüber, welche Daten Sie über eine Person gespeichert haben.
Plausible, Umami, GoatCounter und Medama setzen standardmäßig keine Cookies. Was die einzelnen Tools stattdessen ableiten, unterscheidet sich je nach Projekt und ändert sich zwischen Versionen. Lesen Sie daher die Datenschutzdokumentation des jeweiligen Projekts und nicht nur eine Zusammenfassung. Matomo bietet eine IP-Anonymisierung und einen Opt-out-Endpunkt, den Sie in der Administrationsoberfläche aktivieren.
Aufsichtsbehörden kommen in verschiedenen Ländern zu unterschiedlichen Einschätzungen. Die französische CNIL veröffentlicht beispielsweise Bedingungen, unter denen die Reichweitenmessung von der Einwilligung ausgenommen sein kann. Dieser Abschnitt ist eine sachliche Zusammenfassung und keine Rechtsberatung. Fragen Sie für eine echte Website mit echten Nutzern einen Rechtsanwalt in Ihrer Rechtsordnung.
Ein Punkt wird häufig übersehen: Auch ein Zugriffsprotokoll enthält personenbezogene Daten. GoAccess fügt der Seite kein Script hinzu und verarbeitet trotzdem IP-Adressen. Eine logbasierte Analyse fällt daher nicht automatisch außerhalb der gesetzlichen Vorgaben.
Werbeblocker und warum Ihre Zahlen sinken werden
Filterlisten gleichen Hostnamen und URL-Muster ab. Ein gehostetes Analyseprodukt lässt sich leicht erkennen, weil es von allen Besuchern unter demselben bekannten Hostnamen geladen wird. Wenn Sie den Collector in Ihre eigene Subdomain verschieben, verschwindet dieser Hostname aus der Anfrage. Wenn Sie das Script unter einem selbst gewählten Pfad bereitstellen, verschwindet außerdem der bekannte Dateiname. Dadurch ändern sich die Merkmale, nach denen eine Filterliste suchen muss.
Dieser Beitrag macht keine Aussage über eine Trefferquote, weil keine gemessen wurde. Der Anteil der Besucher, die eine bestimmte Konfiguration blockieren, hängt von Ihrer Zielgruppe ab. Eine Zielgruppe aus Entwicklern blockiert deutlich häufiger als eine allgemeine Zielgruppe. Messen Sie stattdessen Ihre eigene Abweichung. Zählen Sie in derselben Woche mit GoAccess die Anfragen für HTML-Seiten im Access-Log. Vergleichen Sie diese Zahl mit den Pageviews, die Ihr scriptbasiertes Tool meldet. Die Differenz entspricht den blockierten Besuchen und den Seiten, die auf Ihrer Website aus dem Cache ausgeliefert wurden.
Rechnen Sie damit, dass sich die Gesamtzahlen an dem Tag ändern, an dem Sie von einem gehosteten Produkt wechseln. Rechnen Sie außerdem damit, dass ein Teil dieser Änderung nichts mit dem Blockieren zu tun hat. Produkte definieren einen Pageview unterschiedlich. Sie unterscheiden sich auch darin, ob ein Routenwechsel innerhalb einer Single-Page-Anwendung als ein Pageview zählt und wann eine Session endet. Vergleichen Sie die Trends über mehrere Wochen, bevor Sie auf einen Rückgang des Traffics schließen.
Welche Lösung für welche Website
- Eine persönliche Website oder ein Blog mit etwa 50.000 Seitenaufrufen pro Monat: GoatCounter oder Medama auf einem VPS mit 1 GB RAM; als Backup genügt eine Dateikopie.
- Eine Website, auf der Sie kein Script einfügen können, oder eine Website mit vielen blockierenden Besuchern: GoAccess über das vorhandene Log, zeitgesteuert ausgeführt.
- Eine Website eines kleinen Unternehmens, deren Dashboard von einer anderen Person gelesen wird: Umami mit seinem Postgres-Container.
- Eine Website, für die Sie Ziele und Trichter benötigen, auf einem System mit mindestens 2 GB RAM: Plausible Community Edition oder Rybbit, wenn Sie das modernere Dashboard bevorzugen und ein jüngeres Projekt akzeptieren.
- Viele Websites, viele Benutzerkonten oder die Anforderung, Rohdaten nach einer eigenen Aufbewahrungsrichtlinie zu speichern: Matomo, dimensioniert nach den oben veröffentlichten Empfehlungen.
Beginnen Sie mit dem kleinsten Tool, das Ihre konkrete Frage beantwortet. Der spätere Wechsel von GoatCounter zu Plausible kostet Sie eine Subdomain und einen Teil der Historie. Der Wechsel von Matomo zu einer anderen Lösung erfordert eine Migration, auf die Sie wahrscheinlich verzichten möchten. Wenn Sie noch entscheiden, welche anderen Dienste auf demselben System betrieben werden sollen, zeigt der umfassendere Self-Hosting-Überblick, was sich dafür eignet. Wenn Sie hingegen eigentlich eine Request-Level-Nachverfolgung einer Anwendung und keine Besucherzahlen benötigen, ist ein selbst gehosteter Observability-Dienst das passende Tool.
FAQ
Entfernt selbst gehostete Analyse den Bedarf an einem Cookie-Banner?
Nein. Die beiden Fragen sind getrennt zu betrachten. Die Einwilligungsregel nach ePrivacy bezieht sich auf das Speichern oder Auslesen von Informationen auf dem Gerät des Besuchers. Ein Tool, das keine Cookies setzt und nichts im lokalen Speicher schreibt, fällt daher nicht unter diese konkrete Anforderung. Die DSGVO ist eine andere Regel und bezieht sich auf die Verarbeitung personenbezogener Daten. Eine IP-Adresse ist ein personenbezogenes Datum. Deshalb benötigen Sie auch ohne Cookie eine Rechtsgrundlage und eine Begrenzung der Speicherdauer. Beim Self-Hosting liegen die Daten auf Ihrem Server, und Sie sind dafür verantwortlich. Prüfen Sie die Hinweise Ihrer zuständigen Aufsichtsbehörde und lassen Sie sich zu Ihrem konkreten Fall rechtlich beraten.
Wie viel RAM benötigt selbst gehostete Analyse auf einem VPS?
Der Datenspeicher entscheidet, nicht das Dashboard. GoatCounter und Medama laufen als ein Prozess mit einer Datei. In der Dokumentation von Medama steht, dass kleine Websites auf Systemen mit 256 MB laufen. Umami fügt neben einer Node-Anwendung einen Postgres-Container hinzu. Plausible Community Edition und Rybbit verwenden beide ClickHouse. Beide Projekte nennen mindestens 2 GB. Die Empfehlungen von Matomo beginnen bei 2 CPU-Kernen und 2 GB RAM für bis zu 100,000 Seitenaufrufe pro Monat.
Warum sind die Zahlen meines selbst gehosteten Systems niedriger als die der ersetzten Analytics-Lösung?
Es gibt zwei Ursachen, und beide sind relevant. Filterlisten blockieren einige Anfragen an den Collector. Dadurch verliert jedes auf Scripts basierende Tool diese Besuche. Außerdem zählen die Produkte unterschiedlich. Was als Seitenaufruf gilt und wann eine Sitzung endet, ist von Produkt zu Produkt verschieden. Vergleichen Sie eine Woche lang die HTML-Seitenanfragen aus Ihrem Access-Log mit den scriptbasierten Seitenaufrufen derselben Woche. Die Differenz umfasst blockierte Besuche und aus dem Cache gelieferte Seiten. Sie wird auf Ihrer eigenen Website gemessen und nicht aus einer veröffentlichten Rate eines anderen Anbieters übernommen.
Kann ich Plausible oder Rybbit auf einem ARM-VPS ausführen?
Beide verwenden ClickHouse. ClickHouse benötigt SSE 4.2 auf x86 oder NEON auf ARM. Die Anforderungen von Plausible nennen dies ausdrücklich. Die Dokumentation von Rybbit verlangt für ARM-Systeme ARMv8.2-A oder neuer. Aktuelle ARM-Serverkerne erfüllen diese Anforderung, ältere jedoch nicht. Der Fehler zeigt sich dadurch, dass ClickHouse mit einem Fehler zum Befehlssatz den Start verweigert. Im Anwendungslog erscheint er nicht als gewöhnlicher Anwendungsfehler. Auf einem kleinen ARM-System vermeiden Sie diese Frage mit den dateibasierten Tools, da keines davon ClickHouse verwendet.
Sollte ich Server-Logs auswerten, statt ein Tracking-Script zu verwenden?
Verwenden Sie die Log-Auswertung, wenn Sie kein Script hinzufügen können, wenn Ihre Zielgruppe häufig blockiert oder wenn Sie eine Zählung einschließlich Crawlern benötigen. GoAccess liest ein Log, das Ihr Server bereits schreibt. Dadurch entstehen weder zusätzliches Seitensgewicht noch eine zusätzliche Datenbank. Dafür erfassen Sie keine Vorgänge innerhalb des Browsers. Außerdem fehlen Seiten, die von einem CDN oder aus dem Browser-Cache ausgeliefert werden, weil die entsprechende Anfrage Ihren Server nie erreicht hat. Viele Websites verwenden beide Verfahren und behandeln sie als zwei unterschiedliche Messungen.