835 字
4 分钟
通过docker部署Caddy,并进行反向代理配置

🚀 使用 Docker 部署 Caddy 并配置反向代理#

Caddy 是一款功能强大、支持自动申请 HTTPS 证书的现代 Web 服务器。相比 Nginx 复杂的配置,Caddy 使用 Caddyfile 极大地简化了运维流程。 pn#

01. 准备工作#

在开始之前,请确保你的系统已安装 Docker 和 Docker Compose。

TIP

若未安装,可使用官方一键安装脚本: curl -fsSL https://get.docker.com | bash -s docker

1. 创建项目目录#

为了方便管理,我们将配置文件和持久化数据集中存储。

Terminal window
mkdir -p caddy && cd caddy
touch Caddyfile

2. 编写基础配置#

首先创建一个简单的 Caddyfile 用于测试:

# 监听 80 端口,返回测试文本
:80 {
respond "Hello, Caddy from Docker!"
}

02. 使用 Docker Compose 部署#

创建 docker-compose.yml 文件:

services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/usr/share/caddy
- ./caddy_data:/data
- ./caddy_config:/config
networks:
- caddy
networks:
caddy:
driver: bridge
name: caddy-net

启动服务:

Terminal window
docker compose up -d

访问服务器 IP,看到 Hello, Caddy... 即表示成功!


03. Caddyfile 实战配置#

Caddy 的核心魅力在于其配置文件的简洁性。

1. 基础反向代理#

只需三行,Caddy 会自动为你申请 SSL 证书并配置 HTTP 强制跳转 HTTPS。

example.com {
reverse_proxy 127.0.0.1:8080
}

2. 反代同网络下的 Docker 容器#

这是 Docker 环境下最推荐的用法。将其他服务(如 qBittorrent, Halo 等)加入 caddy-net 网络,即可通过容器名直接访问,无需暴露端口到宿主机,更安全。

# 多域名指向同一服务
a.example.com, b.example.com {
reverse_proxy qbittorrent:8080
}

3. 负载均衡#

Caddy 自带健康检查,配置多节点负载均衡非常直观:

example.com {
reverse_proxy node1:8080 node2:8080 node3:8080 {
lb_policy round_robin
}
}

4. 静态文件服务#

用于部署前端项目(如 Vue/React 编译后的 dist 目录):

oldthief.com {
root * /usr/share/caddy/dist
file_server browse # browse 表示开启目录浏览功能(可选)
}

5. 基础身份认证 (Basic Auth)#

如果你想给某个页面(比如 qbittorrent 后台或者私有文档)加一把简单的“锁”,Caddy 的 basic_auth 非常好用。

注意: Caddy 不允许在配置文件中使用明文密码。你需要先用 Caddy 命令行生成哈希值。

第一步:生成加密密码 在宿主机执行:

Terminal window
docker exec -it caddy caddy hash-password --plaintext 你的密码

你会得到一串类似 $2a$14$J... 的字符,复制它。

第二步:修改 Caddyfile

example.com {
# 账号为 admin,密码填入刚刚生成的哈希值
basic_auth /admin/* {
admin $2a$14$J1p1S/H...
}
reverse_proxy /admin/* localhost:8080
}

6. 重定向 (Redir)#

重定向通常用于更换域名、去掉 www 或者强制跳转到主站点。

场景 A:从 www 跳转到不带 www 的根域名#

www.example.com {
redir https://example.com{uri}
}
example.com {
reverse_proxy localhost:8080
}

场景 B:从旧域名永久重定向到新域名#

使用 permanent 参数(返回 301 状态码),这有利于 SEO。

old-site.com {
redir https://new-site.com{uri} permanent
}

04. 常见问题 (FAQ)#

  • SSL 证书申请失败? 请确保你的域名已 A 记录解析到服务器 IP,且服务器的 80 和 443 端口已在防火墙开启。
  • 如何修改配置后生效? 无需重启容器,执行以下命令热重载配置: docker exec -it caddy caddy reload --config /etc/caddy/Caddyfile
  • 数据持久化: 务必挂载 /data 目录。Caddy 申请的证书存储在此,如果不挂载,容器重启后可能会因为频繁申请证书触发 Let’s Encrypt 的频率限制。

通过docker部署Caddy,并进行反向代理配置
https://fuwari.vercel.app/posts/20260402-caddy-depoly/
作者
oldthief
发布于
2026-04-03
许可协议
CC BY-NC-SA 4.0