From c4a0c5c37836c23e3ca4b35e15dbe7dba1e82d0f Mon Sep 17 00:00:00 2001
From: irrlicht
Date: Wed, 17 Jun 2026 23:21:17 +0200
Subject: [PATCH] Datenschutz + Notes: Reichweitenmessung dokumentieren
Punkt 5 beschreibt die anonyme Reichweitenmessung inkl. ASN-Einordnung;
durchgaengig "anonymisierte IP-Adresse" und expliziter Hinweis, dass auch
fuer die ASN-Bestimmung nie die volle IP verwendet wird. IPv6-
Anonymisierung auf /32 (letzte 96 Bit) korrigiert.
Notes: Migration der asn-Spalte (ALTER TABLE) und neue Env-Var
KVER_GEOIP_ASN samt GeoLite2-Bereitstellung.
Co-Authored-By: Claude Opus 4.8
---
notes/deploy.md | 18 ++++++++++++++++++
notes/migrations.md | 21 +++++++++++++++++++++
static/docs/datenschutz.html | 20 ++++++++++++++------
3 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/notes/deploy.md b/notes/deploy.md
index 1a976a6..10b1e16 100644
--- a/notes/deploy.md
+++ b/notes/deploy.md
@@ -57,6 +57,24 @@ Konfiguration über Umgebungsvariablen:
|-------------|---------------------|----------------------|
| `KVER_ADDR` | `:8080` | Listen-Adresse im Container |
| `KVER_DB` | `/app/data/kver.db` | Pfad zur SQLite-Datei |
+| `KVER_GEOIP_ASN` | _(leer)_ | Pfad zur GeoLite2-ASN-`.mmdb`; leer = ASN-Auflösung aus |
+
+## GeoLite2-ASN-Datenbank (optional)
+
+Für die netzwerktopologische Einordnung der Impressions (Spalte `impression.asn`).
+Ohne diese DB läuft alles normal weiter, die Impressions haben dann nur kein ASN.
+
+Die `GeoLite2-ASN.mmdb` gibt es kostenlos bei MaxMind (Konto + Lizenzschlüssel,
+monatliche Updates). Datei ins Daten-Volume legen und den Pfad setzen:
+
+```sh
+podman unshare cp GeoLite2-ASN.mmdb \
+ "$(podman volume inspect kver-data --format '{{.Mountpoint}}')/"
+```
+
+Dann `KVER_GEOIP_ASN=/app/data/GeoLite2-ASN.mmdb` setzen. Die Datei wird beim Start
+einmalig gemappt; für aktualisierte Daten die Datei ersetzen und den Dienst neu
+starten.
## Bestehende Daten übernehmen
diff --git a/notes/migrations.md b/notes/migrations.md
index e4f5067..e2a203e 100644
--- a/notes/migrations.md
+++ b/notes/migrations.md
@@ -97,3 +97,24 @@ ALTER TABLE entry ADD COLUMN deleted INTEGER NOT NULL DEFAULT 0;
```
Bestehende Beiträge bleiben damit sichtbar (`deleted = 0`). Nur einmalig ausführen.
+
+---
+
+## `asn`-Spalte in `impression`
+
+**Wann:** beim Deploy der ASN-Auswertung gegen eine bestehende `impression`-Tabelle.
+
+**Hintergrund:** Pro Impression wird das autonome System (Netzbetreiber) gespeichert,
+aufgelöst aus der vollen Client-IP *vor* dem Maskieren (siehe `lookupASN`). Die Spalte
+liegt bewusst **nicht** im Primärschlüssel — pro `anon_ip` ist das ASN deterministisch,
+also entstehen keine Zeilen-Duplikate, und ein simples `ADD COLUMN` genügt (kein
+Tabellen-Rebuild). `CREATE TABLE IF NOT EXISTS` ergänzt die Spalte bei einer
+vorhandenen Tabelle nicht.
+
+**Migration:**
+```sql
+ALTER TABLE impression ADD COLUMN asn TEXT NOT NULL DEFAULT '';
+```
+
+Bestehende Zeilen haben damit kein ASN (`''`, in der Auswertung „(unbekannt)"). Nur
+einmalig ausführen.
diff --git a/static/docs/datenschutz.html b/static/docs/datenschutz.html
index 46dca02..a54adae 100644
--- a/static/docs/datenschutz.html
+++ b/static/docs/datenschutz.html
@@ -69,7 +69,7 @@ E-Mail: david@bernet.it
| IP-Adresse (anonymisiert) |
-Nutzungsstatistik |
+Reichweitenmessung (Seitenaufrufe) |
Unbegrenzt |
Berechtigtes Interesse |
@@ -135,15 +135,23 @@ E-Mail: david@bernet.it
Speicherdauer: Maximal 24 Stunden
-5. Anonymisierte Nutzungsstatistik
+
5. Anonymisierte Reichweitenmessung
Erfasste Daten:
-- Anonymisierte IP-Adresse (IPv4: letzte 16 Bit entfernt, IPv6: letzte 80 Bit entfernt)
-- Zugriffszeitpunkt
+- Anonymisierte IP-Adresse (IPv4: letzte 16 Bit entfernt, IPv6: letzte 96 Bit entfernt)
+- Zugriffstag (ohne Uhrzeit)
+- Aufgerufene Seite
-Zweck: Erfassung des Seitenwachstums und Auswertung der Nutzeraktivität
+Verarbeitung:
+
+- Die IP-Adresse wird unmittelbar bei der Verarbeitung gekürzt; die vollständige Adresse wird zu keinem Zeitpunkt gespeichert oder weiterverwendet.
+- Aus der bereits anonymisierten IP-Adresse wird zusätzlich der Netzbetreiber (das autonome System, z. B. „AS3320 Deutsche Telekom AG") bestimmt. Dies ist kein zusätzlich erhobenes Merkmal, sondern eine Einordnung der anonymisierten IP-Adresse anhand eines lokalen Datensatzes (MaxMind GeoLite2-ASN). Auch für diese Einordnung wird nicht die vollständige IP-Adresse herangezogen. Es findet keine Standortbestimmung statt.
+- Die Auswertung erfolgt ausschließlich auf unserem Server. Die IP-Adresse wird zu keinem Zeitpunkt an Dritte übermittelt; insbesondere erfolgt keine Online-Abfrage bei MaxMind.
+- Es werden ausschließlich aggregierte Zählwerte gespeichert (Aufrufe je Tag, anonymisiertem Netz, Seite und Netzbetreiber). Es kommen keine Cookies und keine sonstige Speicherung auf Ihrem Endgerät zum Einsatz.
+
+Zweck: Erfassung des Seitenwachstums und der Reichweite (Seitenaufrufe)
Rechtsgrundlage: Berechtigtes Interesse (Art. 6 Abs. 1 lit. f DSGVO)
-Hinweis: Durch die Anonymisierung ist keine Rückverfolgung auf einzelne Personen möglich
+Hinweis: Durch die Anonymisierung und Aggregation ist keine Rückverfolgung auf einzelne Personen möglich.
6. Datenlöschung