Pages d'état

Une page d’état est le visage public de votre surveillance : une page que n’importe qui peut ouvrir — sans connexion, sans cookie — qui dit si vos services tournent, montre jusqu’à 90 jours d’historique quotidien pour chacun, porte vos annonces d’incident et de maintenance, et laisse les visiteurs les suivre par RSS ou email. Des badges mettent la même réponse dans un README ; une vue compacte tient dans une page intranet.
Elle ne montre que ce que vous y mettez : le libellé que vous donnez à chaque service, son état, sa disponibilité et son temps de réponse. Noms de surveillance, adresses, types et identifiants ne quittent jamais le serveur — ni dans la page, ni dans un badge, ni dans un email.
1. Créer une page
Section intitulée « 1. Créer une page »Pages de statut (dans le rail d’icônes) → Nouvelle page. Cette page liste vos
pages d’état (ouvrir, modifier, supprimer) avec les annonces en
dessous ; l’éditeur s’ouvre sur sa propre route (/status/new,
/status/<id>). Le rendu public est à /s/<adresse>. Les pages de statut étaient dans les
Réglages : /settings/status et ses liens redirigent ici.
| Champ | Ce qu’il fait |
|---|---|
| Titre | Le titre de la page (« État des services »). |
| Adresse | La dernière partie de l’URL, /s/<adresse>. Suggérée depuis le titre ; lettres minuscules, chiffres et tirets, de 2 à 40 caractères. |
| Description | Une phrase sous le titre. Optionnel. |
| Thème | Jour, nuit, ou suivre le système du visiteur. |
| Historique | La fenêtre la plus longue que la barre d’historique couvre (30, 60 ou 90 jours). La barre s’adapte à l’ancienneté des données de la page : elle montre autant de jours que le service le plus ancien a été surveillé, de 7 jours jusqu’à ce réglage. Une page ne dit jamais plus que ça — voir Badges. |
| Mode simple | Une page nue : pas de scène, pas de mascotte, pas d’animation et pas d’easter eggs. Clair ou sombre suit le système du visiteur, avec un interrupteur dans l’en-tête ; le réglage Thème de la page est ignoré. |
| Publiée | Désactivé = brouillon : la page, ses badges et son logo répondent « not found » aux visiteurs jusqu’à ce que vous l’activiez. |
Puis cochez les surveillances à montrer. Pour chacune, réglez le libellé que les visiteurs liront (il vaut par défaut le nom de la surveillance — vous préférerez peut-être « Site web » à « nginx-front-01 ») et, optionnellement, un groupe (« Réseau », « Stockage »). Les groupes deviennent des blocs sur la page, dans l’ordre où vous arrangez les services.
Deux noms par surveillance. Chaque surveillance de la liste montre son nom privé (son nom dans DumbMonit, en gris, en lecture seule, jamais publié) et un nom public éditable : le seul que voient les visiteurs, les badges, le flux et les balises de référencement de la page. Le nom privé sert de placeholder ; si vous laissez le nom public vide, l’éditeur avertit que le nom interne sera publié, et il est utilisé. Idem pour les surveillances qui arrivent par un groupe coché (ci-dessous) : elles ont leur propre champ de nom public.
Groupes de surveillances. Au-dessus de la recherche, cochez un groupe entier (les dossiers de Surveillances) pour tout afficher. Un groupe coché est dynamique : une surveillance ajoutée plus tard au dossier apparaît d’elle-même sur la page, une surveillance retirée disparaît. Dépliez un groupe pour voir ses surveillances ; sa case est à moitié cochée quand seules certaines sont cochées une à une. Les surveillances d’un groupe coché s’affichent sous le nom du groupe, et une surveillance à la fois cochée seule et dans un groupe coché n’apparaît qu’une fois (elle garde son libellé). Les groupes sont liés par le nom du dossier : renommer un dossier dans Surveillances le décoche ici.
Enregistrez, et le lien est prêt à copier. La page se rafraîchit elle-même chaque minute.
Apparence
Section intitulée « Apparence »La section Apparence de l’éditeur habille la page de vos couleurs sans l’ouvrir à du code arbitraire :
| Réglage | Ce qu’il fait |
|---|---|
| Logo | PNG, JPEG ou WebP, jusqu’à 256 Kio, montré à côté du titre. Carré fonctionne mieux. SVG est refusé : il peut porter du script, et la page est servie depuis la même adresse que l’administration. Le fichier est vérifié par son contenu, stocké sous /data/status-pages/, et servi comme image seulement. |
| Accent | Encre (défaut), bleu, teal, violet, rose ou ambre — la règle du haut, les liens et le bouton d’abonnement. Chacun est choisi pour rester lisible de jour comme de nuit. |
| Site web de l’organisation | Un lien http:// ou https:// montré à côté du titre, comme le nom d’hôte du site. |
| Texte de pied de page | Texte brut sous la page, jusqu’à 280 caractères : qui la gère, comment la contacter. Les retours à la ligne sont gardés ; rien n’est interprété comme HTML ou Markdown. |
Le réglage Scène dessine une silhouette de ville derrière la bannière. Les nouvelles pages démarrent avec Paris, et les pages existantes qui n’avaient pas de scène la montrent aussi maintenant ; décochez-la pour une bannière nue, ou activez Mode simple pour abandonner les scènes complètement. Choisissez-en autant que vous voulez, dans l’ordre que vous voulez. Quatre scènes sont fournies, quatre villes de nuit sous la lune et les étoiles, leur monument illuminé : Paris (la tour Eiffel), Tokyo (la Tokyo Tower), New York (l’Empire State et le Chrysler Building) et Dubaï (la Burj Khalifa). La météo suit la page : ciel étoilé quand tout va bien, nuages sur un avertissement, orage quand quelque chose est en panne. Ce sont des scènes de nuit : le titre et l’état par-dessus gardent toujours les couleurs sombres, quel que soit le thème de la page. Dubaï remplace le Cervin : les pages qui l’affichaient (ou une scène repliée sur lui) affichent maintenant Dubaï. Les pages qui utilisaient une scène retirée (les autres villes, les merveilles, les villes suisses et les scènes ludiques) ont été déplacées vers la plus proche des quatre : villes d’Europe et monde antique vers Paris, Asie et scènes marines ou spatiales vers Tokyo, les Amériques vers New York, les Alpes et le nord vers Dubaï ; il en va de même pour les sauvegardes et les appels d’API qui les nomment encore. Avec plus d’une, Rotation décide quand la page passe à la suivante : à chaque visite (défaut), chaque minute, toutes les dix minutes ou chaque heure. Les scènes sont un ensemble fermé de dessins fournis avec DumbMonit — rien n’est téléchargé ni interprété. Les mêmes quatre villes peuvent aussi s’afficher derrière le verdict du mur (Décor).
Il n’y a délibérément pas de CSS ou HTML personnalisé : une page d’état est publique et vit sur la même origine que votre interface d’administration, sous la même politique de sécurité du contenu.
2. Ce que les visiteurs voient
Section intitulée « 2. Ce que les visiteurs voient »- Une bannière avec la réponse en une seconde, lue depuis les services : Tous les systèmes opérationnels, Panne partielle (certains en panne ou dégradés), Panne majeure (tous en panne) ou Maintenance planifiée. Un incident ouvert tandis que chaque service répond encore lit Incident en cours, teinté par son impact.
- Les annonces ouvertes, la mise à jour la plus récente d’abord, avec la chronologie des mises à jour sous un pli.
- Chaque service avec sa plaque d’état (Opérationnel, Dégradé, En panne, Maintenance, Aucune donnée), sa barre d’historique — un carré par jour — sa disponibilité sur 24 h, 7 jours, 30 jours et (sur une page de 90 jours) 90 jours, et le temps de réponse pour les sondes de disponibilité.
- Incidents passés, par jour, pour les 30 derniers jours.
- Recevoir les mises à jour : le flux RSS, et un formulaire d’abonnement email quand vous en configurez un (voir Abonnés email).
La barre d’historique
Section intitulée « La barre d’historique »Choisissez la période dans l’éditeur (Historique) : 24 heures, 7, 30, 60 ou 90 jours. Les barres la suivent : une par heure pour 24 heures, une toutes les 6 heures pour 7 jours, une par jour à partir de 30 jours. Elles s’adaptent aussi aux données qui existent. Une page dont le plus ancien service est surveillé depuis 2 heures montre les 2 dernières heures en barres de 5 minutes (pas 30 jours de gris), 12 heures donnent des barres horaires, 3 jours des barres de 6 heures. La légende sous les barres nomme la période réellement montrée (« Dernières 12 heures ») et la disponibilité est calculée sur cette période. Le temps d’avant la première mesure ne compte ni comme panne ni comme 100 %.
Cliquez ou touchez une barre (ou donnez-lui le focus et appuyez sur Entrée) pour
ouvrir ce jour heure par heure : disponibilité de chacune des 24 heures (UTC),
pannes du jour avec leur début et leur fin, et annonces qui l’ont touché. Seuls
les noms publics apparaissent. Les données sont aussi sur
GET /api/public/status/<adresse>/day/<AAAA-MM-JJ>.
Chaque carré est un jour (UTC), teinté par la disponibilité de ce jour-là : couleur pleine à 99,5 % et plus, ambre à partir de 95 %, rouge en dessous. Un jour sans aucune mesure est gris, pas vert — un service ajouté la semaine dernière a 83 jours gris, pas 83 parfaits. Survolez un carré, ou donnez le focus à la barre et déplacez-vous avec les flèches (Home et End vont aux extrémités), pour lire la date, la disponibilité, les minutes d’indisponibilité et les incidents qui ont touché ce jour. Les mots sont là pour les lecteurs d’écran aussi : le statut n’est jamais dit par la couleur seule.
Comment l’état est décidé :
| État | Signification |
|---|---|
| Opérationnel | La dernière sonde a réussi (sondes de disponibilité), ou la surveillance a rapporté dans les trois dernières périodes de sondage. |
| Dégradé | Actif maintenant, mais au moins une sonde a échoué dans la dernière heure. |
| En panne | La dernière sonde a échoué, la surveillance a arrêté de rapporter, ou sa configuration est en erreur. |
| Maintenance | Une fenêtre de maintenance est en cours et le service est en panne : attendu, pas une panne. Soit une annonce sur cette page, soit une fenêtre de maintenance d’alerte couvrant cette surveillance. |
| Aucune donnée | Jamais sondé encore, ou désactivé. |
La disponibilité pour les sondes (http, tcp, dns, ping, tls,
battements de cœur) est la part de vérifications réussies, depuis
dumbmonit_probe_success ; l’indisponibilité d’un jour est ses
vérifications échouées multipliées par l’intervalle de sonde. Pour les
autres surveillances (SNMP, agent, Proxmox…) c’est la part de créneaux de
cinq minutes où la surveillance a rapporté au moins une fois
(dumbmonit_up), comptée depuis la première mesure — une surveillance ajoutée
hier n’est pas « en panne » pour les 89 jours avant ça — et
l’indisponibilité d’un jour est ses créneaux silencieux.
3. Annoncer des incidents et des maintenances
Section intitulée « 3. Annoncer des incidents et des maintenances »Sur Pages de statut, sous la liste des pages, Incidents et maintenance → Nouvelle annonce (aussi ++ctrl+k++ → Annoncer un incident).
- Un incident a un titre, un impact (mineur montre la page dégradée, majeur comme une panne) et passe par En investigation → Identifié → Surveillance → Résolu. Postez des mises à jour au fur et à mesure : chacune porte un statut et un message, et devient la dernière ligne que les visiteurs lisent. Résoudre le termine avec un message final ; il passe alors dans « Incidents passés » pendant 30 jours.
- Une fenêtre de maintenance a un début et une fin et passe par Planifiée → En cours → Terminée. Tandis qu’elle est en cours, la bannière dit « Maintenance planifiée » et les services en panne se montrent comme Maintenance.
Une fenêtre de maintenance planifiée dans Alertes fait la même chose pour la seule surveillance qu’elle couvre, sans annonce : ce service lit Maintenance au lieu de rouge tandis que la fenêtre est ouverte, et l’état global de la page dit Maintenance quand rien d’autre n’est en panne ou dégradé. Seules les fenêtres qui nomment une surveillance se montrent ainsi ; le nom et le commentaire de la fenêtre restent privés.
Une annonce est montrée sur une page ou sur toutes les pages.
Incidents passés
Section intitulée « Incidents passés »En mettant DumbMonit en place, saisissez les incidents que vous avez déjà eus. Dans Nouvelle annonce (type Incident), renseignez Début (votre heure locale ; vide = maintenant ; le futur est refusé) et, pour un incident déjà terminé, Résolu le. Ajoutez des mises à jour datées (En investigation, Identifié, Surveillance, Résolu), chacune avec sa propre date : elles sont triées dans le temps, doivent tomber entre le début et la résolution, et rien ne peut suivre la résolution.
Un incident saisi avec une résolution est enregistré Résolu et personne n’est prévenu : aucun courriel n’est envoyé aux abonnés. Il apparaît dans l’historique, dans les barres par jour et dans le calendrier, à sa vraie date. Quand vous postez une mise à jour sur un incident existant, Date et heure fonctionne de la même façon : vide = maintenant (et les abonnés sont prévenus) ; une date passée complète l’historique sans prévenir personne. Les heures sont stockées en UTC.
Abonnés email
Section intitulée « Abonnés email »Les visiteurs peuvent s’abonner à vos annonces par email une fois que vous choisissez un canal email (SMTP) dans l’éditeur, sous Abonnés email. Le canal est un que vous avez déjà configuré sous Notifications ; son serveur et son expéditeur sont réutilisés, pas ses propres destinataires. Sans ça, la page n’offre que son flux RSS.
- Double opt-in. Un visiteur saisit une adresse ; DumbMonit envoie un lien de confirmation, et rien d’autre n’est envoyé jusqu’à ce qu’il soit suivi. Une demande jamais confirmée est oubliée après deux jours. Le formulaire répond la même phrase que l’adresse soit nouvelle, en attente ou déjà abonnée, il ne dit donc à personne qui suit votre page.
- Ce qui est envoyé. Un email quand une annonce est créée, quand une mise à jour est postée, et quand son statut change — pour les incidents comme pour les maintenances, sur cette page (ou sur toutes les pages, pour une annonce montrée sur toutes).
- Se désabonner. Chaque email se termine par un lien pour se
désabonner, et porte les en-têtes
List-UnsubscribeetList-Unsubscribe-Post, pour que Gmail, Apple Mail et d’autres offrent leur propre bouton en un clic. - Limites. Le point de terminaison public d’abonnement accepte cinq requêtes par adresse client et soixante en tout par 15 minutes, et une adresse en attente n’est pas mailée deux fois en dix minutes : la page ne peut pas être transformée en canon à mail.
- L’éditeur liste les abonnés (confirmés ou en attente) et en supprime n’importe lequel.
Les liens dans ces emails pointent vers le
domaine personnalisé de la page quand elle en a un
(https://status.example.com/). Sinon ils sont construits depuis
l’URL publique de la politique de notification
(ou DUMBMONIT_PUBLIC_URL) ; sans ça, depuis l’adresse que vous avez
utilisée la dernière fois que vous avez enregistré la page — jamais
depuis la requête d’un visiteur.
Abonnés SMS, webhook et Slack
Section intitulée « Abonnés SMS, webhook et Slack »En plus de l’email, une page peut proposer trois autres façons de la suivre. Ouvrez-les dans le panneau des abonnés de l’éditeur (Canaux d’abonnement) ; la page publique affiche alors un onglet par canal.
- SMS. Choisissez un canal Vonage, Telnyx ou ASPSMS parmi les
Notifications ; ses identifiants et son
expéditeur sont réutilisés, pas ses destinataires. Le visiteur saisit un
numéro au format international (
+33612345678) et le confirme avec un code à six chiffres reçu par SMS (cinq essais, 15 minutes). Les annonces tiennent en un court message avec un lienStop:. Un SMS coûte de l’argent : les inscriptions SMS ont des limites plus basses (trois requêtes par adresse client et 25 en tout par 15 minutes). - Webhook signé. Le visiteur donne une URL
http(s). DumbMonit lui envoie en POST une requête signéesubscription.confirmportant unconfirm_url; l’abonnement démarre quand le point d’arrivée (ou le visiteur) l’appelle. Le secret de signature (whsec_…) est affiché une seule fois, sur la page, juste après la demande. Chaque requête porteX-DumbMonit-TimestampetX-DumbMonit-Signature: sha256=<hex>, le HMAC-SHA256 de<horodatage>.<corps>avec le secret. Le corps JSON contienttype(incidentoumaintenance),page,incident(id, titre, statut, gravité, dates),messageetunsubscribe_url. L’URL passe par la même garde sortante que les canaux de notification (les adresses du serveur lui-même sont refusées). - Slack. Le visiteur colle l’URL du webhook entrant de son propre Slack
(
https://hooks.slack.com/services/…). DumbMonit y publie un message de test avec un lien de confirmation ; chaque annonce porte ensuite un lien de désabonnement. - Services suivis. Un abonné peut cocher les services qui l’intéressent.
En créant une annonce pour une page, vous pouvez cocher les services
concernés (
componentsdans l’API) : les abonnés qui ne suivent que d’autres services ne sont pas prévenus. Une annonce sans service coché, et un abonné sans service coché, signifient « tout ». - Envoi. Les messages SMS, webhook et Slack passent par une file : un échec est repris après 1 minute, 5 minutes, 30 minutes, 2 heures, puis abandonné après cinq essais ou un jour. Les envois sont espacés pour ne pas inonder un fournisseur.
- Pages privées. Sur une page protégée par mot de passe ou par connexion, seul qui peut voir la page peut s’y abonner.
- Administration. Le panneau liste les abonnés de tous les canaux (numéros
et URL masqués, filtre par canal), les exporte en CSV
(
GET /api/status-pages/{id}/subscribers.csv; les URL restent masquées) et en supprime n’importe lequel. Les canaux ouverts par une page voyagent avec les sauvegardes ; pas les abonnés eux-mêmes.
4. Partager le lien
Section intitulée « 4. Partager le lien »La page vit à https://votre-serveur/s/<adresse>. Tout sous /s/ et
/api/public/ est servi sans authentification ; le reste de DumbMonit
reste derrière la connexion.
Le panneau Partager de l’éditeur construit les extraits ci-dessous pour vous, avec un aperçu.
Chaque page publiée sert des badges SVG — plats, texte blanc sur couleur unie, lisibles sur les thèmes clair et sombre d’un README GitHub :
| Badge | URL |
|---|---|
| Statut de la page | /api/public/status/<adresse>/badge.svg |
| Disponibilité de la page | /api/public/status/<adresse>/uptime.svg?days=30 |
| Temps de réponse de la page | /api/public/status/<adresse>/response.svg |
| Statut du service | /api/public/status/<adresse>/components/<service>/badge.svg |
| Disponibilité du service | /api/public/status/<adresse>/components/<service>/uptime.svg?days=30 |
| Temps de réponse du service | /api/public/status/<adresse>/components/<service>/response.svg |
<service> est le libellé du service sous forme d’URL : « API
Publique » devient api-publique (une seconde « API Publique » serait
api-publique-2). C’est aussi la key de chaque service dans le
document JSON. days est 1, 7, 30 (défaut) ou 90, et jamais
plus que l’historique de la page : une page de 30 jours refuse un badge
de 90 jours. La disponibilité et le temps de réponse de la page sont la
moyenne sur ses services. Un service sans aucune mesure dit aucune
donnée, en gris.
Dans un README :
[](https://your-server/s/home-lab)[](https://your-server/s/home-lab)[](https://your-server/s/home-lab)Les badges sont mis en cache une minute (Cache-Control: public, max-age=60), le proxy d’images de GitHub et vos visiteurs ne coûtent
donc rien à la base de séries temporelles.
Intégrer
Section intitulée « Intégrer »/s/<adresse>/embed est une vue compacte pour une iframe : l’état
global et une ligne par service avec son état et 30 jours d’historique,
et un lien vers la page complète dans un nouvel onglet.
<iframe src="https://your-server/s/home-lab/embed" title="Home lab status" width="100%" height="320" style="border:0"></iframe>Ajoutez ?theme=light ou ?theme=dark pour correspondre à la page
hôte, et ?history=0 pour cacher les barres. La page d’état et son
embed sont les seules adresses de DumbMonit qu’une page tierce peut
mettre dans une frame ; tout le reste (les pages de confirmation et de
désabonnement incluses) répond avec frame-ancestors 'none' et
X-Frame-Options: DENY.
Domaine personnalisé
Section intitulée « Domaine personnalisé »Une page peut avoir sa propre adresse, comme status.example.com, à la
manière d’Uptime Kuma. Saisissez le nom dans le champ Domaine public
de l’éditeur (le i à côté résume les étapes) et enregistrez. Quand
une requête atteint DumbMonit avec ce nom dans son en-tête Host,
DumbMonit montre la page à la racine /, et rien d’autre : sur ce nom,
l’écran de connexion, les réglages, l’API, les points de terminaison des
agents, les métriques et les autres pages d’état répondent tous 404 Not found, même pour quelqu’un connecté, et aucun cookie de session n’est
lu ni réglé. Seuls la page, son embed, ses pages de confirmation et de
désabonnement, ses badges, flux et document JSON, et les propres
fichiers de l’interface (/_app/, icônes) sont servis.
Le nom est stocké en minuscules, sans https:// ni barre oblique
finale ; un port, un chemin ou une adresse IP sont refusés. Deux pages
ne peuvent pas partager un nom, et l’adresse que vous utilisez pour
atteindre DumbMonit lui-même (ou son URL publique) ne peut pas être le
domaine d’une page — l’enregistrer vous enfermerait dehors. Videz le
champ pour retirer le domaine ; la page reste à /s/<adresse> dans tous
les cas.
Pour le configurer :
- DNS. Créez l’enregistrement pour le nom (ou le nom d’hôte public d’un Cloudflare Tunnel), pointant vers votre reverse proxy.
- Proxy. Envoyez le nom vers l’adresse de DumbMonit, par exemple
https://dumbmonit:8080, sans réécrire le chemin : le proxy transfère/, pas/s/<adresse>. - En-tête Host. Transmettez l’en-tête
Hostoriginal : c’est comment DumbMonit distingue le domaine de la page de sa propre adresse. DumbMonit ne lit queHost;X-Forwarded-Hostne compte que depuis un proxy listé dansDUMBMONIT_TRUSTED_PROXIES. - HTTPS est géré par le proxy. DumbMonit crée des liens vers
https://<domain>/dans les emails d’abonné, le flux RSS et le panneau Partager de l’éditeur.
Traefik (labels Docker) — l’en-tête Host est transmis par défaut :
labels: - traefik.enable=true - traefik.http.routers.status.rule=Host(`status.example.com`) - traefik.http.routers.status.entrypoints=websecure - traefik.http.routers.status.tls.certresolver=letsencrypt - traefik.http.services.status.loadbalancer.server.port=8080Nginx Proxy Manager — ajoutez un Proxy Host avec le domaine
status.example.com, schéma http, nom d’hôte de transfert
dumbmonit, port 8080, et un certificat SSL. Rien d’autre : il
transmet Host par défaut. Laissez les Custom locations vides.
Cloudflare Tunnel — ajoutez un Public hostname
status.example.com avec le service https://dumbmonit:8080 et aucun
chemin. Le tunnel garde le Host du visiteur ; laissez HTTP Host
Header vide dans les réglages avancés.
Caddy — reverse_proxy transmet Host et Caddy récupère le
certificat :
status.example.com { reverse_proxy dumbmonit:8080}Nginx — proxy_pass envoie le nom de l’upstream sauf indication
contraire, réglez donc l’en-tête :
server { listen 443 ssl; server_name status.example.com; # ssl_certificate … ;
location / { proxy_pass https://dumbmonit:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}Dépannage.
- Le domaine montre l’écran de connexion ou le tableau de bord de
DumbMonit : l’en-tête
Hostn’a pas atteint DumbMonit — le proxy l’a remplacé par le nom de l’upstream (dumbmonit:8080). Ajoutezproxy_set_header Host $host;(Nginx), retirez un HTTP Host Header personnalisé (Cloudflare Tunnel), ou retirez un middleware de réécriture deHost(Traefik). Rien de privé n’est exposé : le tableau de bord demande quand même un mot de passe. - Un simple
Not foundsur le domaine : le proxy réécrit le chemin (il envoie/s/<adresse>ou ajoute un préfixe), ou le domaine dans l’éditeur ne correspond pas exactement au nom dans le navigateur. Transférez le chemin intact. - La page dit qu’elle n’existe pas : la page est encore un brouillon — publiez-la.
- Vous ne pouvez plus atteindre l’interface de DumbMonit : vous naviguez via le domaine de la page. Utilisez la propre adresse de DumbMonit, ou videz le Domaine public de la page.
Derrière un reverse proxy
Section intitulée « Derrière un reverse proxy »Un domaine personnalisé est la façon la plus simple
d’exposer seulement la page d’état. Si vous préférez garder le chemin
/s/<adresse> sur un nom public, filtrez les chemins dans le proxy à
la place. Avec Caddy, par exemple :
status.example.com { @public path /s/* /api/public/* /_app/* /favicon.svg reverse_proxy @public dumbmonit:8080 respond 404}Avec nginx :
location ~ ^/(s/|api/public/|_app/|favicon\.svg) { proxy_pass https://dumbmonit:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;}location / { return 404; }/_app/ porte les scripts et styles de l’interface : la page en a
besoin pour s’afficher. Transférez X-Forwarded-Proto et
X-Forwarded-Host pour que le flux RSS pointe vers la bonne adresse, et
réglez l’URL publique (voir ci-dessus) pour que les emails d’abonné le
fassent aussi.
Moteurs de recherche (SEO)
Section intitulée « Moteurs de recherche (SEO) »Une page publiée a un bloc SEO dans son éditeur. Par défaut la page n’est pas
indexée : elle répond noindex, nofollow (balise meta et en-tête X-Robots-Tag).
- Indexer cette page par les moteurs de recherche passe en
index, follow, ajoute la page à/sitemap.xmlet l’autorise dans/robots.txt. Tout le reste de l’instance reste fermé aux robots. - Titre SEO (environ 60 caractères), meta description (environ 155), mots-clés, URL canonique, image de partage (Open Graph / Twitter), langue et nom du site ou de l’organisation. Un champ vide utilise une valeur générée à partir du nom de la page, affichée en placeholder. Un aperçu en direct montre le résultat tel qu’un moteur le dessine.
- Copier le prompt pour une IA copie un prompt rempli avec le nom de la page,
l’organisation, les services listés, la langue et l’adresse. Collez-le dans
ChatGPT (ou un autre assistant), puis Coller le résultat remplit les champs
depuis sa réponse JSON (
title,description,keywords,canonical,image,lang,site_name). Les champs invalides sont ignorés avec un message.
Les balises sont écrites par le serveur dans le HTML de /s/<adresse> (et de la
racine d’un domaine personnalisé) : <title>, description,
robots, canonique, Open Graph, carte Twitter, langue et données JSON-LD. Les robots
et les aperçus de liens n’exécutent pas JavaScript : ils les lisent telles quelles.
Une page brouillon, inconnue ou non indexable ne montre jamais son titre, et les
variantes /embed, /confirm et /unsubscribe ne sont jamais indexées.
Pages privées
Section intitulée « Pages privées »Par défaut une page est ouverte à toute personne qui a le lien. Qui peut voir cette page, dans l’éditeur, change cela :
- Toute personne avec le lien : le défaut.
- Toute personne avec le mot de passe : les visiteurs voient d’abord un formulaire de mot de passe. Le mot de passe (8 caractères au minimum) est stocké haché en Argon2id et n’est jamais réaffiché ; laissez le champ vide pour garder l’actuel. Un mot de passe correct pose un cookie d’accès signé, valable 12 heures. Changer le mot de passe met fin à tous les accès déjà accordés. Les erreurs sont comptées par adresse et par page : après cinq, les essais suivants attendent 30 secondes, en doublant jusqu’à cinq minutes.
- Utilisateurs DumbMonit connectés : tout compte, local, LDAP ou SSO, quel que soit son rôle. Les visiteurs sans session sont envoyés vers l’écran de connexion et reviennent sur la page. Le cookie de session appartient à l’adresse principale : ce mode ne fonctionne pas derrière un domaine personnalisé, utilisez-y un mot de passe.
Une page qui n’est pas publique n’est jamais indexée, quoi que dise son bloc
SEO : elle répond noindex, nofollow, reste hors de /sitemap.xml et n’expose
aucun titre dans le HTML. Tout ce qui sort de la page par son adresse suit le
même accès : le document JSON, les badges, les flux RSS et iCal, le
logo, le détail d’un jour et l’abonnement par e-mail. Les réponses portent
Cache-Control: private, no-store. Un badge est une image chargée par le
navigateur du lecteur : il ne s’affiche que là où ce navigateur a déjà l’accès,
et reste cassé dans un README. L’intégration (embed) et la
bannière de site web demandent aussi le
même accès.
Calendrier des maintenances (iCal)
Section intitulée « Calendrier des maintenances (iCal) »Les maintenances planifiées se suivent depuis une application de calendrier (Google Agenda, Outlook, Thunderbird, Calendrier Apple) abonnée à un flux iCalendar :
GET /api/public/status/<adresse>/maintenance.ics: les maintenances annoncées sur la page (et celles de toutes les pages), de 90 jours en arrière à l’avenir lointain. Il suit le mode d’accès de la page et figure sous Recevoir les mises à jour sur la page publique.GET /api/calendar/maintenance.ics?token=…: toutes les maintenances de l’instance. Le jeton est dans l’adresse et c’est la seule protection : partagez-la comme un mot de passe. Les administrateurs la lisent, et la remplacent avec Nouvelle adresse, dans le bloc Calendrier des maintenances de l’éditeur de page.
Chaque maintenance est un événement, avec son titre, son début, sa fin (une heure si elle n’est pas fixée) et son dernier message en description. Les incidents n’y figurent pas.
Fournisseurs tiers
Section intitulée « Fournisseurs tiers »Votre page peut montrer un fournisseur dont vous dépendez, à côté de vos propres services. Ajoutez un moniteur État d’un fournisseur tiers (Cloudflare, GitHub, Atlassian, AWS…) et placez-le sur la page comme n’importe quel moniteur : il apparaît avec une étiquette Externe, son propre historique et les états habituels. La page du fournisseur est lue au plus une fois par minute, et partagée entre les moniteurs et les pages.
Flux et document
Section intitulée « Flux et document »GET /api/public/status/<adresse>/rss— un flux RSS des incidents et fenêtres de maintenance, un élément par annonce avec sa dernière mise à jour.GET /api/public/status/<adresse>— le document JSON dont la page est construite, si vous voulez construire la vôtre : le titre, la description et l’apparence de la page, l’état global, lakey, lelabel, lestate, la disponibilité (uptime_24h,uptime_7d,uptime_30d,uptime_90d), lelatency_mset l’history(date,uptime_pct,down_minutes,incidentspar jour) de chaque service, et les annonces.
N’importe quel site peut lire ce document depuis le navigateur (il est
envoyé avec Access-Control-Allow-Origin: * et sans cookies). GET /api/public/status/<adresse>/banner.js est un script prêt à l’emploi
qui le transforme en bannière : voir
Bandeau pour site web.
Le document est mis en cache 30 secondes sur le serveur ; les badges, le flux et l’embed lisent tous ce même document mis en cache, aucun ne peut donc dire plus que la page.