在 docker-compose 中使用 acme.sh 来申请和管理证书
在 docker-compose
中使用 acme.sh
来申请和管理证书,需要将 acme.sh
的功能集成到 Docker 容器中。以下是具体步骤和使用方法:
1. 准备工作
- 确保你的服务器上已经安装了
docker
和docker-compose
。 - 确定需要为哪些域名申请证书。
- 确保你的域名已经解析到服务器(DNS A 记录或 CNAME 记录设置正确)。
- 如果使用 DNS 验证方式,需要获取你的 DNS 服务商的 API 密钥。
2. 获取 acme.sh
Docker 镜像
acme.sh
官方提供了一个 Docker 镜像,可以直接运行 acme.sh
脚本:
docker pull neilpang/acme.sh
这个镜像包含了 acme.sh
,可以用来申请、验证和管理证书。
3. 在 docker-compose.yml
中配置 acme.sh
下面是一个示例 docker-compose.yml
文件,用于运行 acme.sh
容器:
version: "3.8"
services:
acme:
image: neilpang/acme.sh
container_name: acme_cert
environment:
- CF_Key=your_cloudflare_api_key # Cloudflare的API Key(如果用DNS验证)
- [email protected] # Cloudflare账号邮箱(如果用DNS验证)
command: >
--issue
--dns dns_cf
-d example.com
-d *.example.com
volumes:
- ./certs:/acme.sh/certs
restart: unless-stopped
4. 配置说明
环境变量:
CF_Key
和CF_Email
是 Cloudflare 的 DNS API 密钥和账号邮箱。如果使用其他 DNS 服务商,请参考 acme.sh 的文档修改相应的环境变量。例如,阿里云的 DNS 需要设置Ali_Key
和Ali_Secret
。- 如果使用 HTTP 验证,可以省略这些环境变量。
命令部分:
--issue
:表示申请证书。--dns dns_cf
:使用 DNS 验证方式(这里以 Cloudflare 为例)。-d example.com -d *.example.com
:为主域名和泛域名申请证书。如果你使用 HTTP 验证,可以改为以下命令:
command: > --issue -w /path/to/webroot -d example.com
卷挂载(volumes):
./certs:/acme.sh/certs
:将生成的证书保存到主机的./certs
目录中,你可以将证书挂载到其他需要的服务中(如 Nginx 或 Traefik)。
自动续期:
acme.sh 容器本身不会自动运行续期任务,但可以通过cron
或docker-compose
定期重启来触发续期。或者手动在容器中运行以下命令:docker exec -it acme_cert --renew -d example.com
5. 完整示例:与 Nginx 配合
如果你希望把申请的证书直接与 Nginx 服务配合,以下是一个完整的 docker-compose.yml
示例:
version: "3.8"
services:
acme:
image: neilpang/acme.sh
container_name: acme_cert
environment:
- CF_Key=your_cloudflare_api_key
- [email protected]
command: >
--issue
--dns dns_cf
-d example.com
-d *.example.com
volumes:
- ./certs:/acme.sh/certs
restart: unless-stopped
nginx:
image: nginx:alpine
container_name: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
ports:
- "80:80"
- "443:443"
restart: unless-stopped
nginx.conf 示例:
server {
listen 80;
server_name example.com www.example.com;
# Redirect HTTP to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/certs/example.com/fullchain.cer;
ssl_certificate_key /etc/nginx/certs/example.com/example.com.key;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
6. 启动服务
在配置好 docker-compose.yml
文件和相关配置文件后,启动服务:
docker-compose up -d
首次申请证书:
acme.sh
容器会自动申请证书,并将其存储在./certs
目录中。
检查证书是否生成成功:
ls ./certs/example.com/
你应该能看到类似以下文件:
fullchain.cer
:完整的证书链。example.com.key
:私钥。
- 访问 HTTPS 网站:
启用 HTTPS 后,可以通过浏览器访问https://example.com
来验证配置是否成功。
7. 证书续期
acme.sh
的证书有效期为 90 天。acme.sh
自带自动续期功能,可以通过挂载到主机的cron
来触发续期,或者定期重启容器来申请新的证书。- 在
docker-compose.yml
中,你可以设置一个定期运行的任务来手动触发续期操作。
例如,每月通过 cron
定期重启 acme.sh
容器:
docker-compose run acme --renew -d example.com
总结
通过 docker-compose
使用 acme.sh
可以轻松实现自动化证书申请和管理,特别是在使用反向代理服务器(如 Nginx 或 Traefik)时非常方便。根据你的实际需求,选择适合的验证方式(DNS 或 HTTP),并确保证书续期任务能够正常运行,从而实现 HTTPS 的长期维护。
评论已关闭