Notifications DumbMonit
Ce guide explique comment recevoir les alertes DumbMonit sur le service de votre choix. Il ne demande aucune compétence de programmation : chaque section dit où trouver l’adresse ou le jeton à copier, et quoi saisir dans le formulaire.
Sommaire
Section intitulée « Sommaire »- Comment ça fonctionne
- Créer et tester un canal
- Réglages ou secrets : la différence
- Acquitter ou mettre en pause depuis la notification
- Le canal personnalisé
- Canaux supportés
- Dépannage
Comment ça fonctionne
Section intitulée « Comment ça fonctionne »Un canal est une destination : un canal Discord, un numéro de téléphone, une boîte mail. Vous en créez autant que vous voulez, et vos règles d’alerte choisissent lesquels notifier.
Trois principes s’appliquent à chaque canal :
- Les alertes sont groupées. Un message par surveillance et par cycle, même si cinq disques se remplissent en même temps. Sans ça, vous coupriez les notifications en une semaine.
- Un canal cassé n’en bloque jamais un autre. L’échec est enregistré dans la colonne « dernière erreur » du canal, et la livraison continue vers les autres.
- Un service qui ne répond pas est abandonné après 15 secondes. Une notification qui arrive une minute en retard n’est plus utile, et la boucle de surveillance ne doit pas attendre derrière un serveur inaccessible.
Créer et tester un canal
Section intitulée « Créer et tester un canal »- Ouvrez Réglages → Notifications → Ajouter un canal
(
/settings/notifications). - Donnez-lui un nom significatif (« Discord — famille », « SMS — astreinte »). C’est le nom que vous choisirez plus tard dans vos règles d’alerte.
- Choisissez le type de canal, puis remplissez les champs décrits ci-dessous.
- Enregistrez, puis cliquez sur Envoyer un test.
Le message de test prend exactement le même chemin qu’une vraie alerte : même requête, même jeton, même formatage. S’il arrive, le canal fonctionne. S’il échoue, le message d’erreur nomme le réglage à corriger.
Un jeton n’est jamais remontré. Une fois enregistré, il est chiffré dans la base de données et l’interface dit seulement « configuré ». Pour modifier un canal sans ressaisir son jeton, laissez simplement le champ vide.
Réglages ou secrets : la différence
Section intitulée « Réglages ou secrets : la différence »Chaque canal a deux groupes de champs.
| Réglages | Secrets | |
|---|---|---|
| Contenu | adresse serveur, nom de canal, sujet | jetons, mots de passe, URL de webhook |
| Stockage | texte clair | chiffré |
| Relu par l’interface | oui | jamais |
L’interface refuse d’enregistrer un champ sensible parmi les réglages, et vous le dit. Ce n’est pas une formalité : les réglages sont renvoyés tels quels par l’API, un jeton stocké là serait donc publié chaque fois que la page est ouverte.
Les tableaux de la section Canaux supportés disent, pour chaque canal, ce qui va où.
Acquitter ou mettre en pause depuis la notification
Section intitulée « Acquitter ou mettre en pause depuis la notification »Quand une URL publique est réglée (Réglages → Notifications → Politique de
notification, ou DUMBMONIT_PUBLIC_URL), chaque message d’alerte porte trois
actions :
- Écarter (« Dismiss ») : « j’ai compris ». L’alerte quitte la liste active et plus rien ne part pour elle, pas même sa résolution, jusqu’à ce que la condition retombe ; si elle revient plus tard, elle alerte à nouveau. Elle vient en premier : c’est elle qui reste là où seuls deux boutons tiennent (Web Push dans la plupart des navigateurs).
- Acquitter (« Acknowledge ») : plus de rappels jusqu’à la résolution de l’alerte. La résolution reste annoncée.
- Pause 1 h (« Snooze 1 h ») : plus de rappels pendant une heure ; ils reprennent ensuite si l’alerte est toujours active. Une pause n’écourte jamais un acquittement plus long.
Leur présentation dépend du canal :
| Canal | Présentées comme |
|---|---|
| ntfy, Telegram, Web Push | Boutons sous la notification |
| Discord, Slack, courriel et tous les autres canaux | Liens en fin de message |
| Webhook personnalisé | Liens dans {{message}}, et les variables {{dismiss_url}} / {{ack_url}} / {{snooze_url}} |
| PagerDuty, Opsgenie, Grafana OnCall, SIGNL4 | Rien : acquittez dans le service lui-même |
| Jira, GLPI, Zammad, GitHub Issues, GitLab Issues | Rien : l’acquittement est ajouté au ticket en commentaire |
| Vonage, Telnyx, ASPSMS (SMS) | Rien : un lien signé coûterait plusieurs segments de SMS |
Telegram n’accepte de boutons que vers une adresse https avec un nom de domaine ;
avec une adresse IP ou une URL en http, les actions restent des liens dans le
texte. Web Push ne montre les boutons que sur les appareils des opérateurs et des
administrateurs : un lecteur voit l’alerte, pas de quoi la faire taire.
Un lien ouvre une courte page de confirmation dans DumbMonit : rien ne se passe tant que vous n’appuyez pas sur le bouton. Les messageries, applications de chat et antivirus ouvrent les liens pour construire un aperçu ; ils ne font que charger la page. Aucune connexion n’est nécessaire : le lien est l’autorisation, et seulement pour ce geste, sur les alertes de ce message (ce déclenchement-là : une alerte résolue puis redéclenchée n’est plus couverte par l’ancien lien), une seule fois, pendant 24 heures. L’action est inscrite au journal d’audit, et l’alerte indique « acknowledged by via notification link » (ou « dismissed by via notification link »).
La sécurité, en bref : chaque lien est signé avec une clé dérivée du secret
d’instance (changer le secret invalide tous les liens), ne porte aucune session, et
voyage après le # de l’adresse, que les navigateurs n’envoient jamais au serveur :
il n’apparaît donc dans aucun journal d’accès ni de mandataire. Un lien forgé,
altéré ou expiré reçoit la même réponse que n’importe quel lien invalide, et les
tentatives répétées depuis une même adresse sont freinées.
Désactivez Acquitter et mettre en pause depuis les notifications dans la politique de notification pour ne plus les ajouter ; cela invalide aussi les liens déjà envoyés. Vider l’URL publique a le même effet.
Le canal personnalisé
Section intitulée « Le canal personnalisé »Le canal webhook est la trappe de secours de DumbMonit. Vous décrivez
toute la requête HTTP — méthode, adresse, en-têtes, type de contenu et
corps —, ce qui vous laisse brancher presque n’importe quel service, y
compris une API interne que DumbMonit ne connaîtra jamais.
Sans aucune configuration particulière, il envoie déjà une charge utile JSON structurée qu’un script peut utiliser :
{ "source": "dumbmonit", "target": "nas", "rule": "Disk full", "severity": "warning", "status": "firing", "title": "nas — Disk full", "text": "⚠️ Warning · Disk full — /data — 95 % (threshold > 90 %)", "value": 95.0, "threshold": 90.0, "unit": "%", "fingerprint": "nas/disk-full", "count": 1, "at": "2026-09-01T14:12:05+00:00", "link": ""}Réglages du canal personnalisé
Section intitulée « Réglages du canal personnalisé »| Réglage | Requis | Défaut | Rôle |
|---|---|---|---|
url | oui (ici ou comme secret) | — | Adresse à appeler. Peut contenir des variables. |
method | non | POST | POST, PUT ou GET. |
content_type | non | json | json, form ou text. Détermine aussi comment les variables sont échappées. |
body_template | non | — | Modèle de corps. Quand absent, la charge utile ci-dessus est envoyée. |
headers | non | — | En-têtes supplémentaires, comme un objet {"X-Key": "value"}. |
base_url | non | — | Adresse publique de votre DumbMonit, pour que {{link}} donne un lien cliquable. |
username | non | — | Nom d’utilisateur pour l’authentification HTTP « Basic ». Demande le secret password. |
| Secret | Rôle |
|---|---|
url | Utilisez-le au lieu du réglage url si l’adresse contient déjà un jeton. |
token | Envoyé comme en-tête Authorization: Bearer …, sauf si votre modèle utilise {{token}}. |
password | Mot de passe pour l’authentification « Basic ». |
Variables disponibles
Section intitulée « Variables disponibles »Une variable s’écrit entre doubles accolades : {{title}}. Les
espaces autour du nom sont tolérés ({{ title }}). Les accolades
simples dans un corps JSON restent littérales, vous pouvez donc écrire
votre JSON normalement.
| Variable | Ce qu’elle contient | Exemple |
|---|---|---|
{{title}} | Titre complet du message | nas — Disk full |
{{message}} | Corps en texte brut, une ligne par alerte | ⚠️ Warning · Disk full — /data — 95 % (threshold > 90 %) |
{{message_markdown}} | Le même corps en Markdown | **nas — Disk full**\n• ⚠️ … |
{{rule}} | Nom de la règle d’alerte | Disk full |
{{target}} | Nom de la surveillance | nas |
{{target_id}} | Identifiant numérique de la surveillance | 42 |
{{severity}} | Gravité technique | info, warning ou critical |
{{severity_fr}} | Gravité comme un mot lisible | information, avertissement, critique |
{{status}} | Statut technique | firing ou resolved |
{{status_fr}} | Statut comme un mot lisible | en cours ou résolu |
{{value}} | Valeur mesurée, unité incluse | 95 % |
{{value_raw}} | Valeur nue, utilisable comme nombre JSON | 95 |
{{threshold}} | Seuil franchi, unité incluse | 90 % |
{{threshold_raw}} | Seuil nu, utilisable comme nombre JSON | 90 |
{{unit}} | Unité de la valeur | % |
{{operator}} | Comparaison de seuil | > |
{{count}} | Nombre d’alertes groupées dans ce message | 3 |
{{fingerprint}} | Identifiant stable de l’alerte | nas/disk-full |
{{timestamp}} | Horodatage ISO 8601 | 2026-09-01T14:12:05+00:00 |
{{timestamp_unix}} | Horodatage en secondes depuis 1970 | 1788358325 |
{{date}} | Horodatage lisible, en UTC | 2026-09-01 14:12 UTC |
{{priority}} | Priorité de 1 (basse) à 5 (haute) | 4 |
{{color}} | Couleur d’accent, sans dièse | D98A00 |
{{color_hex}} | Couleur d’accent, avec dièse | #D98A00 |
{{emoji}} | Pictogramme de statut | 🔴, ⚠️, ℹ️ ou ✅ |
{{link}} | Lien vers la surveillance dans DumbMonit | https://dumbmonit.home/targets/42 |
{{source}} | Toujours dumbmonit | dumbmonit |
{{token}} | Le secret token du canal | (votre jeton) |
{{ack_url}} | Lien signé qui acquitte l’alerte jusqu’à sa résolution, vide si les liens d’action sont désactivés | https://dumbmonit.home/alert-action#… |
{{snooze_url}} | Lien signé qui met l’alerte en pause une heure, vide si les liens d’action sont désactivés | https://dumbmonit.home/alert-action#… |
{{dismiss_url}} | Lien signé qui écarte l’alerte (masquée et muette jusqu’à sa résolution), vide si les liens d’action sont désactivés | https://dumbmonit.home/alert-action#… |
Deux remarques utiles :
- Certaines variables peuvent être vides. Une alerte de disponibilité
(« hôte inaccessible ») n’a ni valeur ni seuil :
{{value}}et{{value_raw}}rendent alors une chaîne vide, jamaisnullniNaN. Si vous les placez comme un nombre JSON, gérez ce cas — ou utilisez"{{value}}"entre guillemets. {{link}}reste vide jusqu’à ce que vous remplissiezbase_url. Un lien faux gaspillerait plus de temps qu’une alerte sans lien.
Vous n’avez jamais besoin d’échapper quoi que ce soit vous-même. Selon
le content_type choisi, DumbMonit protège automatiquement les valeurs
substituées : guillemets et retours à la ligne échappés en JSON,
encodage pourcentage dans un formulaire, aucune transformation en texte
brut. Une règle nommée "Système" disque plein ne cassera pas votre
modèle JSON.
Exemple 1 — une API JSON interne
Section intitulée « Exemple 1 — une API JSON interne »Une application maison expose POST /incidents et attend un jeton dans un
en-tête personnalisé.
Réglages
{ "url": "https://api.internal.example.org/incidents", "method": "POST", "content_type": "json", "base_url": "https://dumbmonit.home", "headers": { "X-Application": "dumbmonit" }, "body_template": "{\"title\": \"{{title}}\", \"device\": \"{{target}}\", \"severity\": \"{{severity}}\", \"state\": \"{{status}}\", \"value\": {{value_raw}}, \"threshold\": {{threshold_raw}}, \"detail\": \"{{message}}\", \"link\": \"{{link}}\", \"seen_at\": \"{{timestamp}}\"}"}Secrets
{ "token": "your-application-token" }Le jeton est envoyé automatiquement comme en-tête
Authorization: Bearer …. Voici ce que l’application reçoit :
{ "title": "nas — Disk full", "device": "nas", "severity": "warning", "state": "firing", "value": 95, "threshold": 90, "detail": "⚠️ Warning · Disk full — /data — 95 % (threshold > 90 %)", "link": "https://dumbmonit.home/targets/42", "seen_at": "2026-09-01T14:12:05+00:00"}Exemple 2 — un service qui attend un formulaire
Section intitulée « Exemple 2 — un service qui attend un formulaire »Beaucoup de passerelles SMS et d’anciennes API attendent
application/x-www-form-urlencoded plutôt que du JSON, avec le jeton
dans le corps.
Réglages
{ "url": "https://gateway.example.org/api/send", "method": "POST", "content_type": "form", "body_template": "key={{token}}&recipient=0612345678&subject={{title}}&text={{emoji}} {{message}}&priority={{priority}}"}Secrets
{ "token": "gateway-key" }Comme le modèle utilise déjà {{token}}, DumbMonit n’ajoute pas
d’en-tête Authorization : certains services rejettent une requête qui
porte deux authentifications. Les valeurs sont encodées automatiquement,
les espaces devenant + et les caractères accentués leur équivalent
encodé en pourcentage.
Exemple 3 — un SMS en texte brut via un opérateur
Section intitulée « Exemple 3 — un SMS en texte brut via un opérateur »Certains services, comme l’API SMS d’un opérateur ou une automatisation maison, veulent une seule ligne de texte.
Réglages
{ "url": "https://automation.home/alert", "method": "POST", "content_type": "text", "body_template": "{{emoji}} {{severity}} on {{target}}: {{rule}} ({{value}}, threshold {{operator}} {{threshold}}) — {{date}}"}Le message envoyé, sans aucun échappement :
⚠️ warning on nas: Disk full (95 %, threshold > 90 %) — 01/09/2026 14:12 UTCExemple 4 — une requête GET sans corps
Section intitulée « Exemple 4 — une requête GET sans corps »Quand le service n’accepte que des paramètres d’URL, mettez les variables
dans url et choisissez la méthode GET. Une requête GET n’a pas de
corps : body_template est alors refusé, pour que personne ne croie
qu’il fait quelque chose.
Réglages
{ "url": "https://sms.example.org/send?user=noe&text={{title}} — {{value}}", "method": "GET"}Secrets
{ "token": "api-key" }Seules les valeurs substituées sont encodées ; le reste de l’adresse est copié tel quel. La requête réellement envoyée ressemble à :
GET https://sms.example.org/send?user=noe&text=nas%20%E2%80%94%20Disk%20full%20%E2%80%94%2095%20%25Erreurs de template courantes
Section intitulée « Erreurs de template courantes »Un modèle défectueux est refusé à l’enregistrement, pendant que vous regardez le formulaire, pas la nuit où l’incident arrive.
| Ce que vous écrivez | Ce qui se passe |
|---|---|
{{severite}} | Refusé : variable inconnue « severite », suivie de la liste des noms valides. Le bon nom est severity. |
{"t": "{{title"} | Refusé : « accolades non fermées ». Le }} manque. |
{{}} ou {{ }} | Refusé : une variable sans nom ne signifie rien. |
{"a": {"b": 1}} | Accepté. Les accolades simples sont littérales : écrivez votre JSON normalement. |
{{token}} sans secret token | Refusé : le modèle demande un jeton que le canal n’a pas. |
method: GET avec body_template | Refusé, avec l’alternative : mettez les variables dans url. |
method: DELETE | Refusé : seuls POST, PUT et GET sont acceptés. |
Canaux supportés
Section intitulée « Canaux supportés »Dans Discord : Réglages du canal → Intégrations → Webhooks → Nouveau webhook, puis Copier l’URL du webhook. Cette URL contient le jeton : elle va dans les secrets.
- Secrets —
webhook_url
Sur https://api.slack.com/apps, créez une application, activez
Incoming Webhooks, puis Add New Webhook to Workspace et choisissez
le canal. Copiez l’URL https://hooks.slack.com/services/….
- Secrets —
webhook_url
Telegram
Section intitulée « Telegram »Il vous faut deux choses : le jeton de bot (secret) et le
chat ID (chat_id) où il doit écrire. Le premier prend une minute à
obtenir ; le second dépend d’où vous voulez recevoir les alertes.
1. Créer le bot et obtenir son jeton
Section intitulée « 1. Créer le bot et obtenir son jeton »-
Dans Telegram, cherchez @BotFather et cliquez sur Start.
-
Envoyez
/newbot, puis répondez aux questions (un nom, puis un nom d’utilisateur qui doit se terminer parbot). -
BotFather termine avec un message comme ceci :
Done! Congratulations on your new bot. You will find it at t.me/my_homelab_bot.Use this token to access the HTTP API:63xxxxxx71:AAFoxxxxn0hwA-2TVSxxxNf4cLa ligne
63xxxxxx71:AAFoxxxxn0hwA-2TVSxxxNf4cest le jeton de bot. Ne le partagez pas : il donne le contrôle complet du bot.
Dans les exemples ci-dessous, remplacez <TOKEN> par ce jeton. Notez le
préfixe bot collé devant dans les URL :
https://api.telegram.org/bot<TOKEN>/….
2. Trouver le chat_id
Section intitulée « 2. Trouver le chat_id »Chat privé (le bot vous écrit directement)
-
Ouvrez votre bot (
t.me/my_homelab_bot) et cliquez sur Start, ou envoyez-lui n’importe quel message. Sans ça, il ne pourra jamais vous écrire. -
Ouvrez dans un navigateur :
https://api.telegram.org/bot<TOKEN>/getUpdates -
Vous obtenez un document JSON ; cherchez
"chat":{"ok":true,"result":[{"update_id":83xxxxx35,"message":{"message_id":2643,"from":{…},"chat":{"id":21xxxxx38,"first_name":"…","type":"private"},"date":1703062972,"text":"/start"}}]}Le
chat_idest la valeur dechat.id: ici21xxxxx38(un nombre positif).Si
resultest vide ("result":[]), envoyez un autre message au bot et rechargez la page.
Canal
-
Ajoutez le bot comme administrateur du canal (Manage channel → Administrators → Add).
-
Postez un message dans le canal.
-
Ouvrez
https://api.telegram.org/bot<TOKEN>/getUpdates: la réponse contient un blocchannel_postavec"chat":{"id":-1001xxxxxx062,"type":"channel"}.Le
chat_idest ce nombre négatif,-100inclus :-1001xxxxxx062.
Groupe
Le plus simple passe par l’application de bureau :
- Ajoutez le bot au groupe.
- Envoyez un message dans le groupe, clic droit sur lui → Copy message
link. Vous obtenez
https://t.me/c/194xxxx987/13(ouhttps://t.me/c/194xxxx987/11/13si le groupe a des sujets). - Le nombre juste après
/c/est l’identifiant interne du groupe :194xxxx987. Lechat_idà saisir est ce nombre préfixé avec-100:-100194xxxx987.
Sans l’application de bureau, la méthode getUpdates ci-dessus
fonctionne aussi : message.chat.id est directement le bon nombre (déjà
négatif). Si le bot ne voit pas les messages du groupe, demandez à
BotFather /setprivacy → Disable, puis retirez le bot du groupe et
rajoutez-le.
Sujet de groupe (groupes en mode « Topics »)
Le chat_id est celui du groupe. En plus, remplissez Sujet de groupe
(message_thread_id) avec le nombre du milieu du lien copié : dans
https://t.me/c/194xxxx987/11/13, le sujet est 11. Sans ce réglage, le
message atterrit dans le fil General.
3. Vérifier avant d’enregistrer
Section intitulée « 3. Vérifier avant d’enregistrer »Ouvrez dans le navigateur :
https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=<CHAT_ID>&text=test123(ajoutez &message_thread_id=11 pour un sujet). Si test123 arrive, le
jeton et le chat_id sont bons : saisissez-les dans DumbMonit et cliquez
sur Test.
- Réglages —
chat_id(requis),message_thread_id(sujet, optionnel),api_base(défauthttps://api.telegram.org, changez-le seulement pour passer par un relais) - Secrets —
bot_token
« Telegram cannot find this chat » — pour un chat privé, le bot n’a jamais reçu de message de vous : envoyez-lui
/start. Pour un groupe ou un canal, le préfixe-100manque probablement, ou le bot n’y a pas été ajouté.« thread not found » — le
message_thread_idne correspond à aucun sujet du groupe, ou le groupe n’est pas en mode « Topics ».
Microsoft Teams
Section intitulée « Microsoft Teams »Attention : la méthode a changé. Les anciens « Office 365 connectors »
ont été retirés en mai 2026 ; une URL outlook.office.com/webhook/… ne
fonctionne plus.
La procédure actuelle :
- Dans le canal Teams, ⋯ → Workflows.
- Choisissez le modèle « Post to a channel when a webhook request is received ».
- Confirmez les étapes, puis copiez l’URL HTTPS POST montrée à la fin.
- Secrets —
webhook_url
DumbMonit envoie une Adaptive Card encapsulée, le seul format que ces flux affichent correctement. Si vous obtenez une erreur mentionnant Power Automate, l’URL vient probablement d’un ancien connecteur.
- Créez un compte dédié à DumbMonit sur votre homeserver, et invitez-le dans la salle. Un compte qui n’en est pas membre ne peut pas écrire.
- Obtenez son jeton d’accès. Dans Element : Settings → Help & About → Advanced → Access token.
- Obtenez l’identifiant interne de la salle — pas son nom
d’affichage. Dans Element : Room settings → Advanced → Internal room
ID. Il commence par
!(par exemple!aBcDeF:matrix.org).
- Réglages —
server_url(par exemplehttps://matrix.org),room_id - Secrets —
token
Mattermost
Section intitulée « Mattermost »Integrations → Incoming Webhooks → Add. Choisissez le canal par défaut, puis copiez l’URL.
- Réglages —
channel(optionnel, pour écrire ailleurs que le canal par défaut),username(optionnel, défautDumbMonit) - Secrets —
webhook_url
Rocket.Chat
Section intitulée « Rocket.Chat »Administration → Integrations → New integration → Incoming webhook. Choisissez la salle, activez l’intégration, puis copiez l’URL du webhook.
- Réglages —
channel(optionnel),alias(optionnel, défautDumbMonit) - Secrets —
webhook_url
Google Chat
Section intitulée « Google Chat »Dans l’espace Google Chat : nom de l’espace → Apps & integrations → Webhooks → Add webhook. Copiez l’URL, qui contient déjà la clé et le jeton.
- Secrets —
webhook_url
- Créez un bot : Personal settings → Bots → Add a new bot, type « Generic ». Notez son adresse email et sa clé d’API.
- Abonnez le bot au stream cible, sinon l’envoi sera refusé.
- Réglages —
server_url(par exemplehttps://your-org.zulipchat.com),email(l’adresse du bot),stream(le nom du stream),topic(optionnel, défautDumbMonit) - Secrets —
api_key
Le canal le plus simple de tous : choisissez un nom de sujet difficile à deviner, puis abonnez-vous-y depuis l’application ntfy.
- Réglages —
topic,server_url(optionnel, défauthttps://ntfy.sh) - Secrets —
token(seulement si votre serveur exige une authentification)
Sur l’instance publique, n’importe qui connaissant le nom d’un sujet peut le lire. Choisissez un nom long et aléatoire, ou hébergez votre propre serveur.
Dans l’interface Gotify : Apps → Create Application. Copiez le jeton affiché.
- Réglages —
server_url(par exemplehttps://gotify.home) - Secrets —
token
Pushover
Section intitulée « Pushover »- Sur https://pushover.net, votre User Key est affichée directement sur la page d’accueil.
- Puis créez une application : Create an Application/API Token. Vous obtenez un jeton d’application.
- Réglages —
priority(optionnel, de -2 à 2),sound(optionnel),retryetexpire(seulement pourpriority: 2) - Secrets —
token(jeton d’application),user_key(clé utilisateur)
Sans réglage priority, DumbMonit choisit selon la gravité : -1 pour un
avis ou une résolution, 0 pour un avertissement, 1 pour une alerte
critique. Un avis ne fait donc pas sonner le téléphone.
La priorité
2(« emergency ») répète la notification jusqu’à ce qu’elle soit acquittée. DumbMonit ajoute alorsretryetexpireautomatiquement, sans quoi Pushover rejetterait le message.
Pushbullet
Section intitulée « Pushbullet »Sur https://www.pushbullet.com/#settings/account, cliquez sur Create Access Token.
- Réglages —
device_iden(optionnel ; sans lui, tous vos appareils sont notifiés) - Secrets —
token
Bark (iOS)
Section intitulée « Bark (iOS) »Ouvrez l’application Bark sur votre iPhone : elle montre une URL contenant votre clé d’appareil, la longue chaîne de caractères après le nom de domaine.
- Réglages —
server_url(optionnel, défauthttps://api.day.app),group(optionnel),level(optionnel),sound(optionnel) - Secrets —
token(la clé d’appareil)
Sans réglage level, DumbMonit choisit : passive pour un avis, active
pour un avertissement, timeSensitive pour une alerte critique. Le niveau
critical, qui traverse « Ne pas déranger », n’est jamais choisi
automatiquement — réglez-le explicitement si vous le voulez.
Web Push
Section intitulée « Web Push »Notifications natives sur vos téléphones et ordinateurs, directement depuis votre propre DumbMonit, sans application à installer et sans compte tiers : le navigateur (installé comme application ou non) reçoit les alertes même avec chaque onglet fermé.
- Sur chaque téléphone ou ordinateur, ouvrez DumbMonit et allez à Réglages → Notifications push → Activer sur cet appareil, puis Envoyer un test. Sur iPhone et iPad, ajoutez d’abord DumbMonit à l’écran d’accueil. Le guide pas à pas est dans Notifications push (PWA).
- Créez un canal Web Push ici. Il n’a pas de secret : ses destinataires sont les appareils abonnés à l’étape 1.
- Réglages —
users(optionnel ; un compte par ligne, vide : chaque appareil abonné de chaque compte),urgency(highpar défaut,normaloulow),ttl(secondes que le service de push garde le message pour un appareil éteint, défaut86400),contact(adressemailto:ouhttps:optionnelle donnée aux services de push ; vide :DUMBMONIT_PUBLIC_URLquand elle est en HTTPS, sinon la page du projet) - Secrets — aucun. La paire de clés VAPID du serveur est générée au premier démarrage et stockée chiffrée ; la clé privée ne quitte jamais le serveur.
Le titre de la notification est la gravité et la surveillance
(Critical · nas01), le corps un court résumé ; toucher ouvre la page
Alertes. DumbMonit a besoin de HTTPS sortant vers les services de
push (fcm.googleapis.com, *.notify.windows.com,
updates.push.services.mozilla.com, *.push.apple.com) ; les messages
sont chiffrés de bout en bout, ces services ne peuvent pas les lire. Un
abonnement que le service de push rapporte comme disparu (HTTP 404 ou
410, par exemple après que l’application a été supprimée) est supprimé
automatiquement.
Apprise est une passerelle : avec une seule configuration elle donne
accès à des dizaines de services que DumbMonit n’implémente pas
lui-même. Déployez le conteneur caronc/apprise, puis choisissez l’un
des deux modes.
Mode recommandé — configuration stockée dans Apprise. Créez une configuration dans l’interface Apprise, notez sa clé, et ne mettez rien d’autre ici.
- Réglages —
server_url,config_key
Mode direct — DumbMonit fournit les destinations. Les URL Apprise
contiennent souvent un mot de passe (mailto://user:password@…) : elles
vont donc dans les secrets.
- Réglages —
server_url - Secrets —
urls(une ou plusieurs URL Apprise, séparées par des virgules)
Réglages communs optionnels : tag (pour ne cibler qu’une partie des
destinations d’une configuration) et format (text par défaut, ou
markdown).
Si le test répond « Apprise has no configuration under this config_key », la clé ne correspond à rien. DumbMonit le rapporte plutôt que de prétendre que le message a été envoyé.
Home Assistant
Section intitulée « Home Assistant »- Dans Home Assistant : votre profil → Security → Long-lived access tokens → Create token. Copiez-le, il ne sera plus montré.
- Choisissez le service à appeler. Par défaut, DumbMonit crée une notification persistante sur le tableau de bord.
- Réglages —
server_url(par exemplehttp://homeassistant.local:8123),service(optionnel, défautpersistent_notification.create),target(optionnel),data(optionnel, objet fusionné dans l’appel) - Secrets —
token
Quelques services utiles :
service | Effet |
|---|---|
persistent_notification.create | Bannière dans l’interface Home Assistant |
notify.notify | Toutes les cibles de notification configurées |
notify.mobile_app_<device> | L’application mobile d’un appareil spécifique |
light.turn_on | Allume une lumière — utilisez data pour l’entité et la couleur |
Le réglage data est fusionné en dernier : il peut donc surcharger le
titre ou le message que DumbMonit a préparé.
Email (SMTP)
Section intitulée « Email (SMTP) »Le seul canal qui ne dépend d’aucun service tiers.
- Réglages —
host,from,to(liste d’adresses),security(starttlspar défaut, outls, ounone),port(dérivé desecurity: 587, 465 ou 25),username(optionnel) - Secrets —
password
Avec Gmail, un mot de passe de compte ne fonctionne pas : créez un mot de passe d’application dans les réglages de sécurité de votre compte Google.
Passe par une instance
signal-cli-rest-api
que vous hébergez et où vous enregistrez d’abord votre numéro.
- Réglages —
server_url(par exemplehttp://signal.home:8080),number(le numéro expéditeur enregistré),recipients(liste de numéros ou d’identifiants de groupe),username(optionnel) - Secrets —
password(optionnel, si votre instance est protégée)
Tous les numéros s’écrivent au format international,
+33612345678.
SMS via Twilio
Section intitulée « SMS via Twilio »Sur la console Twilio, la page d’accueil montre votre Account SID et votre Auth Token. Achetez ensuite un numéro qui peut envoyer des SMS.
- Réglages —
account_sid,from(votre numéro Twilio) oumessaging_service_sid,to(liste de destinataires) - Secrets —
token(l’Auth Token)
Le corps du SMS est tronqué à 300 caractères : au-delà, Twilio le découpe en segments facturés séparément.
Sur un compte d’essai, Twilio n’envoie qu’aux numéros que vous avez vérifiés.
WhatsApp (Cloud API)
Section intitulée « WhatsApp (Cloud API) »Utilise l’API Cloud WhatsApp Business de Meta. Dans la console développeur Meta,
créez une application de type Business, ajoutez le produit WhatsApp et notez
le Phone number ID sous API Setup. Créez un jeton permanent pour un
utilisateur système avec la permission whatsapp_business_messaging.
- Réglages —
phone_number_id,to(liste de numéros au format international) - Secrets —
token
Meta n’autorise le texte libre que dans les 24 heures suivant le dernier message du destinataire à votre numéro. Faites écrire « bonjour » au numéro par chaque destinataire. Hors de cette fenêtre il faut un modèle approuvé, que ce canal n’utilise pas.
WhatsApp (CallMeBot)
Section intitulée « WhatsApp (CallMeBot) »Une passerelle gratuite pour vous notifier vous-même, sans compte Meta. Ajoutez le
contact CallMeBot, envoyez-lui I allow callmebot to send me messages : il répond
avec une clé d’API.
- Réglages —
phone(votre numéro au format international) - Secrets —
api_key
CallMeBot est un service tiers sans garantie de disponibilité : pour ce qui est critique, préférez l’API Cloud.
Threema Gateway
Section intitulée « Threema Gateway »Sur gateway.threema.ch, créez un ID Gateway Basic
(huit caractères commençant par *) et notez son secret.
- Réglages —
from(l’ID Gateway),to(liste d’ID Threema de huit caractères) - Secrets —
secret
Le message est chiffré par le serveur Threema (mode basique), ce qui suffit pour une alerte et ne demande aucune paire de clés. Chaque message consomme un crédit Gateway.
Sur developer.webex.com, créez un Bot (My Apps → Create a Bot), copiez son jeton, puis ajoutez le bot à l’espace. L’identifiant de l’espace est renvoyé par l’appel d’API List Rooms.
- Réglages —
room_id - Secrets —
token(le jeton du bot)
Le message est envoyé en Markdown.
SMS via Vonage
Section intitulée « SMS via Vonage »La clé et le secret d’API sont sur le tableau de bord Vonage.
- Réglages —
from(un numéro ou un nom alphanumérique),to(liste) - Secrets —
api_key,api_secret
SMS via Telnyx
Section intitulée « SMS via Telnyx »Créez une clé d’API (v2) dans le Mission Control Portal et achetez un numéro avec SMS activé.
- Réglages —
from(le numéro Telnyx),to(liste, format E.164 avec le+) - Secrets —
api_key
SMS via ASPSMS
Section intitulée « SMS via ASPSMS »- Réglages —
userkey,originator(11 caractères au plus),to(liste) - Secrets —
password(le mot de passe d’API)
Les trois canaux SMS envoient 300 caractères au plus, sans émoji, sur une seule ligne. Ils n’ont pas de lien d’acquittement ni de mise en pause — un lien signé coûterait plusieurs segments — : utilisez pour cela un canal de messagerie.
PagerDuty
Section intitulée « PagerDuty »Dans PagerDuty : Services → votre service → Integrations → Add integration, et choisissez Events API v2. Copiez l’Integration Key.
- Réglages —
region(eusi votre compte est hébergé en Europe),source(optionnel, défautdumbmonit) - Secrets —
token(l’Integration Key)
Une alerte ouvre un incident ; sa résolution le ferme
automatiquement. La correspondance se fait sur l’empreinte de
l’alerte, préfixée avec dumbmonit-, un rappel n’ouvre donc jamais un
second incident.
Une clé d’un autre type (« Events API v1 », « REST API ») obtient un refus sec. Vérifiez que l’intégration est bien de type Events API v2.
Opsgenie
Section intitulée « Opsgenie »Teams → votre équipe → Integrations → Add integration → API. Copiez la clé d’API.
- Réglages —
region(eupour un compte européen),responders(liste de noms d’équipe, optionnel),tags(liste, optionnel) - Secrets —
api_key
Comme avec PagerDuty, une résolution ferme l’alerte, identifiée par son alias.
Atlassian a fixé la fin de service d’Opsgenie au 5 avril 2027. Ce canal reste pour les installations existantes ; pour une nouvelle, préférez PagerDuty ou un canal personnalisé pointant vers Jira Service Management.
Grafana OnCall
Section intitulée « Grafana OnCall »Dans Grafana OnCall : Integrations → New integration → Webhook, puis copiez le point d’accès HTTP.
- Secrets —
webhook_url
Une alerte ouvre un groupe d’alertes (state: alerting) et sa résolution le résout
(state: ok), rapprochés par un identifiant dumbmonit- propre à chaque équipement.
L’acquittement se fait dans OnCall.
Dans SIGNL4, copiez le webhook de l’équipe depuis Teams → Team settings : c’est
https://connect.signl4.com/webhook/ suivi du secret d’équipe.
- Secrets —
webhook_url
Une alerte arrive sur les téléphones de l’équipe (X-S4-Status: new) et sa
résolution la ferme (resolved), rapprochées par un identifiant externe par
équipement.
DumbMonit on-call
Section intitulée « DumbMonit on-call »Prévient la personne d’astreinte, puis escalade étape par étape jusqu’à ce que quelqu’un acquitte. Un seul réglage, la politique d’escalade à exécuter, et aucun secret. Plannings, contacts et politiques sont décrits dans Astreintes ; le canal passe par le routage habituel (étiquettes, sévérité minimale, canaux choisis par règle).
Tickets automatiques (Jira, GLPI, Zammad, GitHub, GitLab)
Section intitulée « Tickets automatiques (Jira, GLPI, Zammad, GitHub, GitLab) »Ces cinq canaux n’envoient pas de message : ils tiennent un ticket par alerte.
- Quand une alerte s’ouvre, le ticket est créé : titre, description avec un lien vers l’équipement dans DumbMonit (renseignez l’adresse publique dans la politique de notification) et une priorité tirée de la sévérité.
- La référence du ticket est mémorisée par alerte et par canal : un rappel ou une nouvelle tentative n’en ouvre jamais un second tant que le premier est ouvert.
- Les faits notables s’ajoutent en commentaire : une escalade, une alerte que personne n’a acquittée à temps, une nouvelle constatation, et un acquittement fait dans DumbMonit.
- À la résolution, DumbMonit commente puis ferme le ticket (transition, statut ou état réglé sur le canal).
- Rouvrir si l’alerte revient dans (heures) — si la même alerte revient dans ce délai, le ticket clos est rouvert avec un commentaire au lieu d’en ouvrir un nouveau. Vide ou 0 : un nouveau ticket à chaque fois. Si le ticket ne peut pas être rouvert (transition absente, ticket supprimé), un nouveau est créé.
- Le lien du ticket apparaît sur l’alerte, dans ses détails.
- Les échecs apparaissent dans la « dernière erreur » du canal. Une panne passagère (service en panne, 429) est retentée avec un délai croissant ; une erreur définitive (jeton refusé, projet inconnu) est signalée et non retentée.
- Envoyer un test crée un ticket de test puis le ferme aussitôt. S’il ne peut pas être fermé, l’erreur le dit et nomme le ticket à fermer à la main.
- Les liens d’acquittement et de report ne sont pas ajoutés à ces canaux.
Les jetons sont chiffrés et jamais remontrés. Créez un compte ou un jeton dédié, avec les seuls droits nécessaires.
Fonctionne avec Jira Cloud et Jira Data Center.
-
Cloud : créez un jeton d’API sur https://id.atlassian.com/manage-profile/security/api-tokens et indiquez l’e-mail du compte.
-
Data Center : Profil → Personal Access Tokens ; pas d’e-mail.
-
Réglages —
server_url,email(Cloud uniquement ; vide sur Data Center),project(la clé du projet),issue_type(défautTask),labels(liste),priority(mappose Highest, Medium ou Low selon la sévérité ;nonepour un projet sans champ priorité),close_transition(défautDone),reopen_transition(défautReopen),reopen_hours -
Secrets —
api_token
Les transitions se choisissent par leur nom (celui de la transition ou du statut cible, sans tenir compte de la casse) parmi celles offertes depuis le statut actuel du ticket. Si le nom n’existe pas, l’erreur liste celles qui existent.
Activez l’API REST dans Configuration → Générale → API, créez un client d’API et copiez le jeton d’API de l’utilisateur (Préférences → Clés d’accès distant).
- Réglages —
server_url(l’adresse de GLPI ;/apirest.phpest ajouté),entity_id,category_id(nombres, optionnels),close_status(solvedouclosed),reopen_hours - Secrets —
user_token,app_token(jeton d’application du client d’API, s’il en exige un)
Le ticket est un incident ; urgence, impact et priorité suivent la sévérité. Les escalades s’ajoutent en suivi. La réouverture remet le statut à Nouveau.
Créez un jeton d’accès dans Profil → Accès par jeton avec la permission
ticket.agent.
- Réglages —
server_url,group,customer(e-mail ou identifiant),close_state(défautclosed),reopen_state(défautopen),reopen_hours - Secrets —
token
Les tickets sont créés avec une note interne ; la priorité est basse, normale ou haute selon la sévérité.
GitHub Issues
Section intitulée « GitHub Issues »Créez un jeton à granularité fine (Settings → Developer settings) limité au dépôt, avec la permission Issues : lecture et écriture.
- Réglages —
repository(owner/name),labels(liste ; ils doivent exister),api_url(GitHub Enterprise Server uniquement, par exemplehttps://ghe.example.org/api/v3),reopen_hours - Secrets —
token
La résolution ferme l’issue comme terminée.
GitLab Issues
Section intitulée « GitLab Issues »Créez un jeton d’accès de projet (ou personnel) avec le périmètre api.
- Réglages —
server_url,project(identifiant numérique ougroupe/projet),labels(liste),reopen_hours - Secrets —
token
Webhook personnalisé
Section intitulée « Webhook personnalisé »Voir Le canal personnalisé ci-dessus.
Dépannage
Section intitulée « Dépannage »Le test échoue immédiatement, avec « missing setting … ». Un champ requis est vide. Le message nomme le réglage exact.
Le test échoue avec « no answer within 15 s ». Le serveur cible est inaccessible depuis DumbMonit. S’il s’agit d’un service sur votre réseau local, vérifiez que le conteneur DumbMonit peut l’atteindre — c’est fréquemment un problème de réseau Docker, pas un problème de configuration de canal.
Le test réussit, mais je ne reçois rien. Le service a accepté le message et l’a envoyé ailleurs : mauvais canal, mauvais sujet ntfy, mauvais appareil Pushbullet. Vérifiez le réglage de destination.
Le message d’erreur contient ***.
C’est volontaire : votre jeton a été retiré du message avant qu’il ne
soit enregistré. Aucun secret n’apparaît jamais dans les logs, dans la
colonne « dernière erreur », ni dans une réponse d’API.
Où puis-je voir la dernière erreur d’un canal ? Dans la liste des canaux : chaque ligne montre la date de la dernière livraison réussie et, s’il y en a, l’erreur du dernier échec.