Aller au contenu

Tape un mot pour chercher dans les pages.

↑↓ Choisir↵ OuvrirÉchap Fermer

Référence

Évènements envoyés, types de canaux, priorités ntfy, reprises en cas d'échec et vérification de la signature d'un webhook.

Une alerte part quand un évènement est confirmé : panne, rétablissement, expiration proche. Elle est envoyée vers chaque canal de l’organisation.

Évènements

ÉvènementQuand
downUne panne est confirmée, ou un heartbeat n’a pas signalé dans les délais
upLe moniteur est revenu en ligne après une panne
tls_expiringLe certificat expire dans le délai du rappel
domain_expiringLe nom de domaine expire dans le délai du rappel
testEnvoi manuel depuis la liste des canaux

Les rappels d’expiration partent aux seuils choisis dans le moniteur, puis à 7, 3 et 1 jour, une fois par seuil.

Types de canaux

TypeCibleNotes
E-mailAdresseEnvoyé depuis Status. Une adresse hors membres doit être confirmée
Notification ntfyAdresse complète du sujet, en HTTPSLe sujet est obligatoire dans l’adresse
Webhook signéAdresse HTTPSRequête POST JSON, signée (voir ci-dessous)

Une organisation compte 20 canaux au plus. Une cible doit être joignable depuis Internet ; une adresse privée ou locale est refusée. Une adresse ne contient jamais d’identifiants.

Priorités ntfy

ÉvènementPrioritéÉtiquette
down5 (urgente)sirène
up3coche verte
tls_expiring, domain_expiring3cadenas, avertissement
test3cloche

Le titre et le message tiennent sur une ligne.

Reprises

Un envoi échoue quand le webhook ou le sujet ntfy répond autre chose que 2xx (une redirection compte comme un échec : elle n’est pas suivie), quand il ne répond pas en 15 secondes ou quand le réseau coupe. Il est alors repris après 30 secondes, puis 2 minutes, 10 minutes, 30 minutes et 2 heures. Après la dernière reprise, l’envoi est abandonné. L’historique des envois est gardé 30 jours.

Webhook signé

Chaque requête porte trois en-têtes, au format Standard Webhooks :

En-têteContenu
webhook-idIdentifiant unique de l’envoi
webhook-timestampHeure d’envoi, en secondes depuis l’époque Unix
webhook-signaturev1, suivi de la signature en base64

La signature est un HMAC-SHA256, calculé avec la clé du Secret de signature sur la chaîne <webhook-id>.<webhook-timestamp>.<corps brut>.

Le secret commence par whsec_, suivi de la clé en base64. Le préfixe est retiré avant le calcul.

Vérifier la signature

import { createHmac, timingSafeEqual } from "node:crypto"
export function verifierWebhook(secret, headers, corps) {
const cle = Buffer.from(secret.replace(/^whsec_/, ""), "base64")
const message = `${headers["webhook-id"]}.${headers["webhook-timestamp"]}.${corps}`
const attendu = createHmac("sha256", cle).update(message).digest("base64")
const recu = headers["webhook-signature"].split(" ").find((s) => s.startsWith("v1,"))?.slice(3) ?? ""
return recu.length === attendu.length && timingSafeEqual(Buffer.from(recu), Buffer.from(attendu))
}

Vérifie la signature sur le corps brut, avant tout parsing JSON. Refuse aussi les requêtes dont webhook-timestamp est trop ancien : une marge de quelques minutes est courante.

Ton point d’arrivée répond 2xx pour acquitter l’envoi. Toute autre réponse déclenche une reprise.