Files
proxy-station/docs/SURGE-CHANGES.md

45 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Surge 订阅变更与验证
2026-10-03 的缺陷与证据见 [体检报告](SURGE-AUDIT-2026-10-03.md)。后续节点、组、规则和设置变更使用本文件的检查;具体 API 与生产备份操作见 update-db 技能。
最新节点启用范围、组成员、名称排序与规则优先级见 [当前生产状态](CURRENT-STATE.md)。历史验收成功不能替代新一轮 API 重读;本机模块和已保存策略选择也不等同于数据库配置。
## 写入前
- 获取最新全量节点、组、规则和设置,明确改动对象及受影响订阅范围。保留策略选择和出口语义;名称正则、节点范围、客户端排除不能只按数据库行数检查。
- 分别核对节点登记总量、enabled、订阅 nodeIds 和客户端能力过滤。当前停用记录继续保留;All Nodes/AI Nodes 使用同一节点来源和独立选择,排序调整先核对 sortOrder,再看完整名称。
- 节点/组名称不能包含配置分隔符、控制字符或与内置策略及另一类实体冲突。导入预览先验证字段;组更新替换完整 members,校验存在性、成员类型及完整图无环。
- 保住唯一启用、末尾 FINAL;完整排序,不通过停用/删除 FINAL 处理兜底。不用 reset 调整生产;reset 的真实含义是事务内恢复模板并保留自定义规则。
- 用官方规则顺序检查业务例外与广告/服务规则集的遮蔽,协议规则不放在提前覆盖其目标的域名规则后。IP 黑名单的 `no-resolve` 会改变未解析目标的拦截覆盖,要记录取舍。
- DNS 对照连接规则、手写 Host、加密 DNS 出口和 FINAL 的 dns-failed 行为。Host 不能表达进程/协议/IP 路由,远端代理解析和浏览器自带 DoH 也不是同一条路径。
- Surge 测速用节点 `test-url` 或 General 的 `proxy-test-url`,不用组级 `url=`。共享订阅不传播默认控制口令,MITM 保留上游证书验证。
## 本地与生产验证
代码修改运行相关单测与类型检查;共享字段或 IR 修改运行全量类型检查及单测,页面修改再构建。数据库/管理 API 测试必须在导入 db 模块之前设置绝对临时 DATA_DIR。
将候选配置存到私有临时目录,文件权限 600,然后运行:
```bash
python3 scripts/check-surge.py /private/tmp/<profile>.conf
python3 scripts/check-surge.py /private/tmp/<profile>.conf --fetch-rulesets
```
脚本先调用本机官方 `surge-cli --check`,再检查 FINAL、无效组级 url、公开控制口令和 MITM 参数。第二条下载当前规则集,以临时本地快照再次调用官方 CLI,并提示更早不同策略对后面域名规则样例的覆盖。提示需要结合业务审阅,不能自动将所有广告域名放行。它不模拟 IP/协议/进程或客户端缓存,规则集非法行也可能被 Surge 跳过;有疑点时查看设备资源加载警告及请求匹配日志。
生产变更先在线备份,确认本次文件为 root 属主、600 权限;不要仅因脚本退出成功就假定权限正确。经管理 API 逐条核对状态,失败停止;在新代码防护部署后再写需要新防护的数据。组成员整体替换,排序使用完整且无重复的 ids;节点权重更新以私有文件保留全部原字段,重读排除排序/更新时间后比对,避免改变协议或凭据。写入后重读变更对象、核对数量与完整顺序,从实际 HTTPS 入口拉订阅并核对 MANAGED-CONFIG 的 self URL,然后重复以上校验。通过回环 API 拉的订阅可能带内网 self URL,不能拿它替代实际 HTTPS 验收。配置中的 token、密码、UUID、Host IP 不落仓库或共享日志。
下载使用 `curl -fsSL --max-time ...`,完成后检查文件存在、非空、预期段落或 YAML 结构,再运行原生校验。串行验证遇错停止;如果管道会隐藏前一步失败,启用 pipefail 或分别读取返回码。mihomo 在配置路径不存在时可能创建默认配置并报告成功,这种输出不能算真实订阅通过。
Clash 受影响时,用独立临时目录运行 `mihomo -t -d <临时目录> -f <配置>`;不要覆盖正在使用的配置或启动代理服务。没有客户端 CLI 的产物用对应单测和结构检查,明确尚缺的真机验收。HTTP 正文不包含 excluded/skippedRules,需将启用节点与实际产物逐项比对;配置规则条数也会受派生规则和客户端跳过类型影响。
Shadowrocket/Clash 的完整差异与待验项见 [2026-10-04 体检](MOBILE-CLIENT-AUDIT-2026-10-04.md)。除解析外还要检查节点完整名称顺序、UDP 能力、动态组显式成员、RULE-SET 的 no-resolve 和实际跳过规则。Shadowrocket 官方更新记录确认存在逻辑规则,不能把生成器的保守跳过范围当成客户端能力断言。
默认不切换活动 Surge 配置、修改保存的组选择或导入 CA。用户授权的本机复测需要更新既有托管配置时,先核对托管 URL 与当前配置,备份并读取最新组选择,再执行 `surge-cli managed-profile update`。该命令可能仅报告已安排重载;须随后读取 `dump profile effective` 和 `policy-group get` 确认真正生效,不把紧接更新的旧规则查询当作最终结果。
组改名时 API 会级联生产引用,但客户端保存选择按组身份存储。核对新组、父组路径和两个独立节点组的最新实际选择;仅迁移原选定节点到新组名,不借验证更换线路。用 `profile diff` 区分原订阅与模块覆盖;数据库 url-test 与设备有效 Smart 等类型可能不同,不直接用客户端覆盖修改数据库。
CLI 成功只证明解析;节点连接、测速结果、DNS/WebRTC 和业务连接仍需设备侧验证。Net.Coffee 的已完成复测限定于本机 Chrome+Surge 的随机探测域名路径,详见 [DNS 复测](NET-COFFEE-DNS-2026-10-04.md),不能代替其他设备或 Claude 全部业务请求的验收。
依据:[匹配与 DNS](https://manual.nssurge.com/rules/overview.html)、[FINAL](https://manual.nssurge.com/rules/final.html)、[成员导入](https://manual.nssurge.com/policy-groups/policy-including.html)、[测速](https://manual.nssurge.com/policy-groups/url-test.html)、[Host](https://manual.nssurge.com/dns/local-dns-mapping.html)、[引用格式](https://manual.nssurge.com/profile/format.html)、[CLI](https://manual.nssurge.com/tools/cli.html)。