整体架构设计

/etc/letsencrypt/renewal-hooks/deploy/
└── dispatcher.sh

/usr/local/lib/certbot/
├── deploy/
│   ├── 10-axigen.sh
│   ├── 20-hysteria.sh
│   └── 65535-notify.sh
│
├── lib/
│   ├── common.sh
│   └── logger.sh

调用链(运行时依赖关系)

[执行关系]
dispatcher.sh
    ↓ 调用
65535-notify.sh

[依赖关系]
65535-notify.sh
    ↓ source
common.sh
    ↓ source
logger.sh

正确的“关系方向

65535-notify.sh → 依赖 → common.sh → 依赖 → logger.sh

Note

source 是“代码注入”,不是"调用"

这是一种: “运行时依赖 + 代码注入”结构

三种“依赖关系”的区别(重点)
  1. dispatcher → notify(运行时依赖)

    ./65535-notify.sh

    含义:

    dispatcher 在运行时“调用” notify

    特点:

    • 是“执行关系”
    • 会创建执行流程
    • 是脚本级调用
  2. notify → common(代码依赖)

    source common.sh

    含义:

    notify 需要 common 提供函数

    特点:

    • 是“代码包含”
    • 是“静态依赖”
    • 不会创建新进程
  3. common → logger(底层依赖)

    source logger.sh

    含义:

    common 依赖 logger 提供日志能力

分层架构(设计视角)

[入口层]
dispatcher.sh
    ↓

[执行层]
10-axigen.sh
20-hysteria.sh
    ↓

[能力层]
common.sh
    ↓
logger.sh

    ↓

[收尾层]
65535-notify.sh

创建目录

1
mkdir -p "/usr/local/lib/certbot/deploy" && mkdir -p "/usr/local/lib/certbot/lib/"

编辑脚本

复制下面的带内容贴进 *.sh 文件中

授予执行权限

1
chmod +x /usr/local/lib/certbot/deploy/*.sh && chmod +x /usr/local/lib/certbot/lib/*.sh && chmod +x /etc/letsencrypt/renewal-hooks/deploy/dispatcher.sh

验证 hook 是否可靠

第一种 : 模拟执行(不真正发起请求)

使用 –dry-run(官方标准)

1
certbot renew --dry-run

1
certbot renew --dry-run -v

作用 模拟证书更新流程(不会真正申请新证书)

会执行:

你的 deploy hook(dispatcher + 所有脚本)

你可以验证:

  • dispatcher 是否被调用
  • 每个脚本是否执行
  • lock 是否正常
  • journald 日志是否正确

查看日志

1
journalctl -t certbot-hook -f

Caution

--dry-run 有一个关键点: 不会真正替换证书文件

第二种:本地“手动模拟”(强烈推荐)

你可以直接模拟 Certbot 传参:

手动调用 dispatcher

1
2
RENEWED_LINEAGE="/etc/letsencrypt/live/mail.eternal.foo" \
/etc/letsencrypt/renewal-hooks/deploy/dispatcher.sh

优点

  • 不依赖 certbot
  • 直接测试你的 hook 逻辑
  • 完全可控 可以测试:
  • dispatcher 逻辑
  • 所有脚本执行
  • 日志输出
  • 锁机制
  • 错误处理

第三种 :真实证书更新(生产验证)

方法 1:强制续期

1
certbot renew --force-renewal

作用

  • 真正请求新证书
  • 真正触发 deploy hook

Caution

可能触发频率限制(rate limit)

影响线上服务(reload / restart)

建议只在:

  • 测试环境
  • 或非常确认安全时使用

检查日志

1
journalctl -t certbot-hook

检查 Axigen

1
ls -l /var/opt/axigen/certs/fullchain.pem