
1 つのサーバーで 60 のコンテナ
1 つのベアメタルボックスで数十から数百の Hoody コンテナを実行。KSM と BTRFS のデデュプでマージナルコストはほぼゼロ。
`.hoody/crontab` をジョブの隣にチェックインします。デプロイスクリプトが `main`、`feature/billing-v2`、あるいは任意のプレビューブランチ用にコンテナを起動するとき、そのファイルを新しいコンテナの Cron API に PUT します。スケジュールはブランチとともに出荷され、ブランチが消えると一緒に消えます。
ブランチごとに 1 ファイル · どのリポジトリでも同じパス · 共有 cron サーバーなし
すべてのブランチコンテナは Hoody Cron を実行します。デプロイスクリプトはチェックインされた crontab を読み、それを新しいコンテナの raw-crontab エンドポイントに PUT します。コンテナは、ファイルが記述するスケジュールを実行します — それ以上でも以下でもありません。
#!/bin/sh
# このブランチ用の新しいコンテナをプロビジョニングします。
BRANCH=$(git branch --show-current)
CTR=$(hoody containers create --from main-snapshot)
# コンテナの crontab をリポジトリ内のものに置き換えます。
curl -X PUT --data-binary @.hoody/crontab \
-H "Content-Type: text/plain" \
https://$CTR-cron-1.hoody.com/users/root/crontab
# 完了。ブランチのスケジュールはそのコンテナの中に存在します。
echo "deployed $BRANCH → $CTR"# Hoody Cron raw-crontab エンドポイント — ファイル全体をアトミックに置き換えます。
PUT /users/root/crontab HTTP/1.1
Host: ctr_4d72b9-cron-1.hoody.com
Content-Type: text/plain
0 2 * * * /srv/jobs/billing-rollup-v2.sh
*/15 * * * * /srv/jobs/sync-stripe.py
@hourly curl -fsS http://localhost/healthz
*/5 * * * * /srv/jobs/diff-v1-v2.sh
HTTP/1.1 200 OK
# 200 OK: cron デーモンがリロードし、スケジュールは 1 秒以内に有効化されます。crontab は、cron サーバーが記憶する状態ではなく、ブランチが運ぶデータです。コンテナを削除すれば、片付けるべきエントリは何も残りません — ファイルはディスクとともに消えました。
スケジュールがリポジトリ内のファイルになると、3 つのカテゴリの作業が消えます。
`billing-rollup.sh` を v2 に変更すると、新しいスケジュールも同じプルリクエストに乗ります。レビュアーはスクリプトのすぐ隣で cron 行を見ます。1 つのコミットを取り消せば、スケジュールも一緒に元に戻ります。
ブランチコンテナはエフェメラルです。ブランチをマージまたはクローズすると、コンテナを破棄します。crontab はその中に存在していたため、スケジュールは清掃係なしで消えます — 古いエントリを抱えた共有 cron サーバーは存在しません。
`experiment/llm-rollups` の毎時実験ジョブは、自分のファイルシステムを持つ自分のコンテナで動きます。ステージングの cron デーモンには見えませんし、本番の cron デーモンにも見えません。ジョブ自体の中に `if BRANCH_ENV` のガードはありません。
標準の「ops が管理する 1 つの crontab」モデルとブランチに紐づくモデルは、反対方向に失敗します。同じジョブ、まったく異なる影響範囲です。
違いは機能ではありません — スケジュールがどこに存在するかです。ブランチが運ぶファイルか、ブランチが借りる共有テーブルの行か。
コンテナごとの Cron は本物の REST サーフェスです — 3 つのエンドポイントファミリ、標準の cron 構文、ユーザーごとの完全な分離。数値は Cron API 仕様によるもので、捏造したベンチマークではありません。
各ブランチコンテナは自分のユーザーごとの crontab を持ちます。ファイル全体を PUT し、GET で取り戻し、アトミックに置き換えます。裏に共有スケジュールテーブルはありません。
Raw crontab (GET/PUT)、マネージドエントリ (UUID と `expires_at` 付きの POST/PATCH/DELETE)、ユーザーごとのリスト。デプロイスクリプトが必要とするものを選んでください。
標準の `min hour day month dow` に加えてマクロ: `@hourly`、`@daily`、`@weekly`、`@monthly`、`@yearly`。`.hoody/crontab` がすでに使っているのと同じ構文です。
Hoody Cron API より: 各コンテナの cron サービス URL 上で GET/PUT /users/[user]/crontab および POST/PATCH/DELETE /users/[user]/entries。
スケジュールは、それを動かすコードの隣、同じコンテナの中、同じブランチに存在します。
cron スケジュールがかつて存在していた 6 つの場所、どれもコードの隣ではありませんでした。ブランチに紐づく crontab は、それらすべてを不要にします。
システム間でスケジュールを同期するのをやめましょう。crontab をチェックインしてください。ブランチに運ばせましょう。