Sub-Store 自部署 + 订阅链接转换全教程
机场订阅多了,每家给的链接格式还不一样——有的 Clash YAML、有的 base64、有的 share link。手动管理几条还行,多了之后想要”聚合 + 过滤 + 重命名 + 一键导出 Clash/V2rayN/Shadowrocket”等功能,Sub-Store 是社区里目前最强的工具。
这篇用 Docker Compose 把 Sub-Store 跑起来 + 接 1Panel 反代 + 自定义后端路径,全套搞定。
一、为什么用 Sub-Store
订阅工具市面上有 3 类,对比一下:
| 工具 | 重点 | 适合 |
|---|---|---|
| subconverter | 格式转换 | 在线一次性转换 |
| Sub-Store | 节点聚合 + 过滤 + 编排 | 长期管理多个机场 |
| surgio | 规则集生成 | 高度自定义需求 |
Sub-Store 的杀手锏:
- 多机场聚合到一个订阅链接
- 节点筛选(正则 / 国家 / 协议 / 倍率)
- 节点改名(去广告 + 加 emoji)
- 格式输出:Clash / V2rayN / Shadowrocket / Surge / Loon 全支持
- 定时备份到 WebDAV / S3
- 有 iOS / Android / Web 三端 UI
二、整体架构
聚合/筛选/改名] A2[机场 B 订阅] --> SS A3[自建节点] --> SS SS --> O1[Clash 客户端] SS --> O2[Shadowrocket] SS --> O3[Surge / Loon] SS --> O4[V2rayN] N[Nginx 反代
HTTPS] --> SS
部署后你只需要在客户端填一个 Sub-Store 生成的 URL,所有机场节点都聚合进来。
三、Docker Compose 部署
3.1 创建数据目录
mkdir -p /opt/sub-store/data3.2 docker-compose.yml
services: sub-store: image: xream/sub-store:http-meta container_name: sub-store restart: always environment: # 定时备份到自定义存储(可选) - SUB_STORE_BACKEND_UPLOAD_CRON=55 23 * * * # 自定义后端路径(关键,防扫) - SUB_STORE_FRONTEND_BACKEND_PATH=/your_secret_path volumes: - /opt/sub-store/data:/opt/app/data ports: - "127.0.0.1:3001:3001" # 只绑本机,外网走 nginx 反代3.3 关键环境变量
| 变量 | 说明 |
|---|---|
SUB_STORE_FRONTEND_BACKEND_PATH | 必设:自定义后端路径,相当于密码 |
SUB_STORE_BACKEND_UPLOAD_CRON | 定时备份的 cron 表达式(可选) |
SUB_STORE_BACKEND_API_HOST | API 域名(自动检测,一般不设) |
SUB_STORE_DATA_BASE_PATH | 数据目录(一般用默认) |
SUB_STORE_BACKEND_DEFAULT_FLOW_USER_AGENT | 拉机场订阅时的 UA |
⚠️
SUB_STORE_FRONTEND_BACKEND_PATH是你的唯一防护——这个路径就是你 Sub-Store 后端的”密码”。设个长一点的随机字符串。
3.4 启动
cd /opt/sub-storedocker compose up -d
# 看日志确认启动docker compose logs -f3.5 端口绑定为什么是 127.0.0.1:3001?
不直接 3001:3001 暴露公网,原因:
- Sub-Store 默认不强制认证,任何能访问端口的人都能改你的配置
- 必须通过反代 + 自定义路径 + HTTPS 把它保护起来
127.0.0.1绑定意味着只有 nginx 反代能访问
四、Nginx 反代 + HTTPS
用 1Panel 的话最简单:
4.1 1Panel 配置
网站 → 创建网站 → 反向代理:
| 字段 | 值 |
|---|---|
| 主域名 | substore.your-domain.com |
| 代理地址 | http://127.0.0.1:3001 |
| HTTPS | 开启 + 用 DNS 自动签 |
完成后浏览器访问 https://substore.your-domain.com 就能看到 Sub-Store 的 Web UI。
4.2 手动 nginx 配置(不用 1Panel)
server { listen 443 ssl http2; server_name substore.your-domain.com;
ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem;
location / { proxy_pass http://127.0.0.1:3001; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; }}
server { listen 80; server_name substore.your-domain.com; return 301 https://$host$request_uri;}五、首次访问 Web UI
访问 https://substore.your-domain.com,第一次需要填后端路径:
| 字段 | 值 |
|---|---|
| 后端地址 | https://substore.your-domain.com |
| 后端路径 | /your_secret_path(和 docker compose 里的一致) |
填对了进 UI 即可。
六、Sub-Store 核心功能
6.1 添加订阅
订阅 → 添加:
| 字段 | 值 |
|---|---|
| 名称 | 随便,如 机场A |
| 类型 | 单条 / 组合订阅 |
| 链接 | 机场提供的订阅 URL |
| 用户代理 | 通常 clash.meta 或 clashx.pro |
填完保存,Sub-Store 会自动拉机场节点。
6.2 节点筛选 + 改名
在订阅上右键 → 编辑预处理,能加各种节点操作脚本:
| 操作 | 用途 |
|---|---|
| 节点过滤器 | 按关键词/正则筛节点(去广告) |
| 节点重命名 | 加 emoji / 国家旗 / 删多余 |
| 节点类型过滤 | 只保留 vless / 排除 trojan |
| 节点排序 | 按延迟 / 按国家排 |
| 去重 | 删重复节点 |
社区有大量现成脚本,搜「Sub-Store 脚本」就有。
6.3 组合订阅
把多个机场聚合成一条:
订阅 → 添加 → 组合订阅 → 勾选多个子订阅 → 保存。
输出一条 URL,里面包含所有勾选的机场节点。
6.4 文件管理(自定义规则集)
文件 → 添加,可以上传自己的:
- 节点列表
- 规则集
- mihomo / Clash 模板
之后在订阅里可以引用这些文件。
七、生成订阅 URL
在订阅列表 → 点订阅 → 下载 → 选目标格式:
| 客户端 | 格式 |
|---|---|
| Clash / Clash Verge / mihomo | Clash |
| Shadowrocket | Shadowrocket |
| Surge | Surge |
| Loon | Loon |
| V2rayN | V2ray |
| sing-box | sing-box |
每种都会生成一个 URL,这个 URL 就是你客户端要填的东西。
八、订阅格式扫盲
不同客户端吃不同格式:
| 格式 | 内容 | 客户端 |
|---|---|---|
| Share Links | 每行一个 vmess:// / ss:// / trojan:// / vless:// | V2rayN、Shadowrocket、Clash Meta 都支持 |
| Base64 | Share Links 整体 Base64 编码 | 几乎所有客户端 |
| Clash YAML | 完整 YAML 配置(节点+策略组+规则) | 仅 Clash 系列 |
💡 机场给的是什么? 99% 都是 base64 编码的 Share Links。Sub-Store 帮你拉回来,按你要的格式重新输出。
九、定时备份配置
🪤 Sub-Store 的所有数据在 Docker 卷里,容器重建数据丢失。一定要配备份。
9.1 直接备份卷目录
每周 cron 打包:
0 4 * * 0 tar -czf /backup/sub-store-$(date +\%Y\%m\%d).tar.gz \ /opt/sub-store/data9.2 Sub-Store 内置同步(推荐)
设置 → 应用同步,可选:
- WebDAV(InfiniCLOUD / Koofr / 自建 Alist)
- GitHub Gist
- 自定义 HTTP 同步接口
配好之后每天自动备份配置 + 数据。
十、踩坑清单
| 现象 | 原因 | 解决 |
|---|---|---|
| 访问 UI 显示空白 | 后端路径不一致 | 检查 docker env 和 UI 填的 |
| 拉机场 403 | UA 触发机场风控 | 改 UA 为 clash.meta 或别的常见值 |
| 拉机场超时 | VPS 在国内 / 机场在国外 | 给 Docker 配代理 |
| HTTPS 不通 | 1Panel 证书没绑或反代配错 | 检查 nginx + 证书 |
| 重启 Docker 后数据消失 | 没挂卷 | 检查 volumes 配置 |
| 客户端拉订阅超时 | Sub-Store 拉机场慢 | 在 Sub-Store 里调整定时刷新 |
| 多人能匿名访问 UI | 后端路径太短 | 改成 32 位随机字符串 |
十一、几条实用经验
SUB_STORE_FRONTEND_BACKEND_PATH必设强密码:这是唯一防线。- 端口绑
127.0.0.1:别裸奔到公网。 - HTTPS 必上:Sub-Store 走 HTTP 明文传输,所有订阅 token 都在 URL 里。
- 预处理脚本是核心生产力:花一次时间写好”去广告 + 改名 + 去重”,永久受益。
- iOS / Android 端也有 app:搜 “Sub-Store”,能扫码同步配置。
- VPS 在国内 + 机场在国外 需要给 Docker 配代理,否则拉机场超时。
跑通之后你的代理订阅管理体验会上一个台阶:所有机场聚合成一条 URL,多个客户端共享,节点筛选/改名一次配好永久用。