前言
最近在 NAS 上折腾 vaultwarden,由于服务端部署后必须通过 HTTPS 访问,反向代理肯定是最优解。但是中国大陆的 IPv6 一般封锁了 80/443 端口,所以可以采用 DNS-01 来申请证书,以实现 HTTPS 反向代理访问,这才有了下文~
准备
DNS 配置
配置 DDNS 或者手动让域名的 AAAA 记录指向 NAS 的 IPv6 地址。
创建 Cloudflare API Token
DNS-01 验证的原理是让 Caddy 自动调用 Cloudflare API,在域名下临时创建并删除用于验证所有权的 _acme-challenge TXT 记录,所以需要 Cloudflare 的 API Token。
在 Cloudflare 的 用户 API 令牌 页面使用模板 编辑区域 DNS 创建 API Token,如下图所示:

确保拥有编辑 DNS 的权限,然后建议把区域资源限制到反代的域名,如下图所示:

然后找个地方保存好你的 Token。
Caddy 配置
文件准备
Docker Hub 上的官方 caddy:latest 不包含第三方 DNS 服务商插件,所以需要手动将 caddy-dns/cloudflare 编译进镜像中。
在你的 compose 目录执行以下命令:
mkdir -p caddy_config caddy_data
touch Dockerfile docker-compose.yaml Caddyfile .env
编辑 Dockerfile:
FROM caddy:builder AS builder
RUN xcaddy build \
--with github.com/caddy-dns/cloudflare
FROM caddy:latest
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
编辑 docker-compose.yaml:
services:
caddy:
image: caddy-cloudflare:local
build:
context: .
dockerfile: Dockerfile
container_name: caddy
restart: always
network_mode: host
environment:
- TZ=Asia/Shanghai
- CF_API_TOKEN=${CF_API_TOKEN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy_data:/data
- ./caddy_config:/config
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
编辑 .env,填入上面创建的 API Token:
CF_API_TOKEN=<替换为你的Cloudflare_API_Token>
编辑 Caddyfile:
{
auto_https disable_redirects
acme_dns cloudflare {env.CF_API_TOKEN}
}
<NAME>.cya.moe:8443 {
reverse_proxy [::1]:<服务端口>
}
8443 可以任意替换为你想要的端口,如果需要开小橙云的话可以替换为2053, 2083, 2087, 2096;后面需要添加其他服务的话,在下面继续追加站点块即可。
启动容器
在 compose 目录执行以下命令构建镜像:
docker compose build
构建完之后验证是否成功编译插件:
docker run --rm caddy-cloudflare:local caddy list-modules | grep cloudflare
启动前可以通过 Compose 验证刚刚的 Caddyfile:
docker compose run --rm caddy caddy validate --config /etc/caddy/Caddyfile
一切正常的话就可以启动 Caddy 容器了:
docker compose up -d
docker logs -f caddy
logs 里面如果显示证书签发成功就 OK 了~
日常运维
以后在 Caddyfile 中新增或修改了其他服务的反向代理规则时,运行以下命令即可:
docker exec caddy caddy validate --config /etc/caddy/Caddyfile
docker exec caddy caddy reload --config /etc/caddy/Caddyfile
利用 CF Origin Rules 去掉端口访问
如果每次访问都需要加 8443 这种非标准口显然不够优雅,可以使用 Cloudflare Origin Rules 实现浏览器免端口访问。
首先需要把反代的 AAAA 记录改为小橙云,即 Proxied,然后SSL/TLS 模式为严格模式:

在域名左侧的 规则 → 概述 中找到 Origin Rules,如下图所示:

然后如下图所示填写规则,端口填你自己配置的就行了:

点击部署之后后就可以去掉后面的端口直接访问啦~但是注意用这种方法会让 Cloudflare 代理你的流量,如果不是特别想去掉后面的端口的话,建议还是不要配置,因为在国内肯定直连更快嘛。