feat: 管理后台一键从 Caddy 获取证书 + TLS 证书热加载 #4

Merged
kevin merged 1 commits from dsh/mailgo:caddy-cert-hot-reload into main 2026-08-17 11:41:25 +08:00
Contributor

功能

1. 管理后台一键从 Caddy 获取证书

  • 域名编辑页 /admin/domains/{id}/edit 新增“从 Caddy 获取证书”按钮:一键把本机 Caddy 已签发的证书与私钥导入该域名的 TLS 目录,并自动启用 TLS;成功/失败均回显横幅
  • 支持通配符证书(如 *.example.com 可匹配 mail.example.com
  • 新增 internal/caddycert:搜索 Caddy 证书存储(同步镜像目录优先、caddy.data_dir 与常见位置兜底),校验密钥对/有效期/SAN,失败时给出可操作的中文提示(未找到/证书无效/权限不足)
  • install.sh 新增 setup-caddy-cert:安装 root 权限的 systemd path+timer 同步任务(mailgo-caddy-sync),把 Caddy 证书树镜像到 /srv/mail_go/tls/caddy(证书续期后自动更新、每日兜底),另授予 ACL 作为直接读取兜底;install 时自动检测并配置
  • 新增 [caddy] data_dir 配置节,支持自定义 Caddy 数据目录

2. TLS 证书热加载(无需重启)

  • 新增 internal/tlsutil 热加载器:每次 TLS 握手按需重载证书文件(mtime 检测),重载失败继续使用旧证书兜底并节流重试(成功后清零节流,连续更新立即生效)
  • 应用于 SMTPS 465 / IMAPS 993 / POP3S 995 以及 25/587 的 STARTTLS
  • 证书来源动态切换:协议显式配置优先,否则取首个启用 TLS 且有证书的域名(10 秒缓存),新域名一键导入证书后自动切换
  • 界面/日志文案同步更新,去掉“重启服务生效”提示

测试

  • internal/caddycert:7 个单元测试全过
  • internal/tlsutil:6 个单元测试全过(含 -race
  • 生产机实测:点击按钮 → 465/993/995 立即提供新证书(无需重启);快速连续替换证书文件均即时生效

备注

  • 首次使用需执行 sudo ./install.sh setup-caddy-certinstall.sh install 会自动检测并配置)
  • 证书文件权限说明:Caddy 续期后以 0600 重建文件会重置 ACL,因此以 root 同步任务为主、ACL 为兜底,保证功能长期可用
## 功能 ### 1. 管理后台一键从 Caddy 获取证书 - 域名编辑页 `/admin/domains/{id}/edit` 新增“从 Caddy 获取证书”按钮:一键把本机 Caddy 已签发的证书与私钥导入该域名的 TLS 目录,并自动启用 TLS;成功/失败均回显横幅 - 支持通配符证书(如 `*.example.com` 可匹配 `mail.example.com`) - 新增 `internal/caddycert`:搜索 Caddy 证书存储(同步镜像目录优先、`caddy.data_dir` 与常见位置兜底),校验密钥对/有效期/SAN,失败时给出可操作的中文提示(未找到/证书无效/权限不足) - `install.sh` 新增 `setup-caddy-cert`:安装 root 权限的 systemd path+timer 同步任务(`mailgo-caddy-sync`),把 Caddy 证书树镜像到 `/srv/mail_go/tls/caddy`(证书续期后自动更新、每日兜底),另授予 ACL 作为直接读取兜底;`install` 时自动检测并配置 - 新增 `[caddy] data_dir` 配置节,支持自定义 Caddy 数据目录 ### 2. TLS 证书热加载(无需重启) - 新增 `internal/tlsutil` 热加载器:每次 TLS 握手按需重载证书文件(mtime 检测),重载失败继续使用旧证书兜底并节流重试(成功后清零节流,连续更新立即生效) - 应用于 SMTPS 465 / IMAPS 993 / POP3S 995 以及 25/587 的 STARTTLS - 证书来源动态切换:协议显式配置优先,否则取首个启用 TLS 且有证书的域名(10 秒缓存),新域名一键导入证书后自动切换 - 界面/日志文案同步更新,去掉“重启服务生效”提示 ## 测试 - `internal/caddycert`:7 个单元测试全过 - `internal/tlsutil`:6 个单元测试全过(含 `-race`) - 生产机实测:点击按钮 → 465/993/995 立即提供新证书(无需重启);快速连续替换证书文件均即时生效 ## 备注 - 首次使用需执行 `sudo ./install.sh setup-caddy-cert`(`install.sh install` 会自动检测并配置) - 证书文件权限说明:Caddy 续期后以 0600 重建文件会重置 ACL,因此以 root 同步任务为主、ACL 为兜底,保证功能长期可用
dsh added 1 commit 2026-08-17 11:40:56 +08:00
- 域名编辑页新增“从 Caddy 获取证书”按钮:一键把本机 Caddy 已签发的
  证书与私钥导入该域名的 TLS 目录并自动启用 TLS,支持通配符证书
  (如 *.example.com 可匹配 mail.example.com),成功/失败均回显横幅
- 新增 internal/caddycert:搜索 Caddy 证书存储(同步镜像目录优先、
  caddy.data_dir 与常见位置兜底),校验密钥对/有效期/SAN,并给出
  可操作的中文错误提示(未找到/证书无效/权限不足)
- install.sh 新增 setup-caddy-cert:安装 root 权限的 systemd
  path+timer 同步任务(mailgo-caddy-sync),把 Caddy 证书树镜像到
  /srv/mail_go/tls/caddy(证书续期后自动更新、每日兜底),另授予
  ACL 作为直接读取兜底;install 时自动检测并配置
- 新增 [caddy] data_dir 配置节,支持自定义 Caddy 数据目录
- 新增 internal/tlsutil:TLS 证书热加载器,每次握手按需重载证书
  文件(mtime 检测),重载失败继续使用旧证书兜底并节流重试;
  应用于 SMTPS 465/IMAPS 993/POP3S 995 与 STARTTLS,导入或上传
  新证书后无需重启服务即生效
- 证书来源动态切换:协议显式配置优先,否则取首个启用 TLS 且有证书
  的域名(10 秒缓存),新域名一键导入证书后自动切换
- 更新 README 与界面文案(去掉“重启服务生效”提示)
kevin merged commit f24c939eda into main 2026-08-17 11:41:25 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/mailgo#4