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. 创建项目目录
为了方便管理,我们将配置文件和持久化数据集中存储。
mkdir -p caddy && cd caddytouch Caddyfile2. 编写基础配置
首先创建一个简单的 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启动服务:
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 命令行生成哈希值。
第一步:生成加密密码 在宿主机执行:
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/