﻿﻿{"id":2033,"date":"2026-01-09T09:00:00","date_gmt":"2026-01-09T08:00:00","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/shm-la-telemetrie-qui-respecte-vos-utilisateurs\/"},"modified":"2026-01-09T09:00:00","modified_gmt":"2026-01-09T08:00:00","slug":"shm-la-telemetrie-qui-respecte-vos-utilisateurs","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/shm-la-telemetrie-qui-respecte-vos-utilisateurs\/","title":{"rendered":"SHM &#8211; La t\u00e9l\u00e9m\u00e9trie qui respecte vos utilisateurs"},"content":{"rendered":"<p>Si vous d\u00e9veloppez un logiciel open source auto-h\u00e9berg\u00e9, vous connaissez s\u00fbrement ce dilemme qui est de comment savoir si votre projet est r\u00e9ellement utilis\u00e9 sans devenir l&#8217;affreux Big Brother que vous combattez ? Soit vous ne mesurez rien et vous codez dans le vide, soit vous collez du Google Analytics ou assimil\u00e9 et vous trahissez l&#8217;esprit m\u00eame du self-hosting.<\/p>\n<p>Benjamin Touchard (que certains d&#8217;entre vous connaissent peut-\u00eatre via son projet<br \/>\n<a href=\"https:\/\/korben.info\/ackify-confirmation-lecture-documents-open-source.html\">Ackify<\/a><br \/>\n) a d\u00e9cid\u00e9 de r\u00e9soudre ce probl\u00e8me avec <strong><br \/>\n<a href=\"https:\/\/self-hosted-metrics.com\/\">SHM, pour Self-Hosted Metrics<\/a><br \/>\n<\/strong>. Son id\u00e9e c&#8217;est de proposer une t\u00e9l\u00e9m\u00e9trie respectueuse de la vie priv\u00e9e, o\u00f9 chaque instance g\u00e9n\u00e8re sa propre identit\u00e9 cryptographique d\u00e8s le premier d\u00e9marrage.<\/p>\n<p>\n<img decoding=\"async\" src=\"https:\/\/korben.info\/cdn-cgi\/image\/width=1200,fit=scale-down,quality=90,f=avif\/shm-self-hosted-metrics-telemetrie-privacy\/shm-self-hosted-metrics-telemetrie-privacy-2.png\" alt=\"\" loading=\"lazy\">\n<\/p>\n<p>Concr\u00e8tement, quand vous int\u00e9grez le SDK dans votre application (dispo en Go et Node.js 22+), chaque installation g\u00e9n\u00e8re une paire de cl\u00e9s Ed25519, un peu comme quand vous g\u00e9n\u00e9rez vos cl\u00e9s SSH pour la premi\u00e8re fois. Tous les \u00e9changes avec votre serveur SHM sont ensuite sign\u00e9s cryptographiquement, ce qui garantit l&#8217;int\u00e9grit\u00e9 des requ\u00eates et leur origine. L&#8217;instance a une identit\u00e9 persistante (pseudonyme), mais \u00e7a n&#8217;identifie pas l&#8217;utilisateur final.<\/p>\n<p>C\u00f4t\u00e9 donn\u00e9es collect\u00e9es, ensuite c&#8217;est vous qui d\u00e9cidez. Votre app envoie p\u00e9riodiquement un JSON avec les m\u00e9triques que vous avez d\u00e9finies, et le dashboard s&#8217;adapte dynamiquement. Y&#8217;a pas de sch\u00e9ma impos\u00e9, pas de PII (donn\u00e9es personnellement identifiables) et par d\u00e9faut, le SDK collecte aussi des infos syst\u00e8me (OS, CPU, RAM), mais c&#8217;est d\u00e9sactivable.<\/p>\n<p>\n<img decoding=\"async\" src=\"https:\/\/korben.info\/cdn-cgi\/image\/width=1200,fit=scale-down,quality=90,f=avif\/shm-self-hosted-metrics-telemetrie-privacy\/shm-self-hosted-metrics-telemetrie-privacy-3.png\" alt=\"\" loading=\"lazy\">\n<\/p>\n<p>Pour ceux qui veulent h\u00e9berger le bouzin, c&#8217;est du Docker classique&#8230; Vous cr\u00e9ez un fichier <code>compose.yml<\/code>, vous configurez le DSN PostgreSQL, vous r\u00e9cup\u00e9rez les migrations SQL, et hop un <code>docker compose up -d<\/code>. Le dashboard est alors accessible par d\u00e9faut sur le port 8080 et affiche automatiquement vos m\u00e9triques m\u00e9tier, la distribution des versions, le nombre d&#8217;instances actives, etc.<\/p>\n<p>Et pour les utilisateurs finaux qui ne veulent vraiment pas participer, un simple <code>DO_NOT_TRACK=true<\/code> dans les variables d&#8217;environnement d\u00e9sactive compl\u00e8tement la t\u00e9l\u00e9m\u00e9trie.<\/p>\n<p>\n<a href=\"https:\/\/github.com\/btouchard\/shm?tab=readme-ov-file\">Le code du serveur est sous licence AGPL<\/a><br \/>\n(les SDKs ont leur propre licence, v\u00e9rifiez sur le d\u00e9p\u00f4t) et y&#8217;a aussi des badges SVG \u00e0 coller dans vos pages README pour afficher fi\u00e8rement le nombre d&#8217;instances de votre app qui tournent.<\/p>\n<p>Bref, si vous distribuez un logiciel auto-h\u00e9berg\u00e9 et que vous voulez savoir combien d&#8217;instances sont actives sans compromettre la vie priv\u00e9e des utilisateurs, c&#8217;est le top !<\/p>\n<p>Merci \u00e0 Benjamin pour le partage !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Si vous d\u00e9veloppez un logiciel open source auto-h\u00e9berg\u00e9, vous connaissez s\u00fbrement ce dilemme qui est de comment savoir si votre projet est r\u00e9ellement utilis\u00e9 sans devenir l&#8217;affreux Big Brother que vous combattez ? Soit vous ne mesurez rien et vous codez dans le vide, soit vous collez du Google Analytics ou assimil\u00e9 et vous trahissez l&#8217;esprit m\u00eame du self-hosting. Benjamin Touchard (que certains d&#8217;entre vous connaissent peut-\u00eatre via son projet Ackify ) a d\u00e9cid\u00e9 de r\u00e9soudre ce probl\u00e8me avec SHM, pour Self-Hosted Metrics . Son id\u00e9e c&#8217;est de proposer une t\u00e9l\u00e9m\u00e9trie respectueuse de la vie priv\u00e9e, o\u00f9 chaque instance g\u00e9n\u00e8re sa propre identit\u00e9 cryptographique d\u00e8s le premier d\u00e9marrage. Concr\u00e8tement, quand vous int\u00e9grez le SDK dans votre application (dispo en Go et Node.js 22+), chaque installation g\u00e9n\u00e8re une paire de cl\u00e9s Ed25519, un peu comme quand vous g\u00e9n\u00e9rez vos cl\u00e9s SSH pour la premi\u00e8re fois. Tous les \u00e9changes avec votre serveur SHM sont ensuite sign\u00e9s cryptographiquement, ce qui garantit l&#8217;int\u00e9grit\u00e9 des requ\u00eates et leur origine. L&#8217;instance a une identit\u00e9 persistante (pseudonyme), mais \u00e7a n&#8217;identifie pas l&#8217;utilisateur final. C\u00f4t\u00e9 donn\u00e9es collect\u00e9es, ensuite c&#8217;est vous qui d\u00e9cidez. Votre app envoie p\u00e9riodiquement un JSON avec les m\u00e9triques que vous avez d\u00e9finies, et le dashboard s&#8217;adapte dynamiquement. Y&#8217;a pas de sch\u00e9ma impos\u00e9, pas de PII (donn\u00e9es personnellement identifiables) et par d\u00e9faut, le SDK collecte aussi des infos syst\u00e8me (OS, CPU, RAM), mais c&#8217;est d\u00e9sactivable. Pour ceux qui veulent h\u00e9berger le bouzin, c&#8217;est du Docker classique&#8230; Vous cr\u00e9ez un fichier compose.yml, vous configurez le DSN PostgreSQL, vous r\u00e9cup\u00e9rez les migrations SQL, et hop un docker compose up -d. Le dashboard est alors accessible par d\u00e9faut sur le port 8080 et affiche automatiquement vos m\u00e9triques m\u00e9tier, la distribution des versions, le nombre d&#8217;instances actives, etc. Et pour les utilisateurs finaux qui ne veulent vraiment pas participer, un simple DO_NOT_TRACK=true dans les variables d&#8217;environnement d\u00e9sactive compl\u00e8tement la t\u00e9l\u00e9m\u00e9trie. Le code du serveur est sous licence AGPL (les SDKs ont leur propre licence, v\u00e9rifiez sur le d\u00e9p\u00f4t) et y&#8217;a aussi des badges SVG \u00e0 coller dans vos pages README pour afficher fi\u00e8rement le nombre d&#8217;instances de votre app qui tournent. Bref, si vous distribuez un logiciel auto-h\u00e9berg\u00e9 et que vous voulez savoir combien d&#8217;instances sont actives sans compromettre la vie priv\u00e9e des utilisateurs, c&#8217;est le top ! Merci \u00e0 Benjamin pour le partage !<\/p>\n","protected":false},"author":1,"featured_media":2034,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2033","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2033"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2033\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2034"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}