Caddy: 简化SSL证书管理的利器
自从使用Caddy以来,再也没有操心过SSL证书管理这件事。回想起使用Nginx时,即便配置了Certbot
、acme.sh
这些自动化脚本来更新证书,仍然会因为不小心删除crontab等原因导致证书过期。这种情况并非罕见,令人烦恼。
Docker镜像
我的应用程序都运行在Docker容器中。官方Caddy镜像通过HTTP方式验证域名所有权,但这并不总是方便。因此,我选择使用DNS验证方式,这需要安装相应域名服务商的插件。
如果不介意,也可以使用我预先构建好的镜像lerrybin/caddy-with-cloudflare:latest
。支持arm64
和amd64
两种架构,我会不定时更新。
以下是构建包含DNS验证插件的Caddy Docker镜像的Dockerfile:
FROM caddy:2-builder AS builder
RUN xcaddy build \
--with github.com/caddy-dns/cloudflare/ \
--with github.com/caddy-dns/alidns/
FROM caddy:2
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
Caddyfile配置
使用Caddy非常简单。首先需要配置Caddyfile,设置好域名服务商的token。您可以为单个域名配置,也可以使用泛域名证书。
以下是一个Caddyfile配置示例:
{
email [email protected]
# 使用Cloudflare
acme_dns cloudflare your-cloudflare-token
# 使用阿里云 (注释掉)
# acme_dns alidns {
# access_key_id your-access-key-id
# access_key_secret your-access-key-secret
# }
}
www.example.com {
reverse_proxy 127.0.0.1:9000
}
*.example.com {
@s3 host s3.example.com
handle @s3 {
reverse_proxy 127.0.0.1:9000
}
}
Docker Compose配置
使用Docker Compose可以更方便地管理Caddy容器。以下是一个Docker Compose配置文件示例:
services:
caddy:
image: lerrybin/caddy-with-cloudflare:latest
container_name: caddy1
network_mode: "host"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- /var/log/caddy:/var/log/caddy
- /data/caddy/data:/data
- /data/caddy/config:/config
- /var/www/:/var/www/
restart: always
这里映射了几个重要目录:
- Caddy配置文件
- 日志目录
- Caddy运行数据(如证书)
- 自动生成的配置文件
- 我的网站程序目录
其中,第一个映射(Caddyfile)是必需的,其他则可根据实际需求决定。特别推荐映射/data/caddy/data:/data
,这可以避免每次创建容器时重新申请证书。
部署步骤
- 将
Caddyfile
和docker-compose.yml
放在同一目录下。 - 运行
docker compose up -d
启动容器。 - 等待约1分钟,证书就会自动配置完成。
- 直接访问您的网站,无需重启Caddy。
如需查看部署过程,可以使用docker logs -f caddy1
命令监控日志。
扩展性
Caddy默认支持Let's Encrypt和ZeroSSL两家证书供应商。此外,还可以配置其他供应商,以及更多的DNS服务商插件。您可以根据需求进行进一步探索和配置。
可靠性
至少在我使用Caddy的两年来没有掉过链子,如果是重要的场景,还可以加上第三方的证书监控。
在国内网络环境下使用也没问题。