Soixante conteneurs sur un seul serveur
Une seule machine bare-metal fait tourner des dizaines à des centaines de conteneurs Hoody. La déduplication KSM et BTRFS rend le coût marginal quasi nul.
vos clients tapent l'expression cron. vous la POST dans le crontab de leur container. Pas de queue partagée à arbitrer, pas d'intervalle minimal à imposer, pas de ticket support sur « pourquoi mon job n'a pas tourné le lundi en pic ».
Une vraie page de paramètres côté client — plannings édités par le tenant, parsés par son container.
votre page de paramètres affiche un champ. Le conteneur du tenant expose une API Cron. Submit transmet un seul POST. Pas de scheduler global, pas de logique de filtrage par tenant, pas de plafond « max 100 jobs sur tous les clients ».
// le submit du formulaire relaie l'expression du client telle quelle
POST https://acme-cron.hoody.com/users/root/entries
Content-Type: application/json
{
"schedule": "0 9 * * 1-5",
"command": "/jobs/sync_crm.sh",
"comment": "Sync Salesforce contacts",
"enabled": true
}HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "sch_8a3f1c",
"schedule": "0 9 * * 1-5",
"next_run": "2026-05-04T09:00:00Z",
"enabled": true
}
// le planning est désormais dans le crontab de ce tenant et nulle part ailleursLe service Hoody Cron tourne dans chaque conteneur tenant avec des entrées managées et de l'isolation par utilisateur. Le planning vit là où le travail tourne.
Quand le planning vit à côté du travail, les règles du multi-tenant scheduling changent. Les contraintes sont locales. Le rayon d'impact est local. Les fonctionnalités sont locales.
Pas de pool de threads global à se disputer. votre tenant le plus exigeant tourne toutes les minutes et ne prive jamais les plus calmes — ils ne sont pas dans le même crontab.
vous cessez d'être le gardien de « est-ce que */1 * * * * est autorisé pour votre tier ? ». Leur conteneur, leur cron, leur facture CPU. votre boîte de support se vide.
Snapshot du conteneur tenant, snapshot du crontab. Rollback, restore, fork — les plannings suivent. Pas d'état de scheduler externe à synchroniser.
La différence se voit en trois endroits : l'expérience client, votre charge de support, et la surface d'ingénierie.
La version scheduler partagé de cette feature est une mer de réserves. La version BYO est un champ à cinq champs.
Trois chiffres qui changent le jour où vous arrêtez de faire tourner une queue globale. Chacun correspond à une fonctionnalité que vous n'avez plus à coder ou à exploiter.
Plus d'intervalle minimum verrouillé par tier, plus de max-jobs-par-tenant, plus de boutons d'arbitrage. Le conteneur est la limite.
Le client tape, vous transmettez, le conteneur parse. Le submit de la page settings est un seul appel REST, pas une orchestration.
minute · heure · jour-du-mois · mois · jour-de-la-semaine. Plus les macros (@hourly, @daily). POSIX standard, pas votre DSL.
Les chiffres reflètent le modèle BYO lié au conteneur — les entrées cron réelles scalent avec le CPU de chaque conteneur et le forfait du client.
L'expression cron du client est la sienne, pas à vous de la valider contre une queue globale.
Les pièces d'infra qu'un cron BYO lié au conteneur met discrètement à la retraite.
Arrêtez d'être le gardien du planning de quelqu'un d'autre. Donnez-lui le champ cron, donnez le travail à son container.