From aa78c13161b04f6241ff11616101a17bf9120529 Mon Sep 17 00:00:00 2001 From: anonsaber Date: Wed, 30 Sep 2026 19:07:17 +0800 Subject: [PATCH] =?UTF-8?q?worker:=20BACKEND=5FORIGINS=5FJSON=20=E5=86=99?= =?UTF-8?q?=E5=85=A5=20wrangler.toml=20=E7=9A=84=20[vars]=EF=BC=88?= =?UTF-8?q?=E6=98=8E=E6=96=87=E4=BE=8B=E5=A4=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cloudflare Git 集成会提示"Update your Wrangler configuration with these changes to keep deployments in sync",原因是 UI 上的 origin 列表没在仓库里。接受该建议:origin 列表只是公开可达的 https 地址,不是凭据,所以可以随仓库走——配置在 PR 里可审, 预览环境也能拿到它(secret 只存在于 dashboard,preview 拿不到)。 wrangler.toml 加了「明文例外的边界」评论:一旦出现内网地址 / 带内嵌凭据的 URL / 不想公开的 staging 主机名,立刻从 [vars] 删掉改用 wrangler secret put(git 历史 不可逆)。其余三个 LB_* 保持可调参数不写死。 已用实际解析器验证:parseBackendOrigins 返回 [{url: https://messageweave-eu-1.motofans.club, healthPath: /healthz}];npm test 32 通过 0 失败;wrangler deploy --dry-run 通过, 配置里可见 env.BACKEND_ORIGINS_JSON 绑定。 --- cloudflare-worker/README.md | 21 ++++++++++++--------- cloudflare-worker/wrangler.toml | 24 ++++++++++++++++-------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/cloudflare-worker/README.md b/cloudflare-worker/README.md index 5395038..c9224de 100644 --- a/cloudflare-worker/README.md +++ b/cloudflare-worker/README.md @@ -62,13 +62,15 @@ | 变量 | 必填 | 说明 | |---|---|---| -| `BACKEND_ORIGINS_JSON` | 是(secret) | JSON 数组,形如 `["https://a.platform1.example","https://b.platform2.example"]`;必须全部 https、无内嵌凭据/query/fragment/路径。 | +| `BACKEND_ORIGINS_JSON` | 是 | JSON 数组,形如 `["https://a.platform1.example","https://b.platform2.example"]`;必须全部 https、无内嵌凭据/query/fragment/路径。已写在 `wrangler.toml` 的 `[vars]`。 | | `LB_REQUEST_TIMEOUT_MS` | 否 | 单 origin 请求超时;默认 `10000`。建议 > 最坏 cold start + 最长 JMAP 拉取。 | | `LB_MAX_ATTEMPTS` | 否 | 每请求最多 origin 尝试次数;默认 `2`(= 1 次故障转移)。`POST /reconcile` 固定为 `1`。 | | `LB_RECONCILE_TIMEOUT_MS` | 否 | 仅 `POST /reconcile` 的单 origin 超时覆盖;默认 `320000`(须大于后端锁初租 300s + 心跳余量)。 | | `LB_HEALTH_TTL_MS` | 否 | 健康探测缓存 TTL;默认 `30000`。 | -> secret 通过 `wrangler secret put BACKEND_ORIGINS_JSON` 注入;`wrangler.toml` 里 `vars` 保持为空,不写明文。 +> 默认写在 `wrangler.toml` 的 `[vars]`(**明文例外**,因为当前值只是公开可达的 https origin, +> 不是凭据)。一旦要放内网地址、带内嵌凭据的 URL、或不想公开的 staging 主机名, +> 立刻改用 `npx wrangler secret put BACKEND_ORIGINS_JSON` 并把该行从 `[vars]` 删掉。 ## 本地 / CI 验证 @@ -89,14 +91,15 @@ npm run check ```bash cd cloudflare-worker # 安装 dev dep(仅 wrangler): -npm install -# 注入 secret: -npx wrangler secret put BACKEND_ORIGINS_JSON # 粘贴 ["https://a.example","https://b.example"] -# 可选调参: -npx wrangler secret put LB_REQUEST_TIMEOUT_MS # 建议 10000 -npx wrangler secret put LB_MAX_ATTEMPTS # 默认 2 -# 部署: +npm install --no-audit --no-fund +# BACKEND_ORIGINS_JSON 已写在 wrangler.toml 的 [vars],直接部署: npx wrangler deploy +# 可选调参(默认值已够用;要覆盖就用 dashboard 的 Add Variable): +# LB_REQUEST_TIMEOUT_MS / LB_MAX_ATTEMPTS / LB_RECONCILE_TIMEOUT_MS / LB_HEALTH_TTL_MS +# 仅当 [vars] 里要放非公开值时才改用 secret 注入: +npx wrangler secret put BACKEND_ORIGINS_JSON +# 部署后确认: +curl https://.workers.dev/healthz ``` 健康探针: diff --git a/cloudflare-worker/wrangler.toml b/cloudflare-worker/wrangler.toml index cd4c804..df904b7 100644 --- a/cloudflare-worker/wrangler.toml +++ b/cloudflare-worker/wrangler.toml @@ -9,15 +9,17 @@ # http/非 https/内嵌凭据。 # - 不代理 Redis/JMAP(C-NO-DB / C-REDIS-ONLY-STATE):Worker 只做请求转发,后端连自己的 Redis。 # - 不使用 WebSocket/SSE/长轮询(C-NO-LONG-CONN):纯请求-响应转发。 -# - 后端 secret 走 `wrangler secret`(见 README),不进代码/日志(SAF-LOG-PURITY / C-NO-SECRET-IN-IMAGE; -# C-LB-SHARED-SECRETS:所有后端实例共享同一组 secret)。 +# - 真 secret 不进代码/日志(SAF-LOG-PURITY / C-NO-SECRET-IN-IMAGE;C-LB-SHARED-SECRETS: +# 所有后端实例共享同一组 secret)。唯一明文例外是 [vars] 里的 BACKEND_ORIGINS_JSON—— +# 它的值只是公开 https origin,不是凭据(见该段的「明文例外的边界」)。 # - 日志无密钥(SAF-LOG-PURITY):只打「方法/路径/origin/失败类别」,origin 清单走 secret。 # - 仅允许转发 safelist 路由(C-LB-SINGLE-REG-URL);未知路径 404。 # # 部署: # cd cloudflare-worker -# npx wrangler secret put BACKEND_ORIGINS_JSON # 见下方示例格式 # npx wrangler deploy +# BACKEND_ORIGINS_JSON 现在写在下方 [vars](见该段的注释与例外条款); +# 仅当里面出现非公开值时才改用 `npx wrangler secret put BACKEND_ORIGINS_JSON`。 name = "messageweave-lb" main = "src/index.js" @@ -25,13 +27,19 @@ compatibility_date = "2025-01-01" compatibility_flags = ["nodejs_compat_v2"] # 统一 HTTPS 入站(C-HTTPS-URL;平台代 TLS,Worker 内为短请求模型)。 -# 后端 origin 为 secret(不经明文 env 流转)。BACKEND_ORIGINS_JSON 只接受 -# 「字符串数组」——每项是一个 https origin;不支持 {"url":…, "weight":…} 这种 -# 对象形式(parseBackendOrigin 只认字符串,对象项会让整份配置解析失败, -# 而配置是**每个请求**重新解析的,所以会表现为**每个请求都 503**,不是启动即失败): +# BACKEND_ORIGINS_JSON 只接受「字符串数组」——每项是一个 https origin;不支持 +# {"url":…, "weight":…} 这种对象形式(parseBackendOrigin 只认字符串,对象项会让 +# 整份配置解析失败,而配置是**每个请求**重新解析的,所以会表现为**每个请求都 503**, +# 不是启动即失败): # BACKEND_ORIGINS_JSON 形如 ["https://a.platform1.example","https://b.platform2.example"] # LB_HEALTH_TTL_MS 可选,健康缓存 TTL(默认 30000) # LB_REQUEST_TIMEOUT_MS 可选,单 origin 超时(默认 10000,建议 > 最坏 cold start) # LB_MAX_ATTEMPTS 可选,每请求最多 origin 尝试次数(默认 2:首次 + 1 次故障转移, # 对应 deployment.md §10.4「有界重试其它实例(建议 1 次)」) -vars = {} +# +# ⚠️ 明文例外的边界:[vars] 里的 origin 只能是**公开可达的 https origin**(当前就是)。 +# 一旦出现内网地址、带内嵌凭据的 URL、或不想公开的 staging 主机名,立刻从 [vars] 删掉, +# 改用 `npx wrangler secret put BACKEND_ORIGINS_JSON`(git 历史不可逆,删掉不等于没进过库)。 +# 其余三个 LB_* 保持可调、不写死,用 dashboard 的 Add Variable 覆盖默认值即可。 +[vars] +BACKEND_ORIGINS_JSON = '["https://messageweave-eu-1.motofans.club"]'