Aller au contenu
use-cases / daily-rollups-no-orchestrator / hero
AGRÉGATS QUOTIDIENS · SANS ORCHESTRATEUR

Des agrégats quotidiens sans orchestrateur

Chaque nuit à 1h, une entrée cron fait un curl sur une URL exec. Le script lance votre SQL d'agrégation sur l'URL sqlite et écrit la table quotidienne. Pas de Postgres Airflow, pas de fichier DAG, pas de tableau de bord scheduler à 14 widgets, pas d'astreinte pour l'orchestrateur lui-même.

Lire la documentation
use-cases / daily-rollups-no-orchestrator / mechanism

Deux URL et un planning à cinq champs

Toute la pipeline, c'est une entrée cron qui pointe 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, lance le SQL d'agrégation et renvoie les nouvelles lignes. Voilà tout le DAG.

POST /users/root/entries
LE PLANNING
// chaque nuit à 01:00 UTC
POST /users/root/entries
{
  "schedule": "0 1 * * *",
  "command":  "curl -fsS https://exec.containers.hoody.com/scripts/rollup/run"
}
1H · CURL
exec.containers.hoody.com/scripts/rollup/run
LA PIPELINE
// le corps entier de la 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 l'agrégat échoue, les logs cron le disent. Si vous devez rejouer la veille, vous appelez 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, c'est une entrée cron qui pointe sur une URL.

use-cases / daily-rollups-no-orchestrator / powers

Ce que vous n'avez pas eu à construire

Le Hoody Kit livre le scheduler, le runtime et le stockage en simples services HTTP. La pipeline, c'est l'appel curl entre eux — rien d'autre.

PAS DE DAEMON ORCHESTRATEUR

Le scheduler est une entrée HTTP

hoody-cron stocke les plannings comme des ressources sur /users/root/entries. Pas de base de métadonnées Postgres à sauvegarder, pas de conteneur scheduler à garder en bonne santé, pas de dépôt DAG à déployer. POSTez une ligne, et le run se déclenche.

PAS DE CÂBLAGE RUNTIME

Le script est une URL

hoody-exec exécute le script d'agrégation à la demande sur exec.containers.hoody.com/scripts/rollup/run. cron fait le curl, reçoit un 200, log la réponse. Pas de file de workers, pas de broker, pas de graphe de tâches picklé.

PAS DE PIPELINE DE LOGS

L'historique de run est le corps de la réponse

Chaque appel exec renvoie les nouvelles lignes en JSON et est loggé par cron avec statut, timestamp et stdout. Backfills, échecs et retry vivent tous dans les deux mêmes URL — rien de plus à expédier vers un agrégateur de logs.

use-cases / daily-rollups-no-orchestrator / backfill

Si un run échoue — ou si vous devez rejouer

La 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 bizarreries scheduler.

  1. 01 · DÉTECTER

    les logs cron disent que ça a échoué

    Si le run de 1h a renvoyé un non-2xx, l'enregistrement de dernier 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 — GETez l'entrée et lisez-la.

  2. 02 · REJOUER

    curl l'URL exec avec ?date=

    Le script accepte un paramètre date. Passez la date d'hier et il recalcule la ligne d'agrégat de ce jour, remplaçant la cassée par un INSERT OR REPLACE. Une commande, pas d'UI de re-déclenchement DAG.

  3. 03 · VÉRIFIER

    la réponse est la nouvelle ligne

    exec renvoie la ligne d'agrégat fraîchement écrite en JSON. Diffez-la contre ce que vous attendiez, puis passez à autre chose. Rien d'autre à vérifier — l'URL du tableau de bord sert la même table que vous venez d'écrire.

// rejouer l'agrégat d'hier à la maincurl -fsS https://exec.containers.hoody.com/scripts/rollup/run?date=2026-04-30
use-cases / daily-rollups-no-orchestrator / capacity

La forme de la pipeline

Trois nombres décrivent tout le système. Comparez-les avec à quoi ressemble un déploiement Airflow dans votre dépôt aujourd'hui.

  1. CHAMPS · PLANNING CRON5

    minute, heure, jour-du-mois, mois, jour-de-la-semaine. Voilà toute la surface de configuration pour le moment où un run se déclenche.

  2. URL · ENTRY + EXEC2

    un POST pour enregistrer le planning, un GET qui lance le script. Voilà toute la pipeline déployable.

  3. DAEMONS · PAS D'ORCHESTRATEUR0

    pas de processus scheduler à garder en vie, pas de base de métadonnées, pas de pool de workers. Hoody Kit tient les plannings et lance le script.

Les chiffres décrivent le modèle cron + exec sur Hoody Kit. Votre pipeline existante a probablement plus de pièces mobiles ; c'est tout l'intérêt de la comparaison.

use-cases / daily-rollups-no-orchestrator / punchline

L'orchestrateur, c'est une entrée cron qui pointe sur une URL.

AVANT · UNE PILE DE SCHEDULERAPRÈS · UNE LIGNE DE CRON
AVANTairflow webserver + scheduler + worker + postgres + dags/rollup_daily.pyCINQ PROCESSUS, UNE BASE DE MÉTADONNÉES, ET UN DÉPÔT DE FICHIERS DAG
MAINTENANT0 1 * * * curl -fsS https://exec.containers.hoody.com/scripts/rollup/runUNE LIGNE. UNE URL. UN PLANNING.
Lire la documentation
use-cases / daily-rollups-no-orchestrator / replaces

Ce que cela remplace

La couche d'orchestration s'effondre en un cron d'une ligne. Le DAG vit dans votre script.

  • Apache AirflowUn Postgres + Redis + scheduler + worker pour une seule requête
  • PrefectCompte cloud, install d'agent, enregistrement de flow
  • DagsterPythonique, mais toujours un service à faire tourner
  • LuigiUn moteur de graphe pour planifier votre SQL nocturne
  • Plannings GitHub ActionsÉpinglés à main, pas de contexte par locataire
  • dbt CloudUn SaaS pour emballer un CLI pour emballer un SELECT
  • Schedulers Python maisonUn while et un try/except, appelés « robustes »
use-cases / daily-rollups-no-orchestrator / cta

Arrêtez de faire tourner un orchestrateur. Faites tourner une entrée cron.

Lire la documentation
use-cases / daily-rollups-no-orchestrator / related

Découvrez les autres