🚨 2026-11-10 托管变更:
*.autional.cn已迁出 Vercel —— 改为 mf01 构建(node:24-alpine + 钉版 pnpm)→ 香港自建托管。.cn的构建 env 由 workspaceshared/infra-ops/sites/sites.manifest.json注入;push 后由 mf01 cron(约 10 分钟)构建发布,不经 Vercel。*.autional.com仍在 Vercel —— 本文中涉及 Vercel 的构建/部署描述对.com仍然成立。 现行口径:workspacedocs/AUTIONAL-CN-SITES-SELF-HOST.md。
consent.autional.cn / consent.autional.com 的唯一源站(双区单源,照 authenticator 的目录/发布模式)。
-
单页 PWA(Vite + React + TypeScript)。
-
登录:平台 OIDC 授权码 + PKCE(
auth.autional.{cn,com})。 -
实时更新:登录后先
POST .../consents/stream-ticket换一次性票据,再EventSource(.../consents/stream?ticket=…)建流;事件只当"有变化"信号,收到即重拉列表;切到后台暂停、回到前台重连并重拉;断线指数退避(1s→30s)。状态徽标在标题旁(实时/重连中/已断开)。⚠️ 边缘必须对长连接关缓冲:.cn走香港 nginx 两层(宿主 → sites 容器)→api.autional.cn,默认proxy_read_timeout 60s+ 缓冲会让EventSource收不到事件,已在 sites 管线用streamPaths+proxySets[].stream放行;.com走 Vercel rewrite,实测可直接流式。- 前端另有 30s 轮询兜底(
VITE_CONSENT_POLL_MS,0=关闭,标签页隐藏时跳过):SSE 只当加速通道,边缘/服务异常时列表仍会刷新。
-
登录过期:接口 401 会清 token 并显示「重新登录」,不再出现"提示过期但无出口"。
-
页面:
/待确认列表、/c/:id确认详情、/oauth/callback登录回调。 -
API:
/bff/ops/v1/consents*(.com由 Vercel rewrite、.cn由香港 nginx 反代 →API_ORIGIN)。 -
不持有任何数据库/服务凭据;只展示与提交确认决定。
pnpm install
pnpm dev # http://localhost:13113
pnpm build
pnpm typecheck
pnpm testpnpm mock # 内存 mock API,127.0.0.1:11080
pnpm dev
# 打开 http://localhost:13113/?demo=1演示数据只有 3 条(R1/R2/R3),决策只改内存状态;重启 mock 即重置。
正式后端:shared/service-consent(3 表 + 3 端点 + 审计 fail-closed),已在 prod 部署。生产构建默认走 /bff/consent/api/v1/ops;本地 dev 默认仍走 mock,联调真实后端按下方 VITE_CONSENT_BASE_URL=/api/v1/ops 设置。
2026-11-10:两区已重新部署
79f2c43;线上env.js已含VITE_CONSENT_BASE_URL=/bff/consent/api/v1/ops,Playwright 线上真实 OAuth 登录→列表→批准→审计全链路通过。
# 终端 1:后端(内存库 + 演示数据)
cd shared/service-consent
CONSENT_REQUIRE_ADMIN=false \
CONSENT_SEED_DEMO=1 CONSENT_DEMO_TENANT=tenant-a \
go run ./cmd/server
# 终端 2:前端(Vite 代理 /api/v1 -> :11030)
cd .refs/site-consent
VITE_CONSENT_BASE_URL=/api/v1/ops \
VITE_CONSENT_DEV_HEADERS=1 \
VITE_CONSENT_PROXY_URL=http://localhost:11030 \
pnpm dev
# 打开 http://localhost:13113/?demo=1Git Bash 下必须带
MSYS_NO_PATHCONV=1,否则/api/v1/ops会被 MSYS 转成 Windows 路径。
VITE_CONSENT_DEV_HEADERS=1 只在 dev 注入 X-User-ID/X-Tenant-ID/X-User-Roles;生产由网关注入,前端不伪造。
本地默认 REGION=cn、SITE_URL=https://consent.autional.cn、API_ORIGIN=http://localhost:11080;生产构建(VERCEL_ENV=production)缺 REGION/SITE_URL/API_ORIGIN/VITE_OAUTH_CLIENT_ID 直接失败。
| 变量 | 说明 |
|---|---|
REGION |
cn / com |
SITE_URL |
https://consent.autional.cn / .com |
API_ORIGIN |
https://api.autional.cn / .com |
VITE_OAUTH_CLIENT_ID |
consent 自己的 OAuth 公开 client id |
FRONTEND_API_MODE |
proxy(推荐)或 direct;direct 需服务端 CORS |
CDN_HOST |
https://cdn.autional.cn / .com |
DEFAULT_LANG / FALLBACK_LANG |
zh / en |
2026-11-10:
.cn已迁出 Vercel,本节关于项目/env/部署的描述仅对.com成立;.cn见 workspacedocs/AUTIONAL-CN-SITES-SELF-HOST.md。
.cn项目cn-consent(prj_6Ib6WYGRtuWOvQBhKtj3ozPJOzLW),.com项目consent(prj_8QPYe7AUcuKh9poFaynEH6b0tJf8);同一仓、同一vercel.ts,只换环境变量。- 推
main:.com由 Vercel 自动部署;.cn由 mf01 cron 构建发布(约 10 分钟,不经 Vercel)。CLI 重投(仅.com)按shared/entry-proxies/README.md。 vercel.ts由 CLI 本地编译:命令环境与 Vercel 项目 env 都要有API_ORIGIN。- Hobby 下成员仓必须 public(ADR-017)。
- GitHub:
https://github.com/autional/consent,main已推送。 - Vercel:两个项目均已创建并部署(
cn-consent/consent),Production READY。 ⚠️ cn-consent的 Ignored Build Step 若被设为true,Vercel 会直接取消构建(日志:deployment was canceled because the Ignored Build Step command returned exit code 0)。已清空;再遇到 CN CANCELED 先检查该设置。.com:GoDaddy CNAMEconsent -> 4f90496b90f22370.vercel-dns-017.com.;证书已签发,https://consent.autional.com200。.cn:DNSPod CNAMEconsent -> 181a2b43c72b9f9d.vercel-dns-017.com.已配置;Vercel 证书已签发(CN=consent.autional.cn);https://consent.autional.cn200。- OAuth:独立 client
client-9R0t08yqe4gF(public;redirect.cn/.com+ localhost;cors_origins两域);两区 authorize 探针均 302 → 各自/oauth/callback?error=login_required。 - 两区
env.js均已含VITE_OAUTH_CLIENT_ID=client-9R0t08yqe4gF。 /、/env.js、/manifest.webmanifest、/sw.js、/oauth/callback、/c/<id>(Accept html)均 200;缺失静态资源 404。- 两区自动构建均可用:
.com= Vercel Git 部署;.cn= mf01 cron(2026-11-10 起迁出 Vercel)。2026-11-09 Vercel 手动 API 部署额度耗尽(100/天)只影响.com的手动重投。 - API:两区
FRONTEND_API_MODE=proxy;若改direct,CORS 已在 client 上登记两域。
注册独立 client(不要复用 authenticator 的):
- redirect:
https://consent.autional.cn/oauth/callback、https://consent.autional.com/oauth/callback - 若用
direct:把两个 consent 域写进oauth_clients.cors_origins VITE_OAUTH_CLIENT_ID指向该 client;缺省会回落到 authenticator 的01AR...0005(错误)。