定时调度与自动续期¶
每条流水线最多挂一份调度,调度由两种触发器组成,可单独或同时使用: 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瞬间按临期处理。
去重与审计¶
两道去重:
- 运行中检查:流水线有
running历史(含崩溃遗留)→ 跳过本次触发。 - 续期去重窗口:续期触发距上次 < 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。