Rapport technique d’ingénierie : écosystème gghstats v1.5.1

gghstats v1.5.1 — Honest Reporting

1. Contexte et philosophie de conception

Les données de trafic GitHub (vues et clones) ne sont conservées que dans une fenêtre glissante de 14 jours. Sans capture propre, cette télémétrie disparaît. gghstats persiste l’historique de trafic dans SQLite, avec tableau de bord, API, CLI et métriques Prometheus, au-delà de la limite de l’API.

API GitHub 14 jours vs gghstats SQLite

La conception privilégie la souveraineté des données et le minimalisme opérationnel : un binaire Go + SQLite, pas de base externe obligatoire, auto-hébergement plutôt qu’un SaaS qui exige de confier un PAT à un tiers.

Séparation des responsabilités

Dépôt Rôle
gghstats (core) Application : sync GitHub → SQLite, serve, API/UI, CLI, Prometheus, alertes opt-in, image GHCR / binaires. Variables d’app telles que GGHSTATS_DB, GGHSTATS_TRUSTED_PROXIES, GGHSTATS_GITHUB_TOKEN, etc.
gghstats-selfhosted (déploiement) IaC opérateur : Compose (minimal / Traefik TLS / observabilité), Helm, layout GGHSTATS_HOST_DATA, pin d’image, docs VPS. Pas le code du moteur.

Diagramme écosystème gghstats v1.5.1

Traefik, Helm, stacks Grafana/Prometheus/Loki et la convention GGHSTATS_HOST_DATA appartiennent à selfhosted. Le core ne livre que le binaire/image et la sémantique des variables d’application (ex. faire confiance à X-Forwarded-* via GGHSTATS_TRUSTED_PROXIES).


2. Installation et déploiement

Évaluation rapide (core)

Méthode Commande / outil Usage
Script curl -fsSL https://get.gghstats.com/install.sh | sh Install rapide Linux/macOS (pin : VERSION=v1.5.1 …)
Homebrew brew install hrodrig/gghstats/gghstats Postes de travail
Go go install github.com/hrodrig/gghstats/cmd/gghstats@latest Source / bleeding-edge

Mode démo : gghstats serve --demo (ou GGHSTATS_DEMO=true) — UI avec données synthétiques, sans PAT ni sync réelle.

Production : qui vit où

Core (application) :

Selfhosted (manifestes) : version repo ~0.1.58, pin app GGHSTATS_VERSION=v1.5.1.

Les alertes (Slack / webhook / Loki / SMTP) sont du core (GGHSTATS_ALERTS_*) ; selfhosted ne fait que câbler ces vars dans Compose/Helm et documente gghstats alert test.


3. Trajectoire : v1.1.0 → v1.5.1

v1.3.0 — Statistiques d’index + JSONL

v1.5.0 — Cinq tranches de reporting

Tranche Contenu
F-fresh Fraîcheur / couverture par métrique (views / clones). Statuts : fresh | delayed | missing | failed | never. Graphiques avec trous null (zéro explicite ≠ jour omis). Fetch views/clones indépendant. Migration v7 (traffic_metric_state, traffic_metric_coverage).
V-vis github_visibility + report_policy (exclude > include > inherit) ; GGHSTATS_REPORT_PRIVATE ; CLI repo report ls/set. Surfaces de rapport fail-closed (404 indistinguable). Collection (filter/pins/INCLUDE_PRIVATE) séparée du reporting. Migration v8.
V-json gghstats repo report ls --json (+ filtres --visibility / --policy) pour scripts post-upgrade.
U-legend Légende i18n sur les charts détail : trou/null = non rapporté par GitHub ; 0 = zéro confirmé.
X-chart Téléchargement JSON aligné chart (/{owner}/{repo}/traffic.json) ; dogfood …/traffic?dense=1 (sparse par défaut inchangé).

Opérateurs : après 1.5.0, lignes existantes → unknown + inherit jusqu’au prochain sync (ou repo report set … include). L’historique SQLite n’est pas effacé ; dashboard/APIs/exports/badges peuvent paraître vides jusque-là.

En 1.5.0, Featured a été traité à tort comme surface de rapport : /featured, API, nav et sitemap exigeaient une ligne repos collectée et reportVisible. Cela casse la vitrine éditoriale (entrée Featured ≠ repo à trafic).

1.5.1 restaure le catalogue : à nouveau FilterFeatured / FeaturedCount. La visibilité de rapport reste limitée aux routes trafic/dashboard. Pas de sync nécessaire pour la vitrine. Ce n’est pas un assouplissement du fail-closed du dashboard ; le bug était le mauvais scope de Featured.


4. Données, sécurité et chaîne d’approvisionnement

Migrations SQLite pertinentes

Version Contenu
v6 pins, featured
v7 Fraîcheur / couverture du trafic
v8 repos.github_visibility, repos.report_policy

Ouverture en WAL pour lectures concurrentes (UI/API) pendant que le sync écrit.

Défense en profondeur (core)

Alertes

Opt-in (GGHSTATS_ALERTS_ENABLED) : sinks Slack / webhook / Loki / SMTP ; règles après sync ; validation avec gghstats alert test. Les stacks Grafana/Loki d’observability Compose sont du déploiement selfhosted, distincts du sink Loki de l’app.


5. Clôture

v1.5.1 consolide la ligne 1.5 : fraîcheur honnête (cinq statuts + trous null), visibilité de rapport fail-closed avec migrations v7/v8, et le correctif que Featured est un catalogue éditorial, pas un scope de rapport. Le moteur reste dans gghstats ; Traefik, Helm, GGHSTATS_HOST_DATA et l’observabilité vivent dans gghstats-selfhosted, avec pin d’image v1.5.1.

Références : CHANGELOG · SPEC · README core · gghstats-selfhosted · install https://get.gghstats.com/install.sh