Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Server & Netzwerk 05.11.2026 · 7 min Lesezeit

GoAccess: Server-Logs als Dashboard ohne Tracking

Teil 7 der Reihe Server im Netz: GoAccess wertet die JSON-Logs von Caddy aus und macht daraus einen HTML-Bericht hinter einer Anmeldung. Mit echten Zahlen, ausgeschlossenen eigenen Zugriffen und dem Blick auf echte und gefälschte KI-Crawler.

Geprüft am 05.11.2026 · für GoAccess 1.12, Caddy 2.11.7

Mit KI erstellt – redaktionelle Prüfung ausstehend

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Symbolbild: Server mit leuchtendem Kabel zur Weltkarte, Titel Server-Logs als Dashboard

Wer wissen will, wer die eigene Website besucht, greift oft zu Google Analytics oder einem anderen Tracker. Das bedeutet Skripte im Browser, Cookies und meist einen Hinweis zur Einwilligung. Dabei stehen die wichtigsten Zahlen schon in den Logs des Webservers: welche Seiten abgerufen wurden, wie oft, mit welchem Browser, und welche Bots vorbeikamen. GoAccess macht daraus einen übersichtlichen Bericht als HTML-Datei. Diese Anleitung wertet die echten Caddy-Logs des Testservers aus, schließt eigene Zugriffe aus, kürzt die IP-Adressen und stellt den Bericht hinter einer Anmeldung bereit.

Dies ist Teil 7 der Reihe „Server im Netz“. Als Beispiel dient ein netcup-VPS mit Ubuntu und Docker, auf dem Caddy mehrere Dienste unter sedv-lab.de ausliefert und für jeden ein JSON-Log schreibt.

Voraussetzungen

  • Der VPS aus Teil 4 mit Caddy und einem JSON-Log je Site, etwa mit log { output file /log/sedv-lab.json format json }
  • Docker
  • Ein Name für den Bericht, im Beispiel stats.sedv-lab.de

Schritt 1: Ein erster Bericht

GoAccess läuft als Container und liest die Logs nur lesend:

mkdir -p /opt/goaccess/out
docker run --rm -v /opt/caddy/log:/logs:ro -v /opt/goaccess/out:/out allinurl/goaccess:1.12 \
  /logs/sedv-lab.json /logs/heim.json /logs/dns.json /logs/backup.json \
  --log-format=CADDY --anonymize-ip -o /out/index.html

--log-format=CADDY kennt den Aufbau der JSON-Logs von Caddy, eine eigene Formatbeschreibung ist nicht nötig. Mehrere Logdateien wertet GoAccess zusammen aus und zeigt die Sites im Bereich Virtual Hosts getrennt, einzelne Anfragen zusätzlich mit angehängtem :443. --anonymize-ip setzt laut Handbuch bei IPv4 das letzte Oktett und bei IPv6 die letzten 80 Bit auf null, aus 203.0.113.57 wird 203.0.113.0.

Verifizieren: In /opt/goaccess/out liegt eine index.html von gut 2 MB. Sie enthält alles, auch die Diagramme, und lässt sich ohne Server im Browser öffnen.

Schritt 2: Eigene Zugriffe ausschließen

Der erste Bericht war verzerrt. Unter den häufigsten Adressen standen der Testrechner, der Heimanschluss und Container-Netze von Docker, und die übertragene Datenmenge lag bei rund 760 MB, vor allem durch eigene Testdownloads. Mit --exclude-ip fallen solche Adressen heraus, auch ganze Bereiche:

  --exclude-ip=203.0.113.10 \
  --exclude-ip=2001:db8:1:2::-2001:db8:1:2:ffff:ffff:ffff:ffff \
  --exclude-ip=172.16.0.0-172.31.255.255

Der Bereich 172.16.0.0/12 deckt die üblichen Docker-Netze ab, aus denen Container auf dem Server die eigenen Dienste aufrufen. Danach zeigte die Übersicht 1654 ausgeschlossene Anfragen, die Datenmenge sank auf 11 MiB:

Übersicht des GoAccess-Berichts mit eindeutigen Besuchern und ausgeschlossenen eigenen Zugriffen
Übersicht von GoAccess für sedv-lab.de: 371 eindeutige Besucher (1), 1654 Anfragen eigener Adressen ausgeschlossen (2).

Ein eindeutiger Besucher ist für GoAccess die Kombination aus Adresse, Tag und Browserkennung. Bots, die mit wechselnden Kennungen kommen, zählen damit mehrfach. Die Zahl ist also eine grobe Größe, keine genaue Besucherzahl.

Verifizieren: Im Bereich Visitor Hostnames and IPs taucht keine eigene Adresse mehr auf.

Schritt 3: Was in den Zahlen steckt

Die meisten Abrufe galten der Startseite. Direkt dahinter folgten die Dateien der Prüfseite von Anubis aus Teil 6 unter /.within.website/, denn jeder Browser ohne Cookie lädt sie einmal. Von 487 Antworten mit Fehlercode waren 313 ein 404, darunter typische Ziele von Scannern wie /.env. 95 Mal kam 401 für eine verlangte Anmeldung, 73 Mal 403. 1665 Verbindungen nutzten TLS 1.3, nur 7 TLS 1.2.

Spannend ist der Bereich Browsers. GoAccess sortiert Bots nach ihrer Kennung in Crawlers und AI Crawlers:

Grafik: von GoAccess erkannte KI-Crawler und klassische Crawler mit Trefferzahl
Eigene Auswertung aus dem JSON-Export von GoAccess: erkannte KI-Crawler und eine Auswahl klassischer Crawler mit ihrer Trefferzahl.

Die Zuordnung beruht allein auf der Kennung, die jeder frei setzen kann. Ein Blick in die Logs zeigte das deutlich: Die Treffer von ClaudeBot kamen zum Teil aus dem Bereich, den Anthropic für seinen Crawler veröffentlicht, die von GPTBot und OAI-SearchBot zum Teil aus Bereichen, die OpenAI veröffentlicht. Eine einzelne Adresse aus einem anderen Netz probierte dagegen nacheinander sieben verschiedene KI-Kennungen. Das ist kein Crawler, sondern ein Scanner, der testet, welche Kennung durchkommt. Echte und gefälschte Bots unterscheidet erst ein Abgleich mit den veröffentlichten Adressbereichen der Anbieter, wie ihn Anubis in Teil 6 für gute Crawler macht.

Ein zweiter Punkt: Anubis beantwortet gesperrte KI-Crawler mit seiner Sperrseite und Status 200. GoAccess zählt diese Treffer deshalb als erfolgreich, obwohl der Crawler keinen Inhalt bekam.

Verifizieren: Ein Klick auf den Pfeil neben AI Crawlers im Bericht klappt die einzelnen Kennungen auf.

Schritt 4: Regelmäßig neu erzeugen

Ein kleines Skript fasst den Aufruf zusammen und schreibt neben dem HTML auch einen JSON-Export für eigene Auswertungen:

#!/bin/sh
docker run --rm -v /opt/caddy/log:/logs:ro -v /opt/goaccess/out:/out allinurl/goaccess:1.12 \
  /logs/sedv-lab.json /logs/heim.json /logs/dns.json /logs/backup.json \
  --log-format=CADDY --anonymize-ip --html-report-title="sedv-lab.de" \
  --exclude-ip=203.0.113.10 --exclude-ip=2001:db8:1:2::-2001:db8:1:2:ffff:ffff:ffff:ffff \
  --exclude-ip=172.16.0.0-172.31.255.255 \
  -o /out/index.html -o /out/bericht.json >/dev/null 2>&1

Gespeichert als /opt/goaccess/bericht.sh mit chmod 700, dazu /etc/cron.d/goaccess:

*/10 * * * * root /opt/goaccess/bericht.sh

Ein Lauf dauerte im Test rund zwei Sekunden, die eigentliche Auswertung meldete GoAccess mit einer Sekunde. Weil die Ausgabe nach /dev/null geht, sehen Sie Fehler im Cron-Lauf nicht. Zum Einrichten lassen Sie das Umleiten zunächst weg.

Verifizieren: Die Zeitangabe Last Updated oben rechts im Bericht ist höchstens zehn Minuten alt.

Schritt 5: Bericht mit Anmeldung ausliefern

Der Bericht enthält gekürzte Adressen und alle abgerufenen Pfade. Er gehört nicht öffentlich ins Netz. Caddy erzeugt den Hash für das Passwort selbst:

PW=$(openssl rand -hex 12); echo "$PW"
docker exec caddy caddy hash-password --plaintext "$PW"

Das ausgegebene Passwort notieren Sie, den Hash tragen Sie in den Block ein:

stats.sedv-lab.de {
	import sicher
	basic_auth {
		auswertung HASH
	}
	root * /srv/stats
	file_server
}

In der Compose-Datei von Caddy kommt das Verzeichnis dazu: - /opt/goaccess/out:/srv/stats:ro. Weil sich damit die Volumes ändern, muss der Container neu erstellt werden, ein caddy reload reicht hier nicht.

Verifizieren: curl -s -o /dev/null -w '%{http_code}\n' https://stats.sedv-lab.de/ liefert 401, mit -u auswertung:PASSWORT 200.

Typische Fehler

Meldung oder BeobachtungUrsache und Lösung
option does not take an argumentSchalter wie --ignore-crawlers sind reine Ein-Aus-Schalter. Ohne =false angeben oder weglassen.
Eigene Adressen und riesige Datenmengen im BerichtEigene Tests und Server-Zugriffe. Mit --exclude-ip ausschließen.
Bericht bleibt leerFalsches Format. Für Caddy --log-format=CADDY verwenden, die Logs müssen im JSON-Format sein.
Bericht unter der Subdomain nicht erreichbarVerzeichnis nicht im Caddy-Container eingebunden. Volume ergänzen und Container neu erstellen.

Häufige Fragen

Ersetzt das ein Analysewerkzeug wie Matomo?

Für die Grundfragen ja: welche Seiten, wie oft, woher, mit welchem Gerät. Was im Browser passiert, etwa wie lange jemand liest oder wohin er klickt, steht nicht im Log. Dafür braucht es Skripte auf der Seite.

Ist das datenschutzrechtlich unproblematisch?

Es werden keine Cookies gesetzt und keine Daten an Dritte gegeben. Server-Logs enthalten aber IP-Adressen und sind damit personenbezogen. Legen Sie eine kurze Aufbewahrung fest und nennen Sie die Auswertung in der Datenschutzerklärung. Die gekürzten Adressen im Bericht helfen, die Rohlogs bleiben aber vollständig, und auch eine gekürzte Adresse kann noch auf eine Person verweisen.

Geht das auch live?

GoAccess kann einen Bericht ständig aktualisieren und über einen WebSocket an den Browser schicken. Für eine kleine Website reicht der Bericht alle zehn Minuten.

Fazit

GoAccess macht aus den Logs, die Caddy ohnehin schreibt, in einer Sekunde einen brauchbaren Bericht, ganz ohne Tracker auf der Seite. Die wichtigste Arbeit ist das Ausschließen der eigenen Zugriffe, im Test war rund die Hälfte aller Anfragen davon betroffen. Und die Zahlen zu KI-Crawlern sollten Sie mit Vorsicht lesen: Kennungen lassen sich fälschen, das zeigten schon die ersten Logs des Testservers.

Weiterführende Anleitungen und Quellen

Server im NetzGoAccessCaddyLogsWebanalyseDatenschutzKI-Crawler