Caddy: 简化SSL证书管理的利器


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 your-email@example.com

使用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的两年来没有掉过链子,如果是重要的场景,还可以加上第三方的证书监控。

在国内网络环境下使用也没问题


yg9538 2025年7月3日 09:30 54 收藏文档