frankenphp 的证书由内置 caddy 统一管理,默认存于 /root/.local/share/caddy/certificates/...(root)或 $home/.local/share/caddy/certificates/...(普通用户),备份需停服务、完整拷贝目录或使用 frankenphp export-certs(v0.12+),恢复须用 caddy trust 和 frankenphp import-certs 保证一致性。

FrankenPHP 的证书默认存放在 Caddy 的数据目录里
FrankenPHP 内置 Caddy,所有 TLS 证书(包括 Let’s Encrypt 自动申请的)都由 Caddy 统一管理,默认路径是 /root/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/(Linux root 用户)或 $HOME/.local/share/caddy/certificates/...(普通用户)。这个路径不是 FrankenPHP 自定义的,而是 Caddy 的硬编码数据目录。
备份证书前先确认 Caddy 是否在运行中
直接拷贝正在使用的证书文件可能失败或不一致——Caddy 会锁住目录、并可能在后台自动续期。实操建议:
- 停掉 FrankenPHP 容器或进程:
docker stop frankenphp或kill $(pgrep -f "frankenphp php-server") - 用
ls -la确认证书目录下有yourdomain.com/子目录,里面包含cert.pem、key.pem和issuer.crt - 打包整个
certificates/目录,而不是只拷 cert.pem + key.pem:Caddy 后续恢复依赖完整结构和元数据(如acme.json) - 如果用 Docker 部署,更稳妥的方式是把该目录挂载为卷,例如
-v /data/caddy:/root/.local/share/caddy,这样备份就是备份宿主机上的/data/caddy
用 frankenphp export-certs 命令导出(仅限 v0.12+)
新版 FrankenPHP 提供了内置导出工具,比手动复制更安全:
- 确保你用的是
dunglas/frankenphp:latest或明确 >= v0.12(frankenphp --version查看) - 执行:
frankenphp export-certs --domain example.com --output ./backup/ - 它会提取当前生效的证书+私钥,并生成标准 PEM 格式,不含 Caddy 内部元数据,适合迁移到 Nginx 或其他服务
- 注意:该命令不导出 ACME 账户密钥,所以不能用于续期,仅作证书内容备份
恢复时别直接覆盖,优先用 Caddy 的 import 流程
如果你备份后要还原到新机器,不要把 cert.pem 和 key.pem 手动丢进目录就完事。Caddy 需要重建索引:
- 先把备份的整个
certificates/目录原样放到新环境对应路径 - 启动 FrankenPHP 前,先运行一次:
caddy trust(确保系统信任本地 CA,尤其在非 root 用户下) - 首次启动时 Caddy 会校验证书有效性;若域名已过期,它会在下次 HTTP 请求触发时自动尝试续期(前提是 80/443 端口可达且 DNS 解析正常)
- 如果只是临时换机器测试,又不想等续期,可用
frankenphp import-certs(同样需 v0.12+)导入备份的 PEM 文件并注册进 Caddy 状态
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











