acme.sh icon indicating copy to clipboard operation
acme.sh copied to clipboard

[Feature] 新增一个deploy重试机制,在cron中重试deploy

Open PMExtra opened this issue 1 year ago • 5 comments

需求背景

目前 acme.sh 有很多的 deploy-hook 。这些 hook 大多依赖一个外部服务。

acme.sh --cron 更新证书时,如果外部服务临时发生异常,无法与 acme.sh 正确通信,则这个 deploy-hook 会失败,证书未能正确部署。而在这之后,即使外部服务恢复正常,也会因为错过这次证书从而更新导致证书过期。

当前行为

因为 acme.sh 下一次 cron 发现本地证书已经是最新的,在设定的有效期内,不需要更新,自然也就不触发 deploy 。所以即使外部服务恢复正常,也会发生证书过期。

举例(如果已经理解了以上内容就不用看了):
  • 第1天,acme.sh 申请了一个证书,有效期是90天,当有效期不足30天的时候自动更新证书。同时通过 docker deploy-hook 将证书部署到了指定容器。
  • 在第61天的时候,acme.sh 发现证书需要更新,向 CA 申请了新的证书。但是此时,Docker 或者指定容器因为各种原因没能正常工作,导致 deploy 失败。
  • 在第62天,容器恢复了正常工作,但是此时容器内的证书仍然是旧证书。
  • 在第62~90天里,acme.sh 每天检查证书状态,发现这个证书不需要刷新。而容器里一直还在用着旧证书。
  • 在第91天,容器里的证书过期了,服务发生异常。

此示例仅为了方便理解,使用最常见的 docker 举例。实际上 deploy-hook 还有许多类型,例如 Vault 这样需要远程通信的场景,实际发生失败的可能性并不低。

功能预期

在 deploy 的时候,记录每个 hook 的执行结果(return code),在下一次执行 --cron 的时候,检查每个 hook 上一次执行的结果,如果结果非0,则重新尝试 deploy 。

最后

麻烦 @Neilpang 大大评估一下这个功能设计能否被接受,如果可以接受,我可以之后抽空实现并提交 PR 。(当然如果大大或者其他好心人愿意帮忙实现那更是感激不尽)

PMExtra avatar Oct 30 '23 02:10 PMExtra

Please upgrade to the latest code and try again first. Maybe it's already fixed. acme.sh --upgrade If it's still not working, please provide the log with --debug 2, otherwise, nobody can help you.

github-actions[bot] avatar Oct 30 '23 02:10 github-actions[bot]

运行acme.sh --cron时,我看命令行中最后有部署环节,可以设置cron通知,如果发现失败可以查看原因,解决问题后重新来一次acme.sh --cron --force acme

shaojs321 avatar Nov 26 '23 11:11 shaojs321

@shaojs321 问题在于日常的cron是无人值守的,显然我每天--force一次是不太合理的。 而我的重点是说,一些情况下发生偶然的失败是无需人工干预,稍后重试就能自愈的,而目前cron模式是不会进行这种重试。

PMExtra avatar Nov 26 '23 15:11 PMExtra

可以, 这看起来的确是一个问题.

Neilpang avatar Nov 26 '23 16:11 Neilpang