
Sesenta contenedores en un servidor
Un servidor bare-metal ejecuta decenas a cientos de contenedores Hoody. KSM y dedup BTRFS hacen que el costo marginal sea casi cero.
Apunta tu webhook real de Stripe a una URL de hoody-files durante treinta minutos. La carpeta tiene ahora catorce archivos JSON — cada payload que golpeó producción, byte por byte. Una entrada de cron ejecuta un script exec que los manda por POST a staging a las 9, de lunes a viernes. El horario expira el sábado siguiente y se borra solo.
{ "id": "evt_3OHk8ZJs2k9aXq1vQ", "type": "payment_intent.succeeded", "created": 1714723522, "data": { "object": { "id": "pi_3OHk8ZJs2k9aXq1v0K7rT4mB", "amount": 4900, "currency": "usd", "status": "succeeded" } } }
capturado por tu webhook real · reproducido por una entrada de cron
Todo el flujo son tres URLs. El tráfico de producción llega a la URL de captura. Los archivos aterrizan en hoody-files. El cron recorre la carpeta y manda los cuerpos por POST a staging. No hay broker, ni cola, ni servicio de replay — solo un directorio y un horario.
Pon tu URL de webhook de Stripe / Intercom / GitHub a una ruta de hoody-files. Cada evento llega como un PUT y aterriza como un archivo JSON nombrado con su marca de tiempo. El directorio es la grabación.
Los archivos persisten en disco; cada archivo tiene su propia URL. Navega el directorio en un navegador, lístalo vía API, o entra con curl. La grabación es un hecho que puedes hacer cat, scp o versionar.
Haz POST de una entrada de cron gestionada con schedule 0 9 * * 1-5 y comando bash /scripts/replay.sh /webhooks/2026-05-03. El script lista el directorio y manda cada archivo por POST de vuelta a staging en orden de marca de tiempo.
Captura y reproducción son el mismo protocolo en días distintos. Lo que grabó los bytes es lo que los reproduce. No hay parser de JSONL, ni sidecar, ni formato de grabación que tengas que aprender — archivos en una carpeta, en orden temporal.
La captura es un PUT por evento de webhook. La reproducción es un POST a la API de cron. Hoody Files guarda la grabación; Hoody Cron la recorre con un horario; hoody-exec ejecuta el script bash que hace los POSTs. Tres servicios, sin pegamento entre ellos.
# 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" }
El lado de captura corre una vez un viernes por la mañana. El lado de reproducción corre cada día laborable hasta el sábado siguiente, cuando el campo expires_at de la entrada de cron borra el horario. Escribiste una URL PUT en la configuración de tu webhook, y un POST en la API de cron — esa es toda la prueba de carga.
El tráfico sintético es lo que tú imaginabas que era la petición. El tráfico capturado es lo que de verdad llegó. Mismos nombres de campo, mismos casos límite, mismas sorpresas.
La grabación captura el JSON exacto que envió Stripe — incluyendo cada campo nullable, cada tipo de evento inesperado, cada formato de customer_id que olvidaste. Tu handler se enfrenta a los mismos payloads con los que falló ayer.
La expresión cron 0 9 * * 1-5 aterriza la reproducción a la hora a la que tus usuarios reales usan el sistema. El handler bajo prueba ve el rush de la mañana contra las mismas cachés, los mismos vecinos cron, la misma BD ruidosa.
La carpeta es inmutable; el cron corre cada día laborable hasta expires_at. Si el handler aún se rompe en la ejecución del martes, lo arreglas y dejas que la del miércoles lo demuestre. Misma entrada cada vez — el handler es lo único que cambia.
Los números salen de la API de entradas gestionadas de Hoody Cron y de la especificación estándar de expresiones cron — no de benchmarks inventados.
Expresión cron estándar de 5 campos — minuto, hora, día del mes, mes, día de la semana. La misma sintaxis que usaste en 1985 todavía programa la reproducción en 2026.
GET /users/[user]/entries pagina hasta 200 entradas gestionadas a la vez. Sesenta y tres horarios de reproducción por entorno entran de sobra.
Crea la reproducción recurrente con un POST /users/me/entries — schedule, comando, expires_at. PATCH después para silenciarla; DELETE para retirarla; expires_at la retira por ti.
Límites según la API de Entradas Gestionadas de Hoody Cron: expresiones cron estándar de 5 campos más macros @daily / @hourly, paginación hasta 200 entradas por página, expires_at es opcional y auto-desactiva la entrada pasado el plazo.
Tráfico de producción, grabado una vez, reproducido con un horario.
Las herramientas estándar para reproducir tráfico de webhooks — grabadores, servicios de replay, mocks programados. Cada una es un SaaS, un sidecar o un script que hay que cuidar. La pareja hoody-files + hoody-cron no es ninguno.
Captura el tráfico del viernes. Programa la reproducción de la próxima semana. Deja que la entrada de cron expire sola cuando el experimento termine.