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.
Chaque nuit à 1h, une entrée cron curl une URL exec. Le script exécute votre SQL de rollup sur l'URL sqlite et réécrit la table quotidienne. Pas de Postgres Airflow, pas de fichier DAG, pas de dashboard scheduler à 14 widgets, pas d'astreinte pour l'orchestrateur lui-même.
SELECT date_trunc('day', created_at) AS d,
count(*) AS n
FROM events
WHERE created_at >= 'today'
GROUP BY 1 -- the whole pipelineLE DASHBOARD EST L'ORCHESTRATEUR. UNE URL. UNE PLANIFICATION.
Tout le pipeline est une entrée cron pointant sur une URL exec. L'entrée cron est un POST sur /users/root/entries. L'URL exec est un petit script qui ouvre l'URL sqlite, exécute le SQL de rollup, et renvoie les nouvelles lignes. C'est tout le DAG.
// chaque nuit à 01:00 UTC
POST /users/root/entries
{
"schedule": "0 1 * * *",
"command": "curl -fsS https://exec.containers.hoody.com/scripts/rollup/run"
}// tout le corps du pipeline
import { Database } from "bun:sqlite";
const db = new Database("events.db");
db.run(`INSERT INTO rollup_daily
SELECT date_trunc('day', created_at), count(*)
FROM events GROUP BY 1;`);
return { ok: true, rows: db.query("SELECT * FROM rollup_daily").all() };Si le rollup échoue, les logs cron le disent. Si vous devez rejouer hier, vous curl l'URL exec à la main avec un paramètre date. Pas de second système à apprendre, pas de base scheduler à maintenir vivante, pas de fichier DAG à committer. L'orchestrateur est une entrée cron pointant sur une URL.
Le Hoody Kit livre le scheduler, le runtime et le stockage en services HTTP simples. Le pipeline est l'appel curl entre eux — rien d'autre.
hoody-cron stocke les planifications comme des ressources sur /users/root/entries. Pas de DB de métadonnées Postgres à sauvegarder, pas de conteneur scheduler à maintenir en santé, pas de repo de DAG à déployer. POST une ligne, et le run se déclenche.
hoody-exec exécute le script de rollup à la demande sur exec.containers.hoody.com/scripts/rollup/run. cron le curl, reçoit un 200, log la réponse. Pas de queue worker, pas de broker, pas de graphe de tâches sérialisé.
Chaque appel exec retourne les nouvelles lignes en JSON et est loggé par cron avec statut, timestamp et stdout. Backfills, échecs et reruns vivent tous dans les deux mêmes URL — rien à expédier vers un agrégateur de logs.
Le pipeline c'est deux URL et un paramètre date. Rejouer hier a la même forme que le run nocturne, juste avec ?date=2026-04-30 sur l'URL exec. Pas d'UI de replay, pas de quirks de scheduler.
Si le run de 1h a renvoyé un non-2xx, l'enregistrement last-run de l'entrée sur hoody-cron montre le code de sortie et le corps de réponse capturé. Pas de service d'alerting séparé à câbler — GET l'entrée et lis-la.
Le script accepte un paramètre date. Passez la date d'hier et il recalcule la ligne de rollup de ce jour-là, remplaçant la cassée par un INSERT OR REPLACE. Une commande, pas d'UI de re-trigger DAG.
exec retourne la ligne de rollup fraîchement écrite en JSON. Comparez avec ce que vous attendiez, puis passez à autre chose. Rien d'autre à vérifier — l'URL du dashboard sert la même table que celle que vous venez d'écrire.
Trois nombres décrivent tout le système. Compare-les avec ce à quoi ressemble un déploiement Airflow dans votre repo aujourd'hui.
minute, heure, jour-du-mois, mois, jour-de-la-semaine. C'est toute la surface de configuration pour le moment où un run se déclenche.
un POST pour enregistrer la planification, un GET qui exécute le script. C'est tout le pipeline déployable.
pas de processus scheduler à garder vivant, pas de base de métadonnées, pas de pool de workers. Le Hoody Kit retient les planifications et exécute le script.
Les chiffres décrivent le modèle cron + exec sur Hoody Kit. votre pipeline existant a sans doute plus de pièces mobiles ; c'est tout l'intérêt de la comparaison.
L'orchestrateur est une entrée cron pointant sur une URL.
La couche d'orchestration s'effondre en une ligne de cron. Le DAG vit dans votre script.
Arrêtez de faire tourner un orchestrateur. Faites tourner une entrée cron.