腾讯云 Caddy 反向代理部署方案

1. 架构说明

公网用户
  ↓ HTTPS
腾讯云轻量服务器 Caddy
  ↓ WireGuard 隧道
飞牛 OS 服务

关键地址:

腾讯云公网 IP:<PUBLIC_IPV4>
飞牛 WireGuard IP:10.66.66.2
Caddy 部署位置:腾讯云轻量服务器
Caddy 运行方式:Docker Compose

Caddy 负责:

1. 对外提供 HTTPS
2. 自动申请 TLS 证书
3. 按域名反代到飞牛内网服务
4. 将公网请求转发到 10.66.66.2:服务端口

2. 前置条件

确保 WireGuard 已经连通。

腾讯云执行:

ping -c 4 10.66.66.2

测试飞牛服务端口:

curl -I http://10.66.66.2:5666
curl -I http://10.66.66.2:18080

能返回 HTTP 响应后,再配置 Caddy。


3. DNS 配置

在域名解析中添加 A 记录,全部指向腾讯云公网 IP:

test.example.com   A   <PUBLIC_IPV4>
nas.example.com    A   <PUBLIC_IPV4>
blog.example.com   A   <PUBLIC_IPV4>
mcs.example.com    A   <PUBLIC_IPV4>
mcd.example.com    A   <PUBLIC_IPV4>
minio.example.com  A   <PUBLIC_IPV4>
s3.example.com     A   <PUBLIC_IPV4>

检查解析:

dig test.example.com +short

应返回:

<PUBLIC_IPV4>

4. 腾讯云防火墙放行

腾讯云轻量应用服务器控制台放行:

TCP 80
TCP 443

如果某个服务必须通过自定义 HTTPS 端口访问,例如:

https://mcd.example.com:24444

还需要放行:

TCP 24444

系统 UFW 放行:

ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 24444/tcp
ufw reload
ufw status

5. 安装 Docker 和 Compose

腾讯云执行:

apt update
apt install -y curl ca-certificates gnupg lsb-release

curl -fsSL https://get.docker.com | sh

systemctl enable docker
systemctl start docker

apt install -y docker-compose-plugin

可选:配置 Docker 镜像源。

mkdir -p /etc/docker

cat > /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://docker.m.daocloud.io",
    "https://docker.1ms.run"
  ],
  "dns": [
    "223.5.5.5",
    "223.6.6.6",
    "119.29.29.29",
    "8.8.8.8"
  ]
}
EOF

systemctl daemon-reload
systemctl restart docker

6. 创建 Caddy 目录

mkdir -p /opt/nas-gateway/caddy/data
mkdir -p /opt/nas-gateway/caddy/config
mkdir -p /opt/nas-gateway/caddy/site

cd /opt/nas-gateway

7. 创建 Docker Compose

cat > /opt/nas-gateway/docker-compose.yml <<'EOF'
services:
  caddy:
    image: caddy:latest
    container_name: caddy
    network_mode: host
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
      - ./caddy/site:/srv
      - ./caddy/data:/data
      - ./caddy/config:/config
    restart: unless-stopped
EOF

network_mode: host 用于让 Caddy 直接监听腾讯云服务器的 80/443 端口。


8. 编写 Caddyfile

根据实际域名和端口修改。

cat > /opt/nas-gateway/caddy/Caddyfile <<'EOF'
# 测试服务
test.example.com {
    reverse_proxy 10.66.66.2:18080
}

# 飞牛管理后台,后端 HTTP 5666
nas.example.com {
    reverse_proxy 10.66.66.2:5666
}

# WordPress,Docker 外部映射端口 48080
blog.example.com {
    reverse_proxy 10.66.66.2:48080 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto https
        header_up X-Forwarded-Host {host}
        header_up X-Forwarded-Port 443
    }
}

# MCS Web 管理端
mcs.example.com {
    reverse_proxy 10.66.66.2:23333 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto https
        header_up X-Forwarded-Host {host}
        header_up X-Forwarded-Port 443
    }
}

# MinIO Console
minio.example.com {
    reverse_proxy 10.66.66.2:9001 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto https
        header_up X-Forwarded-Host {host}
    }
}

# MinIO S3 API
s3.example.com {
    reverse_proxy 10.66.66.2:9000 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto https
        header_up X-Forwarded-Host {host}
    }
}
EOF

9. MCD 24444 特殊端口配置

如果 MCD 必须通过:

https://mcd.example.com:24444

访问,则 Caddyfile 增加:

mcd.example.com:24444 {
    encode gzip

    reverse_proxy 10.66.66.2:24444 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto https
        header_up X-Forwarded-Host {host}
        header_up X-Forwarded-Port 24444
        header_up X-Forwarded-Ssl on
        header_up Upgrade {http.request.header.Upgrade}
        header_up Connection {http.request.header.Connection}
        flush_interval -1
    }
}

如果 MCD 后端开启了 HTTPS 且使用自签证书,则改为:

mcd.example.com:24444 {
    encode gzip

    reverse_proxy https://10.66.66.2:24444 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto https
        header_up X-Forwarded-Host {host}
        header_up X-Forwarded-Port 24444
        header_up X-Forwarded-Ssl on
        header_up Upgrade {http.request.header.Upgrade}
        header_up Connection {http.request.header.Connection}

        transport http {
            tls_insecure_skip_verify
        }

        flush_interval -1
    }
}

推荐方式:

MCD 后端 ssl=false
Caddy 对外提供 HTTPS
Caddy 到后端走 HTTP

10. 启动 Caddy

cd /opt/nas-gateway
docker compose up -d caddy

查看日志:

docker logs -f caddy

验证配置:

docker exec -it caddy caddy validate --config /etc/caddy/Caddyfile

11. 重载或重启 Caddy

修改 Caddyfile 后执行:

cd /opt/nas-gateway
docker compose restart caddy

查看日志:

docker logs --tail=120 caddy

12. 验证访问

腾讯云本机测试 Caddy:

curl -I -H "Host: test.example.com" http://127.0.0.1

测试 HTTPS:

curl -Ik https://test.example.com

测试后端:

curl -I http://10.66.66.2:18080
curl -I http://10.66.66.2:5666
curl -I http://10.66.66.2:48080
curl -I http://10.66.66.2:23333

如果是 HTTPS 后端:

curl -Ik https://10.66.66.2:24444

13. 常见问题

13.1 Caddy 未启动

表现:

DNS 正确
WireGuard 正常
curl 后端正常
域名访问不了

处理:

cd /opt/nas-gateway
docker compose up -d caddy
docker logs -f caddy

13.2 80/443 被其他服务占用

检查:

ss -tulpn | grep -E ':80|:443'

如果 nginx 占用腾讯云 80/443:

systemctl stop nginx
systemctl disable nginx

如果是 Docker nginx:

docker ps
docker stop <容器名或ID>
docker rm <容器名或ID>

然后重启 Caddy:

cd /opt/nas-gateway
docker compose restart caddy

13.3 后端 HTTP/HTTPS 写反

如果:

curl -Ik https://10.66.66.2:24444

报:

wrong version number

说明后端是 HTTP,Caddy 应写:

reverse_proxy 10.66.66.2:24444

如果:

curl -I http://10.66.66.2:24444

返回:

Empty reply from server

但:

curl -Ik https://10.66.66.2:24444

能通,说明后端是 HTTPS,Caddy 应写:

reverse_proxy https://10.66.66.2:24444 {
    transport http {
        tls_insecure_skip_verify
    }
}

13.4 Caddy 返回 502

查看日志:

docker logs --tail=120 caddy

常见原因:

1. 后端服务没启动
2. 后端端口写错
3. 后端 HTTP/HTTPS 写反
4. 后端使用自签 HTTPS,但 Caddy 未设置 tls_insecure_skip_verify
5. 后端服务不接受当前 Host

13.5 Socket.IO / WebSocket 服务异常

如果日志中出现:

/socket.io/
EOF
status 502

Caddy 配置中加入:

header_up Upgrade {http.request.header.Upgrade}
header_up Connection {http.request.header.Connection}
flush_interval -1

并检查服务自身配置:

public_url = https://对应域名
trust_proxy = true
ssl = false

14. 生产建议

14.1 飞牛管理后台加 Basic Auth

生成密码 hash:

docker run --rm caddy:latest caddy hash-password

Caddyfile 示例:

nas.example.com {
    basicauth {
        admin <HASH>
    }

    reverse_proxy 10.66.66.2:5666
}

14.2 数据库不走 Caddy

MySQL 不是 HTTP 协议,不应使用普通 Caddy 反代。

推荐:

MySQL 只走 WireGuard 内网访问
Host: 10.66.66.2
Port: 3306

或使用 Adminer/phpMyAdmin 这类 Web 工具,再通过 Caddy 暴露。


15. 最终维护命令

cd /opt/nas-gateway

docker compose ps
docker logs -f caddy
docker compose restart caddy
docker compose pull
docker compose up -d
docker image prune -f

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇