跳转至

定时调度与自动续期

每条流水线最多挂一份调度,调度由两种触发器组成,可单独或同时使用: cron 定时触发与到期续期扫描。启用的调度必须至少配置其一。

调度参数(内置默认)

参数 默认 说明
tick 间隔 30 秒 调度器醒一次检查到点的周期,即 cron 触发精度上界
扫描间隔 1 小时 到期扫描节流(tick 再频繁扫描也不会更勤)
续期阈值 30 天 证书剩余有效期 ≤ 该值进入续期窗口
去重窗口 1 小时 同一流水线两次续期触发的最小间隔

cron 触发

  • 支持 5 段 Unix cron(分 时 日 月 周,如 0 3 * * *,自动补零按 整分零秒触发),也接受 6/7 段(带秒/年)表达式;其它段数拒绝。
  • cron 在保存时校验,非法表达式保存即被拒。
  • 触发点存在 next_trigger_at:触发成功后立即推进,这同时是 cron 去重 机制。启动失败则不推进,下一轮 tick 到点再试。
  • 停机错过的触发点:默认跳过(catch_up=false);catch_up=true 时重启 装载会补跑最近一次错过点(仅此一次)并落审计记录。

到期续期扫描

  • 每小时扫一次证书库:not_after <= now + 30 天 且未吊销的证书进入续期 窗口。
  • 按域名交集匹配调度:证书覆盖的任一域名出现在调度的 renewal_domains 里即命中;一张证书一次扫描只触发一次。无调度声明该 域名时记 warn。
  • 到期状态判定比较的是时间点而非天数(刚过期 1 小时不会被「剩余 0 天」 误判为还有一天)。now == not_after 瞬间按临期处理。

去重与审计

两道去重:

  1. 运行中检查:流水线有 running 历史(含崩溃遗留)→ 跳过本次触发。
  2. 续期去重窗口:续期触发距上次 < 1 小时 → 跳过。cron 触发不查窗口, 靠 next_trigger_at 推进去重。

审计语义:

  • 触发成功落一条触发记录(acmecast_trigger_log:pipeline_id、来源 cron/renewal、详情、时间);被去重/运行中拦下的不算触发、不落记录 (否则每次抑制都刷新去重窗口基准点)。
  • 续期启动即使失败也落记录:「试过但失败」是审计需要,且失败若是永久性的, 靠记录驱动窗口节流,避免每轮扫描重试成风暴。
  • 单张证书启动失败不中断整轮扫描。

API 速查

  • GET /api/schedules:列出全部调度(含 last_triggered_at、 next_trigger_at)
  • POST /api/schedules:创建/更新,字段: {pipeline_id, cron?, enabled=true, catch_up?, renewal_domains?}
  • GET /api/schedules/trigger-logs?pipeline_id=&page=&page_size=:触发审计

续期域名集合保存时规范化为小写、去重、排序(与证书域名同一套规则)。

手动触发

POST /api/pipelines/{id}/run 与调度触发共用同一条执行链路(先落 running 历史、跑完原地写终态),只是触发来源记为 manual。