
1 つのサーバーで 60 のコンテナ
1 つのベアメタルボックスで数十から数百の Hoody コンテナを実行。KSM と BTRFS のデデュプでマージナルコストはほぼゼロ。
Hoody Cron がスケジュールを担い、Hoody Exec が更新ロジックを担います。日曜午前 04:00 に curl が発火し、certbot が走り、新しいバンドルが PATCH でプロキシに反映され、リロードが返ってきます。シェルセッションも、~/.ssh の鍵も、あなたと証明書の間の踏み台もありません。
# weekly · Sunday 04:00 0 4 * * 0 bash /scripts/renew.sh毎週 · 1 度だけ POST · 自走し続ける
SSH 鍵なし · 踏み台なし · スケジュールは JSON API の 1 行
更新パイプライン全体は、エンドポイント 2 つと 5 フィールドのスケジュールで完結します。Cron が Exec をトリガーし、Exec が ACME を呼び出してプロキシに PATCH。応答は 200 として返ってきます。
POST /users/me/entries で schedule "0 4 * * 0"、command "curl /scripts/certs/renew"。cron サービスがこれをユーザー crontab に書き込み、刻み始めます。HTTPS が通れば、世界のどこからでも 1 度だけやれば済みます。
日曜 04:00、cron が exec URL を curl します。Exec はスクリプトを起動し、Let's Encrypt の ACME エンドポイントと話し、http-01 チャレンジを検証し、更新したバンドルを /files に書き込みます。誰もログインせず、セッションも要りません。
スクリプトは新しい証明書と鍵を Hoody プロキシのバンドル エンドポイントに PATCH します。プロキシはホットリロードします — 再起動なし — 次の TLS ハンドシェイクから新しい証明書が提供されます。サイクル全体が 1 分以内です。
各ステップは、ターミナルから再生できる HTTP 呼び出しです — デバッグしたいなら `curl --dry-run`、ヘッダーが見たいなら `curl -i`。パイプラインはどの時点でもログイン済みセッションに依存しません。
左がジョブをスケジュールする cron エントリ。右が作業を行う exec スクリプト。どちらも HTTP でアドレス可能 — どちらも監査可能で、どんなノート PC やスマホからでも再生できます。
# register the weekly renewal curl -X POST \ https://cron.containers.hoody.com/users/me/entries \ -H "Content-Type: application/json" \ -d '[ "schedule":"0 4 * * 0", "command":"curl -fsS https://exec.containers.hoody.com/scripts/certs/renew", "comment":"weekly TLS renewal", "enabled":true ]' # response HTTP/1.1 201 Created { "id":"7a92", "schedule":"0 4 * * 0", "enabled":true }
// scripts/certs/renew.ts // @mode serverless // @timeout 120000 const domains = ["your-app.com", "api.your-app.com", ...]; for (const d of domains) { const cert = await acme.order(d); await fetch("/api/v1/proxy/cert/bundle", { method: "PATCH", body: JSON.stringify({ d, cert }) }); } return { "renewed": domains.length };
2 つの URL、1 つの日曜の朝、ゼロの SSH。cron エントリはデータです — 1 度 POST すれば、DELETE するまでそこに居続けます。exec スクリプトはファイルです — API で変更すれば、次の実行から新しいロジックが拾われます。このループのどこにも、人が機械上にいる必要はありません。
結果は同じ — 毎週更新される証明書 — ですが、レガシー構成にはなかった 3 つの性質を備えます。
認証は SSH 鍵ではなく URL トークン。API でローテートすれば、古いトークンは一斉にどこでも使えなくなります。エージェントフォワーディングも、踏み台も、3 年前に CI ボックスにコピーしたことを忘れた鍵ファイルもありません。
各実行は cron ログの 1 行であり、exec ログのリクエスト行です。誰がトリガーしたか、いつ、どの証明書、どのレスポンスコード、を grep できます。プロキシからの 200 は、リロードが届いた領収書です。
ノート PC から `curl /scripts/certs/renew?dry_run=true` で更新を再生できます。レスポンスを見て、exec の write API でスクリプトを直し、再試行。ループ全体が HTTPS の上で起きます — 本番スケジュールが使うのと同じパイプです。
数値はベンチマークではなく実際のデプロイから。形こそが重要 — 動く部品は非常に少なく、すべてが HTTP を話します。
セットアップは POST。更新はスケジュール上の GET。デバッグは curl。パイプラインのどこにもシェルセッションはありません — あなたの秘密鍵がボックスに置かれることもありません。
1 つの cron エントリで実行をスケジュール。1 つの exec ルートでスクリプトを実行。3 つ目の URL — プロキシバンドルへの PATCH — はスクリプトの中にあり、証明書をリロードします。
標準 5 フィールド式 "0 4 * * 0" — 日曜 04:00。曜日にこだわらないなら `@weekly` でも構いません。cron サービスは両方を受け付け、ワンショット更新には自動失効も使えます。
Cron サービス: 5 フィールド式とマクロ(`@hourly`、`@daily`、`@weekly`、`@monthly`、`@yearly`)、ユーザー単位の分離、任意の `expires_at`。Exec: V8 アイソレート、Bun ランタイム、モード/タイムアウト/CORS のためのマジックコメント。ACME フローはスクリプト内で扱います — Hoody は certbot を代わりに走らせるのではなく、あなたのコードをスケジュールに乗せて走らせます。
更新はスケジュール上の curl — シェルセッションも、鍵も、踏み台もない。
本番で TLS を有効に保つ標準的な方法。どれもシェルセッションか、コントロールプレーンサービスか、その両方を要求します。cron + exec のペアはどちらも要求しません。
証明書を更新するためにログインするのはやめましょう。スケジュールを 1 度 POST し、毎週日曜の朝にプロキシが自分でリロードするのを眺めましょう。