Besucherstatistiken und ihre Schwierigkeiten

Ich habe im letzten Jahr Plausible eingerichtet um die Handvoll Leute zu zählen, die meine Website bis dato besuchen. Leider hat sich herausgestellt, dass ein normaler Adblocker – wie ich ihn selbst verwende – auch das Javascript-Snippet zum Zählen blockiert. Zuerst habe ich gedacht, dass Plausible nicht funktioniert, weil meine eigenen Websiten-Aufrufe nicht registriert worden sind. Aber nein, das ist per Design so und man muss einen Reverse Proxy zwischenschalten, damit das auch geht. Dazu habe ich aber nie Zeit gehabt und daher wurde wohl ein Gutteil der Besucher gar nicht gezählt. Nachdem ich jetzt aber sowieso meinen Mietserver migriere, ist das eine gute Gelegenheit sich um eine Alternative umzusehen. Da kommt Goatcounter ins Spiel.

Minimalismus mit Goatcounter

Die Oberfläche von Goatcounter schaut zwar nicht so poliert aus wie bei Plausible, aber Goatcounter zählt von Haus aus alle Aufrufe und das auch in datenschutzfreundlicher Manier. Das heißt keine individuellen Daten, wie IP-Adressen, werden gesammelt. Es wird nur zusammengezählt und es lassen sich keine Rückschlüsse auf individuelle Besucher machen. Das heißt man bekommt durchaus relevante Infos, wie aus welchen Ländern wer auf die Seite zugreift, aber ansonsten gibt sich Goatcounter sparsam. So sparsam, dass man auch keine Zustimmung zu irgendeiner Datenverarbeitung einholen muss, es werden schlicht keine individuellen Daten verarbeitet.

Installation von Goatcounter auf eigenen LXC unter Proxmox

Goatcounter ist nur eine Go-Binary (daher auch der Name) und hat keinerlei Abhängigkeiten. Das heißt Goatcounter würde auch sehr gut in den Caddy-LXC passen, aber aus administrativen Gründen bekommt das Programm dennoch seinen eigenen Container. So kann ich separat Zurückrollen, falls etwas kaput gehen sollte und auch die Backups gehen eigenständig. Also erster Schritt ist ein LXC Container erstellen. Ich verwende Ubuntu 24.04, aber die Distribution ist eher nebensächlich. Ich bin es halt gewöhnt. Der Container sollte eine statische IP-Adresse bekommen, der Container geupdatet sein und die Programme git, curl und sqlite3 installiert sein. OK, das sind dann schon ein paar Abhängigkeiten, aber das ist nicht die Welt:

sudo apt install git curl sqlite3

Unter Ubuntu 24.04 sind die Programme jedenfalls nicht vorinstalliert:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  git-man libbrotli1 libcurl3t64-gnutls libcurl4t64 liberror-perl libgdbm-compat4t64
  libldap-common libldap2 libperl5.38t64 librtmp1 libssh-4 patch perl perl-modules-5.38
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitweb git-cvs
  git-mediawiki git-svn diffutils-doc perl-doc libterm-readline-gnu-perl
  | libterm-readline-perl-perl make libtap-harness-archive-perl sqlite3-doc
The following NEW packages will be installed:
  curl git git-man libbrotli1 libcurl3t64-gnutls libcurl4t64 liberror-perl
  libgdbm-compat4t64 libldap-common libldap2 libperl5.38t64 librtmp1 libssh-4 patch perl
  perl-modules-5.38 sqlite3
0 upgraded, 17 newly installed, 0 to remove and 2 not upgraded.
Need to get 15.0 MB of archives.

Dann mit unter /opt die Repo klonen…

git clone https://github.com/arp242/goatcounter.git

cd goatcounter

sudo apt install golang

go build ./cmd/goatcounter

./goatcounter db create site \
    -vhost=example.com \
    -user.email=admin@example.com

Hier muss man ein sicheres Passwort für den Admin-Login erstellen.

./goatcounter serve --tls none --listen :8080 

Reverse Proxy Einstellungen

Beim Caddy Reverse Proxy muss man jetzt die folgenden entsprechenden Zeilen hinzufügen:

stats.website.com {
    reverse_proxy <lokale-ip>:8080
    tls "admin@example.com"
    encode gzip zstd

Und schon sollte die Website aufrufbar sein und man kann sich mittels zuvor festgelegten Passwort einloggen:

Quartz sagen es soll nun Goatcounter verwenden

Mein Static Site Builder Quartz hat schon eine vorgefertigte Einstellungsmöglichkeit, um Goatcounter als Service zu verwenden.

Dazu trägt man in quartz.config.ts folgende Zeilen ein:

`{ provider: 'goatcounter', websiteId: 'my-goatcounter-id', host: 'my-goatcounter-domain.com', scriptSrc: 'https://my-url.to/counter.js' }`

Das sieht dann so aus, Plausible weg:

Goatcounter her:

    analytics: {
      provider: "goatcounter",
      host: "stats.martinfellner.at",
      websiteId: "stats-martinfellner-at",
      scriptSrc: "https://stats.martinfellner.at/counter.js"
    },

Laut dem Chatbot braucht man für die selbstgehostete Variante die Website ID eh nicht. Schauen wir einmal ob das stimmt.

Jetzt kann die Website neu gebastelt werden von Quartz und schauen wir einmal, ob Goatcounter dann funktioniert.

Goatcounter mag’s hinterm Reverse Proxy

Goatcounter mag es hinterm Reverse Proxy:

Aber zumindest zum Einrichten geht es auch so. Also alles in Ordnung.

Geht nicht

Leider hat es ab da nur mehr gehakt. Quartz will einfach kein Goatcounter Snippet einbauen. Ich habe edin paar Sachen probiert, aber nichts hilft. Das schaue ich mir ein andermal an, wie zum Beispiel im Folgebeitrag, wo es dann funktioniert hat.