Outil interne · Agence web
Un outil de supervision pour les sites que nous maintenons
Une application web développée en interne pour surveiller les sites que nous maintenons : vérifications par cron, gestion des incidents, alertes et pages de statut publiques.
PHP 8.3, MariaDB, Composer, PHPUnit 11, uPlot, Brevo API, cron, CSS maison, Inter auto-hébergée

Contexte
ADN PAPER maintient les sites de ses clients. Nous devons savoir avant eux quand un site ne répond plus, ralentit ou présente un certificat qui expire. Nous voulions un outil dont nous maîtrisons les règles d’alerte, les données et l’hébergement.
Une première version reposait sur un moteur PHP greffé à WordPress. Elle testait les sites en parallèle avec curl_multi, résolvait le DNS en PHP, relançait un test après 5 secondes en cas d’échec, comparait avec des témoins réseau chez Google et Cloudflare, alertait 14 jours avant l’expiration d’un certificat SSL et groupait les alertes.
Besoin
Il fallait sortir de WordPress pour gagner en autonomie. L’outil devait vérifier les sites à intervalle régulier sans que deux passages se chevauchent, ouvrir et clore des incidents, alerter sans bruit inutile, et présenter à chaque client une page de statut publique qui ne dévoile rien de notre infrastructure.
Il devait aussi tenir des statistiques de disponibilité et de temps de réponse dans la durée, et rester sûr, car il connaît l’ensemble de nos sites en production.
Solution
Nous avons développé une application web autonome, sans WordPress et sans framework, en PHP 8.3 avec MariaDB. Le routeur est écrit maison, le schéma de base évolue par migrations SQL, les dépendances passent par Composer et les tests par PHPUnit 11. L’interface utilise un kit CSS maison, la police Inter auto-hébergée et des graphiques uPlot.
Un vérificateur est lancé par cron, le planificateur de tâches du serveur. Un verrou GET_LOCK en base empêche deux exécutions simultanées. Chaque anomalie ouvre un incident. Le moteur d’alertes applique des règles, attend un délai de confirmation avant de notifier, peut mettre un site en sourdine, empile les événements dans une file et retente les envois en échec. Les e-mails partent par l’API Brevo. Cette chaîne de traitement relève de l’automatisation.
Chaque site dispose d’une page de statut publique sous /status/{slug}, sans donnée interne exposée. Les statistiques de disponibilité et de temps de réponse p95, le seuil sous lequel se situent 95 % des mesures, sont calculées par tranches. Les utilisateurs ont un profil et un cookie « rester connecté » sécurisé par sélecteur et validateur haché.
Côté sécurité, l’application applique une CSP limitée à ‘self’, HSTS, une protection CSRF, des requêtes préparées et un fichier .env stocké hors du webroot.
Fonctionnalités
Vérificateur par cron avec verrou
Les contrôles tournent à intervalle régulier. Un verrou GET_LOCK empêche deux passages simultanés.
Gestion des incidents
Chaque anomalie détectée ouvre un incident, suivi jusqu'à sa résolution.
Moteur d'alertes
Règles, délai de confirmation, mise en sourdine par site, file d'événements et nouvelles tentatives d'envoi.
Pages de statut publiques
Chaque site a sa page sous /status/{slug}. Aucune donnée interne n'y est exposée.
Disponibilité et p95 par tranches
Les statistiques de disponibilité et de temps de réponse sont calculées par périodes et affichées avec uPlot.
Profils et connexion persistante
Chaque utilisateur a un profil. Le cookie « rester connecté » repose sur un sélecteur et un validateur haché.
E-mails par Brevo
Les notifications partent par l'API Brevo, sans serveur de messagerie à maintenir.
Résultats
L’outil surveille les sites que nous maintenons. Il a remplacé la première version greffée à WordPress. Il est couvert par des tests PHPUnit 11.
Réalisations


