跳至内容
Cloudflare Tunnel

Cloudflare Tunnel

Composia 可以为声明了 network.cloudflare_tunnel 的服务管理远程配置的 Cloudflare Tunnel 入口规则。隧道同步作为控制器端任务运行,因为 Cloudflare 的远程隧道配置是全局状态。

工作原理

当服务被部署、更新、停止或手动同步时,控制器会创建一个 cloudflare_tunnel_sync 任务。控制器工作器执行以下步骤:

  1. 读取任务仓库版本中的所有服务元数据。
  2. 从声明了 network.cloudflare_tunnel 的服务构建隧道入口规则。
  3. 通过 PUT /accounts/{account_id}/cfd_tunnel/{tunnel_id}/configurations 将完整的入口列表发送到 Cloudflare。
  4. 确保每个主机名都有一个指向 {tunnel_id}.cfargotunnel.com 的代理 CNAME 记录。

Cloudflare 要求一个通配入口规则。Composia 默认追加 http_status:404

控制器配置

隧道 ID 和 Cloudflare 凭证应放在控制器配置中,而不是服务元数据中:

controller:
  cloudflare_tunnel:
    account_id: "REPLACE"
    api_token_file: /run/secrets/cloudflare-api-token
    tunnels:
      edge:
        tunnel_id: "c1744f8b-faa1-48a4-9e5c-02ac921467fa"
        fallback_service: http_status:404
    nodes:
      main:
        tunnel: edge
类型必需描述
account_idstringCloudflare 账户 ID。
api_token / api_token_filestring具有 Cloudflare Tunnel 配置和 DNS 写入权限的 API 令牌。
tunnelsmap映射到 Cloudflare 隧道 ID 的隧道别名。
nodesmap当服务未指定 tunnel 时使用的默认节点到隧道映射。

tunnel_id 不是连接器密钥,但它仍然是控制器级的基础设施元数据。Cloudflared 连接器令牌或凭证应保留在 cloudflared 服务使用的节点/代理密钥中。

服务声明

在服务的 composia-meta.yaml 中声明隧道入口:

network:
  cloudflare_tunnel:
    hostname: app.example.com
    service: http://app:8080
    origin_request:
      no_tls_verify: false
      http_host_header: app.internal
类型必需描述
hostnamestring由 Cloudflare Tunnel 路由的公共主机名。
servicestringcloudflared 使用的源 URL,例如 http://app:8080
tunnelstring隧道别名。省略时,Composia 从目标节点映射中推导。
pathstring入口规则的可选路径匹配器。
origin_requestobjectCloudflare 源参数。初始支持包括 no_tls_verifyhttp_host_headerorigin_server_nameconnect_timeouttls_timeout

隧道选择

Composia 按以下规则为每个服务解析隧道:

  1. 如果设置了 network.cloudflare_tunnel.tunnel,则使用该别名。
  2. 如果服务只针对一个节点,Composia 使用 controller.cloudflare_tunnel.nodes.<node>.tunnel
  3. 如果服务针对多个节点且所有节点映射到同一个隧道,则使用该隧道。
  4. 如果目标节点映射到不同的隧道,服务必须显式设置 network.cloudflare_tunnel.tunnel

停止行为

当已停止的服务声明了 network.cloudflare_tunnel 时,后续的隧道同步会排除该服务并删除其 CNAME 记录。之后的同步只包含有运行实例的服务,因此重新部署服务会将其重新加入。

手动同步

使用 CLI 同步服务的隧道配置:

composia service my-app tunnel-sync

这会将完整的已配置隧道状态同步到 Cloudflare,而不仅仅是选定的服务,因为 Cloudflare 的远程隧道配置是作为单个文档更新的。

最后更新于 • Renovate Bot