Last Updated:

Plausible Analytics - Eigene Besuche mit dynamischer IP ausschließen

Ralf Kirchner
Ralf Kirchner Plausibe

Vermeide unerwünschtes Tracking: So schließt du bestimmte IPs vom Plausible-Tracking aus – auch bei dynamischen Adressen!

Du betreibst Plausible Analytics in einem Docker-Container und nutzt den NGINX Proxy Manager als Reverse Proxy? Dann kannst du gezielt bestimmte Besucher – z. B. dich selbst oder interne Testnutzer – vom Tracking ausschließen. In diesem Beitrag zeige ich dir, wie du mit einer Kombination aus DynDNS, IP-Auflösung und einem kleinen NGINX-Trick das Tracking für dynamische IPs effektiv unterbindest.

Motivation

Wenn du Plausible Analytics selbst hostest – z. B. in einem Docker-Setup hinter dem NGINX Proxy Manager – willst du vermutlich nicht deine eigenen Seitenaufrufe mittracken.

Das Problem: Viele von uns surfen zuhause mit einer dynamischen IP-Adresse. Statische IPs kosten extra oder sind gar nicht verfügbar. Wie kannst du trotzdem zuverlässig deine eigene Verbindung vom Tracking ausschließen?

Die Lösung: Nutze einen DynDNS-Dienst (z. B. meinname.dyndns.org), der deine aktuelle IP immer aktuell hält – und konfiguriere NGINX Proxy Manager so, dass Zugriffe von dieser IP nicht mehr auf /js/script.js und /api/event zugreifen können.

Voraussetzungen

  • Du betreibst Plausible Analytics als Docker-Container
  • Du nutzt den NGINX Proxy Manager (ebenfalls als Docker-Container)
  • Du hast Zugriff auf den Host, auf dem beide Container laufen
  • Du nutzt einen DynDNS-Dienst, z. B. DuckDNS, No-IP, DynDNS

Schritt-für-Schritt Anleitung

1. DynDNS-IP regelmäßig auflösen (vom Host aus)

Da nginx-proxy-manager in einem Container läuft, muss die Datei mit der geblockten IP auf dem Host erzeugt und dann per Docker Volume in den Container gemountet werden.

Installiere alle benötigten Pakete:

sudo apt install dnsutils

Erstelle ein Shell-Script auf dem Host und passe den DNS-Namen DYNDNS_HOST und den NPM Containernamen NGINX_CONTAINER auf deine Gegebenheiten an:

#!/bin/bash

# Configuration
DYNDNS_HOST="meinname.dyndns.org"
OUTFILE="/opt/nginx-blocked-ip/blocked-ip.conf"
IPFILE="/opt/nginx-blocked-ip/last-ip.txt"
NGINX_CONTAINER="proxy-npm-1"
LOGGER_TAG="update-blocked-ip"

# Ensure target directory exists
mkdir -p "$(dirname "$OUTFILE")"

# Retrieve current IP from DynDNS
CURRENT_IP=$(dig +short "$DYNDNS_HOST" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -n1)

# Handle error if IP is empty
if [ -z "$CURRENT_IP" ]; then
  logger -t "$LOGGER_TAG" "Error: Could not resolve IP for $DYNDNS_HOST."
  exit 1
fi

# Read previous IP
if [ -f "$IPFILE" ]; then
  LAST_IP=$(cat "$IPFILE")
else
  LAST_IP=""
fi

# Check if IP has changed
if [ "$CURRENT_IP" != "$LAST_IP" ]; then
  logger -t "$LOGGER_TAG" "IP changed: $LAST_IP → $CURRENT_IP"

  # Write new IP to file
  echo "$CURRENT_IP" > "$IPFILE"

  # Write config file in correct format
  echo "deny $CURRENT_IP;" > "$OUTFILE"

  # Reload NGINX inside the container
  if docker exec "$NGINX_CONTAINER" nginx -s reload >/dev/null 2>&1; then
    logger -t "$LOGGER_TAG" "NGINX config reloaded successfully inside container '$NGINX_CONTAINER'."
  else
    logger -t "$LOGGER_TAG" "Error reloading NGINX config inside container '$NGINX_CONTAINER'."
  fi
else
  logger -t "$LOGGER_TAG" "No change detected. Current IP remains $CURRENT_IP."
fi

Speichere es z. B. als: /usr/local/bin/update-blocked-ip.sh und mache es ausführbar:

sudo chmod +x /usr/local/bin/update-blocked-ip.sh

Lege einen Cronjob an (alle 5 Minuten):

# Write current DynDNS address to /opt/nginx-blocked-ip/blocked-ip.txt
*/5 * * * * /usr/local/bin/update-blocked-ip.sh

Beispielinhalt der Datei /opt/nginx-blocked-ip/blocked-ip.conf:

deny 91.230.22.26;

2. Volume-Mount zur NGINX Proxy Manager Instanz

Bearbeite deinen docker-compose.yml oder docker run für den nginx-proxy-manager und füge ein Volume hinzu:

  nginx-proxy-manager:
    image: jc21/nginx-proxy-manager:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ...
      - /opt/nginx-blocked-ip:/etc/nginx/custom-deny:ro
      - ...

Wichtig: /opt/nginx-blocked-ip ist auf dem Host und wird read-only im Container unter /etc/nginx/custom-deny gemountet

Anschließend docker-compose up -d ausführen (alternativ den Container neu starten).

3. NGINX Proxy Host konfigurieren

  1. Öffne die Web-GUI von NGINX Proxy Manager
  2. Gehe zu „Proxy Hosts“ → Bearbeite den Eintrag für plausible.yourdomain.tld.
  3. Wechsle zum Reiter „Custom locations“ und füge eine neue Location hinzu.
  4. Gib im Feld Location den Pfad /js/script.js ein.
  5. Klicke auf das Zahnradsymbol, um die erweiterten Einstellungen zu öffnen, und füge im Bereich Advanced folgenden Inhalt ein:
include /etc/nginx/custom-deny/blocked-ip.conf;
allow all;
  1. Trage im Abschnitt Scheme, Forward Hostname / IP und Forward Port* exakt die gleichen Werte ein wie im Tab Details.

Damit wird der Zugriff auf Tracking-Skript und Event-Endpunkt verwehrt, wenn die aufgelöste DynDNS-IP mit der Client-IP übereinstimmt.

🔥 Das funktioniert, weil include im location erlaubt ist, und deny darin ausgeführt wird. Das allow all; stellt sicher, dass alle anderen IPs weiterkommen.

4. Testen

  1. Besuche deine Website von einem Gerät, das über deine DynDNS-IP verbunden ist
  2. Öffne die Entwicklertools (Netzwerk-Tab)
  3. Prüfe, ob script.js und api/event mit HTTP 403 Forbidden blockiert werden
  4. Öffne dein Plausible-Dashboard → Du solltest nicht auftauchen

Abschluss

Damit ist das Tutorial zu “Plausible Analytics - Eigene Besuche mit dynamischer IP ausschließen” abgeschlossen. Wenn Sie Fragen haben, senden Sie eine Mail an ralf.kirchner@ksite.de