本文介绍家庭宽带及VPS中部署caddy,实现反向代理、自动申请并续签证书、http自动跳转https等功能,可通过docker或裸跑二进制的方式部署
① 家庭宽带中通过docker部署
由于家庭宽带80 443端口被封,无法通过DNS验证的方式申请证书,需配合cloudflare DNS token申请证书,故只推荐通过docker安装
使用docker官方脚本一键安装docker,已安装docker的跳过
curl -fsSL https://get.docker.com | bash -s docker
可选用阿里镜像仓库加速安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
创建好容器所需文件夹及文件
mkdir -p /root/docker/caddy/data
touch /root/docker/caddy/data/caddyfile.txt
touch /root/docker/caddy/compose.yml
compose.yml内容如下,使用host模式会自动占用8080和55443端口(55443为公网访问时所加端口,可在配置文件中修改)
version: '3'
services:
caddy:
pull_policy: always
image: sliamb/caddy:latest
container_name: caddy
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
- DNS=223.5.5.5,8.8.8.8
volumes:
- ./data:/data
- ./cert:/root/.local/share/caddy/certificates # 证书路径
network_mode: "host"
修改caddyfile.txt配置文件
以下为配置示例,根据情况自行调整
- 格式参考如下,修改对应邮箱、dns_token、域名及服务地址
- 将caddy监听的https端口修改为55443,相对应的公网端口(即之后访问域名时候加的端口)也是55443,主路由做好wan端口55443到caddy 55443的映射。该端口根据自己需求修改即可。
- 配置模板内容依次为:反向代理pve等https连接、反向代理普通http连接、反向代理静态网页
{
# 配置 cloudflare 的 DNS-01 挑战
email [email protected] # 替换为您的邮箱
acme_dns cloudflare xxxxxxxxxxxxxxxxxxxxxxx # 替换为 cloudflare 的 token
# 以上两条是基于let‘s encrypt的格式,如果是zerossl,参考下面,(zerossl博主没试过,仅供参考,以上两条基于let‘s encrypt的已测试成功)
#acme_ca https://acme.zerossl.com/v2/DV90 #切换证书发行商为ZeroSSL
#acme_eab {
#key_id XXXXXXXXXXXXXXXXXX #ZeroSSL网站上api的ID
#mac_key XXXXXXXXXXXX #ZeroSSL网站上api的KEY
#}
auto_https disable_redirects #关闭caddy默认的自动https,因为它是基于标准端口的
http_port 8080 # 修改默认 HTTP 端口为 8080 ,用不到,无需在主路由做端口映射
https_port 55443 # 修改默认 HTTPS 端口为 55443,需在主路由做好端口映射,建议外部端口和caddy使用同一端口,不同端口自行测试
servers { #这一串代码块就是实现非标端口的http重定向https
listener_wrappers {
http_redirect
tls
}
}
}
XXXXXX.com:55443 { #增加一个主域名,不代理任何网站,只是为了申请一张证书,可以导出给其他设备使用
}
# 泛域名配置
*.xxxxxxxxx.com:55443 {
# 根据子域名配置反向代理
@pve host pve.xxxxxxxxx.com
handle @pve {
reverse_proxy 10.10.10.2:8006 {
transport http { #跳过本地的证书验证,由caddy加密,适用于pve等局域网内https://10.10.10.2:5667等https连接
tls_insecure_skip_verify
}
}
}
@ikuai host i.xxxxxxxxx.com #简单反代
handle @ikuai {
reverse_proxy 10.10.10.31
}
@ikuai host i.xxxxxxxxx.com # 添加头部,传输客户端IP等信息
handle @ikuai {
reverse_proxy 10.10.10.32 {
header_up Host {upstream_hostport}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
}
@password host password.xxxxxxxxx.com #带密码认证的反代,用户名为rainbow,密码为123456,其中写入配置的密码需用caddy hash-password --plaintext 123456命令生成,若用docker版本无法运行命令,可google搜索“Bcrypt密码生成工具”生成密钥
handle @password {
basicauth / {
# 以下设置代表用户名为rainbow, 密码为123456
rainbow $2a$14$ZTwlgDTKk38.53Z0QhkuJ.iwmOwnK1ggYs2O8M6eT0ivTwTeVXxVS
}
reverse_proxy 10.10.10.33
}
@www host chatgpt.你的域名.com #静态网页
handle @www chatgpt.你的域名.com {
root * /usr/share/caddy
file_server
encode gzip
}
handle { #兜底规则,匹配不上以上任何网址,则返回404
respond 404
}
}
启动caddy
进入compose所在文件夹,使用“docker compose up -d”命令启动caddy
② 家庭宽带中通过官方二进制文件部署
自行安装好lxc,推荐ubutun22.04,建议换好国内源
安装带模块的caddy
由于家庭带宽中443端口被封,原版caddy无法申请证书,需使用附带cloudflare模块的caddy,通过配置dns token的方式申请证书,详细信息可参考官方文档
https://caddy2.dengxiaolong.com/docs/install
前往以下地址下载官方编译好带DNS模块的二进制文件(以cloudflare为例,若使用alidns、dnspod均有对应模块,自行勾选即可)
<https://caddyserver.com/download?
选择对应系统,勾选cloudflare模块,点击下载

参考官方文档,使用以下命令安装原版caddy
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
先将下载的caddy二进制文件上传到 /root 目录,重命名为“caddy”,再使用下面命令覆盖原版文件
systemctl stop caddy
mv /root/caddy /usr/bin/caddy
chmod +x /usr/bin/caddy
修改配置文件
配置文件位于 /etc/caddy/Caddyfile
vim /etc/caddy/Caddyfile
输入 dG 清空内容(注意G是大写)
粘贴修改好的配置文件
按esc
输入:wq 保存退出
** 配置文件内容参考docker部分 **
修改完配置后重启caddy(每次修改配置后均需重启caddy)
systemctl restart caddy
查看caddy运行状态
systemctl status caddy
caddy证书存放目录,可查看证书是否申请成功
"/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/"
③ vps中部署caddy
依然建议使用docker部署caddy,vps环境下(80、443端口可用)使用官方原版即可正常申请证书
compose文件如下
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
networks:
- caddy_docker_bridge
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile # Caddyfile位配置文件,通常使用绑定挂载方便编辑
- ./html:/var/www/html # 静态网页绑定挂载
- ./data:/data # **使用命名卷**来存储Caddy的持久化数据(如证书、缓存)
- ./config:/config # **使用命名卷**来存储Caddy的运行时配置
volumes:
caddy_data:
caddy_config:
networks:
caddy_docker_bridge:
配置文件Caddyfile内容如下
pve.你的域名.com {
reverse_proxy https://172.16.0.254:8006 {
transport http {
tls_insecure_skip_verify
}
}
}
omv.你的域名.com {
reverse_proxy http://172.16.0.8:80
}
静态网页.你的域名.com {
root * /var/www/html
file_server
encode gzip
}
