通过 Cloudflare Tunnel,你可以不需要公网 IP、不需要在路由器/防火墙开启 80 或 443 端口,就能安全地将 Dokploy 上的应用发布到互联网。

核心流程图

用户 -> Cloudflare 域名 (HTTPS) -> Cloudflare 隧道 -> Docker 内部网络 (HTTP) -> 你的应用容器


第一步:在 Cloudflare 创建隧道 (Tunnel)

  1. 登录 Cloudflare Zero Trust
  2. 进入 Networks -> Tunnels -> Create a Tunnel
  3. 选择 Cloudflared,起个名字(如 my-server)。
  4. 在安装页面,找到 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: 这表示隧道找不到你的应用。请检查:

  1. 网络名称:确保隧道和应用都在 dokploy-network
  2. DNS 冲突:不要使用 network_mode: host,除非你手动映射了主机端口并使用 localhost:端口 访问。
  3. 容器端口:确认应用镜像内部运行的端口(有些是 80,有些是 3000)。

Q: Cloudflare 的 SSL 设置该选哪个?

A: 建议在 Cloudflare 仪表盘的 SSL/TLS -> Overview 中选择 Full 模式。