兔洞博客
兔洞博客
个人博客

Sub-Store 订阅管理工具使用教程(多订阅合并、过滤、转换,一个链接搞定)

软件介绍

Sub-Store

Advanced Subscription Manager for QX, Loon, Surge, Stash, Egern and Shadowrocket

Sub-Store 不是代理客户端,是订阅管理工具——不转发流量,负责把你手上所有机场订阅合并、过滤、重命名、转换格式,最后吐出一个统一订阅链接,交给 Clash、sing-box、Surge 这些客户端去用。官方 README 给自己的定位是 “Advanced Subscription Manager for QX, Loon, Surge, Stash, Egern and Shadowrocket”(面向 QX、Loon、Surge、Stash、Egern 和 Shadowrocket 的高级订阅管理器),核心功能官方列了四条:多格式互相转换、订阅格式化、把多个订阅合并到一个链接、托管并修改订阅与文件

Sub-Store 是开源 JavaScript 项目,仓库在 sub-store-org/Sub-Store,采用 GPL v3 协议2020 年 8 月创建。截止到本文更新时间,GitHub 上 10,278 星,最近一版 v2.36.372026-08-12 发布,仓库至今仍在高频更新,README 顶部挂着 Trendshift 趋势徽章和作者 Peng-YMBuy Me A Coffee 赞助入口。README 致谢部分点名感谢了 KOP-XIAO 的 resource-parser(QuantumultX 生态的资源解析器)和 Orz-3、58xinian 提供的图标。

核心卖点:一个链接管所有订阅。手里三个机场、每份订阅节点命名还不一样,客户端里就要维护三条订阅;Sub-Store 把它们合并去重、按规则过滤、统一重命名,生成一条新订阅链接,客户端只认这一条。转换能力覆盖 13 种目标格式,过滤玩法有 正则过滤、丢弃正则、地区过滤、类型过滤、无用节点过滤、脚本过滤六种,节点操作有 属性设置、旗帜标记、排序、正则排序、正则重命名、正则删除、脚本操作、域名解析八种(官方 README 功能列表)。适用人群:手上有两个以上机场订阅、或者想在客户端里少维护几条订阅的人

用过在线订阅转换站的话,会发现两者干的活差不多,但思路不同:转换站靠网页一次性转换、订阅链接要交给第三方,Sub-Store 是自己部署、常驻服务、持续处理——订阅由你自己的实例拉取和缓存,转换随时可重复,还能叠加过滤脚本和定时同步。个人取舍是:不想让第三方碰订阅链接的,自建是更稳的选择;只是偶尔转一次格式、不想维护服务的,转换站也够用。

痛点与适用场景

订阅管理麻烦在三个地方:

  • 多机场多订阅,客户端维护成本高:两三个机场就有两三条订阅,客户端里来回切,节点一多名字还分不清谁是谁。
  • 客户端格式不互通:QX、Loon、Surge、Shadowrocket 各吃各的订阅格式,换客户端往往要重新折腾订阅,Sub-Store 的 13 种目标格式就是干这个的。
  • 订阅内容不干净:机场下发的东西经常混着失效节点、命名风格混乱,需要统一洗一遍再给客户端。

适用人群很明确:有两个以上机场订阅、或经常换客户端、或想把订阅整理逻辑固化下来的人。反过来,只有一个机场、只用一台设备、对节点命名无所谓的话,客户端直接填订阅链接就够了,这个工具属于"多花一步、长期省事"。

还有个生态细节:官方 README、Wiki 里大量链接指向 Telegram 频道 zhetengsha(折腾啥),Sub-Store 的快捷脚本、本地节点写法、排查帖基本都沉淀在那里,README 致谢里提到的 resource-parser 也是这个圈子里的热门项目。注意这个频道是社区资料,不是官方维护的文档——遇到官方 Wiki 没写透的问题可以过去搜,但优先看官方仓库和 Wiki。

13 种目标格式一览

官方 README 的目标平台列表正好 13 种,前端 Copy/Preview 面板在这 13 种之外还多一个 通用订阅选项(实测面板选项)——它按请求的 User-Agent 自动判断输出格式,不算在 13 种里。13 种目标格式:

面板选项对应客户端/用途
StashStash(iOS/macOS)
mihomo(Clash.Meta)Clash Verge、Mihomo Party 等 Clash 系客户端
SurgeSurge iOS 版
Surge MacSurge macOS 版,用 mihomo 补不支持的协议
LoonLoon
ShadowrocketShadowrocket
Quantumult XQuantumult X
EgernEgern
SurfboardSurfboard(安卓)
sing-boxsing-box 系客户端
V2RayV2Ray 系客户端(如 v2rayN)
URIV2Ray URI 节点列表
JSONPlain JSON,给脚本和工具用

输入侧官方支持的格式同样很宽(README 功能列表):socks5/http/https 代理 URI、SS/SSR/VMess/VLESS/Trojan/Hysteria/Hysteria 2/TUIC/WireGuard/AnyTLS 等节点 URI、Clash Proxies YAML、Clash Proxy JSON/JSON5/YAML、QX、Loon、Surge、mihomo(Clash.Meta)兼容配置。旧版 Clash 目标被官方标记为弃用(前端不再显示),但后端仍支持 target=Clash 参数(官方 README 说明)。

优缺点速览

优点缺点
一个链接聚合多个机场订阅,客户端只加一次不同部署方式的功能、持久化和数据边界不同(Docker 最完整,iOS 模块受 MitM 限制)
13 种目标格式,Clash / sing-box / Surge / QX / Loon 全系覆盖正则过滤和脚本操作有学习门槛,多数人只用其中两三个
过滤、重命名、排序、去重一条龙,机场给什么都能洗默认没有登录鉴权,公网部署必须自己加访问控制
开源免费,社区活跃,版本迭代快iOS 模块玩法依赖 MitM 和证书信任,介意隐私的别选这条
Docker 一条命令跑起来,订阅数据完全本地官方资料分散在 Wiki 和 Telegram,新手查问题要自己翻
⚠️ sub.store 不是官方域名,先记住这个坑
官方 README 和 Wiki 都发过安全通告:sub.store 只是模块脚本重写 MitM 规则用的域名,不是官方持有的公网域名。请求一旦没进重写,数据就会发往公网 sub.store 服务,存在数据泄露风险;官方前端是 sub-store.vercel.app。规避方法是在客户端配置里把 sub.store 映射到 127.0.0.1,风险细节和配置示例见「深入配置」和「常见问题」。

安装部署

Sub-Store 有几种跑法:Docker 自建、iOS 代理 App 模块、Vercel 云部署,安卓还有 SubCase AppTermux 方案(官方 Wiki 的安装入口列表)。按小白友好度排序:

部署方式适合谁数据在哪难度
Docker 自建有台常开的电脑/软路由/NAS自己机器上低,一条命令
iOS 代理 App 模块已经在用 Loon/QX/Surge 的 iOS 用户手机里,走 MitM中,要装证书
Vercel 云部署不想养常驻机器第三方平台
安卓 SubCase / Termux安卓用户,不想开电脑手机里

这篇的主线是 Docker 自建,下面所有"实测"都来自本机 Docker 部署。

部署在哪台机器

先想清楚服务跑在哪,再动手:

  • 常开的电脑:Windows / macOS 装 Docker Desktop,用合并模式-p 127.0.0.1:3001:3001),开机自启容器,机器开着订阅就可用。
  • 软路由 / NAS:Linux 环境直接 --network host(实测模式),跑在软路由上还能让局域网设备共用一条订阅链接。
  • 云服务器:有公网 IP,订阅链接随时能拉,但必须加访问控制(见下面的 callout)。
  • 手机:安卓用 SubCase 或 Termux,iOS 用代理 App 模块,适合不想开电脑的场景。

版本信息汇总(都来自官方发布渠道):

项目
版本v2.36.37(2026-08-12 发布)
代码仓库sub-store-org/Sub-Store
Docker 镜像xream/sub-store:latest
官方前端sub-store.vercel.app

常见部署坑

  • 端口被占用:3003/3004/3001 任意一个被别的服务占了,容器会起不来,先 docker ps 看端口,或换个端口。
  • Windows / macOS 的 host 网络:Docker Desktop 对 --network host 支持有限,这两个平台直接用合并模式 -p 127.0.0.1:3001:3001
  • 数据目录权限:挂载目录 /root/sub-store-data 权限不对会导致后端写不进去,容器日志会报错,chmod 一下目录即可。
  • 订阅名里的特殊字符:订阅名会出现在下载链接路径里(/download/{订阅名}),名字里带空格、斜杠的话链接要编码,起名时用中文或字母数字最省事。
  • 公网裸奔:云服务器部署时后端默认监听所有网卡,配好防火墙只放行自己的 IP,别把 3003/3004 直接丢到公网。
方案一:Docker 部署(小白首选)

先确保机器上有 Docker(Linux 装 docker-ce 即可,Windows / macOS 装 Docker Desktop)。然后跑这条命令(实测本机跑通):

docker run -d --name sub-store --restart unless-stopped --network host \
  -e SUB_STORE_BACKEND_API_PORT=3003 \
  -e SUB_STORE_FRONTEND_PORT=3004 \
  -e SUB_STORE_FRONTEND_BACKEND_PATH=/substore \
  -v /root/sub-store-data:/opt/app/data \
  xream/sub-store:latest

几个参数解释一下:

  • --restart unless-stopped:容器意外退出或机器重启后自动拉起。
  • --network host:容器复用宿主机网络,适合本机/内网部署。
  • SUB_STORE_BACKEND_API_PORT=3003:后端 API 端口。
  • SUB_STORE_FRONTEND_PORT=3004:前端页面端口。
  • SUB_STORE_FRONTEND_BACKEND_PATH=/substore:前端访问后端用的路径。
  • -v /root/sub-store-data:/opt/app/data:数据目录挂到宿主机,容器删了配置还在。

这条命令是前后端分离端口模式:后端 3003、前端 3004。官方镜像默认是合并模式,一条 -p 127.0.0.1:3001:3001 单端口跑前后端,更简单。两个注意点:--network host 会让服务监听宿主机所有网卡,局域网内其他设备能直接访问 3003/3004——本机或内网部署问题不大,要暴露公网必须加访问控制(见下面 callout);分离端口只是端口分开,不等于访问控制。Windows / macOS 的 Docker Desktop 对 host 网络支持有限,改合并模式更省事。

跑起来后浏览器打开(实测访问方式,前端通过 api 参数找到后端):

http://127.0.0.1:3004/?api=http://127.0.0.1:3003

打开能看到订阅列表页就说明部署成功。页面左侧导航有 5 项:订阅、文件、同步、归档、我的,订阅相关操作基本都在 订阅 页。

验证用的常用命令:

docker ps                    # 看容器是不是 Up 状态
docker logs sub-store        # 看启动日志有没有报错

数据都落在挂载目录 /root/sub-store-data,备份时把这个目录打包带走即可。升级方式:docker pull xream/sub-store:latest 后重建容器,数据不丢。

端口速查(实测分离模式)
前端页面http://127.0.0.1:3004本机访问
后端 APIhttp://127.0.0.1:3003本机访问
订阅下载链接http://127.0.0.1:3003/download/...本机访问
官方镜像合并模式127.0.0.1:3001单端口
方案二:iOS 代理 App 模块(Loon / Quantumult X / Surge / Stash)

不想开服务器的话,Sub-Store 官方提供了代理 App 模块方案(官方 Wiki 安装入口,配置文件在仓库 config 目录):把 Sub-Store 以模块形式装进 Loon、Quantumult X、Surge、Stash 这些 iOS 代理 App,手机自己就是订阅服务。

这条路的前提是安装并信任根证书、开启 MitM(官方文档说明):模块通过 MitM 重写把 sub.store 域名的请求接管到本地处理,这也是上文 sub.store 通告的由来。新版 Loon(3.5.0 及以上)官方给了资源解析器插件,旧版配置方式是在 [General] 段加一行 resource-parser,然后更新外部资源(官方 Wiki 说明)。

Loon 资源解析器插件支持这几个参数(官方 Wiki 说明):

参数作用
resourceUrlOnly仅使用远程资源,忽略 Loon 自身解析数据
ua拉取订阅时使用的 User-Agent
noCache禁用缓存
timeout拉取请求超时,单位毫秒
age-secret-keyage 加密解密用的私钥

具体每个 App 怎么导入模块,直接看官方 Wiki 的安装入口和仓库 config 目录。适合已经在用 iOS 代理 App、不想多养一台机器的用户;介意 MitM 和证书信任的,优先考虑 Docker 方案

方案三:Vercel 云部署 + 安卓方案

Vercel 云部署把后端放到 Vercel 免费额度上跑,订阅链接变成公网地址,手机在外面也能直接拉取。订阅转换是轻量请求,个人使用一般够用(实际受请求频率、订阅大小、平台限制影响,重度使用还是本地 Docker 稳);这类部署的详细步骤官方 Wiki 没展开,第三方教程有完整流程(2clash 的 Sub-Store 教程)。云部署意味着订阅链接会经过 Vercel 平台,介意数据落地的就本地 Docker。

安卓端官方 Wiki 给了三个入口:Magisk / KernelSU / APatch 模块SubCase Appsionnx/SubCase)、Termux 版。SubCase 是安卓上的独立 App,把 Sub-Store 跑在手机里,适合没有常驻电脑的用户。

⚠️ 自建实例默认没有登录鉴权
实测打开前端不需要登录,订阅和转换结果没有访问控制。Docker 跑在本机、内网问题不大;一旦要暴露到公网,必须补齐:HTTPS(TLS)打底(明文 HTTP 上做 Basic Auth 没有意义)、后端 API 不要直接暴露(用反向代理只放行前端需要的路径)、加鉴权(Basic Auth / 反代插件),防火墙按需放行。CORS 白名单不是鉴权,它只限制浏览器跨域读取,不拦直接请求。生成的订阅链接也别发到公开渠道——下载链接通常不直接暴露上游 URL,但实例里保存着带凭据的机场订阅地址,任何人拿到链接都能通过你的实例拉取转换结果。

使用教程

主线三步:添加订阅 → 选格式生成链接 → 粘贴进客户端。下面按实测界面走一遍,界面路径全部来自本机 Docker 部署的前端。

添加订阅

打开前端进入 订阅 页,订阅列表页顶部工具栏有 + 图标(空列表时显示添加订阅文字按钮),点击创建新订阅:

Sub-Store 订阅列表页

图注:订阅列表页,左上角类型计数显示单条订阅和组合订阅各有多少条,顶部按钮创建新订阅

点击按钮弹出创建面板,流程是:类型选单条订阅 → 填名称 → 填 URL(订阅链接)→ 点保存。名称自己起,后面生成的下载链接会带这个名字;URL 填机场后台给的订阅地址。实测时我用的订阅名叫"测试机场"、节点名"测试-东京-01"这类,都是保留 IP 构造的演示数据,你填自己的机场订阅即可,节点数量取决于你的订阅

创建订阅表单

图注:创建订阅的表单,上半部分填名称和订阅链接,下半部分是常用配置和节点操作

没有远程订阅地址的话,官方还支持本地节点:编辑器里把 来源从远程订阅切到本地订阅,在输入框里直接写节点内容(格式参考官方 Wiki 的"本地节点/订阅怎么写"),适合自己手写节点、或者把机场后台的节点复制过来的场景。官方链接参数文档里给过本地节点的格式示例(名称 = 协议, 服务器, 端口),照着写就能被识别。

保存后列表出现这条订阅,左上角类型计数**单条订阅(1)**会 +1;列表顶部还有 全部 / 本地订阅 筛选,默认全量显示。左侧导航的 文件面板还能托管普通文件,“托管并修改订阅与文件"就指这个。

添加完可以先验证两步:在列表页确认订阅状态正常,再点进订阅看内容标签里有没有节点。如果上游订阅本身有问题(链接失效、被机场限流),这一步就会暴露出来,不用等到客户端那边才发现。

不想用界面的话,实测后端也接受 POST /api/subs 创建订阅,body 传 {"name":"xxx","url":"http://..."} 返回 201,适合脚本批量添加。

查看节点与生成链接

点进订阅,预览/拷贝订阅面板就是转换主战场:

预览/拷贝订阅面板与目标格式列表

图注:预览/拷贝订阅面板,先选目标格式再复制下载链接

面板列出 13 种目标格式,实测能看到 Stash、mihomo(Clash.Meta)、Egern、Surfboard、Surge、Surge Mac、Loon、Shadowrocket、Quantumult X、sing-box、V2Ray、URI、JSON,第一个选项是 通用订阅。选完格式,面板给出转换后的下载链接,右侧 Copy 一键复制。实测生成的链接长这样:

http://127.0.0.1:3003/download/测试机场?target=ClashMeta

把这条链接粘到客户端的远程订阅/URL 订阅栏(Clash Verge、Mihomo Party、Karing 等都支持),客户端更新后就能看到处理过的节点。实测用 ?target=Surge 也能直接输出 Surge 格式,说明目标格式就是链接参数控制的,同一份订阅可以给不同客户端各生成一条链接。

选格式时按客户端对号入座:

客户端推荐选的目标格式
Clash Verge / Mihomo Party 等 Clash 系mihomo(Clash.Meta)
Karingsing-box通用订阅
ShadowrocketShadowrocket
LoonLoon
Quantumult XQuantumult X
Surge iOS / macOSSurge / Surge Mac
v2rayNV2Ray
StashStash

节点预览与生成的订阅链接

图注:节点预览区显示转换后的节点列表,下方链接栏是可复制的订阅地址

如果客户端种类多、懒得每台设备选格式,直接用 通用订阅:官方链接参数文档说明,通用链接会根据请求的 User-Agent 自动判断输出格式——在 UA 能被识别的情况下,Clash 客户端拿到 Clash 格式、Shadowrocket 拿到 Shadowrocket 格式,一条链接全设备通吃。

面板的即时预览里可以复制全部节点名(官方 Wiki 说明),写过滤规则或脚本时,对着真实节点名改比凭空想靠谱得多。

实测走查:把一份订阅变成客户端能用的链接

把前面几步串起来,走一遍完整流程(实测路径):

  1. 添加订阅:订阅页 → 顶部 + 图标(空列表时是添加订阅按钮)→ 单条订阅 → 填名称和机场订阅 URL → 保存。
  2. 进编辑器:点订阅名 → 操作标签 → 打开过滤非法节点
  3. 过滤:节点操作里加正则过滤,保留规则填 香港|东京|新加坡,只留常用地区。
  4. 重命名:加正则命名香港 替换成 HK,统一命名风格。
  5. 检查:切到内容标签,确认节点列表和命名都符合预期。
  6. 生成链接:回预览/拷贝订阅面板,选 mihomo通用订阅,Copy 复制下载链接。
  7. 给客户端:粘贴到 Clash 系客户端的订阅栏,更新订阅,完成。

这套流程跑顺之后,每次机场更新订阅,Sub-Store 自动按同一套规则处理,客户端拉到的永远是整理好的版本。

编辑订阅

订阅的过滤、重命名都在编辑器里做。点进订阅,编辑器有三个标签:显示、内容、操作(实测界面)。内容标签能看到处理后节点的实际内容,改完配置回来核对效果用;操作标签是过滤和节点操作的主战场:

编辑器内容标签节点列表

图注:编辑器内容标签,节点实际内容在这里核对

编辑器 Actions 标签

图注:编辑器操作标签,上半部分是常用配置,下半部分是节点操作

操作标签分成两块(实测):常用配置节点操作

常用配置里是影响整体输出的开关:过滤非法节点、UDP 转发、跳过证书验证、TCP Fast Open、VMess AEAD、连接复用、阻止 QUIC、ECN、IP 版本(实测面板清单)。日常用得最多的是过滤非法节点:机场订阅里常混着过期、失效节点,开它之后转换结果会自动剔除;跳过证书验证这类涉及安全性的开关,对陌生节点不建议开。

节点操作才是 Sub-Store 的精华,实测面板里有 脚本操作、修改响应、旗帜操作、节点排序、域名解析、区域过滤、协议过滤、正则过滤、正则排序、正则删除、正则命名、节点去重、脚本过滤、从剪贴板导入 这些操作项,其中四个是日常高频:

剩下的像 修改响应、旗帜操作、从剪贴板导入 这些偏门操作,按名称字面理解用途即可,日常很少用到,用到时再研究。

常见过滤操作

1. 过滤非法节点(去无用节点):就是常用配置里的那个开关,一键剔除失效节点,建议默认开着。

2. 协议过滤(按类型过滤):官方 README 的 Type filter。按协议类型筛选节点,比如只想留 SS、VMess 两种协议,在过滤里指定类型即可;机场订阅协议杂(SS/VMess/VLESS/Trojan 混着来)时,用它把不想要的类型洗掉。

3. 正则过滤:官方 README 的 Regex filter(保留匹配的节点)和 Discard regex filter(丢弃匹配的节点)。给现成示例,正则语法不展开:

  • 只想留香港节点:保留规则填 香港
  • 去掉名字带"直连"的节点:丢弃规则填 直连
  • 多关键词用 | 连接:保留规则填 香港|东京|新加坡

中文节点名直接匹配中文关键词就行,不用转义;想同时保留"香港 01"和"香港 02”,一个 香港 就覆盖了。正则区分大小写,英文关键词按实际节点名的大小写来填。

4. 正则命名:官方 README 的 Regex rename operator。批量改节点名,让各机场的命名风格统一。示例:

  • 香港HK东京Tokyo
  • 给所有节点加前缀:匹配 ^(.*)$,替换为 机场A-$1
  • 去掉节点名里的后缀:匹配 - 加速版$,替换为空

四个操作叠加后按配置顺序处理,内容标签里能看到处理结果;改完回到预览/拷贝订阅重新复制链接,客户端更新订阅即可。节点操作里剩下的 节点排序、正则排序、区域过滤、节点去重、域名解析 等玩法,逻辑一样,按需配置。

调试小技巧:改完过滤先看内容标签再复制链接,不要在客户端那边反复试错;内容里节点数量对不对、名字对不对,一眼就能确认。规则写复杂了不用慌,把操作里加的操作逐个停掉,定位是哪一步把节点弄没的。

过滤场景速查表

场景用什么操作示例
只要香港/日本节点正则过滤保留`香港
去掉"直连"“官网"节点正则过滤丢弃`直连
只留某类协议协议过滤只留 ss、vmess
剔除失效节点过滤非法节点打开开关
统一各机场命名风格正则命名香港HK
按地区给节点排序正则排序香港日本 关键词排序

这套组合拳的打法是:先合并(Collection)→ 再过滤(去无用/去类型/去关键词)→ 后重命名 → 生成链接。顺序固定下来后,每次机场更新订阅,Sub-Store 都会按同一套规则处理,客户端拿到的始终是整理好的版本。

深入配置(进阶篇)

前面四步已经覆盖日常使用。进阶玩法按难度排:Collection 合并多机场 → 订阅链接参数 → 脚本过滤/操作 → 定时更新与备份 → sub.store 安全细节

Collection:把多个机场合并成一个订阅

订阅列表页左上角的类型计数分 单条订阅和组合订阅 两种(实测界面),创建面板里也按这两个类型建:组合订阅,把多条 Single 订阅装进一个集合,转换输出时节点自动合并。官方 README 核心功能第三条就是”把多个订阅收集到一个 URL"。

典型场景:主机场 + 备用机场合成一条订阅,客户端只维护一条链接,主机场节点失效时还能用备用节点的;或者一家机场按地区分多条订阅,合并后统一按地区过滤。Collection 的生成链接方式和 Single 一样,预览/拷贝订阅面板选格式复制即可。

几个实操建议:合并后的节点数理论上等于各成员之和,实际会受去重、过滤、拉取失败和目标格式支持范围影响;重复节点用节点去重;两家机场命名撞车时,用正则命名加机场名前缀区分(^(.*)$机场A-$1);某个成员订阅失效了,Collection 里单独替换那条即可,不影响其他成员。

订阅链接参数:一条链接按需定制

生成的下载链接支持在 URL 后面加参数,官方链接参数文档里有完整说明。常用几个:

参数作用
target指定输出格式,如 ?target=Surge?target=ClashMeta
ua拉取上游订阅时使用的 User-Agent,机场按 UA 区分协议时有用
url覆盖订阅来源,直接传一个新的订阅链接
content传本地节点内容,不依赖已保存的订阅
fakeSub不按 name 查订阅,配合 url/content 直接转换传入内容,方便接第三方系统
includeUnsupportedProxy强制包含官方/商店版/未续费订阅不支持的协议
noCache强制重新拉取上游,不走缓存
noFlow强制不查询订阅流量信息

示例:指定格式加自定义 UA。

http://127.0.0.1:3003/download/测试机场?target=Surge&ua=clash-verge%2Fv2.4.7

两个坑提醒(官方文档特别说明):带特殊字符的参数要先 encodeURIComponent 编码布尔参数按"是否传了参数"判断,传 false 也会被当成启用,不想启用就别传这个参数。文件链接 /api/file/___ 走同一套参数体系,还支持 type/source/sourceName/mode 这些运行时覆盖参数,接自动化脚本时很顺手。

输出格式除了用 target 参数指定,官方文档还支持多一级路由直接指定/download/{订阅名}/ClashMeta,此时忽略 target 参数。

托管文件与 mihomo 配置生成

除了订阅,Sub-Store 还能托管普通文件(官方 README 核心功能第四条"托管并修改订阅与文件",实测左侧导航的 文件面板就是入口)。文件链接 /api/file/___ 和订阅下载链接 /download/{name} 是两套地址:文件链接支持 typesourcesourceTypesourceNamemode 这些运行时覆盖参数,只影响本次请求、不修改已保存的配置(官方链接参数文档说明)。

一个实用玩法是直接生成 mihomo 配置文件/api/file/demo?type=mihomoConfig&sourceType=subscription&sourceName=xxx 能把已保存的订阅输出成完整 mihomo 配置;mode 参数分 config(把来源当完整配置) 和 proxy(把来源转成节点写进 proxies) 两种(官方链接参数文档说明)。需要给 mihomo 系客户端喂完整配置的场景,不用自己在客户端里拼规则。

脚本过滤器与脚本操作

官方 README 的过滤列表里还有 Script filter(脚本过滤),节点操作里有 Script operator(脚本操作)——用 JavaScript 写过滤/修改逻辑,自由度比正则更高。实测 Actions 面板里就有 Script FilterScript Operator 两项。官方在仓库 scripts/demo.js 放了示例脚本,Wiki 脚本使用说明还给了节点快捷脚本入口;即时预览里可以复制全部节点名,官方建议配合 AI 生成更通用的脚本。

脚本能做的事举例:按延迟/地区动态过滤节点、批量改节点属性、给订阅内容加自定义字段——正则写不动的东西交给脚本。小白阶段用正则就够,脚本玩法适合有编程基础的进阶用户。

脚本资源集中在两处:官方仓库的 scripts/demo.js 是入门示例,官方 Wiki 的资源合集导航里有一批现成脚本可以直接用或参考。

定时更新与推送

Sub-Store 对远程订阅有缓存机制,链接参数里的 noCache 就是强制不走缓存、重新拉取上游(官方链接参数文档说明)。定时相关的 Docker 环境变量官方 Wiki 推荐的 Lucy 部署教程有完整表,注意别用错变量SUB_STORE_BACKEND_SYNC_CRON定时把订阅/文件同步到私有 Gist(配合备份);真正控制定时处理订阅、生成脚本缓存的是 SUB_STORE_PRODUCE_CRON(格式 cron,类型,名称;,如 0 */2 * * *,sub,a 表示每两小时处理订阅 a)。端口、路径这些参数也都能通过环境变量覆盖(前面 Docker 命令里的 SUB_STORE_BACKEND_API_PORT 就是例子)。订阅同步后的推送通知配置(Telegram/Bark 等),Lucy 教程里也有说明。

更新频率怎么设,按使用习惯来:请求时才拉取的默认行为适合个人使用,客户端更新订阅时顺便拉一次;常驻服务想提前生成好结果,用 SUB_STORE_PRODUCE_CRON 定时处理(生成脚本缓存,客户端拉取不超时);客户端侧的更新间隔也可以调长一点(比如一天一次),减少无谓拉取。

备份(Gist / API)

左侧导航的 Sync(同步)面板就是备份/同步入口(实测导航项),官方生态里常用 Gist(GitHub 的代码片段服务)做同步载体,把配置同步到 Gist 后换机器能拉回来——具体步骤在官方 Wiki 推荐的 Lucy 教程里。用 Gist 备份注意三点:Gist 别设公开、GitHub Token 不要写进 Gist 内容(GitHub 会扫描明文 Token 并吊销)、备份内容不是加密的(Base64 编码 ≠ 加密)。除了界面操作,后端还直接暴露 REST API:实测 POST /api/subs{"name":"xxx","url":"http://..."} 就能创建订阅,返回 201(接口细节不同版本可能有差异);文件链接 /api/file/___ 支持运行时覆盖来源参数(官方链接参数文档)。有自动化需求的可以拿 API 做批量管理,日常用户把数据目录 /root/sub-store-data 定期备份就够了。

备份的内容包括订阅配置(名称、URL、过滤规则、脚本、常用配置),都在数据目录里;镜像本身随时可以重新拉取,数据目录才是需要备份的东西。要说明的是:“数据在本地"指配置和缓存存在你的挂载目录,但拉取远程机场订阅、Gist 同步、推送通知这些动作仍然会经过对应服务。

还原同样简单:把备份的数据目录恢复到原来的挂载路径、重建容器即可,订阅和过滤规则会原样回来。

sub.store 域名安全说明(必读)

官方 README 和 Wiki 都发了安全通告。背景是:sub.store 只是 Sub-Store 模块脚本做 MitM 重写时用的域名,官方并不持有它。iOS 模块方案里,客户端把发往 sub.store 的请求重写到本地处理;但如果请求没进重写规则,就会真的发往公网 sub.store 服务。官方通告列了两个理论上可能的风险:可能被跳转到假前端(官方前端是 sub-store.vercel.app,认准这个地址),以及 sub.store 可能获取到用户数据。官方强调这只是可能性、不是暗示域名持有者会这么做,也表示暂时不换域名,只发通告——所以这个坑要用户自己防。

官方的建议是把 sub.store 在客户端配置里映射到本地地址,示例(官方通告原文):

[Host]
sub.store = 127.0.0.1

这样即使请求没进重写,也会落在本地而不是公网。只用 Docker 自建、不用 iOS 模块的用户不会碰到这个域名。另外官方还支持 CORS 白名单:Node/服务器部署用环境变量 SUB_STORE_CORS_ALLOWED_ORIGINS,默认 *;代理 App 模块默认只允许三个来源(两个域名):https://sub-store.vercel.apphttp://substore.stashhttps://substore.stash(官方 README 说明,来源按协议、主机、端口精确匹配)。* 不是安全配置——它只控制浏览器跨域读取,替代不了鉴权,不想任何网页都能读本地后端就把白名单收紧。

常见问题

Sub-Store 免费吗?

免费。项目是 GPL v3 开源协议,代码全公开;作者在 README 挂了 Buy Me A Coffee 赞助链接,自愿打赏,不影响功能。

sub.store 是什么?为什么官方要发安全通告?

sub.store 是 Sub-Store 模块脚本在 MitM 重写里用的占位域名,官方并不持有它。iOS 模块用户开了 MitM 后,这个域名的请求会被代理 App 接管;一旦请求没进重写,数据就发往公网 sub.store,官方通告明确说了存在数据泄露风险。规避方法:客户端 [Host] 里加一行 sub.store = 127.0.0.1;只部署 Docker、不用 iOS 模块的用户不涉及这个域名。官方前端认准 sub-store.vercel.app

部署在本地安全吗?

安全。Docker 自建时订阅数据、上游链接都存在你自己的数据目录里(挂载的 /root/sub-store-data),不出本机。要留意两点:端口别随便暴露到公网(3003/3004 只绑本机或内网),以及自建实例默认没有登录鉴权,公网部署一定要加访问控制。

转换后客户端用不了?

按顺序查三件事:目标格式选对没有(Clash 客户端选 mihomo,别选 Surge 或 sing-box);订阅里有没有该客户端不支持的协议(官方支持 includeUnsupportedProxy 参数强制包含);过滤规则有没有误伤(先关掉所有过滤生成一次试试)。再不行,换通用订阅让 Sub-Store 按 UA 自动判断格式(在 UA 能被识别的前提下)。

补充一点:先确认客户端本身支持订阅里的协议。机场只下发 SS,客户端却只认 VMess,这种"格式对但协议不认"的情况,转换救不了,得换订阅或换客户端。

生成的链接节点变少了 / 节点列表空了?

先看编辑器内容标签里实际输出的内容,再逐个排查:过滤非法节点开着会把失效节点剔除;正则过滤正则写错可能把节点全删光(比如保留规则匹配不到任何节点);Collection 合并时某个成员订阅拉取失败也会少节点。官方 Wiki 有自建版排查帖(官方排查说明)。

订阅更新失败?

上游机场的订阅地址失效、机场限流、机场按 User-Agent 区分协议,都会导致拉取失败。官方链接参数里有 ua 参数可以自定义请求 UA;要绕过缓存强制拉新内容,加 noCache。还不行,检查容器网络能不能访问上游——Docker 自建时拉订阅走的是宿主机网络。

官方说明 Sub-Store 拉取订阅的默认 UA 类似 clash.meta 客户端,部分机场会按 UA 区分下发的协议;遇到"换了格式还是少节点"的情况,把 ua 换成 v2rayshadowrocket 之类的再试,是社区里常用的解法(官方 Loon 插件说明里也给了这个思路)。

需要一直开着吗?

Docker 容器会常驻,但平时只在有人请求订阅链接时干活,负载很低。想要服务端定时处理订阅结果,用环境变量 SUB_STORE_PRODUCE_CRON 控制(Lucy 教程);SUB_STORE_BACKEND_SYNC_CRON 是定时同步到 Gist 用的,别混淆。嫌占资源可以把客户端更新间隔调长,或者用的时候再启动容器。

安卓能用吗?

能。官方 Wiki 给了三个安卓入口:Magisk / KernelSU / APatch 模块SubCase Appsionnx/SubCase)、Termux 版。SubCase 相当于安卓上的独立 App 版,Termux 版适合习惯命令行的人。

软路由能用吗?

能。Sub-Store 后端是 Node 服务,官方镜像 xream/sub-store 是通用 Linux 镜像,OpenWrt 上装 Docker、NAS 上跑 Docker 都行;跑在软路由上,局域网所有设备都能用一条内网订阅链接。

生成的下载链接是 127.0.0.1,手机怎么用?

本机部署时生成的链接是 http://127.0.0.1:3003/...,只有本机能访问。手机或局域网其他设备要拉订阅,把链接里的 127.0.0.1 换成电脑/软路由的局域网 IP,并确认 3003 端口没被防火墙挡住;Docker 用了 --network host 的话,宿主机 IP 就是服务 IP。

同网络内想操作前端也一样:浏览器直接访问 http://<局域网IP>:3004/?api=http://<局域网IP>:3003

订阅链接被别人拿到会怎样?

生成的下载链接不含机场 token(token 存在你实例的配置里),但任何人拿到链接都能从你的实例拉取转换结果;而且实例里存着上游订阅地址,自建实例别对公网开放,链接也别发到公开场合。担心泄露的,机场后台一般能重置订阅地址,重置后在 Sub-Store 里更新 URL 即可。

General 通用链接和直接选格式有什么区别?

通用订阅按请求的 User-Agent 自动判断输出格式(官方链接参数文档说明):Clash 客户端请求拿到 Clash 格式,Shadowrocket 拿到 Shadowrocket 格式;直接选格式则是固定输出。多设备混用推荐 General,单客户端固定格式更可控。

Sub-Store 和客户端自带的订阅功能有什么区别?

客户端自带的订阅导入只能"喂进去自己用”;Sub-Store 是独立的订阅管理服务:多机场合并、过滤重命名、格式转换、托管订阅都在服务端完成,所有客户端共享一条链接。订阅在客户端之间搬家,也只需换一条订阅地址。

Surge Mac 格式有什么特别的?

官方文档说明,SurgeMac 目标会调用 mihomo 来支持 Surge 自身不支持的协议(比如部分加密方式),WireGuard 全节点订阅还能直接输出成 Surge 模块(官方链接参数说明)。玩 Surge macOS 版可以留意这个格式。

想跟进新版本去哪里看?

GitHub Releases(sub-store-org/Sub-Store releases)是官方发布入口;Docker 用户留意 xream/sub-store 镜像更新,latest 标签会跟随新版本。

Comments

评论

本地 Worker 预览版,后续可切换到 Cloudflare D1。

正在加载评论...

连接本地评论服务中...

Sub-Store 订阅管理 机场订阅 订阅转换 正则过滤 Clash sing-box 教程 翻墙工具
工具与软件