6 Commits

Author SHA1 Message Date
irrlicht e965775809 revert migration 2026-06-19 23:07:18 +02:00
irrlicht 3f05200aeb migration function 2026-06-19 22:53:43 +02:00
irrlicht c30399e498 Fixed /stats layout 2026-06-19 22:49:01 +02:00
irrlicht 63240a6cf7 ASN-Auflösung: dominanter Betreiber statt Offset-0-Treffer
Das anonymisierte /16 (bzw. /32 bei IPv6) gehört oft nicht einem
einzigen AS -- gerade im APNIC-Raum ist es in viele kleine Bloecke
zerstueckelt. Der bisherige Lookup auf die Basisadresse lieferte dann
nur den zufaelligen Inhaber von Offset 0 (z.B. faelschlich "Rakuten
Mobile" fuer einen Besucher, der irgendwo im selben /16 sitzt).

Jetzt: per NetworksWithin alle ASNs im Netz zaehlen, das mit der
groessten Adress-Abdeckung waehlen und bei weiteren "(n weitere
Treffer)" anhaengen. Homogene Netze stehen sauber mit Betreibername,
zersplitterte tragen den dominanten plus ehrlichen Unsicherheits-Marker.
Arbeitet weiter ausschliesslich auf dem maskierten Netz, nie auf der
vollen IP.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 22:50:33 +02:00
irrlicht dd714762dc Statistik: Impression-Erfassung asynchron (nicht im Request-Pfad)
Der Seitenaufruf wartete bisher synchron auf den DB-Upsert. Mit
synchronous=FULL (WAL) macht SQLite pro Commit ein fsync -> spuerbare
Latenz pro Seitenaufruf. Die Erfassung laeuft jetzt in einer Goroutine,
die Auslieferung blockiert nicht mehr darauf. Der GeoIP-Lookup war nie
das Problem (mmap, einmal beim Start geoeffnet).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 23:57:33 +02:00
irrlicht 662285c8b5 Statistik: anonymes Impression-Tracking mit ASN-Einordnung
Seitenaufrufe werden serverseitig pro (Tag, anonymisiertes Netz, Pfad)
gezaehlt -- nur auf den HTML-Seiten-Routen, nicht auf API/Assets. Die
Client-IP wird sofort maskiert (IPv4 /16, IPv6 /32); die vollstaendige
IP wird nie gespeichert oder weiterverwendet.

Optional loest eine lokale GeoLite2-ASN-DB (Env KVER_GEOIP_ASN) den
Netzbetreiber aus dem bereits anonymisierten Netz auf -- auch dafuer wird
nicht die volle IP herangezogen. Fehlt die DB, bleibt das Feld leer.

Neuer Endpunkt GET /stats/detail liefert die Aggregate; die Tabelle
impression speichert nur Zaehlwerte (kein Eventlog).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 23:21:17 +02:00