# Let's Encrypt 证书管理服务 独立的 certbot 服务,用于管理 Let's Encrypt SSL证书的申请和自动续签。 ## 架构说明 ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 用户请求 │───▶│ frps (远程) │───▶│ frpc (本地) │ │ *.stonelan.cn │ │ 80/443端口 │ │ 80/8443端口 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ nginx-proxy 容器 │ │ - 80端口: 处理 ACME 验证请求,转发到 certbot 容器 │ │ - 8443端口: HTTPS 反向代理,使用 Let's Encrypt 证书 │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ certbot 容器 │ │ - 处理 ACME HTTP-01 验证 │ │ - 定期续签证书 │ │ - 续签后自动重载 nginx (通过 docker.sock) │ └─────────────────────────────────────────────────────────────────┘ ``` ## 文件说明 - `Dockerfile` - certbot 镜像定义 - `docker-compose.yml` - certbot 容器配置 - `init-cert.sh` - 初始化申请证书脚本 - `renew-cert.sh` - 自动续签脚本 - `crontab.example` - cron 配置示例 ## 使用方法 ### 1. 首次申请证书 ```bash cd /home/awei/workspace/common-server-public/certbot # 为每个域名申请证书 ./init-cert.sh fastgpt.stonelan.cn admin@example.com ./init-cert.sh gitea.stonelan.cn admin@example.com ./init-cert.sh image.stonelan.cn admin@example.com ./init-cert.sh registry.stonelan.cn admin@example.com ./init-cert.sh www.stonelan.cn admin@example.com ``` ### 2. 配置自动续签 ```bash # 编辑 crontab crontab -e # 添加以下行(每天凌晨 2 点检查续签) 0 2 * * * cd /home/awei/workspace/common-server-public/certbot && ./renew-cert.sh >> /var/log/certbot-renew.log 2>&1 ``` ### 3. 手动续签测试 ```bash cd /home/awei/workspace/common-server-public/certbot ./renew-cert.sh ``` ## 证书路径 证书存储在 Docker volume `certbot-certs` 中,nginx 容器通过共享 volume 访问: - 证书: `/etc/letsencrypt/live/<域名>/fullchain.pem` - 私钥: `/etc/letsencrypt/live/<域名>/privkey.pem` ## 端口映射 | 服务 | 容器端口 | 宿主机端口 | 说明 | |------|----------|------------|------| | nginx | 80 | 8081 | HTTP (ACME验证 + 重定向) | | nginx | 8443 | 8443 | HTTPS (SSL反向代理) | | frpc | 80 | 80 (远程) | HTTP 映射 | | frpc | 8443 | 443 (远程) | HTTPS 映射 | ## 重启 nginx 续签后会自动通过 `docker kill -s HUP nginx-proxy` 重载 nginx。如需手动重启: ```bash docker kill -s HUP nginx-proxy # 或 docker restart nginx-proxy ``` ## 故障排查 ### 查看证书状态 ```bash docker compose exec certbot certbot certificates ``` ### 查看续签日志 ```bash tail -f /var/log/certbot-renew.log ``` ### 检查 ACME 验证是否可达 ```bash curl http://fastgpt.stonelan.cn/.well-known/acme-challenge/test ``` ## 注意事项 1. 确保域名 DNS 已正确解析到 frps 服务器 IP 2. 确保 frpc 和 nginx 容器在同一个 Docker 网络 (`trim-default`) 3. 证书有效期 90 天,建议每 60 天续签一次(cron 已配置每天检查) 4. 首次申请证书前,确保 nginx 容器已启动并能处理 ACME 验证请求