通过 Cloudflare Tunnel,你可以不需要公网 IP、不需要在路由器/防火墙开启 80 或 443 端口,就能安全地将 Dokploy 上的应用发布到互联网。
核心流程图
用户 -> Cloudflare 域名 (HTTPS) -> Cloudflare 隧道 -> Docker 内部网络 (HTTP) -> 你的应用容器
第一步:在 Cloudflare 创建隧道 (Tunnel)
- 登录 Cloudflare Zero Trust。
- 进入 Networks -> Tunnels -> Create a Tunnel。
- 选择 Cloudflared,起个名字(如
my-server)。 - 在安装页面,找到 Connector Token(那一长串字符串),复制备用。
第二步:在 Dokploy 中部署隧道服务
在 Dokploy 中新建一个 Compose 服务(建议命名为 cloudflare-tunnel),使用以下配置:
services:
cloudflared:
image: 'docker.1ms.run/cloudflare/cloudflared:latest'
environment:
- 'TUNNEL_TOKEN=你的TOKEN' # 建议在 Environment 变量中设置
networks:
- dokploy-network # 必须加入此网络
restart: unless-stopped
command: ["tunnel", "--no-autoupdate", "run"]
networks:
dokploy-network:
external: true
第三步:部署应用 (以 Excalidraw 为例)
部署应用时,务必确保它与隧道在同一个 Docker 网络中,以便隧道能通过“服务名”找到它。
services:
excalidraw:
image: docker.1ms.run/excalidraw/excalidraw:latest
restart: unless-stopped
networks:
- dokploy-network # 必须与隧道一致
networks:
dokploy-network:
external: true
第四步:配置域名映射 (关键点)
1. Cloudflare 端设置
回到 Cloudflare Tunnel 的 Public Hostname 页面:
- Public Hostname:
excalidraw.yourdomain.com - Service Type:
HTTP - URL:
excalidraw:80 - 注:
excalidraw是应用的服务名,80是应用容器内的端口。
2. Dokploy 端设置
进入应用的 Domains 设置页:
- Domain Name:
excalidraw.yourdomain.com - HTTPS: OFF (关闭) — 由 Cloudflare 负责加密,内部走 HTTP 即可。
- Certificate: None — 选 None,否则会引起 SSL 握手失败。
避坑总结(Q&A)
Q: 为什么出现 ERR_CONNECTION_CLOSED?
A: 通常是因为你在 Dokploy 里开启了 HTTPS 或选择了证书。Cloudflare 隧道已经带了 SSL 保护,如果你在服务器端再次开启 HTTPS,会导致协议冲突或证书缺失导致连接被切断。
Q: 为什么出现 502 Host Error?
A: 这表示隧道找不到你的应用。请检查:
- 网络名称:确保隧道和应用都在
dokploy-network。 - DNS 冲突:不要使用
network_mode: host,除非你手动映射了主机端口并使用localhost:端口访问。 - 容器端口:确认应用镜像内部运行的端口(有些是 80,有些是 3000)。
Q: Cloudflare 的 SSL 设置该选哪个?
A: 建议在 Cloudflare 仪表盘的 SSL/TLS -> Overview 中选择 Full 模式。