
Sechzig Container auf einem Server
Eine Bare-Metal-Box führt Dutzende bis Hunderte von Hoody-Containern aus. KSM und BTRFS-Dedup machen die Marginalkosten nahezu null.
Richte deinen echten Stripe-Webhook für 30 Minuten auf eine hoody-files-URL. Das Verzeichnis enthält jetzt 14 JSON-Dateien — jedes Payload, das Production getroffen hat, byteweise. Ein Cron-Eintrag startet ein Exec-Skript, das sie um 9 Uhr von Montag bis Freitag wieder gegen Staging POSTet. Der Schedule läuft nächsten Samstag ab und löscht sich selbst.
{ "id": "evt_3OHk8ZJs2k9aXq1vQ", "type": "payment_intent.succeeded", "created": 1714723522, "data": { "object": { "id": "pi_3OHk8ZJs2k9aXq1v0K7rT4mB", "amount": 4900, "currency": "usd", "status": "succeeded" } } }
von deinem echten Webhook erfasst · von einem Cron-Eintrag wiederholt
Der gesamte Flow sind drei URLs. Production-Traffic kommt auf der Capture-URL an. Dateien landen in hoody-files. Cron läuft durch den Ordner und POSTet die Bodies wieder gegen Staging. Es gibt keinen Broker, keine Queue, keinen Replay-Service — nur ein Verzeichnis und einen Schedule.
Setze deine Stripe / Intercom / GitHub-Webhook-URL auf einen hoody-files-Pfad. Jedes Event kommt als PUT an und landet als JSON-Datei, benannt mit seinem Zeitstempel. Das Verzeichnis ist die Aufnahme.
Dateien persistieren auf der Disk; jede Datei hat ihre eigene URL. Durchsuche das Verzeichnis im Browser, liste es via API oder shell mit curl rein. Die Aufnahme ist ein Fakt, den du catten, scpen oder versionieren kannst.
POSTe einen Managed-Cron-Eintrag mit Schedule 0 9 * * 1-5 und Command bash /scripts/replay.sh /webhooks/2026-05-03. Das Skript listet das Verzeichnis und POSTet jede Datei in Zeitstempel-Reihenfolge wieder an Staging.
Capture und Replay sind dasselbe Protokoll an verschiedenen Tagen. Das, was die Bytes aufgenommen hat, ist das, was sie wieder abspielt. Es gibt keinen JSONL-Parser, keinen Sidecar, kein Recording-Format, das du lernen musst — Dateien in einem Ordner, in zeitlicher Reihenfolge.
Capture ist ein PUT pro Webhook-Event. Replay ist ein POST an die Cron-API. Hoody Files hält die Aufnahme; Hoody Cron läuft nach Schedule durch sie; hoody-exec führt das Bash-Skript aus, das das POSTen erledigt. Drei Services, kein Glue dazwischen.
# 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/api/v1/cron/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" }
Die Capture-Seite läuft einmal an einem Freitagmorgen. Die Replay-Seite läuft jeden Werktag bis nächsten Samstag, wenn das expires_at-Feld des Cron-Eintrags den Schedule löscht. Du hast eine PUT-URL in deine Webhook-Config geschrieben und einen POST in die Cron-API — das ist der gesamte Load-Test.
Synthetischer Traffic ist das, was du dir vorgestellt hast, wie der Request aussieht. Erfasster Traffic ist das, was tatsächlich angekommen ist. Gleiche Feldnamen, gleiche Edge Cases, gleiche Überraschungen.
Die Aufnahme erfasst exakt das JSON, das Stripe gesendet hat — inklusive jedes nullable Felds, jedes unerwarteten Event-Typs, jedes customer_id-Formats, das du vergessen hast. Dein Handler trifft auf dieselben Payloads, an denen er gestern gescheitert ist.
Die Cron-Expression 0 9 * * 1-5 platziert den Replay zur Stunde, in der deine echten Nutzer das System tatsächlich verwenden. Der Handler unter Test sieht den Morgenrausch gegen die gleichen Caches, die gleichen Cron-Nachbarn, die gleiche laute DB.
Der Ordner ist immutable; der Cron läuft jeden Werktag bis expires_at. Wenn der Handler beim Dienstags-Lauf immer noch bricht, fixt du ihn und lässt den Mittwochs-Lauf es beweisen. Gleicher Input jedes Mal — der Handler ist das Einzige, was sich ändert.
Die Zahlen kommen aus der Hoody Cron Managed Entries API und der Standard-Cron-Expression-Spec — nicht aus erfundenen Benchmarks.
Standard 5-Feld-Cron-Expression — Minute, Stunde, Tag-des-Monats, Monat, Wochentag. Dieselbe Syntax, die du 1985 verwendet hast, plant 2026 immer noch den Replay.
GET /users/[user]/entries paginiert bis zu 200 Managed Entries auf einmal. 63 Replay-Schedules pro Environment liegen klar im Budget.
Erstelle den wiederkehrenden Replay mit einem POST /users/me/entries — schedule, command, expires_at. PATCH später, um ihn stummzuschalten; DELETE, um ihn auszumustern; expires_at mustert ihn für dich aus.
Limits gemäß Hoody Cron Managed Entries API: Standard 5-Feld-Cron-Expressions plus @daily / @hourly Macros, Pagination bis zu 200 Entries pro Seite, expires_at ist optional und deaktiviert den Entry automatisch nach Ablauf der Frist.
Production-Traffic, einmal aufgenommen, nach Schedule wiederholt.
Die Standard-Tools zum Wiederholen von Webhook-Traffic — Recorder, Replay-Services, geplante Mocks. Jedes davon ist ein SaaS, ein Sidecar oder ein Skript, das du babysittest. Das hoody-files + hoody-cron-Paar ist nichts davon.
Erfasse Freitags Traffic. Plane den Replay nächste Woche. Lass den Cron-Eintrag sich selbst ablaufen, wenn das Experiment vorbei ist.