Synthèse, accueil

Projets

Hora

Un moniteur d'uptime léger, multi-vantage et auto-hébergé, en Rust. Né d'une exigence : peu de ressources, des alertes qui comptent. Il surveille ce site même : la page Statut tourne dessus.

Rustmonitoringproduit

Rôle
Conception, développement, documentation, exploitation
Période
2026
Stack
Rust (tokio), axum, askama, SQLite, rustls, hickory-dns, Astro Starlight
La page de statut Hora de Pelican, l'entreprise fictive de la documentation : la chouette, l'heure, « Everything is running. », une maintenance annoncée, puis douze services en trois groupes, chacun avec sa barre sur 90 jours.
La page de statut Hora de Pelican, l'entreprise fictive de la documentation : la chouette, l'heure, « Everything is running. », une maintenance annoncée, puis douze services en trois groupes, chacun avec sa barre sur 90 jours.

Le besoin

Mes services tournent sur deux serveurs et un réseau domestique. Je voulais un moniteur léger, qui alerte seulement pour une vraie panne. J’ai écrit Hora, un moniteur d’uptime auto-hébergé en Rust, et publié la version 0.1.0 le 7 juin 2026. Il surveille aujourd’hui l’infrastructure de synthe.se, ce site compris.

À l'usage

Hora vérifie les services en HTTP, TCP, ICMP et DNS, et reçoit les heartbeats des tâches planifiées et des sauvegardes. Il suit aussi l’expiration des certificats TLS et des domaines, et les nouvelles versions des logiciels surveillés.

Avant d’alerter, Hora confirme la panne. Une vérification échouée est relancée une seconde plus tard, et il faut trois échecs consécutifs, le seuil par défaut. Les autres instances vérifient alors la même cible depuis leur réseau, en dix secondes au plus.

Si dix services dépendent d’une base de données en panne, Hora envoie une seule alerte, qui désigne la base comme cause. L’alerte part sur Telegram, Matrix, par e-mail ou sur un autre canal, et une notification suit au rétablissement.

La page de statut dit en une phrase si tout fonctionne. Chaque moniteur a sa page : courbe sur 24 heures, carte des latences, résultat de chaque point de mesure. En ligne de commande, hora tune rejoue l’historique pour montrer les alertes qu’un autre seuil aurait produites.

La page Hora du moniteur synthe.se : 99,9 % de disponibilité sur 90 jours, 44 ms de réponse typique, un certificat valide encore 42 jours, la courbe des 24 dernières heures et la barre jour par jour.
La page Hora du moniteur synthe.se : 99,9 % de disponibilité sur 90 jours, 44 ms de réponse typique, un certificat valide encore 42 jours, la courbe des 24 dernières heures et la barre jour par jour.

Architecture

Un seul binaire Rust sert de démon, de CLI et de tableau de bord en terminal. Chaque moniteur tourne dans sa propre tâche asynchrone : une cible lente ralentit seulement sa propre boucle.

Les vérifications, les incidents et leurs agrégats horaires et quotidiens tiennent dans un fichier SQLite. La partie web lit un instantané en mémoire, reconstruit en tâche de fond ; la page publique, l’API JSON et les métriques Prometheus en sont tirées.

La page de statut Hora en production : 19 services opérationnels, vérifiés depuis deux endroits, groupés par machine, chacun avec sa disponibilité et sa barre quotidienne.
La page de statut Hora en production : 19 services opérationnels, vérifiés depuis deux endroits, groupés par machine, chacun avec sa disponibilité et sa barre quotidienne.

Décisions

Toute la configuration dans un fichier. Un fichier TOML, rechargé à chaud, identique sur chaque instance et versionné dans git.

Des instances égales. Chaque instance fonctionne seule et surveille les autres : la panne d’un nœud laisse les autres en service.

En cas de doute, alerter. Une panne est classée locale seulement si toutes les autres instances qui ont répondu voient la cible en ligne ; la page affiche alors « Not an outage » et la notification part sur un canal secondaire. Dans tous les autres cas, l’alerte part normalement.

Un fichier de données. La sauvegarde porte sur un seul fichier SQLite, et hora compact récupère l’espace inutilisé.

Accessible et vérifié. Chaque état est signalé par une couleur, une forme et un mot. L’intégration continue lance clippy en mode pedantic, cargo-deny et cargo-audit, et le code est entièrement en Rust sûr.

Aujourd'hui

Hora en est à la version 0.11.1, sous licence MIT, documenté sur uplg.github.io/hora. La 0.11.0 a été éprouvée sur 575 millions de vérifications et 700 moniteurs : la page de statut s’affiche en moins de 1,5 ms dans 99 % des cas, contre 13 s auparavant, elle pèse 71 Ko au lieu de 6,5 Mo, et le pic mémoire est passé de 887 Mo à 353 Mo.

Deux instances surveillent mon infrastructure depuis deux réseaux, et la page Statut de synthe.se affiche leur résumé public, relu toutes les 30 secondes.

Un projet en tête ? Parlons-en