什么是Sub-Store
Sub-Store 是 BoxJs 中的一个模块,主要用于管理和使用订阅资源。它可以帮助用户导入、管理和更新网络订阅,通常用于代理服务、VPN 订阅、脚本更新等场景。Sub-Store 使得用户可以集中管理多个订阅资源,简化操作流程,提升使用体验。
主要功能
导入订阅:
- 用户可以将订阅链接导入到 Sub-Store 中。订阅链接通常是提供网络服务、代理或更新内容的 URL。
- 支持从 URL 或本地文件中导入订阅数据。
管理订阅:
- 在 Sub-Store 中,用户可以查看已导入的订阅资源,管理订阅列表。
- 可以更新订阅内容、删除不再需要的订阅,或者对订阅进行分类和整理。
同步和更新:
- Sub-Store 支持自动同步和更新功能,以确保订阅内容是最新的。
- 用户可以设置更新频率,定期拉取最新的订阅数据。
-
配置和设置:
- 允许用户对订阅进行个性化配置,如设置优先级、排序、过滤等。
- 用户可以根据需要调整订阅的相关参数,以优化使用体验。
应用场景
- 代理服务管理:通过 Sub-Store,用户可以集中管理各种代理服务的订阅链接,轻松切换和更新代理节点。
- VPN 订阅:适用于管理 VPN 服务的订阅资源,方便用户随时更新和维护 VPN 连接。
- 脚本更新:用于管理脚本更新订阅,确保用户使用的脚本始终保持最新状态。
如何使用
添加订阅:
- 打开 BoxJs 并进入 Sub-Store 模块。
- 点击“添加订阅”或“导入”按钮,输入或粘贴你的订阅链接,然后确认导入。
查看和管理:
- 导入成功后,你可以在 Sub-Store 的界面中查看所有订阅资源。
- 可以对订阅进行操作,如编辑、删除或更新。
设置和优化:
- 根据需要调整订阅的设置,例如同步频率、过滤规则等,以实现最优化的管理。
Sub-Store 是 BoxJs 中的一个实用模块,通过集中管理和更新订阅资源,帮助用户高效地处理代理、VPN 和脚本等内容。无论是导入、管理还是更新订阅,Sub-Store 都能提供简洁且强大的功能,提升整体使用体验。
在VPS服务器上使用Docker部署Sub-Store
项目仓库:https://github.com/sub-store-org/Sub-Store
sub-store 最早是 Peng-YM 在 loon 平台推出的高级订阅管理工具。完全本地解析,无订阅泄露的风险。经过后续发展,现在已经适配了 Surge 和 Quantumult X 以及 Shadowrocket、Clash。
Sub-Store主要功能
- 订阅转换
- 组合订阅
- 订阅过滤
- 订阅重命名
- 订阅排序
- 订阅同步
部署Sub-Store之前的准备
- 一台 VPS(配置不建议太低)
- 拥有自己的域名并且已经托管到了 CloudFlare(其它地方的也行,但是习惯了 CloudFlare,并且很良心也很方便)
- SSH 工具(强烈推荐 Termius)
Sub-Store部署过程
更新系统
sudo -i apt-get update && apt-get full-upgrade -y
如果系统里面没有 Docker,那么需要安装 Docker
安装 Docker
国外 vps:
curl -fsSL https://get.docker.com | bash -s docker
国内 vps:
curl -fsSL https://get.docker.com | bash -s docker –mirror Aliyun
如果想手动安装 Docker,请参照 官方文档
安装 Sub-Store 镜像
此处采用的是目前 Sub-Store 当前主要维护者之一 @xream(小一)的 docker 镜像
启动
数据文件夹: /root/sub-store-data
端口: 3001
监听: 127.0.0.1
后端前缀(API): /2cXaAxRGfddmGz2yx1wA
复制下面指令一键运行即可
可以将其中的 2cXaAxRGfddmGz2yx1wA 字段改为其它复杂字符串
本示例中演示的定时任务环境变量为
SUB_STORE_CRON
, 此时使用的是系统的crond
; 如果有问题, 可以使用SUB_STORE_BACKEND_CRON
, 此时将使用 Node 版node-cron
推送服务: https://api.day.app/XXXXXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive&icon=https%3A%2F%2Fraw.githubusercontent.com%2F58xinian%2Ficon%2Fmaster%2FSub-Store1.png
支持 Bark/PushPlus 等服务. 形如:
https://api.day.app/XXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive
或http://www.pushplus.plus/send?token=XXXXXXXXX&title=[推送标题]&content=[推送内容]&channel=wechat
的 URL,[推送标题]
和[推送内容]
会被自动替换.
全功能带通知版:
docker run -it -d --restart=always -e "SUB_STORE_PUSH_SERVICE=https://api.day.app/XXXXXXXXXXXX/[推送标题]/[推送内容]?group=SubStore&autoCopy=1&isArchive=1&sound=shake&level=timeSensitive&icon=https%3A%2F%2Fraw.githubusercontent.com%2F58xinian%2Ficon%2Fmaster%2FSub-Store1.png" -e "SUB_STORE_CRON=0 0 * * *" -e SUB_STORE_FRONTEND_BACKEND_PATH=/2cXaAxRGfddmGz2yx1wA -p 127.0.0.1:3001:3001 -v /root/sub-store-data:/opt/app/data --name sub-store xream/sub-store
不带通知版:
docker run -it -d --restart=always -e "SUB_STORE_CRON=0 0 * * *" -e SUB_STORE_FRONTEND_BACKEND_PATH=/2cXaAxRGfddmGz2yx1wA -p 3001:3001 -v /root/sub-store-data:/opt/app/data --name sub-store xream/sub-store
按照上面一键指令运行后的 sub-store 地址为:本地前端 + 本地后端 +API
http://127.0.0.1:3001?api=http://127.0.0.1:3001/2cXaAxRGfddmGz2yx1wA
Tips: 可以通过
docker help
查看 docker 的各项指令
docker stats
指令查看当前运行中的 docker 状态
如果你跟示例一样, 只监听了 127.0.0.1, 这样是无法从本地机器外使用 IP+ 端口 来访问容器内的服务的。
建议的做法是:
不要直接暴露容器的端口到宿主机, 而是设置反向代理。比如可以使用 Nginx 作为反代, 并配置域名访问容器内服务。
如果就是想直接通过 IP+ 端口访问, 可以在 docker run 时使用 -p 参数, 比如 -p 3001:3001 来将容器端口映射到宿主机端口。但是直接暴露端口有安全风险, 还是建议使用反向代理的方式。运行指令见不带通知版。如果设置了端口映射但是无法访问, 可以检查下面的常见情况:
• 使用 docker ps 查看容器是否正确启动并监听了端口。• 使用 lsof -i:3001 等命令检查宿主机上是否已占用目标端口。
• 检查本地防火墙规则, 是否屏蔽了访问的端口。
• 如果是远程访问, 检查网络安全组或云平台防火墙设置。
根据检查结果, 进一步排查并调整容器端口暴露或防火墙设置, 以允许访问容器服务。
域名设置:
在 cloudflare 的域名 DNS 记录里面添加两个 A 记录
用于前端的 substore:
substore.domain.com
用于后端(API)
subapi.domain.com
实际 A 记录的名字随意,只要你能区分就行
如下图例:
备注:后面的代理黄云勾不勾随意,如果你用其它第三方 ssl 证书可以不勾,如果用 CF 的证书就勾上。
nginx 部署过程
安装 nginx
sudo apt install nginx -y
编辑 nginx 配置
sudo vim /etc/nginx/sites-enabled/sub-store.conf
根据自己的前面域名设置将以下内容改好后复制进去并保存
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name substore.yourdomain.com; // 将此处改为你自己的域名 ssl_certificate /root/cert/ssl.pem; // 将此处改为你自己 ssl 公钥证书位置和名字 ssl_certificate_key /root/cert/ssl.key; // 将此处改为你自己 ssl 私钥 location / { proxy_pass http://127.0.0.1:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
编写完毕保存后输入:nginx -t
查看配置是否正确,并根据提示信息进行排查。
使用 CloudFlare 的 15 年 ssl 证书步骤
- 将域名托管到 cloudflare 后,将旁边那朵云点上变为黄色
- 在左侧的 SSL/TLS 栏目下概述中,将加密模式改为完全(严格)
- 点击左侧的源服务器,在源证书中选择创建证书
- 选择 RSA(2048),并创建证书
- 将随后出现的私钥和公钥,分别复制并保存下来
请注意,私钥仅显示一次,请务必保存好
- 打开 ssh 软件,并且链接上 VPS 后
- 创建文件夹 cert
mkdir cert
cd cert - 创建公钥文件
vim ssl.pem
- 将上面的 cloudflare 证书公钥内容粘贴进去并保存
- 创建私钥文件
vim ssl.key
- 将上面的 cloudflare 证书私钥内容粘贴进去并保存
至此整个 Docker 版的 sub-store 服务搭建完成。
访问的地址是
https://substore.yourdomain.com?api=https://substore.yourdomain.com/2cXaAxRGfddmGz2yx1wA
本教程编写过程中受到小一 @xream 大力指导,十分感谢。
如果在部署使用过程中有疑问,可以进他的 telegram 群 https://t.me/zhetengsha_group 交流沟通。
此种方法只使用了一个域名
如果想两个域名都用上
docker 那部分启动改为docker run -it -d –restart=always -p 127.0.0.1:3001:3001 -v /root/sub-store-data:/opt/app/data –name sub-store xream/sub-store
不使用Docker部署Sub-store
部署过程
域名设置
在cloudflare的域名DNS记录里面添加两个A记录,一个是substore.domain.com
,一个是subapi.domain.com
(实际A记录的名字随意,只要你能区分就行)
见下图例子:
备注:后面的代理黄云勾不勾随意,如果你用其它第三方ssl证书可以不勾,如果用CF的证书就勾上。
脚本的前端后端安装过程
ssh登陆到vps后,对vps进行常规升级和更新:
Tip:我是在新开的主机上进行部署,所以有更新和安装过程,如果你上面已经安装有相关的可以跳过
sudo apt update -y
安装 unzip wget git
sudo apt install unzip wget git -y
下载和安装 fnm (Node.js版本管理器)
curl -fsSL https://fnm.vercel.app/install | bash
看上一步的提示复制粘贴 不要抄下面的
根据上一步提示执行命令:
source /home/ubuntu/.bashrc
安装node.js
fnm install v16.13.2
安装 PNPM 软件包管理器
curl -fsSL https://get.pnpm.io/install.sh | sh –
根据上一步提示执行命令
看上一步的提示复制粘贴 不要抄下面的
source /home/ubuntu/.bashrc
创建Sub-store的安装文件夹并进入该文件夹
mkdir -p ~/Sub-Store cd ~/Sub-Store
下载前端页面压缩包并解压缩
wget https://github.com/xream/Sub-Store/releases/download/2.13.5-alpha/dist.zip -O frontend.zip unzip frontend.zip
将dist文件夹复制到相应目录,后面前端页面要用到
sudo cp -R dist /var/www/html/
注意:有些VPS如果直接执行上面操作会提示没有那个文件或者文件夹
解决办法是如上图所示切换到相应的目录去建立对应的文件夹然后再执行复制操作。
下载后端sub-store脚本
wget https://github.com/xream/Sub-Store/releases/download/2.13.5-alpha/sub-store.js -O sub-store-bundled.js
创建sub-store服务
Tip:经测试发现使用pm2时因为pid存在bug,而导致服务在直接重启VPS时不会自动启动,故改为创建sub-store服务并设置成开机自动启动
编辑 /home/ubuntu/Sub-Store/sub-store.service
里面对应的路径要根据实际情况改
vim /home/ubuntu/Sub-Store/sub-store.service
将以下内容复制进去,注意下里面的文件路径对应你自己的实际路径
本文都是在ubuntu这个用户下进行操作的,如果你是Debian或者root用户,记得修改其中对应的用户名以及文件路径
[Unit] Description=Sub-Store After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] LimitNOFILE=32767 Type=simple User=ubuntu Restart=on-failure RestartSec=5s ExecStartPre=/bin/sh -c ulimit -n 51200 ExecStart=/home/ubuntu/.local/share/fnm/fnm exec --using v16.13.2 node /home/ubuntu/Sub-Store/sub-store-bundled.js WorkingDirectory=/home/ubuntu/Sub-Store/ [Install] WantedBy=multi-user.target
将创建的服务加入到系统服务
sudo cp /home/ubuntu/Sub-Store/sub-store.service /etc/systemd/system/
重载服务:
sudo systemctl daemon-reload
设置成自动启动
sudo systemctl enable sub-store
启动服务:
sudo systemctl start sub-store
查看sub-store服务状态:
sudo systemctl status sub-store
安装设置nginx
安装nginx
sudo apt install nginx -y
编辑nginx配置
sudo vim /etc/nginx/sites-enabled/sub-store.conf
根据自己的前面域名设置将以下内容改好后复制进去并保存
⚠️注意:改完后需要将//后面的注释部份删除掉,否则下一步检查nginx配置可能会出错。
server { server_name subapi.domaim.com; //改成你自己的api域名 listen 80; location /eWVOSn8esAtDJLgTWBIi4VKL/{ //API-token也要根据需要修改,尽量复杂 proxy_pass http://127.0.0.1:3000/; } } server { listen 80; listen [::]:80; root /var/www/html/dist; index index.html index.htm; server_name substore.domain.com; ////改成你自己的sub域名 location / { try_files $uri $uri/ /index.html; } }
检查一下nginx的配置是否正确
sudo nginx -t
重载nginx配置,使更改的配置生效
sudo nginx -s reload
将端口放行
sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -F sudo netfilter-persistent save
tips:上述操作Oracle的VPS需要进行,可能一些不需要,自己根据情况进行使用
nginx的配置文件没有进行ssl证书设置,请自行搜索教程添加(小一大佬也没加我也不懂
至此整个安装部署过程就已经结束了,访问你的sub-store的地址是:
http://substore.domain.com/?api=http://subapi.domain.com/api-token
如果没有出错的话: