statamic-analytics.jpg

Privacy Analytics — Addon Statamic

Open Source / oliweb.ch

Informations

Client
Open Source / oliweb.ch
Catégories
Applications Web Open Source
Technologies
PHP 8.3+ Statamic 6 MaxMind GeoLite2 Composer SQLite MySQL MariaDB

Privacy Analytics est un addon open-source pour Statamic qui permet de suivre l'audience de son site sans dépendre d'aucun service externe. Ni Google Analytics, ni Matomo cloud, ni Plausible cloud : par défaut, toutes les données restent sur votre serveur.

L'architecture repose sur deux couches complémentaires : chaque page vue est enregistrée directement en base de données pour un suivi en temps réel, puis une tâche planifiée recalcule les métriques agrégées pour les périodes récentes. Par défaut le recording est synchrone ; pour les sites à fort trafic, un mode asynchrone opt-in permet de déléguer l'écriture en base et la géolocalisation à un worker de queue Laravel.

Le tableau de bord propose plus de 15 types de widgets : métriques de visiteurs et visites uniques, comparaison avec la période précédente, distribution géographique (IP → pays/ville), analyse des appareils et navigateurs, attribution des sources de trafic, heatmap d'activité par heure et jour de la semaine, et suivi des visiteurs actifs en temps réel (fenêtres glissantes 5/15/30 min, rafraîchissement automatique toutes les 30 s). Un export CSV des données brutes est disponible pour les comptes disposant de la permission analytics.manage. Seules les réponses HTTP 200 avec Content-Type text/html sont enregistrées — assets, API JSON et scans automatisés sont silencieusement ignorés.

La géolocalisation supporte deux providers : MaxMind GeoLite2 (base locale, aucune IP ne quitte le serveur — recommandé) et ip-api.com (HTTP externe, sans compte, tier gratuit à 45 req/min). La mise à jour de la base GeoLite2 n'est volontairement pas automatisée par l'addon : c'est à chaque projet de planifier le téléchargement selon ses préférences, plutôt que de subir une décision d'infrastructure imposée par une dépendance tierce.

La conformité RGPD/nLPD est intégrée nativement sur deux axes indépendants : l'anonymisation automatique (ip_address, user_agent, user_id mis à NULL après 90 jours par défaut) et la purge des événements bruts (suppression des lignes après 180 jours). Les agrégats journaliers (totaux, pays, appareils) sont préservés indéfiniment dans une table séparée. En mode asynchrone, les payloads des jobs — qui peuvent contenir des données personnelles — sont chiffrés avec APP_KEY avant publication dans la queue. Les commandes de rétention exposent un mode --dry-run pour prévisualiser les suppressions sans les exécuter. Une troisième commande (analytics:purge-failed-jobs) purge les payloads de jobs échoués au-delà du seuil de rétention IP, évitant que des données personnelles chiffrées ne persistent indéfiniment dans la table failed_jobs. Un bandeau de consentement avec contrôles granulaires est disponible en option.

L'accès au tableau de bord est contrôlé par deux permissions granulaires : analytics.view (tableau de bord, données agrégées, temps réel) et analytics.manage (export CSV, réinitialisation des statistiques). Les super-administrateurs Statamic contournent ces contrôles. Côté fiabilité, chaque événement de tracking est identifié par un UUID soumis à une contrainte d'unicité en base : en cas de retry sur la queue, le doublon est silencieusement écarté via insertOrIgnore. La commande de recalcul analytics:process pose un verrou via Cache::lock avant de s'exécuter, ce qui prévient toute corruption des chiffres du jour en cas de chevauchement avec une exécution manuelle.

À l'origine, ce projet était un fork de mohammedshuaau/enhanced-analytics. Depuis, il a considérablement divergé : une architecture de géolocalisation respectueuse de la vie privée (MaxMind en local par défaut), un système complet de conservation et d'anonymisation des données, des permissions CP granulaires, un suivi asynchrone optionnel, ainsi qu'une suite exhaustive de tests automatisés — autant d'éléments qui n'existaient pas dans le projet d'origine.

Ce que ce projet illustre de mon expertise

  • Architecture double couche : écriture directe en DB pour le temps réel, recalcul agrégé par tâche planifiée pour les performances
  • Tracking asynchrone opt-in : géolocalisation et INSERT déportés vers un worker de queue pour les sites à fort trafic ; payloads chiffrés avec APP_KEY
  • Deux providers de géolocalisation : MaxMind GeoLite2 (local, mise à jour quotidienne automatique, aucune IP ne quitte le serveur) ou ip-api.com (HTTP externe, sans compte)
  • Trois commandes de rétention RGPD/nLPD indépendantes avec --dry-run : anonymisation IP/UA/userId (90 j) + purge des événements bruts (180 j, agrégats préservés indéfiniment) + purge des jobs échoués chiffrés — aucun payload à données personnelles ne persiste au-delà du seuil
  • Zéro dépendance externe par défaut : aucun script tiers, aucun cookie analytics imposé, données entièrement auto-hébergées
  • Bandeau de consentement RGPD intégré avec contrôles granulaires optionnels
  • 15+ types de widgets : visiteurs, géographie, appareils, sources, heatmap d'activité horaire, visiteurs actifs en temps réel — export CSV disponible
  • Permissions granulaires CP : analytics.view (consultation) et analytics.manage (export, réinitialisation) — indépendantes du statut super-administrateur
  • Idempotence par UUID d'événement (insertOrIgnore) + verrouillage concurrent sur analytics:process via Cache::lock — double garantie d'intégrité des chiffres
  • Base de données agnostique : SQLite, MySQL et MariaDB testés en CI, aucun moteur spécifique requis
  • Fork open-source refactorisé et significativement étendu, publié sous licence MIT

Galerie

parametre-live.png dashboard.png 2026-08-10-10.42.45-test-statamic-analytics.local-702bd6bad2be.png 2026-08-10-10.43.01-test-statamic-analytics.local-baccecfd386d.png heatmap.png performance.png