
Soixante conteneurs sur un seul serveur
Une machine bare-metal exécute des dizaines à des centaines de conteneurs Hoody. La dédupplication KSM et BTRFS rend le coût marginal quasi nul.
Postez une entrée cron le lundi avec expires_at fixé au vendredi 09:00. Le job sonne sur votre téléphone toutes les 30 minutes pendant quatre jours, puis se supprime au moment exact où la garde se termine. La personne d'astreinte suivante poste la sienne. Pas de planning PagerDuty, pas de config de planificateur partagée, pas de rappel de calendrier pour la désactiver.
l'entrée qui sonne m.dossantos n'existe que pendant que m.dossantos est d'astreinte
Trois moments dans la semaine. L'existence de l'entrée cron suit la garde exactement — pas de chevauchement, pas d'écart, pas de ligne crontab résiduelle.
Un curl avec un planning */30, une commande pointant vers hoody-notifications/push/me, et expires_at = vendredi 09:00:00Z. Le serveur retourne l'id e7d3.
Toutes les 30 minutes pendant quatre jours, l'entrée s'exécute et ping hoody-notifications. Uniquement votre appareil. Le canal d'équipe reste silencieux.
À 09:00:00Z, le service cron supprime e7d3. Le tick de 09:30 n'a rien à déclencher. La personne d'astreinte suivante a déjà posté la sienne.
Chaque personne d'astreinte écrit un POST quand sa garde commence. Le champ expires_at est l'intégralité du protocole de relais — le service cron fait le ménage, à la seconde près.
Tout le protocole de rotation tient en deux appels HTTP par semaine. La personne d'astreinte poste lundi, liste vendredi, voit que l'entrée est déjà partie. Il n'y a aucun fichier de planning partagé à fusionner.
# monday 09:00 — i'm on call until friday 09:00 curl -X POST \ https://oncall.containers.hoody.com/users/me/entries \ -H "Content-Type: application/json" \ -d '["schedule":"*/30 * * * *","command":"curl -fsS hoody-notifications/push/m.dossantos","comment":"on-call wk19","expires_at":"2026-05-08T09:00:00Z"]' # response HTTP/1.1 201 Created { "id":"e7d3", "expires_at":"2026-05-08T09:00:00Z", "enabled":true }
# friday 09:01 — the next on-call took over curl GET https://oncall.containers.hoody.com/users/me/entries HTTP/1.1 200 OK [ // my entry e7d3 is gone — it expired // at 09:00 sharp. j.okafor's new // entry took over at 09:00:30. ] # no slack thread, no calendar reminder
Aucun service de planificateur partagé n'est impliqué. L'entrée cron est détenue par l'ingénieur ; rien dans la configuration de la personne d'astreinte suivante ne dépend du nettoyage par la précédente.
Une entrée d'astreinte qui possède sa propre durée de vie supprime trois classes d'erreurs que les configs PagerDuty et les rappels de calendrier ne peuvent pas.
Comme la commande de l'entrée pointe vers votre endpoint de notification personnel, les escalades sont routées vers votre téléphone pour la durée de votre garde, et uniquement cela. Pas de spam accidentel sur le canal d'équipe à 3h du matin.
Il n'y a pas de escalation_policy.yaml que tout le monde touche. Chaque ingénieur possède son entrée. Deux personnes d'astreinte dans des fuseaux horaires différents ne peuvent pas entrer en conflit en éditant le même fichier.
Quand vendredi 09:00 arrive, vous ne demandez pas "attendez, je reçois encore ces alertes ?". L'entrée est déjà partie. Vérifier le relais c'est un GET qui retourne une ligne en moins.
Les chiffres viennent de l'API Hoody Cron. Vraies limites, pas inventées.
L'auto-expiration s'exécute contre l'horloge système. Un expires_at à 09:00:00Z se supprime dans la même minute que le tick cron — pas de latence de 5 minutes du concierge.
Expressions cron standard à 5 champs plus les macros @hourly / @daily / @weekly. */30 * * * * c'est ce qui se déclenche toutes les 30 minutes pendant votre garde.
Chaque utilisateur système a son propre crontab. L'entrée de la personne d'astreinte suivante vit sous son propre /users/[name]/entries — sans jamais toucher la vôtre.
Limites selon l'API Hoody Cron : les entrées gérées sont des CRUD JSON avec UUID et expires_at ; accès brut au crontab disponible par utilisateur ; isolation du crontab par utilisateur intégrée.
Quand la garde se termine, l'entrée cron aussi — automatiquement.
Les outils standards qu'on attrape pour les rotations d'astreinte. Chacun vous facture un service, un dépôt de config et un rituel de relais. Une entrée cron avec expires_at vous facture un POST.
Arrêtez de désactiver des lignes crontab le vendredi matin. Fixez expires_at le lundi et oubliez-le.