Aller au contenu

Changements de site web

Surveillez le contenu d’une page web, ou d’un site entier, et soyez informé quand il change : une page de tarifs ou de conditions, un site de documentation, l’avis de maintenance d’un fournisseur, une page d’annonce publique, ou votre propre site après un déploiement. Chaque changement est conservé avec le texte avant et après, un diff ligne par ligne et, quand un navigateur est disponible, une capture d’écran de chaque version.

Ce qui est comparé est le texte visible de chaque page, pas son HTML : scripts, styles, commentaires, blocs noscript, svg et template sont abandonnés, les espaces sont réduits et chaque bloc (paragraphe, titre, élément de liste, ligne de tableau) devient une ligne. Une nouvelle compilation de la même page, un attribut réordonné ou un nouveau nom de ressource anti-cache ne change rien ; une phrase reformulée si.

La navigation, l’en-tête, le pied de page et les encadrés latéraux du site sont écartés : ils sont les mêmes sur toutes les pages, et une nouvelle entrée de menu ferait sinon signaler chaque page comme changée en une seule vérification. Ils suivent les rôles que leur donne le HTML : chaque nav, un header ou un footer qui n’est pas dans un article, aside, main, nav ou section (l’en-tête d’un article est gardé), un aside hors d’un article et d’un main, et tout élément de rôle navigation, banner, contentinfo ou search. Leurs liens restent suivis pour trouver les pages d’un site. Comparer menus, en-tête et pied de page désactive cela.

Zone surveillée restreint la comparaison à certains éléments, par exemple main ou #content ; une page où aucun n’est trouvé est lue en entier plutôt que comme vide. Zones exclues écarte d’autres éléments : un bandeau de cookies, un encadré « derniers articles », un emplacement publicitaire. Les deux prennent des sélecteurs simples, séparés par des virgules : une balise (main), un id (#content), des classes (.cookie-banner), des attributs ([role=alert], [data-ad]), ou plusieurs ensemble (div.notice[role=alert]). Les descendants (main p) et autres combinateurs ne sont pas pris en charge.

Du serveur DumbMonit (ou de son agent relais) vers l’équipement :

PortProtocoleUsage
443TCPLecture de la page en HTTPS (port par défaut)
80TCPSeulement avec une adresse http:// (port par défaut)

Page (le défaut) lit l’adresse de la surveillance et rien d’autre. Ça peut aussi être un document texte brut ou JSON, comparé ligne par ligne.

Site part de l’adresse et suit chaque page sous le même dossier (https://example.com/docs/intro.html couvre tout sous /docs/ ; Préfixe de chemin choisit un autre dossier). Les pages sont trouvées :

  1. dans le sitemap du site : celles que robots.txt annonce (lignes Sitemap:), ou /sitemap.xml, index de sitemap inclus (un niveau) ;
  2. à défaut, ou quand le sitemap ne liste rien sous le dossier, en suivant les liens de chaque page, en largeur d’abord.

Seules les pages de la même origine (schéma, hôte et port) sont suivies. Quand la page de départ redirige vers un autre hôte du même site (example.com vers www.example.com, http vers https, ou un sous-domaine comme docs.example.com), le site est tenu pour être là-bas, et les liens vers le premier hôte sont lus sur le second. Quand elle redirige vers un tout autre site (une page de connexion comme login.microsoftonline.com, un domaine tiers), ce site n’est pas parcouru : seule la page de départ est lue, et aucune page n’est déclarée supprimée. Les liens vers images, feuilles de style, scripts, PDF, archives et autres fichiers sont ignorés par leur extension, et toute réponse qui n’est pas HTML est ignorée. Les fragments (#section), les paramètres de suivi (utm_…, fbclid, gclid et consorts) et les requêtes vides sont retirés, une page est donc une adresse ; Ignorer les paramètres d’URL retire toute la partie ?…. robots.txt est respecté pour les pages trouvées ainsi : le groupe qui nomme DumbMonit, ou sinon le groupe *, avec Allow, Disallow, * et $.

Le crawl est poli : deux requêtes à la fois au plus, une demi-seconde entre deux lots, le User-Agent DumbMonit/<version>, un délai de 15 secondes par requête et 5 Mo lus au plus par page. Il s’arrête à Pages maximum (25 par défaut, 200 au plus) ou après dix minutes. Quand Pages maximum l’a arrêté, la page de la surveillance dit combien de pages ont été trouvées : la partie du site non surveillée n’est jamais une surprise. User agent remplace DumbMonit/<version> pour un site qui refuse les robots.

La surveillance est sondée comme n’importe quel autre (chaque minute par défaut), mais les pages ne sont lues que toutes les Vérifier toutes les minutes (60 par défaut, de 5 à 10080). Entre deux, la sonde ne rapporte que l’état de la dernière vérification : le site n’est pas touché chaque minute. Une vérification tourne en arrière-plan ; deux vérifications de la même surveillance ne se chevauchent jamais, et Vérifier maintenant sur la page de la surveillance en démarre une tout de suite.

La première vérification n’enregistre que la référence : chaque page est lue et conservée, rien n’est rapporté. À partir de là, pour chaque page :

SituationCe qui est conservé
Même texte que la dernière fois (après Ignorer les lignes)Rien de nouveau ; la page est marquée vérifiée.
Texte différentUn nouvel instantané et un événement changée, avec le nombre de lignes ajoutées et retirées.
Une page jamais vue avant, ou revue après avoir disparuUn instantané et un événement nouvelle page.
La page répond 404 ou 410Un événement page supprimée, le dernier instantané comme « avant ».
Portée site : un crawl complet n’atteint plus une page connueUn événement page supprimée aussi (« Plus liée »). Un crawl arrêté par Pages maximum ou par sa limite de temps ne conclut jamais qu’une page a disparu.
Toute autre erreur sur une page (délai dépassé, 403, 500 sur une sous-page)L’erreur est montrée sur la page ; aucun événement.

Changer l’adresse, la portée, le préfixe de chemin, Pages maximum, les zones ou Ignorer les lignes fait de la prochaine vérification une nouvelle référence plutôt que de rapporter chaque page comme changée (ou, pour un Pages maximum plus élevé, chaque page ajoutée comme nouvelle). Une mise à jour de DumbMonit qui lit les pages autrement fait de même, une fois.

Quand une vérification trouve la même modification sur plusieurs pages (les mêmes lignes retirées et ajoutées, comme un bandeau), la page de la surveillance la montre une seule fois, avec les pages concernées.

Dans le diff, une ligne remplacée montre quels mots ont changé : soulignés côté ajout, barrés côté retrait.

Des lignes qui changent à chaque visite — une horloge, un compteur de visiteurs, « mis à jour il y a 5 minutes », une citation aléatoire — seraient rapportées à chaque vérification. Ignorer les lignes contient des expressions régulières (syntaxe regex de Rust), une par ligne ou jointes avec | ; tout texte de ligne que l’une d’elles correspond est laissé de côté avant comparaison. Par exemple :

Updated \d+ minutes ago|Visitors: \d+|© \d{4}

Quand la page de départ elle-même ne peut pas être lue (pas de réponse, connexion refusée, délai dépassé, HTTP 5xx), la surveillance est inaccessible : la sonde échoue, et la règle « Surveillance inaccessible » se déclenche comme pour toute surveillance. La page de départ est alors retentée à chaque sonde, son retour est donc vu dans la minute. Une page de départ qui refuse l’accès (401, 403) est rapportée comme un problème de configuration, pas comme une panne. Les erreurs sur d’autres pages du site ne sont montrées que sur ces pages.

Les adresses que seul l’hôte DumbMonit lui-même peut atteindre (loopback, link-local, le service de métadonnées cloud) sont refusées sauf si Autoriser les cibles loopback et link-local est activée ; les adresses LAN privées sont toujours autorisées.

La règle intégrée Site web changé (webchange_detected, Info) se déclenche après une vérification qui a trouvé au moins un changement (page changée, nouvelle ou supprimée), et la notification nomme les pages : « /tarifs, /contact and 2 more ». Tant qu’elle est active, chaque nouvelle vérification qui trouve des changements est notifiée à nouveau, avec ses propres pages, même si ce sont les mêmes ; l’alerte se résout à la première vérification qui ne trouve rien de nouveau. Elle reste une seule alerte par surveillance du début à la fin : l’acquitter ou la mettre en sourdine depuis l’alerte couvre aussi les vérifications suivantes. Elle lit dumbmonit_webchange_last_check_changes ; attachez-la à un canal comme toute autre règle, ou augmentez sa gravité, dans Alertes → Règles. Voir Règles intégrées.

MétriqueQuoi
dumbmonit_webchange_pagesPages suivies (pages supprimées exclues).
dumbmonit_webchange_pages_failedPages suivies dont la dernière lecture a échoué.
dumbmonit_webchange_last_check_changesChangements trouvés par la dernière vérification.

Les métriques apparaissent une fois la première vérification faite.

L’image DumbMonit n’a pas de navigateur : les captures d’écran viennent d’un Chromium headless optionnel, piloté via le protocole Chrome DevTools. Ajoutez-en un comme service browser à côté de DumbMonit dans docker-compose.yml, et pointez le serveur vers lui :

services:
dumbmonit:
environment:
DUMBMONIT_BROWSER_URL: http://browser:9222
browser:
image: chromedp/headless-shell:stable
shm_size: 256m
restart: unless-stopped

Lancez ensuite docker compose up -d. Rien ne publie le port du navigateur : seul le serveur DumbMonit lui parle, via le réseau Compose.

DUMBMONIT_BROWSER_URL pointe DumbMonit vers le navigateur (tout Chromium démarré avec --remote-debugging-port, par exemple chromedp/headless-shell ; le serveur lit /json/version et parle à l’adresse que le nom d’hôte résout).

Une capture n’est prise que quand une page obtient un nouvel instantané (la référence, et chaque changement), jamais sur une vérification sans changement : une fenêtre de 1366 × 900, la page complète jusqu’à 5000 pixels, en JPEG. L’option Captures d’écran les désactive pour une surveillance. Sans navigateur, ou quand il ne répond pas, la comparaison de texte fonctionne pareil et les instantanés n’ont simplement pas d’image ; la page de la surveillance le dit.

Le navigateur charge la page comme le ferait un visiteur, avec ses scripts : ce qu’il montre peut différer du texte que DumbMonit a comparé, qui est le HTML envoyé par le serveur.

Le texte de chaque instantané est gardé dans la base de données (1 Mo au plus par page) ; les captures d’écran sont des fichiers sous /data/webchange/<id de la surveillance>/. Par surveillance, les 500 derniers changements sont gardés ; un instantané est gardé tant qu’il est le plus récent d’une page ou qu’un changement gardé s’y réfère, et tout le reste, fichiers inclus, est supprimé après chaque vérification. Supprimer la surveillance retire tout cela.

Les étapes ci-dessous sont celles que montre l’avis à côté du formulaire.

  1. Dans l’adresse, collez la page à surveiller, avec http:// ou https://.

  2. Pour suivre un site entier ou une section, réglez « Portée » sur « site ».

  3. Listez les lignes qui changent à chaque visite (une horloge, un compteur) dans « Ignorer les lignes », sous forme d’expressions régulières.

  4. Pour une capture d’écran de chaque version, suivez la section « Captures d’écran » de cette page.

Avec la portée « site », toutes les pages sous le même dossier sont suivies, jusqu’à « Pages maximum ». La première vérification enregistre seulement la référence, rien n’est signalé. Ensuite, chaque vérification compare le texte visible page par page et garde une copie avant/après de chaque changement, affichée sur la page de la surveillance ; l’alerte « Website changed » vous prévient.

Identifiants : aucun. Les vérifications tournent toujours sur le serveur DumbMonit : une surveillance de site web ne peut pas passer par un agent relais.

OptionDéfautSignification
Portée (scope)pagepage : l’adresse seulement. site : chaque page sous le même dossier.
Pages maximum (max_pages)25Portée site : pages lues au plus par vérification, de 1 à 200.
Préfixe de chemin (path_prefix)dossier de l’adressePortée site : seulement les pages dont le chemin commence par ceci (/docs/).
Ignorer les lignes (ignore)—Expressions régulières ; les lignes de texte correspondantes ne sont pas comparées.
Zone surveillée (content_selector)—Sélecteurs simples ; seul le texte qu’ils contiennent est comparé.
Zones exclues (exclude_selector)—Sélecteurs simples ; leur texte n’est pas comparé.
Comparer menus, en-tête et pied de page (keep_page_chrome)falseComparer aussi la navigation, l’en-tête, le pied de page et les encadrés du site.
Ignorer les paramètres d’URL (ignore_query)falsePortée site : les adresses qui ne diffèrent que par leur partie ?… sont une même page.
User agent (user_agent)—Envoyé à la place de DumbMonit/<version>.
Captures d’écran (screenshots)trueGarder une capture d’écran de chaque nouvelle version, quand un navigateur est configuré.
Vérifier toutes les (check_interval_minutes)60Minutes entre deux vérifications, de 5 à 10080.
Accepter un certificat non vérifiable (insecure_tls)falsePour un site propre derrière un certificat autosigné.
Autoriser les cibles loopback et link-local (allow_private_targets)falseAtteindre un site servi par l’hôte DumbMonit lui-même.