修正 Pingora 直连验收口径

允许 direct live 接受 SpacetimeDB identity 的 405 真实响应

同步 Nginx README 与 Pingora 试点文档的直连验收说明

在 dev 服务器用真实 API、SpacetimeDB 和静态目录完成 shadow 验收
This commit is contained in:
2026-06-17 21:25:36 +08:00
parent 27912fd020
commit c3f7d1f222
3 changed files with 3 additions and 3 deletions
File diff suppressed because one or more lines are too long
@@ -213,7 +213,7 @@ GENARRATIVE_PINGORA_DIRECT_REDIRECT_HOST=<域名或host:port> \
npm run check:pingora-direct-live
```
该脚本只读检查 HTTPS 根路径、HTTP/2 ALPN、代表性 API、SpacetimeDB identity、WSS `/v1/database/<database>/subscribe` 握手、generated 禁止入口、公开 `/healthz` 拒绝、可选 shadow probe,以及 HTTP 入口到 HTTPS 的 301 和 ACME challenge 静态读取;配置 `--pingora-access-log` 后还会为每个请求生成 `X-Request-Id` 并反查 Pingora access log,逐条比对同一 `request_id` 的 method、path 与 status,证明直连流量真实进入 Pingora,且未发生日志侧方法 / 路径 / 状态漂移。HTTP 响应必须带 `X-Genarrative-Gateway: pingora-shadow`TLS ALPN 必须协商到 `h2`WSS 成功握手时必须保留 `v2.bsatn.spacetimedb` 子协议。release readiness `--require-direct` 会自动要求 WSS 返回 101,并要求提供 direct HTTP base URL、正式域名 Host/SNI、redirect Location host、显式 SpacetimeDB 数据库名和 Pingora access log 路径,让 HTTP/2、HTTP redirect / ACME 入口、正式证书域名、跳转目标域名、目标库 subscribe 和 request_id + method/path/status 对账证据都纳入硬门禁;单独运行 direct live smoke 时也可加 `--require-wss-upgrade` 强制同一口径。direct live 在首页发现 `/assets/``/admin/assets/` 引用时会额外执行静态资源 GET、HEAD、`If-None-Match` / `If-Modified-Since` 条件请求和 `Range: bytes=0-0` 探针,确认静态头、HEAD 头响应、`304` 协商缓存、`206 + Content-Range` 以及不压缩 Range / 304 响应均进入同一 access log 证据链;这些静态 GET / HEAD / 304 / Range 的 JSON 结果会写入白名单 `headers`,只保留 `cache-control``etag``last-modified``accept-ranges``content-range``content-length``content-encoding`,方便切换后复盘缓存和 Range 响应头。若发现 Vite 指纹资源,还会额外确认 `Cache-Control: public, max-age=31536000, immutable` 及其 GET / HEAD / 304 / Range method/path/status 证据,避免旧 tab chunk 缓存口径在直连后退化。direct live 的 HTTPS / HTTP base URL、Host、redirect Host、probe token、额外 path、SpacetimeDB 数据库名、access log 路径、timeout 和布尔 env 都不能包含换行或 NUL;脚本会在发起 HTTPS / HTTP / WSS 请求前失败,避免污染参数进入请求头、URL、日志对账或 JSON 证据。环境变量示例见 `deploy/env/pingora-direct-live.env.example`。生产证书必须可被系统信任;`--insecure-tls` 只允许本机自签证书 smoke 使用。`--skip-wss` 只允许单独 direct live 临时排障,release readiness `--require-direct` 会直接拒绝。
该脚本只读检查 HTTPS 根路径、HTTP/2 ALPN、代表性 API、SpacetimeDB identity、WSS `/v1/database/<database>/subscribe` 握手、generated 禁止入口、公开 `/healthz` 拒绝、可选 shadow probe,以及 HTTP 入口到 HTTPS 的 301 和 ACME challenge 静态读取;真实 SpacetimeDB 对 `GET /v1/identity` 返回 `405 Method Not Allowed` 属于可接受语义,direct live 只把它作为路径转发代表,不要求该 GET 创建 identity配置 `--pingora-access-log` 后还会为每个请求生成 `X-Request-Id` 并反查 Pingora access log,逐条比对同一 `request_id` 的 method、path 与 status,证明直连流量真实进入 Pingora,且未发生日志侧方法 / 路径 / 状态漂移。HTTP 响应必须带 `X-Genarrative-Gateway: pingora-shadow`TLS ALPN 必须协商到 `h2`WSS 成功握手时必须保留 `v2.bsatn.spacetimedb` 子协议。release readiness `--require-direct` 会自动要求 WSS 返回 101,并要求提供 direct HTTP base URL、正式域名 Host/SNI、redirect Location host、显式 SpacetimeDB 数据库名和 Pingora access log 路径,让 HTTP/2、HTTP redirect / ACME 入口、正式证书域名、跳转目标域名、目标库 subscribe 和 request_id + method/path/status 对账证据都纳入硬门禁;单独运行 direct live smoke 时也可加 `--require-wss-upgrade` 强制同一口径。direct live 在首页发现 `/assets/``/admin/assets/` 引用时会额外执行静态资源 GET、HEAD、`If-None-Match` / `If-Modified-Since` 条件请求和 `Range: bytes=0-0` 探针,确认静态头、HEAD 头响应、`304` 协商缓存、`206 + Content-Range` 以及不压缩 Range / 304 响应均进入同一 access log 证据链;这些静态 GET / HEAD / 304 / Range 的 JSON 结果会写入白名单 `headers`,只保留 `cache-control``etag``last-modified``accept-ranges``content-range``content-length``content-encoding`,方便切换后复盘缓存和 Range 响应头。若发现 Vite 指纹资源,还会额外确认 `Cache-Control: public, max-age=31536000, immutable` 及其 GET / HEAD / 304 / Range method/path/status 证据,避免旧 tab chunk 缓存口径在直连后退化。direct live 的 HTTPS / HTTP base URL、Host、redirect Host、probe token、额外 path、SpacetimeDB 数据库名、access log 路径、timeout 和布尔 env 都不能包含换行或 NUL;脚本会在发起 HTTPS / HTTP / WSS 请求前失败,避免污染参数进入请求头、URL、日志对账或 JSON 证据。环境变量示例见 `deploy/env/pingora-direct-live.env.example`。生产证书必须可被系统信任;`--insecure-tls` 只允许本机自签证书 smoke 使用。`--skip-wss` 只允许单独 direct live 临时排障,release readiness `--require-direct` 会直接拒绝。
生产发布包默认不携带 Pingora,避免现有 API 流水线被影子网关构建依赖影响。需要部署影子服务时,构建机先确保有 `cmake`、C/C++ 编译器和 Rust target,再显式执行;`build-production-release.sh` 会在真实构建 Pingora 前 fail-fast 检查 `cmake`、C 编译器和 C++ 编译器,Jenkins `INCLUDE_PINGORA_GATEWAY=true` 时也会先检查这些工具:
+1 -1
View File
@@ -331,7 +331,7 @@ async function main() {
{
name: 'https-spacetime-identity',
url: joinUrl(config.httpsBaseUrl, '/v1/identity'),
expectedStatuses: [200, 401, 403, 404, 503],
expectedStatuses: [200, 401, 403, 404, 405, 503],
assertHeader: assertPingoraGatewayHeader,
},
{