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.
Pointe votre vrai webhook Stripe sur une URL hoody-files pendant trente minutes. Le dossier contient maintenant quatorze fichiers JSON — chaque payload qui a tapé la production, octet pour octet. Une entrée cron lance un script exec qui les POST à staging à 9h, lundi au vendredi. Le schedule expire samedi prochain et se supprime.
{ "id": "evt_3OHk8ZJs2k9aXq1vQ", "type": "payment_intent.succeeded", "created": 1714723522, "data": { "object": { "id": "pi_3OHk8ZJs2k9aXq1v0K7rT4mB", "amount": 4900, "currency": "usd", "status": "succeeded" } } }
capturés par votre vrai webhook · replayés par une entrée cron
Tout le flux est trois URLs. Le trafic de production arrive sur l'URL de capture. Les fichiers atterrissent dans hoody-files. Le cron parcourt le dossier et POST les bodies à staging. Pas de broker, pas de queue, pas de service de replay — juste un dossier et un schedule.
Mettez l'URL de votre webhook Stripe / Intercom / GitHub sur un chemin hoody-files. Chaque event arrive comme un PUT et atterrit comme un fichier JSON nommé avec son timestamp. Le dossier est l'enregistrement.
Les fichiers persistent sur disque ; chaque fichier a sa propre URL. Browse le dossier dans un navigateur, list-le via l'API, ou shell dedans avec curl. L'enregistrement est un fait que vous pouvez cat, scp ou versionner.
POST une entrée cron managée avec schedule 0 9 * * 1-5 et command bash /scripts/replay.sh /webhooks/2026-05-03. Le script liste le dossier et POST chaque fichier à staging dans l'ordre des timestamps.
Capture et replay sont le même protocole sur des jours différents. Ce qui a enregistré les octets est ce qui les rejoue. Pas de parser JSONL, pas de sidecar, pas de format d'enregistrement à apprendre — des fichiers dans un dossier, dans l'ordre temporel.
La capture est un PUT par event webhook. Le replay est un POST sur l'API cron. Hoody Files tient l'enregistrement ; Hoody Cron le parcourt sur un schedule ; hoody-exec lance le script bash qui fait les POSTs. Trois services, pas de glue entre.
# point your real webhook at hoody-files curl -X PUT \ https://files.containers.hoody.com/webhooks/2026-05-03/stripe-08-15-22.json \ --data-binary @- # 30 minutes later, the directory holds 14 files HTTP/1.1 201 Created webhooks/2026-05-03/stripe-08-15-22.json
# one cron entry replays the morning at 9am, mon-fri curl -X POST \ https://cron.containers.hoody.com/users/me/entries \ -d '["schedule":"0 9 * * 1-5","command":"bash /scripts/replay.sh /webhooks/2026-05-03","expires_at":"2026-05-10T09:00:00Z"]' HTTP/1.1 201 Created { "id":"f0a8", "schedule":"0 9 * * 1-5", "expires_at":"2026-05-10T09:00:00Z" }
Le côté capture tourne une fois un vendredi matin. Le côté replay tourne chaque jour ouvré jusqu'à samedi prochain, où le champ expires_at de l'entrée cron supprime le schedule. vous avez écrit une URL PUT dans la config webhook, et un POST dans l'API cron — c'est tout le test de charge.
Le trafic synthétique est ce que vous imaginiez que la requête ressemblait. Le trafic capturé est ce qui est réellement arrivé. Mêmes noms de champs, mêmes cas limites, mêmes surprises.
L'enregistrement capture le JSON exact que Stripe a envoyé — incluant chaque champ nullable, chaque type d'event inattendu, chaque format customer_id que vous avez oublié. votre handler rencontre les mêmes payloads qui l'ont fait échouer hier.
L'expression cron 0 9 * * 1-5 fait atterrir le replay à l'heure où vos vrais users utilisent le système. Le handler testé voit la rush du matin contre les mêmes caches, les mêmes voisins cron, la même DB chargée.
Le dossier est immuable ; le cron tourne chaque jour ouvré jusqu'à expires_at. Si le handler casse encore au run de mardi, vous le répares et laisses le run de mercredi le prouver. Même input à chaque fois — le handler est la seule chose qui change.
Les chiffres viennent de l'API Hoody Cron managed entries et de la spec d'expression cron standard — pas de benchmarks inventés.
Expression cron standard 5 champs — minute, heure, jour-du-mois, mois, jour-de-la-semaine. La même syntaxe qu'en 1985 programme encore le replay en 2026.
GET /users/[user]/entries pagine jusqu'à 200 entrées managées à la fois. Soixante-trois schedules de replay par environnement reste largement dans le budget.
Crée le replay récurrent avec un POST /users/me/entries — schedule, command, expires_at. PATCH plus tard pour le mute ; DELETE pour le retirer ; expires_at le retire pour vous.
Limites selon l'API Hoody Cron Managed Entries : expressions cron standard 5 champs plus macros @daily / @hourly, pagination jusqu'à 200 entrées par page, expires_at est optionnel et auto-désactive l'entrée passée la deadline.
Trafic de production, enregistré une fois, replayé sur un schedule.
Les outils standard pour replayer du trafic webhook — recorders, services de replay, mocks programmés. Chacun est un SaaS, un sidecar ou un script à babysitter. La paire hoody-files + hoody-cron n'est rien de tout ça.
Capturez le trafic du vendredi. Programmez le replay de la semaine suivante. Laissez l'entrée cron expirer quand l'expérience est finie.