---
title: "Caddy: 简化SSL证书管理的利器"
url: "https://lerry.me/post/2024/09/caddy-simplify-ssl-certificate-management"
date: 2024-09-12T14:11:55.021Z
updated: 2026-09-07T07:26:14.302Z
tags:
  - "Linux"
  - "Nginx"
  - "Caddy"
  - "SSL"
language: zh-CN
---

# 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：

```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 配置示例：

```txt
{
  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 配置文件示例：

```yaml
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. 将`Caddyfile`和`docker-compose.yml`放在同一目录下。
2. 运行`docker compose up -d`启动容器。
3. 等待约1分钟，证书就会自动配置完成。
4. 直接访问您的网站，无需重启Caddy。

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

## 扩展性

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


## 可靠性

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

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