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

自从使用Caddy以来,再也没有操心过SSL证书管理这件事。回想起使用Nginx时,即便配置了Certbotacme.sh这些自动化脚本来更新证书,仍然会因为不小心删除crontab等原因导致证书过期。这种情况并非罕见,令人烦恼。

Docker镜像

我的应用程序都运行在Docker容器中。官方Caddy镜像通过HTTP方式验证域名所有权,但这并不总是方便。因此,我选择使用DNS验证方式,这需要安装相应域名服务商的插件。

如果不介意,也可以使用我预先构建好的镜像lerrybin/caddy-with-cloudflare:latest。支持arm64amd64两种架构,我会不定时更新。

以下是构建包含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

这里映射了几个重要目录:

  1. Caddy配置文件
  2. 日志目录
  3. Caddy运行数据(如证书)
  4. 自动生成的配置文件
  5. 我的网站程序目录

其中,第一个映射(Caddyfile)是必需的,其他则可根据实际需求决定。特别推荐映射/data/caddy/data:/data,这可以避免每次创建容器时重新申请证书。

部署步骤

  1. Caddyfiledocker-compose.yml放在同一目录下。
  2. 运行docker compose up -d启动容器。
  3. 等待约1分钟,证书就会自动配置完成。
  4. 直接访问您的网站,无需重启Caddy。

如需查看部署过程,可以使用docker logs -f caddy1命令监控日志。

扩展性

Caddy默认支持Let's Encrypt和ZeroSSL两家证书供应商。此外,还可以配置其他供应商,以及更多的DNS服务商插件。您可以根据需求进行进一步探索和配置。

可靠性

至少在我使用Caddy的两年来没有掉过链子,如果是重要的场景,还可以加上第三方的证书监控。

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