Compare commits
11
Commits
5063100a90
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1822ae3129 | ||
|
|
07d7f77a8a | ||
|
|
414259a5d7 | ||
|
|
bd5a4532ff | ||
|
|
43978a4023 | ||
|
|
7f477972ba | ||
|
|
5bfa386312 | ||
|
|
593798efe8 | ||
|
|
ef5a3504ec | ||
|
|
b59e4e92a4 | ||
|
|
cb8bb28b18 |
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
> 日期:2026-11-03/04。交付:xLightpanda 接管 SERP 浏览器温池 + Storage Hook Phase 1(tmpfs 路由 + 共享 ShaderCache)。
|
> 日期:2026-11-03/04。交付:xLightpanda 接管 SERP 浏览器温池 + Storage Hook Phase 1(tmpfs 路由 + 共享 ShaderCache)。
|
||||||
> 代码:SerpMax node v0.47.0(zcode/serpmax-node 已推送);xLightpanda upstream 提交 `4f69ccd2`(0.10.0 显式指纹导入)。
|
> 代码:SerpMax node v0.47.0(zcode/serpmax-node 已推送);xLightpanda upstream 提交 `4f69ccd2`(0.10.0 显式指纹导入)。
|
||||||
|
> **部署路径勘误(2026-11-04)**:三节点 systemd 服务 WorkingDirectory=/app,实际运行代码在 `/app/src`(bundle 含 /app/node_modules,勿动);
|
||||||
|
> `/opt/{serpmax,profilemax}/src` 是滞留副本。部署 = rsync src → 节点 `/app/src` + package.json → `/app` + 更新日期戳 `/app/version` → restart。
|
||||||
|
|
||||||
## 1. 交付物
|
## 1. 交付物
|
||||||
|
|
||||||
@@ -88,3 +90,134 @@ tail -f /opt/serpmax/data/logs/* # 观察 browser.started_xlightpanda / serp.po
|
|||||||
|
|
||||||
- StorageFS FUSE/Rust/Pack(02_STORAGE_HOOK.md Phase 2+),另行立项。
|
- StorageFS FUSE/Rust/Pack(02_STORAGE_HOOK.md Phase 2+),另行立项。
|
||||||
- xLightpanda localStorage/IndexedDB 落盘(SERP 场景 cookie 足够)。
|
- xLightpanda localStorage/IndexedDB 落盘(SERP 场景 cookie 足够)。
|
||||||
|
|
||||||
|
## 6.5 typed 搜索调查(2026-11-04 下午,node 0.49.0/0.49.1)
|
||||||
|
|
||||||
|
**用户判断(定稿):go-fetch 打 302/门壳标的 Profile,WebDesk 里 veil 手动输入搜索全畅通 ⇒ 只要 xLightpanda 能像真实浏览器一样打开 google.com 在输入框填词回车,搜索应当没问题;两处部署动作:①`/nodes` 编辑弹窗设置多了加 Tabs 分类;②温池搜索路径保证「粘真实浏览器」。受此推动做的实测链:**
|
||||||
|
|
||||||
|
1. **pagefetch 门壳不再直接采信(0.49.0,1475479)**:`~10k Profile 只绑 3 个上游 IP` 的密度下,pagefetch 类 XHR 拿 0 结果/sorry/verify 概率高,而真浏览器路径畅通 ⇒ 改为仅当 `results>0 且 !sorry&&!verify` 采信,其余一律回退 **fill 搜索词 + Enter** 导航路径(真实浏览器行为)。
|
||||||
|
2. **JS 引导就绪门(0.49.1,55eb63d)**——本地 xLightpanda 复现实锤:
|
||||||
|
- Google 主包(xjs)未初始化完成时填词提交 → **原生 form GET**(抓到 `biw=&bih=` 空、`ie=GB2312`、无 sxsrf)→ Google 判异常流量 **302 /sorry**(title "302 Moved" 半秒转sorry);
|
||||||
|
- 等就绪(`readyState=complete` + `gk 命名空间≥30/联想容器 .UUbT9/隐藏域 biw` 有值,约需 10-15s 本地)之后同样操作 → **自然结果**(带 sxsrf/sca_esv 富参数);
|
||||||
|
- 故 navigate 提交前等待就绪标记(上限 10s,日志 `serp.pool_boot_gate`),温页早已就绪因此实测 `ms≈1-2` 即通过,零延迟副作用。
|
||||||
|
3. **ETH-33 生产复测:typed 就绪后提交,入参富化正确(sei= 等),但 Google 仍 302→/sorry** —— 剩余根因嫌疑二选一:① 每上游 IP 的 trip 计数(池 64 ≈21/IP, Typed 探针集中于少数 Profile);② impersonate MITM 链对**导航型请求**的头序/TLS 会话特征与真 Chromium 型有残余差异(veilWebDesk 同代理畅通是对照组)。**待 MITM 详查** = `IMPERSONATE_HEADER_DUMP` 开窗抓 xlp 导航 vs 规范浏览器导航头序对比(xlp 0.10.5 已留工具)。
|
||||||
|
4. 部署注记:node 0.49.1 三节点 `/app/version=20261104.1300`(ETH/HZ/KS5B 全部 xlightpanda 温池态,版本戳一处更新)。
|
||||||
|
5. admin 1.81.0(144955f):`/nodes` 编辑节点弹窗改 **Tabs 三页(基本信息/存储与缓存/温池与守卫)**;Hook 与守卫面板改为各自「恢复默认」按钮(原「联动恢复默认」取消)。前端已构建,HZ-DE-245 侧 profilemax-admin 已重启生效。
|
||||||
|
|
||||||
|
**排查小径(可复用)**:在服务器上 spawn 一只不走 MITM 的 `lightpanda serve` + `/app/node_modules/playwright-core` 装载 typed 探针,可隔离 MITM 因素做二元定位;直连(无 proxy 无 MITM)typed 探针发现 Google 主包就绪但 Enter 提交**不触发导航**,生产池路径(有 MITM)却能正常提交——驱动/键事件传递在直连实例上的差异也收入待修(独立小问题,非 sorry 主因)。
|
||||||
|
|
||||||
|
### 6.6 typed 决胜局:生产 dump 对照(2026-11-04 下午二)(0.49.1→0.49.2)
|
||||||
|
|
||||||
|
**背景**:用户拿 `24447424 / 2305745 / 65368457` 三只被限 Profile 在 WebDesk(veil)手测**全畅通** ⇒ IP 无恙,差异收敛到 xlp 引擎/MITM 链。用 `impersonate-proxy-dbg`(IMP dump 工具)在生产抓上游可见头,拿到关键证据并各进一环:
|
||||||
|
|
||||||
|
1. **生产 dump 三连发(34221790)**:req0 pagefetch XHR(`sec-fetch-mode:cors`/`accept:*/*`,形正常);**req1 typed 导航 = `sec-fetch-site:none` + 无 Referer + 裸 q 提交**(真 Chrome 表单回车应为 `same-origin` + `Referer:https://www.google.com/` + sxsrf 富化);req2(sei= 重定向链,same-origin+referer 正确)。→ 引擎把「激活型提交」送出了地址栏/CDP 型导航特征,Google 判异常。
|
||||||
|
2. **本地直连 typed 对照(reprobe10/11)**:引导就绪后首轮与结果页二连 typed 均 **organic**(sxsrf/newwindow/sca_esv 富化,10 结果);本地 echo 自建表单提交分类 `same-origin+referer` 正确 ⇒ 引擎直连形态本身良好,问题在生产恢复页态 + MITM 链。
|
||||||
|
3. **0.49.1 进站门实测有效但不够**:boot 门标志(`readyState+gk/ac/biw`)温页 1-2ms 即过(免延迟),但提交后 Typed 每 0 结果 —— gate 抓的是页内引导而非请求指纹。
|
||||||
|
4. **0.49.2(55b594c)「typed 回家门」**:pagefetch 门壳回退时若温页是结果/sorry 页,先 `goto google 首页` 再输入(与用户「新开 google → 输入框填词」路径完全对齐),boot 门上限扩到 15s。部署三节点(版本戳 20261104.1240)。
|
||||||
|
5. **复测仍 0 结果** —— 回家门在位、提交链通,Google 依旧 302→/sorry:剩余根因收敛于 **impersonate MITM 链对 document 导航请求的 HTTP/2/TLS 帧特征(h2fp 的 SETTINGS/伪头序/TLS preset chrome 与 Chrome 146 不匹配)**。同一链路 pagefetch(XHR 类)如常 0.9~1.7s organic,而 document(GET)一击即中 —— Google 对 document GET 的 JS/一致性门更严。**待修专项:Chrome 146 帧级对齐 h2fp(与上述直连 typed 字同步联动验证)。**
|
||||||
|
|
||||||
|
压测余量与守卫机制不受影响;搜流量主体照旧 pagefetch 健康;typed 兜底环节在 h2fp 对齐完成前保持现状。
|
||||||
|
|
||||||
|
### 6.7 内核 TLS 对齐(2026-11-04 下午三,node 0.49.3)
|
||||||
|
|
||||||
|
**用户定案走专项①后,第一手就是对齐上游 TLS。逐项对照 Real Chrome 148 akamai 指纹后确认 h2 帧参数层(SETTINGS/WINDOW_UPDATE/无 PRIORITY/伪头序 m,a,s,p)已逐位一致,剩余差异收敛到 TLS ClientHello;部署态 `preset: chrome` 是 uTLS 静态模板而非真内核。**
|
||||||
|
|
||||||
|
1. **采样器(impersonate-proxy,deployed-but-uncommitted 状态保持)**:`proxy/clienthello.go` 新增浏览器侧 ClientHello 字面采样(env 门控 `IMPERSONATE_CLIENT_HELLO_DUMP=<json 路径>`,MITM 终结前截读解析、成功一次落盘,零开销直通),输出与 node `kernel-hello.json` 同型(ciphers/extensions/curves/versions,另记 ext_bodies)。
|
||||||
|
2. **ETH-33 独立链采样**(不经 node:手工 impersonate 实例 + 手工 veil Chromium 153 `--headless=new` 打 Google):真内核是 **Chromium 153.0.8010.52**(与指纹品牌号 146 是两码事),hello 完整特征:GREASE×2(头 0xωaωa + 尾 compliance-GREASE **0xCA34/51764,恒定,186 字节结构化 payload**)、ALPS 0x44cd、ECH 0xfe0d、`x25519mlkem768`(IANA 4588=0x11EC)。
|
||||||
|
3. **修 dialer 三个兼容点(fp/dialer.go)**:① `0xCA34` 不占 uTLS 动态 GREASE 槽,以 GenericExtension 发结构化体(config 新增 `ext_bodies`,缺省带采样同型骨架)——**实锤**:CA34 发 1 字节短体时 Google 上游直接 `tls: error decoding message`(186 字节真 payload 即过,两端皆证);② hybrid 组映射纠正:0x11EC 是 `x25519mlkem768`(此前误标 kyber768 → utls 发出已废弃的 0x6399);③ `keySharesForCurves` 补 Kyber 分支混合复用。
|
||||||
|
4. **kernel-hello.json 转正 + node 侧下发**:采样体放 `DATA_DIR/impersonate/kernel-hello.json`,node `buildImpersonateYaml` 自动生成 `tls: preset: custom + custom_hello`(含 ext_bodies hex);profile config.yaml 重生成即生效(0.49.3,git 54574fe)。
|
||||||
|
5. 部署:新二进制 + kernel-hello.json + node src → 三节点(/app/version=20261104.1330);ETH 全池 config 已带 `preset: custom`;Google HTTPS 经 custom hello 200(4 连测)。
|
||||||
|
|
||||||
|
### 6.8 typed 决胜第三局:根因是引擎不跟 302(2026-11-04 下午四,node 0.49.4)
|
||||||
|
|
||||||
|
1. **dump 窗口复测(0.49.2 回家门 + 0.49.3 TLS 对齐后)**:typed 提交形态已完全正确(`same-origin`+`document`+`referer`+sxsrf/sca_esv 全富化)——但落点页 `document.title = "302 Moved"`。Google 对 document 导航回 302(sei/sxsrf 令牌轮转),**xlp 显示 302 静态体而非跟随**,轮询环拿不到结果 → results=0、无 sorry(此前所有 typed 0 结果的真正根因)。
|
||||||
|
2. 引擎侧排查:本地复现(跨主机 302/多跳链/playwright 拦截四对照)全部正常跟随 —— 生产差异在 Google 的 sei 跳转语义(出口 SG → google.com 302 富化),未再深挖引擎内因。
|
||||||
|
3. **节点侧绕法(实证有效)**:`+sei` 落点 URL 直接再取即 200 结果页(生产 execute_js 实证)。0.49.4 在 typed 轮询环检测 `302 Moved` 标题 → `page.goto(当前URL)` 手动吃跳转(至多两跳)→ 继续轮询。
|
||||||
|
4. **附:此前"typed 0 结果"探针有一半假阴性** —— `verify492_0`/`tlsfixNNNN` 乱码词 Google 合法返回零结果页;验证探针要用真实查询词。
|
||||||
|
|
||||||
|
### 6.9 goto 缓存重构(2026-11-04,node 0.49.4 / admin 1.82.0,git bc56b63 / 80e56bc)
|
||||||
|
|
||||||
|
**用户定稿:goto 缓存从 admin 库单点改成「节点文件缓存 + admin 共享库」双层,把「节点搜完 → HTML→admin→admin 解析 goto→节点逐条 fetch location」的解析环砍掉。**
|
||||||
|
|
||||||
|
- 键不变:`sha256(title+换行+cite)`(与 admin goto_cache 逐字节同型,两端互读)。
|
||||||
|
- 节点 `core/serp/goto.cache.ts`:搜索拿到结果 HTML 后就地提取(typed/页内 fetch 两路统一 DOMParser;`a[href*="/goto?url="]` 且含 h3,近 4 层找 cite)→ 本地文件缓存(`DATA_DIR/goto-cache/<key>`,内容=location)→ 未命中批量直连 admin(`/api/node/serp/goto-cache`,节点密钥,不经 CF)→ 仍无则同 Profile impersonate 链路并发取 location(8 并发,3xx+Location 绝对地址且非 goto 才采信)→ 双写(本地文件 + 异步回填 admin 库跨节点共享)→ **HTML 就地改写为真实地址再返回**。
|
||||||
|
- admin `POST /api/node/serp/goto-cache`(authorizeSerp 鉴权):`keys` 批量查(脏值=仍为 goto 形状的值不采信)、`entries` 回填(过滤非法形状);先回填后批查,节点上一轮写入本轮即可命中。
|
||||||
|
- admin 侧 `resolveGotoLinks` 无需改动:节点已改写的 HTML 扫到 0 目标,旧解析环(含逐条 fetchViaNode)自然整段跳过。
|
||||||
|
- 单测 `tests/goto.cache.test.ts` 5 例(键同型/写读回环/脏值防护/三变体改写/零命中不动);bun test 195 全过。
|
||||||
|
|
||||||
|
- **端到端实测(0.49.6 部署后)**:typed 手动跟随机制逐次触发(journal `pool_typed_302_follow`),信任态正常的会话 2/3 organic(9/10 结果,11-15s);随后 ETH-33 整机一度过载(15:02 admin UI 侧 reboot),回填后 ETH/HZ 会话出现持续 302+enablejs 壳。
|
||||||
|
- **~~「舰队级 IP 信任态塌陷」结论已撤回(2026-11-04 晚)**:用户用同一批指纹 ID(ETH 13594328/2302407/2302770/2303411/2305556/2305846/2306594/38879162/67196721,HZ 32955298/77526684)走正常指纹浏览器(cloak)手工复测,**全部干净无 302/enablejs**。复探针亦证:cloak 同 Profile 走**同一条 impersonate 链**(uTLS+h2fp)typed GET → 200 organic。门态非 IP 级、非 TLS/h2 级。
|
||||||
|
- **真根因(MITM 头 dump 实证,`IMPERSONATE_HEADER_DUMP=/tmp/hdump3`)**:lightpanda 引擎**自造的 Client Hints 残缺**,Google document 门态对残缺 CH 的 typed 导航下发 302。cloak(真 Chromium 内核生成 CH)干净 vs xlp 池被门,同为 typed(sec-fetch-site:none、无 referer)、同链路:
|
||||||
|
- `sec-ch-ua`:cloak `"Not-A.Brand";v="24",…`(Chrome 标准 grease)vs xlp `"Not/A)Brand";v="8",…`(lightpanda 自造 grease v8);
|
||||||
|
- cloak 有 `sec-ch-ua-full-version-list`(146.0.7680.177)/`sec-ch-ua-model`/`sec-ch-ua-wow64`/`sec-ch-ua-bitness`,**xlp 全缺**;
|
||||||
|
- `downlink`/`rtt`:cloak 0.4/450(真实感)vs xlp 10/50(满分值)。
|
||||||
|
- **修复方向**:在 impersonate-proxy rewriter(或 xlp 启动参数)对 google document 导航**覆写 Client Hints** 为与 UA 一致的完整 CH(grease 用 Not-A.Brand v24、补 full-version-list/model/wow64/bitness),对齐 cloak 实测值;修后用 pinned 搜索(`/api/serp/html/search?node=…&runtime=browser`)A/B 验证 302 消失。
|
||||||
|
- **排查流程规则(用户定稿)**:xlp 调试中出现 302/门态时,**必须先用正常指纹浏览器(同 Profile)复测一次再下结论**——否则会把 xlp 特有的请求层缺陷误判为 IP/外部门态,导致修复方向偏差(本轮实证)。
|
||||||
|
- ETH-33 dump 窗口(调试用)`IMPERSONATE_HEADER_DUMP=/tmp/hdump3` 经 systemd drop-in 仍开着(机器重启 /tmp 已清空重写;**注意 dumpRequest 不建目录,重启后需 `mkdir -p /tmp/hdump3`**);排查关闭:`rm /etc/systemd/system/serpmax-node.service.d/dump.conf && systemctl daemon-reload && systemctl restart serpmax-node`。
|
||||||
|
|
||||||
|
### 6.10 引擎侧修复落地:xLightpanda 0.10.6(Google typed-document CH 门,2026-11-04 晚)
|
||||||
|
|
||||||
|
**用户定案:0.10.6 不走 MITM 覆写(impersonate-proxy 维持 deployed-but-uncommitted 不动),直接在 xLightpanda 引擎自体把 UA-CH 修真。修复内容详录见 xLightpanda `docs/CH_GATE_FIX.md`(§1-§4 全量),要点:**
|
||||||
|
|
||||||
|
1. **GREASE 与品牌顺序改为 major 纯函数**(providers/Navigator.zig):移植 Chromium `GetGreasedUserAgentBrandVersion` 原算法 —— `Not{c}A{c}Brand`(11 字符表)+ `{8,99,24}[major%3]` + 顺序表 `order_table[major%6]`(6 个公开实测 major 交叉锚定)。146 → `Not-A.Brand`/`24` 顺序 [Chromium,grease,Chrome](与 cloak-146 200 样本全同);153 → `Not_A Brand`/`8` 顺序 [Google Chrome,grease,Chromium](ETH-33 抓包同)。0.10.4 以前按 module_seed 随机 5×3 组合发出真实 Chrome 从未发过的组合,门由此识别。
|
||||||
|
2. **高熵提示默认回带**(HttpClient appendClientHints):已声明源仍按 Accept-CH 声明回带(Set-Persist 语义);未声明可信源在指纹模式按 cloak-200 样本字段集(11 头,无 ect)回带默认全集 —— 解 xlp 冷启动永远收不到声明的鸡生蛋。裸启动(无指纹 seed)不回带。
|
||||||
|
3. **downlink/rtt 档位化**:9 档真实采样(10/50…0.4/450),network 模块 seed 派生、实例内稳定;HTTP 头与 JS `navigator.connection` 同一 NetworkQuality(禁漂移),替代全舰队 10/50 满分值。
|
||||||
|
4. **平台版本与真实构建号**:Persona.platformVersion linux→"6.11.0"/macos→"26.2.0";导入 UA(cloak/veil 快照)四段真实构建号(`Chrome/153.0.8010.52`)提取进 full-version 与品牌 full-version-list —— 真实 Chrome 从不发 `{major}.0.0.0`。
|
||||||
|
5. **生产验证(ETH-33,dump 窗开启)**:0.10.6 部署重启后 pinned 浏览器搜索 11.8s/1 attempt → **无 gate 头、475KB 真结果页**,xlp typed GET(sec-fetch-site:none)含 `downlink/rtt/prefers-color-scheme/arch/form-factors/platform-version/full-version(153.0.8010.52)` 7 头,与 cloak-146 200 样本逐字段结构一致(GREASE 对 + 顺序按 153 算法,real build 走导入 UA 提取);后续连发两查询进 `/sorry`(每 IP 会话配额,§7.2 已存现象,与 CH 门无关 —— sorry URL 带 sca_esv/sxsrf,doc-gate 302+enablejs 未再复现)。dump 数据存 `/tmp/hdump3.20261104.bak`(dumpRequest 不建目录)。**部署:ETH-33 + HZ-DE-245(备份 lightpanda.0.10.5.bak);FR/KS5B 节点仅跑 proxy 基建,无 xlp 池,不在本轮。**举一反六实现全量 `make test` 通过,版本 0.10.6(package.json),engine 仓库 xLightpanda 未提交待验证定稿后推送。
|
||||||
|
|
||||||
|
### 6.11 指纹自定义/导入第一步:真实构建号全链路(2026-11-04 深夜,node 0.49.7 / xlp 0.10.7,git 130f808 / 90e758ef7)
|
||||||
|
|
||||||
|
**用户定稿三步走(自定义 persona + veil/cloak 快照导入 + 温池代班)的第一步:把构建号列入 persona/导入 schema,消掉 0.10.6 已知边界「纯派生 profile full-version 发 {major}.0.0.0」。**
|
||||||
|
|
||||||
|
1. **xlp 0.10.7 漂移修正(实为 0.10.6 缺陷)**:derive 路径的 `sec-ch-ua-full-version-list` 与 JS `js_full_version_brands` 在导入 UA 覆写块**之前**物化 → HTTP 头与 JS fullVersionList 仍发 `{major}.0.0.0`,只有单值 full-version 拿到真实构建号。0.10.7 把两处物化移到全部覆写之后(回归测试入档)。
|
||||||
|
2. **xlp 0.10.7 `overrides.uaFullVersion`**:四段全数字构建号显式钉定(自定义 persona 无导入 UA 用),显式 wins 于导入 UA 提取;仅 `derivation=xlightpanda` 生效。Profile.zig 校验 ≥4 段全数字。
|
||||||
|
3. **node 0.49.7**:`generateFingerprint` 快照 UA 直接带真实四段构建号(cloak wrapper 五段截前四);`xlightpanda.launcher` 对存量 `.0.0.0` 快照 UA 用 `extra.chromeVersion` 就地改写(存量 Profile 免迁移),**major 取改写后 UA**(否则 persona 钉错被 xlp Validator 拒启动)。
|
||||||
|
4. 验证:xlp `make test` 全绿;node `bun test` 197 全过(新增 xlightpanda.launcher.test 2 例 + veil.test 2 例改期望)。部署与生产 A/B 见 §6.10 同款流程(pinned 搜索 + dump 窗),验证项:typed GET 的 UA 构建号段、full-version、full-version-list 三处同为真实构建号。
|
||||||
|
5. **node 0.49.8(f380615)—— 自定义 persona 生成 + veil/cloak 快照导入面(三步走第二步的节点 API 半)**:
|
||||||
|
- `generateFingerprint` 自定义 persona:`fingerprint.userAgent/webgl/screen` 显式参数优先;**声明版本随 UA 构建号段归一**(UA ↔ extra.chromeVersion ↔ impersonate TLS 档案三者一致,身份锚 = 页面 UA;仅主版本 UA 补全四段)。
|
||||||
|
- `importFingerprintSnapshot`:`createProfile` 请求 `fingerprint.snapshot` 收编一份完整 FingerprintSnapshot 形状 JSON(本系统导出格式,veilbrowser/cloakbrowser 出身通用)—— seed/UA/screen 原样收编**身份不重抽**,id 重生成、出身保留、importedAt 盖章、platformKey/chromeVersion 缺省从 platform/UA 补全。导入优先级 snapshot > admin import > 生成器。
|
||||||
|
- bun test 204 全过(新增 fingerprint.custom.test 7 例);两节点已随 0.49.7 同款 rsync 部署。
|
||||||
|
- **0.49.9 + admin 1.83.0(919b98a)—— admin 接线完成,导入面 API 全链路可测**:
|
||||||
|
- node `importAdminBrowserFingerprint` 顶层 seed 形状自适应:veil/cloak 快照自动走快照导入(身份不重抽),admin BrowserFingerprint 形状不变 —— **admin relay 零改造**。
|
||||||
|
- admin `POST /api/profiles` 新增 `fingerprintSnapshot`(须含 seed/userAgent):原样收编为 Profile browser 指纹(跳过随机生成),补 version(供 TLS 档案)/languages 派生键;`BROWSER_KINDS` 对齐 node 加 `xlightpanda`。
|
||||||
|
- **端到端实测**:admin API 建号(seed 31415926/UA 真实构建号原样)✓;node 直连导入建号 → xlp spawn 真实构建号 UA → google 导航成功 ✓;0.10.7 full-version-list 真实构建号生产 dump 实证 ✓。测试产物已清理,dump 窗已关。
|
||||||
|
- 待办:admin 前端 UI 入口(自定义 Tab + 快照上传);温池代班批量验证 = 三步走第三步(需 Profile 带 task_state=serp + 代理入池)。
|
||||||
|
6. **0.10.7 部署与 dump 复核(ETH-33)**:二进制(90e758ef7)两节点部署,launcher 真实构建号改写已实证生效(新 spawn 的 profile.json:`Chrome/146.0.7680.177` + major 146、`Chrome/153.0.8010.52` + major 153)。dump 复核 typed GET:`sec-ch-ua-full-version 153.0.8010.52`、GREASE/顺序 153 算法正确、档位 10/150(seed 派生)。
|
||||||
|
- **重要校准认知(免误判)**:dump 中 UA 串 `Chrome/153.0.0.0` vs full-version `153.0.8010.52` 并非缺陷 —— veil_compat 0.9.0 期对真实 veil 内核(fingerprint-chromium)的标定即此形态:**UA 串构建号段缩减({major}.0.0.0),fullVersionList 带完整构建号**(kernel_version vs kernel_full_version 双常量即为此设计)。真实内核同款行为,Google 门已实证放行(§6.10 round1)。曾计划 0.10.8 在 veil 路径跳过占位 UA 覆写,复核标定后确认无行为差异,已撤销(树保持 0.10.7)。
|
||||||
|
- full-version-list 头的 dump 复核(0.10.7 漂移修正在 HTTP 侧的实证)待 /sorry 冷却后下轮搜索补验;代码路径已有回归测试(0.10.7 提交)。
|
||||||
|
|
||||||
|
## 7. 极限压测 + 全节点温池化(2026-11-04,node 0.48.0 / admin 1.80.0)
|
||||||
|
|
||||||
|
**用户定稿:ETH-33 旧 veil 池架构经常死机(实测 10-24~11-03 五崩四次,11-03 xlp 灰度后稳定);测新架构极限,系统资源保留 20% 保证不死机;全部节点切温池,全部 SERP 请求走温池路径。**
|
||||||
|
|
||||||
|
### 7.1 节点资源守卫(node 0.48.0,git f50a13f)
|
||||||
|
- `src/core/system/resource.guard.ts`:可用内存(MemTotal-MemAvailable)< 20% 或 load1/核心数 > 80% ⇒ 拒绝**新预热**(SERP_POOL_FULL 语义,admin 补池 15s 重试自愈);池内 ready/busy 与进行中搜索不动。配置 `node-settings.json` 的 `resourceGuard` 键(admin /nodes 可视化编辑,1.80.0)+ `RESOURCE_GUARD_ENABLED=0` 逃生口;判定用 load1(load5 衰减太慢会压着守卫十几分钟)。失败读数不阻塞(降级语义)。
|
||||||
|
- /serp/pool 响应即带 guard 水位;metrics 新增 mem_free_pct / system_load_pct / serp_pool_guard_rejections_total;`resource.guard.test.ts` 5 用例(bun test 190 全过)。
|
||||||
|
- xLightpanda 端口扫描数可配 `XLIGHTPANDA_PORT_COUNT`(默认 64 → 压测时可放更深)。
|
||||||
|
|
||||||
|
### 7.2 ETH-33 极限压测数据(12 核 / 64G,守卫版压测)
|
||||||
|
| 档位 | 池态 | lightpanda 总 RSS(≈单实例) | 内存可用 | 稳态 load1 | 结论 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 64 | 64/64 ready | 6.1G(95MB) | 82-89% | ~0.2(闲) | 资源余量极大 |
|
||||||
|
| 96 | 96/96 ready | 8.6G(88MB) | 85.6% | ~0.2(闲) | 同上 |
|
||||||
|
| 128 | 128/128 ready | 11.7G(91MB) | 82% | ~0.04(闲) | 内存仍远未到保留线 |
|
||||||
|
|
||||||
|
- **机器资源极限远未到**:128 深池内存只占 18%,闲时 CPU≈0;负载尖峰(ll 12-19)全部来自共租任务(保活 veil 浏览器 churn、重启风暴),守卫在尖峰窗口正确拒绝增容、尖峰过后(分钟级)自动恢复补池——“保留 20% 保证不死机”机制实测有效。
|
||||||
|
- **真正的瓶颈是 Google 每 IP 会话配额**:ETH-33 全部 ~10k Profile 只绑 3 个上游代理 IP。池深 20(≈7 会话/IP)时搜索 0.9-1.7s 正常;128 深突发(43 会话/IP + 6 分钟 128 连发)后单实例首搜即 302→/sorry,5 分钟未恢复。**操作定值:ETH-33 池收在 64(≈21/IP)**;曾冲到 128 的会话密度待 IP 冷却后另行评估。
|
||||||
|
- 压测期间 admin 补池 15s×4/轮,自 0 填满 128 仅 ~7 分钟(重启风暴窗口守卫会自动压住几分钟后恢复)。
|
||||||
|
|
||||||
|
### 7.3 全节点温池化(2026-11-04 16:xx 前)
|
||||||
|
| 节点 | SERP_POOL_SIZE | admin override | 状态 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| OVH-ETH-33 | 64 | 64 | xlightpanda,64/64 回填完成 |
|
||||||
|
| HZ-DE-245 | 50 | 50 | xlightpanda(原 veil 兜底),回填中 |
|
||||||
|
| OVH-DEDI-KS5B | 80 | 80 | xlightpanda(原 veil 兜底),回填中 |
|
||||||
|
- 服务名:ETH/HZ=serpmax-node(/opt/serpmax),KS5B=profilemax-node(/opt/profilemax);统一 WorkingDirectory=/app;三节点 /app/version=20261104.1300(/system/version 显示之)。
|
||||||
|
- admin serpConfig `fetchPerSec: 1→0`:令牌桶永不放行 go-fetch,**SERP 请求 100% 走浏览器温池**(go-fetch 代码保留;回滚 = 改回正数即可)。依据:错误请求集中于 go-fetch 直连路径,温池路径无此问题(用户 2026-11-04 定稿)。
|
||||||
|
- Storage Hook 三节点保持 enabled(合并写修复后 /system/dirs 保存不再覆盖 storageHook 块);资源守卫全部默认开启(20/20)。
|
||||||
|
- 回滚:节点删 node.env 的 SERP_BROWSER_KIND 行重启即回 veil/cloak 温池。
|
||||||
|
|
||||||
|
### 7.4 admin 1.80.0(git 07f696c)
|
||||||
|
- /api/nodes/:name/settings(中继节点 GET /system/dirs)+ PUT /api/nodes/:name 支持 storageHook/resourceGuard(undefined=不动/null=恢复默认/对象=合并下发)。
|
||||||
|
- /nodes 编辑弹窗新增「Storage Hook(缓存路由 tmpfs)」与「资源守卫(温池准入)」设置区,打开即回显节点现值;节点 /system/dirs 增加 GET,保存按顶层键合并(修复只改目录导致手配 storageHook 被抿掉的隐患)。前端已构建,profilemax-admin 已重启。
|
||||||
|
(注:守卫与 Hook 值均为节点侧即读即生效,保存无需重启。)
|
||||||
|
|||||||
Reference in New Issue
Block a user