文档/入口模型

入口模型#

Luma 将控制面和数据面分开。

各组件职责#

Tailscale 不是默认业务数据面。只有服务明确选择 exposure: tailscale-relay 时才承载该中继数据流量。

入口模式#

cn-edge#

主要的中国大陆公共服务。

User -> Cloudflare DNS -> CN Traefik -> CN service

适用于:

清单:

name: app
image: ghcr.io/your-org/app:latest
region: cn
exposure: cn-edge
domain: app.example.com
port: 3000
replicas: 2

Luma 生成:

默认通过约束为 ${meta.region}=cn 且 ${meta.ingress}=true 的单个 Traefik 实例接入。存在多个 CN 节点时,DNS 仍指向配置的边缘目标,由该处 Traefik 接收请求,并转发给 Nomad provider 发现的匹配 allocation。

tailscale-relay#

通过现有边缘节点,经 Tailscale 暴露家庭或自定义 Region 服务。自定义 Region 先运行 luma region update render --exposure tailscale-relay,再在应用清单选择该模式;见升级与实施指南。

User -> Cloudflare DNS -> CN Traefik -> Tailscale -> home service

适用于:

不适用于:

清单:

name: home-panel
image: ghcr.io/your-org/home-panel:latest
region: home
exposure: tailscale-relay
domain: panel.example.com
port: 8080
publishPort: 8080
replicas: 1
relay:
  host: home-1.your-tailnet.ts.net

Luma 生成:

运维要求:

tcp-relay#

通过专用 Traefik TCP 入口提供原生公共 TCP 服务。

Client -> Cloudflare DNS -> edge Traefik TCP entrypoint -> task host port

适用于:

不适用于:

清单:

name: ledger-db
image: mysql:8.4.9
region: home
node: lab
exposure: tcp-relay
domain: ledger-db.example.net
port: 3306
publishPort: 3306

Luma 生成:

普通 MySQL 客户端不会以 HTTP Host 请求头开始通信,也不能假定在服务端握手前提供可靠 TLS SNI。tcp-relay 应视为端口独占:一个发布端口路由到一个 TCP 服务。

cloudflare-tunnel#

直接通过 Cloudflare Tunnel 暴露家庭或私网服务。

User -> Cloudflare -> cloudflared -> service

适用于:

清单:

name: home-tool
image: ghcr.io/your-org/home-tool:latest
region: home
exposure: cloudflare-tunnel
domain: tool.example.com
port: 8080
replicas: 1
tunnel:
  tokenEnv: CLOUDFLARE_TUNNEL_TOKEN

Luma 生成:

Tunnel 公共主机名仍在 Cloudflare 管理。此模式跳过普通 DNS A 记录同步。

external-edge#

拥有独立海外/公共边缘入口的 global 服务。

User -> Cloudflare DNS -> external/global edge -> global service

适用于:

清单:

name: ai-gateway
image: ghcr.io/your-org/ai-gateway:latest
region: global
exposure: external-edge
domain: ai.example.com
port: 3000
replicas: 1
dns:
  target: 198.51.100.10

Luma 生成:

通过 dns.target 选择此服务的公共/global 边缘 IP。没有独立 global 边缘目标时,工作负载仍可调度到 region: global,但公共 HTTP 流量不会自动从所有 global 节点进入。

none#

内部服务与工作任务。

No public route

适用于:

清单:

name: fetch-worker
image: ghcr.io/your-org/fetch-worker:latest
region: global
exposure: none
replicas: 1
env:
  QUEUE_URL: redis://redis:6379/0

Luma 生成:

选择规则#