Skip to main content
Illustration isométrique dépeignant le flux d'alerte : les données partent d'un dashboard Grafana, sont traitées par un Cloudflare Worker, et apparaissent comme une notification push personnalisée sur un smartphone.

Connecter Grafana à Ntfy : Des Emails aux Cloudflare Workers

6 min 1,332 words

Dans ce guide, nous allons explorer comment faire le pont entre l’Alertmanager intégré de Grafana et Ntfy. Nous couvrirons trois méthodes distinctes pour envoyer des alertes : via email, via un webhook standard, et enfin, via un Cloudflare Worker—une méthode qui débloque une personnalisation bien plus poussée pour vos notifications.

Prérequis

Ce guide suppose que vous faites tourner une instance auto-hébergée (self-hosted) de Grafana et que vous ciblez l’instance publique de Ntfy sur ntfy.sh.

Grafana

Grafana est la plateforme open-source standard de l’industrie pour la visualisation de données. Elle construit des dashboards et des panneaux modulaires en tirant des informations d’une grande variété de sources de données.

L’écosystème pour collecter des métriques est vaste, incluant :

  • Prometheus : Récupère les données des services, conteneurs Docker (via cAdvisor), métriques serveur (node-exporter), métriques disque S.M.A.R.T., Postgres, Mongo, et plus.

  • Loki : Gère l’agrégation de logs, incluant les logs système, journaux, et logs Docker.

  • Infinity Datasource : Se connecte à pratiquement n’importe quelle API, fichier CSV ou JSON.

  • Et bien d’autres : Intégrations natives pour Google Analytics, Cloudflare, Elasticsearch, GitHub, etc.

Je ne plongerai pas dans la configuration de ces sources de données ici, car cela dépend fortement de votre stack spécifique. Personnellement, j’utilise Grafana pour surveiller la santé de mes serveurs (CPU, E/S, disque, température), la disponibilité des services via Blackbox, et les stats des conteneurs Docker. Je maintiens aussi des dashboards dédiés pour Postgres, MongoDB, Traefik, Plausible Analytics et mon cluster Garage.

Les possibilités sont presque illimitées. La liste des sources de données natives est impressionnante et peut être étendue via le Catalogue de Plugins Grafana. Vous voulez visualiser vos courses Strava ? Il y a un plugin pour ça. Besoin de statistiques Jira ? Il y a un plugin pour ça aussi.

Bien que les dashboards soient géniaux pour visualiser la santé de l’infrastructure, ils ne vous alertent pas de manière proactive des problèmes—comme un pic soudain d’erreurs 5xx ou une fuite de mémoire. À moins d’avoir quelqu’un qui fixe les écrans 24/7, se reposer uniquement sur des vérifications visuelles n’est pas durable.

La vraie puissance du monitoring réside dans l’Alerting. Grafana vous permet de définir des règles basées sur vos métriques via l’Alertmanager. Bien que des services Alertmanager autonomes existent pour Prometheus ou Mimir (offrant une plus grande résilience pour les configurations d’entreprise), l’Alertmanager intégré à Grafana est le moyen le plus simple de commencer. Il est parfaitement adapté aux homelabs et aux équipes agiles.

Exemple : Pour surveiller mon cluster Garage, j’utilise la métrique cluster_healthy (1 pour sain, 0 pour malsain). J’ai créé une règle d’alerte qui se déclenche quand la requête descend en dessous de 1. Dans la section “Configure notifications”, vous pouvez définir des déclencheurs via Email, Discord, Slack, etc., ou via Webhook—ce qui est ce dont nous avons besoin pour Ntfy.

Ntfy

Ntfy est un outil open-source fantastique qui envoie des notifications sur votre téléphone ou bureau via de simples appels API. Les cas d’usage vont des alertes d’échec de sauvegarde aux notifications de “retour en stock”.

Nous utiliserons Ntfy pour recevoir des notifications push chaque fois qu’une alerte Grafana se déclenche (fires) ou se résout (resolves).

La version publique (ntfy.sh) offre un niveau gratuit généreux (plafonné à 250 messages/jour), ce qui est plus que suffisant pour ce cas d’usage. Pour des limites plus élevées ou des topics privés, vous pouvez souscrire à un plan premium ou auto-héberger votre propre instance.

Je recommande vivement de lire la documentation officielle pour comprendre l’étendue des capacités.

Préparation : Créez un compte sur ntfy.sh et abonnez-vous à un topic (ex. mon-topic-grafana-secret). Notez ce nom de topic ; nous en aurons besoin immédiatement.

Création de topic sur ntfyCréation de topic sur ntfy

Option 1 : Via Webhook (La méthode simple)

Une fois votre topic Ntfy prêt, configurer un Point de Contact (Contact Point) dans Grafana est direct :

  1. Naviguez vers Alerting > Contact points > + Create Contact point.

  2. Sélectionnez Webhook dans le menu déroulant Integration.

  3. Dans le champ URL, entrez https://ntfy.sh/${topic}, en remplaçant ${topic} par votre nom de topic.

Point de contact Grafana, avec webhook vers NtfyPoint de contact Grafana, avec webhook vers Ntfy

Grafana vous permet d’injecter des données d’alerte dans le payload en utilisant des templates. Éditez le champ “Custom Payload” pour structurer votre message. Par exemple :

Alerte Grafana {{ .Status }}
{{ range .Alerts.Firing }}{{ .Labels }}{{ end }}

Cliquer sur “Test” devrait déclencher une notification sur votre appareil :

Alerte Grafana firing
alertname=TestAlert, grafana_folder=Test Folder, instance=Grafana

Notification reçue utilisant l'api ntfyNotification reçue utilisant l’api ntfy

Ça marche, mais le formatage est brut et utilitaire.

Option 2 : Via Email

Pour envoyer des notifications par email, vous devez d’abord configurer SMTP dans Grafana. Des instructions détaillées peuvent être trouvées ici.

J’utilise un compte Gmail pour ça. Vous aurez besoin de générer un Mot de passe d’application (voir les guides ici et ici).

Ma configuration SMTP grafana.ini ressemble à ceci :

[smtp]
enabled = true
host = smtp.gmail.com:587
user = <exemple>@gmail.com
password = <motdepasse>
from_address = grafana@exemple.com
from_name = Grafana

Après avoir redémarré Grafana :

  1. Allez dans Alerting > Contact points > + Create Contact point.

  2. Sélectionnez Email.

  3. Dans le champ Addresses, utilisez le format d’email Ntfy : ntfy-${topic}@ntfy.sh.

Contrairement à la méthode webhook, nous pouvons facilement définir un titre propre en utilisant le champ Subject :

Alerte Grafana {{ .Status }}

Point de contact Grafana, avec email vers NtfyPoint de contact Grafana, avec email vers Ntfy

L’inconvénient : Vous perdez le contrôle sur le corps du message. Grafana ajoute des métadonnées par défaut, rendant la notification verbeuse. Je place généralement un simple espace dans le champ message pour minimiser l’encombrement, mais le résultat contient toujours des pieds de page et des en-têtes.

Notification reçue utilisant les emailsNotification reçue utilisant les emails

Option 3 : Webhook + Cloudflare Worker (La méthode “Pro”)

Pourquoi utiliser un Worker ?

Les deux premières options sont faciles mais rigides. La configuration webhook native de Grafana ne vous permet pas de paramétrer dynamiquement les headers basés sur les données de l’alerte (ex. changer le header de priorité basé sur la sévérité de l’alerte).

En introduisant un “middleware”—un Cloudflare Worker—nous pouvons intercepter le payload, traiter la logique, et construire l’appel API parfait pour Ntfy. Cela permet :

  • Notifications actionnables : Ajoutez des boutons pour ouvrir les dashboards directement.

  • Priorités Dynamiques : Les alertes haute priorité déclenchent des sons forts ; les alertes basse priorité sont silencieuses.

  • Tags Visuels : Utilisez des emojis pour distinguer instantanément entre Firing (🔥) et Resolved (✅).

Configurer le Worker

  1. Connectez-vous à Cloudflare et allez dans Compute (Workers) > Create application.

  2. Je recommande de connecter à un repository GitHub pour le contrôle de version. Vous pouvez forker ou utiliser mon repository ici.

L'écran de build et déploiement du worker sur CloudflareL’écran de build et déploiement du worker sur Cloudflare

Une fois déployé, définissez deux secrets dans les paramètres du Worker :

  1. AUTH_TOKEN : Une chaîne sécurisée (générez-en une via openssl rand -base64 20) pour sécuriser le lien entre Grafana et Cloudflare.

  2. TOPIC : Le nom de votre topic Ntfy.

Le panneau de création de secret du workerLe panneau de création de secret du worker

Configurer Grafana

De retour dans Grafana :

  1. Créez un nouveau point de contact Webhook.

  2. URL : L’URL de votre Cloudflare Worker (https://votre-worker.subdomain.workers.dev).

  3. HTTP Method : POST

  4. Authorization Header Scheme : Bearer

  5. Authorization Header Credentials : Le AUTH_TOKEN que vous avez généré.

  6. Message : Sélectionnez “Enter custom message” et coller le bloc JSON ci-dessous.

Point de contact Grafana qui utilise le Cloudflare workerPoint de contact Grafana qui utilise le Cloudflare worker

Note : Ce JSON est un template sur une seule ligne qui extrait toutes les données pertinentes conformes à la structure attendue par mon Worker.

{"receiver":"{{ .Receiver }}","status":"{{ .Status }}","alerts_firing":[{{ range .Alerts.Firing }}{"status":"{{ .Status }}","labels":"{{ .Labels }}","annotations":"{{ .Annotations }}","starts_at":"{{ .StartsAt }}","ends_at":"{{ .EndsAt }}","generator_url":"{{ .GeneratorURL }}","fingerprint":"{{ .Fingerprint }}","dashboard_url":"{{ .DashboardURL }}","panel_url":"{{ .PanelURL }}","silence_url":"{{ .SilenceURL }}","values":"{{ .Values }}","value_string":"{{ .ValueString }}"}{{ end }}],"alerts_resolved":[{{ range .Alerts.Resolved }}{"status":"{{ .Status }}","labels":"{{ .Labels }}","annotations":"{{ .Annotations }}","starts_at":"{{ .StartsAt }}","ends_at":"{{ .EndsAt }}","generator_url":"{{ .GeneratorURL }}","fingerprint":"{{ .Fingerprint }}","dashboard_url":"{{ .DashboardURL }}","panel_url":"{{ .PanelURL }}","silence_url":"{{ .SilenceURL }}","values":"{{ .Values }}","value_string":"{{ .ValueString }}"}{{ end }}],"group_labels":"{{ .GroupLabels }}","common_labels":"{{ .CommonLabels }}","common_annotations":"{{ .CommonAnnotations }}","external_url":"{{ .ExternalURL }}"}

Cliquez sur Test. Vous devriez recevoir une notification magnifiquement formatée avec les tags appropriés, les priorités et les boutons d’action.

Aller plus loin

Utiliser un Cloudflare Worker comme couche middleware ouvre des possibilités infinies :

  • Routage : Envoyer les alertes critiques vers un topic “style PagerDuty” et les alertes info vers un log silencieux.

  • Résilience : Implémenter une logique de réessai si l’API Ntfy est temporairement inaccessible.

  • Déduplication : Utiliser Cloudflare Worker KV pour stocker l’état et empêcher les alertes “flapping” (métriques oscillant autour d’un seuil) de spammer votre téléphone.

Note de sécurité : Ce guide utilise l’instance publique Ntfy. Puisque l’abonnement aux topics est ouvert, assurez-vous que votre nom de topic est unique et impossible à deviner (comme un mot de passe). Pour des données métier sensibles, auto-hébergez toujours Ntfy ou utilisez leur plan payant authentifié.