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.
- Rôle
- Conception, développement, documentation, exploitation
- Période
- 2026
- Stack
- Rust (tokio), axum, askama, SQLite, rustls, hickory-dns, Astro Starlight


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.


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.


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.