🚀 一个基于 Node.js 的轻量级订阅链接管理系统,支持订阅转换、在线管理和持久化存储。
- 安全的登录系统,支持浏览器密码保存
- Session 持久化存储,服务器重启后保持登录状态
- 7天会话有效期,自动清理过期会话
- 在线添加、编辑、删除订阅链接
- 支持订阅状态切换(启用/禁用)
- 实时订阅数量统计
- 响应式设计,完美适配移动端
- 可视化配置管理界面
- 支持访问令牌、文件名称等配置项
- Telegram 通知配置(可选)
- 配置热更新,无需重启服务
- 支持多种客户端格式转换(Clash、Surge、SingBox等)
- 智能客户端识别
- 批量订阅合并
- 公开API,无需登录即可使用
- 后端: Node.js + Express 5.1.0
- 前端: 原生 HTML/CSS/JavaScript
- 存储: JSON 文件持久化
- 会话: session-file-store
- 包管理: pnpm
- Node.js 14.x 或更高版本
- pnpm(推荐)或 npm
-
克隆项目
git clone <repository-url> cd subx
-
安装依赖
pnpm install
-
配置系统
# 复制配置模板 cp data/config.template.json data/config.json # 编辑配置文件(可选) # 修改 data/config.json 中的相关配置
-
启动服务
pnpm start
-
访问系统
- 管理界面: http://localhost:3000/admin
- 默认密码:
admin123
- 访问 http://localhost:3000
- 输入管理员密码(默认:
admin123) - 点击登录进入管理界面
-
添加订阅
- 点击订阅列表右侧的"➕ 添加订阅"按钮
- 填写订阅名称、链接和描述
- 点击"添加订阅"保存
-
编辑订阅
- 点击订阅项目的"编辑"按钮
- 修改相关信息后保存
-
管理状态
- 使用"启用/禁用"按钮控制订阅状态
- 使用"删除"按钮移除不需要的订阅
- 点击右上角"⚙️ 系统配置"按钮
- 修改以下配置项:
- 访问令牌: 用于订阅转换API的身份验证
- 文件名称: 订阅文件的显示名称
- 更新间隔: 订阅自动更新的时间间隔
- 管理员密码: 登录系统的密码
- Telegram配置: 可选的通知功能
GET /{token}?参数=值
- Clash: 在URL中添加
?clash=1或使用Clash客户端User-Agent - Surge: 在URL中添加
?surge=1或使用Surge客户端User-Agent - SingBox: 在URL中添加
?sb=1或?singbox=1 - Quantumult X: 在URL中添加
?quanx=1 - Loon: 在URL中添加
?loon=1 - 其他: 默认返回SS格式
# Clash 格式
curl "http://localhost:3000/your-token?clash=1"
# SingBox 格式
curl "http://localhost:3000/your-token?singbox=1"
# 默认格式
curl "http://localhost:3000/your-token"subx/
├── data/ # 数据目录
│ ├── config.json # 实际配置文件(忽略提交)
│ ├── config.template.json # 配置模板
│ └── sessions/ # 会话存储目录
├── public/ # 静态文件
│ ├── index.html # 管理界面
│ └── login.html # 登录页面
├── database.js # 数据库管理类
├── index.js # 主服务器文件
├── package.json # 项目配置
└── README.md # 项目文档
{
"subscriptions": [...], // 订阅列表
"nextId": 4, // 下一个订阅ID
"config": {
"token": "your-api-token", // API访问令牌
"botToken": "telegram-bot-token", // Telegram Bot Token
"chatId": "telegram-chat-id", // Telegram Chat ID
"tg": 0, // Telegram功能开关
"fileName": "订阅文件名", // 订阅文件名称
"subUpdateTime": 6, // 更新间隔(小时)
"total": 99, // 总流量限制(TB)
"timestamp": 4102329600000, // 过期时间戳
"adminPassword": "admin123" // 管理员密码
}
}pnpm start-
使用PM2
npm install -g pm2 pm2 start index.js --name subx
-
使用Docker
FROM node:16-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["node", "index.js"]
-
Nginx反向代理
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
支持通过环境变量覆盖配置:
PORT=3000 # 服务端口
TOKEN=your-token # API令牌
TGTOKEN=telegram-bot-token # Telegram Bot Token
TGID=telegram-chat-id # Telegram Chat ID
TG=1 # 启用Telegram通知
SUBNAME=订阅名称 # 订阅文件名称
SUBAPI=订阅转换API地址 # 自定义转换API
SUBCONFIG=配置文件URL # 自定义配置文件-
配置文件保护
data/config.json已加入.gitignore- 包含敏感信息,请妥善保管
-
访问控制
- 管理界面需要登录验证
- 订阅转换API为公开接口
- 定期更改管理员密码
-
会话安全
- 使用httpOnly Cookie
- 7天会话过期
- 自动清理过期会话
A: 编辑 data/config.json 文件,修改 config.adminPassword 字段,然后重启服务。
A: 备份整个 data/ 目录即可,包含所有配置和会话信息。
A: 正常情况下不需要,系统使用文件存储会话。如果仍需重新登录,请检查 data/sessions/ 目录权限。
A: 设置环境变量 SUBAPI=your-api-domain.com 或在配置中修改 subConverter。
- Fork 本项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
本项目采用 ISC 协议开源,详见 LICENSE 文件。
感谢所有为此项目做出贡献的开发者!
如有问题或建议,欢迎提交 Issue 或 Pull Request! 🎉