如果你长期使用 Surge,大概率会遇到一个很朴素但很烦的问题:Surge 本身足够强,但配置文件会越来越难维护。订阅源多了以后,节点命名、地区分组、策略组、流量面板、规则集、云端同步,每一项单独看都不复杂,但合在一起就会变成一种持续性的配置负担。

Sub-Surge 就是为了解决这个问题写出来的。它不是一个简单的订阅转换脚本,而是一套配置驱动的 Surge 订阅管理系统:把订阅拉取、节点清洗、地区归类、策略组生成、规则集装配、对象存储发布和定时更新连成一条流水线。项目源码在 Rhythmicc/sub_surge

它到底解决了什么

很多订阅转换工具的问题在于输出太“通用”:节点能用,但策略组不一定顺手;规则能跑,但不一定符合自己的日常习惯;多个订阅源可以导入,却未必能自然地合并成一个稳定的 Surge Profile。Sub-Surge 的目标更偏个人基础设施:把我长期使用 Surge 时形成的一套配置习惯,固化成可重复生成、可调整、可发布的配置系统。

1. 生成一份真正可用的 Surge 配置

Sub-Surge 会解析订阅中的节点,并按照香港、日本、美国、新加坡、英国、台湾等常用区域进行归类。每个区域会自动生成两类策略组:一个用于延迟测试的“最佳”组,一个用于 Surge smart 策略的“智能”组。这样生成的配置不是单纯把节点塞进 [Proxy],而是直接形成可操作的策略结构。

生成后的配置会包含地区策略组、自动测速组和手动切换入口。

这部分对应源码中的 updater.pytemplate.py:前者负责节点去重、地区识别和配置参数组装,后者定义 Surge 托管配置模板,包括 [General][Panel][Script][Proxy][Proxy Group][Rule][Host] 等部分。换句话说,Sub-Surge 的核心并不是“转格式”,而是把一个混乱的订阅输入变成一份结构完整的 Surge 配置。

2. 订阅源不是一次性导入,而是可管理对象

现实里我们通常不止一个订阅源:有的节点快,有的稳定,有的只是备用。Sub-Surge 把每个订阅源抽象成一个 AirportConfig,包括订阅地址、COS 存储路径、是否生成 Clash 配置、是否禁用自动更新、节点过滤规则、地区名称映射、信息节点提取规则等字段。

这张图里的管理界面背后是 FastAPI 服务。api.py 提供了机场增删改查、订阅更新、合并订阅、Clash 转换、配置预览、日志查看和节点健康检查等接口。也就是说,Sub-Surge 并不是运行一次就结束的脚本,而是把订阅源变成可以长期维护的资源对象。

订阅合并也不是简单地重复请求原始链接。实现中会优先从腾讯云 COS 读取已经生成好的机场配置,再从其中解析节点并加上机场前缀,避免频繁请求某些有时效限制或访问限制的订阅链接。这个细节虽然不显眼,但很实用。

3. 把“适配不同机场”的经验变成配置

不同订阅源的输出格式经常不一致:有的是 Surge 配置,有的是 Base64 节点列表,有的是 Clash YAML;节点名里国家地区的写法也五花八门,有时还混着流量、到期、重置信息。Sub-Surge 的处理方式是配置驱动,而不是为每个机场写一段定制代码。

config_schema.py 中的 ProxyParserConfigInfoExtractorConfig 负责描述这些差异:比如国家名称映射、排除关键词、节点名正则替换,以及流量/重置/到期信息的关键词或正则。parser.py 再根据这些配置提取 [Proxy] 节点、过滤无效节点,并在必要时把 Clash 节点转换成 Surge 节点。这样一来,新订阅源的适配成本主要落在配置调整上,而不是改代码。

4. 规则集的控制权应该在自己手里

订阅管理不仅是节点管理,也是规则管理。Sub-Surge 内置了一组常用规则集,覆盖直连、广告拦截、Apple、Microsoft、Telegram、AI 平台、流媒体、游戏平台、国内外媒体等典型场景;同时也允许你在 Web 页面里启停、增删和排序规则集。

这部分对应 GlobalConfig.rule_sets。生成配置时,启用的规则会被渲染成 Surge 的 RULE-SET 行,并接入对应策略组。它的意义在于:你既可以保留自动生成配置的便利,也不会失去对规则系统的控制权。

5. 自动更新、云同步与基本安全性

配置维护最烦的部分往往不是第一次生成,而是后续更新。Sub-Surge 的后台任务会按照全局 interval 周期刷新订阅,并把生成的配置上传到腾讯云 COS。这样 Mac、iPhone、iPad 只需要订阅同一个 URL,就能持续拿到最新配置。

实现上,api.py 在启动时创建自动更新任务;updater.py 负责生成并上传配置;ConfigManager 将全局配置和机场配置持久化到 ~/.sub-surge/config.json。首次运行时还会生成 TOTP 密钥,用于 Web 端 2FA 绑定。它不是面向多人团队的复杂权限系统,但对于个人自托管工具而言,已经补上了必要的访问保护。

6. AI 在这里做什么

Sub-Surge 也支持 OpenRouter 兼容接口,但它的角色不是“让 AI 生成最终配置”。更准确地说,analyzer.py 会先对订阅内容做自动识别:判断它更像 Surge、Clash 还是 Base64 节点列表,提取节点候选、国家地区和信息节点;在配置了模型接口后,再让 AI 辅助给出解析建议。AI 在这里是调参助手,不是配置生成主链路。

快速上手

pip3 install git+https://github.com/Rhythmicc/sub_surge.git -U
sub-surge serve

启动后访问 http://localhost:8000,完成 2FA 绑定和全局配置,就可以添加订阅源、生成 Surge 托管配置、合并多个订阅,并把结果发布到 COS。

写在最后

Sub-Surge 对我来说不是一个“订阅转换器”,而是一套把 Surge 配置维护工程化的小系统。它的优势在于把很多原本散落在个人经验里的操作变成了可描述、可预览、可更新、可同步的流程。它也不是完全通用的标准答案:地区识别依赖节点命名,策略模板带有我的使用偏好。但如果你也厌倦了反复手改 Config,它应该会是一个很顺手的起点。

GitHub 地址:https://github.com/Rhythmicc/sub_surge