
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
Hoody Cron 负责调度。Hoody Exec 负责续期逻辑。周日 04:00 一条 curl 触发、certbot 跑起来、新证书包用 PATCH 推到代理上、reload 被确认。无 shell 会话、~/.ssh 里无密钥、你和证书之间无跳板机。
# weekly · Sunday 04:00 0 4 * * 0 bash /scripts/renew.sh每周 · POST 一次 · 自动永久运行
无 SSH 密钥 · 无跳板机 · 调度就是 JSON API 里的一行
整条续期流水线就是两个端点和一段 5 字段调度。Cron 触发 Exec。Exec 调用 ACME 并 PATCH 代理。确认以 200 返回。
POST /users/me/entries,schedule 是 "0 4 * * 0",command 是 "curl /scripts/certs/renew"。cron 服务把它写进用户 crontab,开始计时。这件事你只在任何能跑 HTTPS 的地方做了一次。
周日 04:00,cron curl 那个 exec URL。Exec 拉起脚本,跟 Let's Encrypt 的 ACME 端点对话,验证 http-01 challenge,把续期后的证书包写进 /files。没有节点登录、不需要会话。
脚本把新证书和密钥 PATCH 到 Hoody 代理的证书包端点。代理热加载——不重启——下一次 TLS 握手就用新证书。整个循环不到一分钟。
每一步都是你能从终端重放的 HTTP 调用——想 debug 就 `curl --dry-run`,想看 header 就 `curl -i`。流水线在任何一刻都不依赖一次已登录会话。
左边是调度任务的 cron 条目。右边是干活的 exec 脚本。两者都通过 HTTP 可达——都可审计、都可以从任意笔记本或手机重放。
# 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 };
两个 URL、一个周日早晨、零 SSH。cron 条目是数据——POST 一次,它就在那里直到你 DELETE。exec 脚本是文件——通过 API 改它,下一次运行就拾取新逻辑。这个回路里没有任何环节需要人在机器上。
结果一样——每周一张续期的证书——但有三个老方案从来没有的属性。
认证是 URL token,不是 SSH 密钥。通过 API 轮换它,旧 token 处处同时失效。无 agent forwarding、无 bastion、无你三年前忘记拷到 CI 机的密钥文件。
每次运行是 cron 日志里的一行,也是 exec 日志里的一条请求。grep 谁触发的、何时、哪张证书、什么响应码。代理的 200 就是 reload 已落地的回执。
在笔记本上用 `curl /scripts/certs/renew?dry_run=true` 重放续期。看响应、用 exec 写 API 改脚本、再试。整个回路走 HTTPS——和生产调度走的是同一根管子。
数字来自这次部署本身,不是基准。重要的是形状:活动部件极少,而且全都讲 HTTP。
建立靠一次 POST。续期是按计划的一次 GET。调试是一次 curl。流水线里没有任何 shell 会话——你的私钥从不必出现在那台机器上。
一个 cron 条目调度运行。一个 exec 路由跑脚本。第三个 URL——代理证书包的 PATCH——藏在脚本里,负责重载证书。
标准 5 字段表达式 "0 4 * * 0"——周日 04:00。或 `@weekly`,如果你不在乎是哪一天。cron 服务两者都接受,外加用于一次性续期的自动过期。
Cron 服务:5 字段表达式和宏(`@hourly`、`@daily`、`@weekly`、`@monthly`、`@yearly`)、按用户隔离、可选 `expires_at`。Exec:V8 isolate、Bun runtime、用于 mode/timeout/CORS 的魔法注释。ACME 流程在你的脚本里——Hoody 不替你跑 certbot,它按调度跑你的代码。
续期就是按计划的一次 curl——无 shell 会话、无密钥、无跳板机。
在生产里维持 TLS 有效的标准方式。每一种要么需要 shell 会话、要么需要控制平面服务,或两者都要。cron + exec 这对组合两样都不需要。
别再为续期登录服务器。POST 一次调度。每个周日早晨看代理自己 reload。