
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.
Vos clients tapent l'expression cron. Vous l'envoyez en POST au crontab de leur conteneur. Pas de file partagée à équilibrer, pas d'intervalle minimum à imposer, pas de ticket de support sur "pourquoi mon job n'a pas tourné le lundi de pointe".
Une vraie page de paramètres face client — plannings édités par le tenant, parsés par leur conteneur.
Votre page de paramètres affiche un champ de saisie. Leur conteneur tenant expose une API Cron. La soumission relaie un POST. Pas de planificateur global, pas de logique de filtrage par tenant, pas de plafond "max 100 jobs sur tous les clients".
// la soumission 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 maintenant dans le crontab de ce tenant et nulle part ailleursLe service Hoody Cron tourne dans chaque conteneur tenant avec des entrées gérées et l'isolation par utilisateur. Le planning vit là où le travail s'exécute.
Quand le planning vit à côté du travail, les règles du planning multi-tenant changent. Les contraintes sont locales. Le rayon d'impact est local. Les fonctionnalités sont locales.
Il n'y a pas de pool de threads global pour lequel se battre. Votre tenant le plus exigeant tourne toutes les minutes et n'affame jamais les calmes — ils ne sont pas sur le même crontab.
Vous arrêtez d'être le gardien de "est-ce que */1 * * * * est autorisé pour votre palier ?". 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 planificateur externe à synchroniser.
La différence apparaît à trois endroits : l'expérience du client, votre charge de support et la surface d'ingénierie.
La version planificateur partagé de cette fonctionnalité est une mer de réserves. La version BYO est un champ de saisie à cinq champs.
Trois chiffres qui changent le jour où vous arrêtez d'exploiter une file globale. Chacun correspond à une fonctionnalité que vous n'avez plus à écrire ou à exploiter.
Plus d'intervalle minimum lié au palier, plus de max-jobs-par-tenant, plus de boutons de partage équitable. Le conteneur est la limite.
Le client tape, vous transférez, le conteneur parse. La soumission de la page de paramètres 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 s'adaptent au CPU de chaque conteneur et au plan du client.
L'expression cron du client est celle du client, pas la vôtre à valider contre une file globale.
Les pièces d'infrastructure qu'un cron BYO lié au conteneur retire discrètement.
Arrêtez d'être le gardien du planning de quelqu'un d'autre. Donnez-leur le champ cron, donnez le travail à leur conteneur.