SublinkPro 是基于优秀的开源项目 sublinkX / sublinkE 进行二次开发,在原项目基础上做了部分定制优化。感谢原作者的付出与贡献。
- 🎨 前端框架:基于 Berry Free React Material UI Admin Template
- ⚡ 后端技术:Go + Gin + Gorm
- 🔐 默认账号:
admin/123456(请安装后务必修改) - 💻 演示系统: https://sublink-pro-demo.zeabur.app 用户名:admin 密码:123456
Warning
| 状态 | 功能描述 |
|---|---|
| ✅ | 修复部分页面BUG |
| ✅ | 支持 Clash dialer-proxy 属性 |
| ✅ | 允许添加并使用 API KEY 访问 API |
| ✅ | 导入、定时更新订阅链接中的节点(可通过前置代理订阅) |
| ✅ | 支持 AnyTLS、Socks5 协议 |
| ✅ | 订阅节点排序 |
| ✅ | 全新 UI,交互和操作便捷性大大提升,移动端友好 |
| 🔄 | 更多功能持续开发中... |
|
|
|
|
|
|
SublinkPro 的自动标签系统是本项目最强大的功能之一,让节点管理从「手动编辑」升级为「规则驱动」。
| 优势 | 说明 |
|---|---|
| 🚫 零代码筛选 | 通过标签规则给节点打标签后,订阅可直接使用标签进行复杂条件筛选,无需编写任何代码或脚本 |
| 🔄 动态自动化 | 标签随节点状态自动更新,例如测速后延迟变高的节点会自动从「低延迟」标签中移除 |
| 📊 多维度分类 | 支持按延迟、速度、国家、协议、来源、节点名等多种条件组合打标签 |
| 🎛️ 灵活运算符 | 支持等于、包含、大于、小于、正则匹配等丰富的条件运算符 |
| ♻️ 互斥组管理 | 同一互斥组内的标签自动替换,确保节点分类唯一且清晰 |
场景一:按延迟分级
├── 规则:延迟 < 100ms → 标签「⚡极速」
├── 规则:延迟 100-300ms → 标签「✅正常」
└── 规则:延迟 > 300ms → 标签「🐌较慢」
场景二:按地区分类
├── 规则:国家 = 香港 → 标签「🇭🇰香港」
├── 规则:国家 = 日本 → 标签「🇯🇵日本」
└── 规则:国家 = 美国 → 标签「🇺🇸美国」
场景三:订阅筛选(无需编码!)
├── 订阅A:标签白名单 = 「⚡极速」「🇭🇰香港」→ 只返回香港极速节点
└── 订阅B:标签黑名单 = 「🐌较慢」→ 排除所有慢速节点
Tip
标签互斥组使用场景:创建「优秀」、「良好」、「差」三个标签并设为同组「速度评级」,测速时节点只会保留最新的评级,避免标签堆积。
SublinkPro 提供专业级的节点测速功能,采用科学的测试方法确保结果准确可靠。
| 特点 | 说明 |
|---|---|
| 双阶段分离测试 | 延迟测试与下载速度测试分开进行,各自使用最适合的测试URL和方法 |
| 智能延迟测量 | 支持 UnifiedDelay 模式,可选择包含或排除握手时间(系统自动发送两次请求取第二次结果) |
| 独立并发设置 | 延迟测试和速度测试可分别配置不同的并发数,平衡效率与精度 |
| 状态自动标记 | 测速完成后自动根据结果更新节点的延迟状态和速度状态 |
| 实时进度展示 | 测速过程中实时显示进度和状态,支持任务面板查看 |
| 流量统计 | 每个节点测速完成后记录消耗流量,任务完成时汇总显示 |
| 颜色 | 延迟阈值 | 速度阈值 |
|---|---|---|
| 🟢 绿色 | < 200ms | >= 5 MB/s |
| 🟡 黄色 | 200-500ms | 1-5 MB/s |
| 🔴 红色 | >= 500ms 或超时/失败 | < 1 MB/s 或失败 |
| ⚪ 灰色 | 未测试 | 未测试 |
Important
核心原理:测速采用「限时下载」方式,即在设定的超时时间内尽可能多地下载数据,然后根据实际下载的字节数和耗时计算速度。
速度计算公式:
速度 (MB/s) = 实际下载字节数 ÷ 1024 ÷ 1024 ÷ 实际耗时(秒)
常见疑问:
| 现象 | 原因 |
|---|---|
| 设置 5MB 测速文件,但实际下载不到 5MB | 节点速度慢,在超时时间内未下载完 |
| 有的节点下载 500KB,有的下载 5MB | 速度快的节点在超时前下载完成,慢的节点下载不完 |
| 流量消耗显示几百KB | 节点速度约为 100KB/s × 超时时间(秒) |
示例(假设超时时间为 5 秒):
| 节点速度 | 实际下载量 | 计算结果 |
|---|---|---|
| 10 MB/s | 5 MB(提前完成) | 速度 ≈ 10 MB/s |
| 1 MB/s | 5 MB | 速度 = 1 MB/s |
| 0.2 MB/s | 1 MB | 速度 = 0.2 MB/s |
| 0.1 MB/s | 500 KB | 速度 = 0.1 MB/s |
| 参数 | 说明 | 建议值 |
|---|---|---|
| 测速超时时间 | 每个节点测速的最大时长 | 5-10秒(平衡速度与准确性) |
| 测速文件 URL | 用于下载测速的文件地址 | 建议 ≥ 超时时间 × 预期最大速度 |
| 延迟测试 URL | 用于延迟测试的地址 | 建议使用 HTTP 204 或小文件,如 Cloudflare 的 generate_204 |
| 延迟测试并发 | 同时进行延迟测试的节点数 | 10-50(可适当调高) |
| 速度测试并发 | 同时进行速度测试的节点数 | 1-3(避免带宽竞争) |
Tip
测速文件大小建议:如果超时时间为 5 秒,预期最快节点为 20 MB/s,则测速文件应 ≥ 100MB。推荐使用 Cloudflare 的测速 URL:https://speed.cloudflare.com/__down?bytes=100000000(100MB)【
Warning
流量消耗提示:每次测速会消耗实际带宽流量。100个节点 × 5MB 测速文件 = 最多消耗 500MB 流量。慢速节点消耗较少,但快速节点会下载完整文件。
| 客户端 | 支持协议 |
|---|---|
| v2ray | base64 通用格式 |
| clash | ss, ssr, trojan, vmess, vless, hy, hy2, tuic, AnyTLS, Socks5 |
| surge | ss, trojan, vmess, hy2, tuic |
| 模块 | 功能说明 |
|---|---|
| 📊 仪表盘 | 系统概览、节点统计、协议分布、地区分布、标签分布等可视化图表 |
| 🌐 节点管理 | 节点增删改查、批量操作、条件筛选、标签管理、测速操作 |
| 📋 订阅管理 | 订阅链接生成、模板配置、节点筛选规则、访问日志、定时更新 |
| 🏷️ 标签管理 | 标签创建编辑、自动规则配置、互斥组设置、批量打标签 |
| 📝 模板管理 | Clash/Surge 配置模板、规则组管理、ACL4SSR 规则同步 |
| 🔗 Host 管理 | 自定义域名 IP 映射、DNS 服务器配置、测速自动持久化、有效期管理 |
| 📜 脚本管理 | JavaScript 脚本编辑、节点过滤脚本、内容后处理脚本 |
| 🔑 API Key | API 密钥管理、权限控制、访问统计 |
| ⚙️ 系统设置 | 通知配置、测速配置、安全设置、用户管理、数据备份 |
- ✅ Token 授权访问控制
- ✅ API Key 独立权限管理
- ✅ IP 黑/白名单过滤
- ✅ 订阅访问日志记录
- ✅ 操作审计追踪
- ✅ PushDeer 推送
- ✅ Bark 推送
- ✅ 钉钉机器人
- ✅ 方糖 (Server酱)
- ✅ 订阅更新通知
- ✅ 测速完成通知
- ✅ IP 地理位置查询
- ✅ 节点落地国家/地区检测
- ✅ 登录位置信息显示
- ✅ 支持代理下载数据库
- ✅ 可通过界面配置下载地址
Note
GeoIP 数据库不再内置在程序中,系统首次启动时会引导用户下载。数据库必须是 MaxMind 的 mmdb 格式且包含 city 数据 (GeoLite2-City)。
自定义 Host 映射功能,类似于系统 hosts 文件,可为指定域名设置固定 IP 地址。
| 特点 | 说明 |
|---|---|
| 全局生效 | Host 映射在测速、导入订阅、Telegram 机器人等所有代理相关操作中自动生效 |
| 订阅地址替换 | 订阅可开启「替换服务器地址为 Host」,将节点域名自动替换为已配置的 Host IP |
| DNS 服务器 | 支持自定义 DNS 服务器(DoH、UDP),可选择是否通过代理节点解析 |
| 测速持久化 | 测速时自动将 DNS 解析结果保存为 Host 映射,避免重复解析 |
| 文本编辑模式 | 支持类 hosts 文件格式批量编辑,每行 域名 IP # 备注 |
| 有效期管理 | 自动创建的 Host 可设置有效期,过期自动清理 |
| 固定功能 (Pin) | 重要 Host 可固定,避免被过期清理 |
场景一:CDN 优选
├── 将 CF 节点域名映射到优选 IP
└── 测速后自动保存最佳解析结果
场景二:DNS 污染绕过
├── 手动设置被污染域名的正确 IP
└── 所有代理操作使用正确解析
场景三:批量导入
├── 使用文本模式一次性编辑多条映射
└── 格式:example.com 192.168.1.1 # 备注
Tip
测速 Host 持久化:开启后,测速时会自动将代理节点的域名与解析到的 IP 保存到 Host 表。推荐配合有效期设置使用,避免 Host 数据无限增长。
Note
DNS 代理设置:可配置 DNS 解析是否通过代理,支持自动选择可用代理或手动指定代理节点。适用于解析被墙域名的场景。
SublinkPro 内置了强大的 Telegram 机器人,让您可以通过 Telegram 随时随地管理您的系统。
| 功能 | 命令 | 说明 |
|---|---|---|
| 📊 仪表盘统计 | /stats |
查看系统概览、订阅数、节点在线情况、最快/最慢节点等 |
| 🖥️ 系统监控 | /monitor |
实时查看服务器 CPU、内存使用率、运行时间等 |
| ⚡ 远程测速 | /speedtest |
远程触发定时测速任务,或仅对未测速节点进行测试 |
| 📋 订阅管理 | /subscriptions |
查看所有订阅,一键生成临时访问链接(支持自定义域名) |
| 🌐 节点管理 | /nodes |
查看节点总数、在线数及地区分布详情 |
| 🏷️ 标签规则 | /tags |
手动触发自动标签规则,立即更新节点标签 |
| 📝 任务管理 | /tasks |
查看当前正在运行的后台任务,支持远程取消任务 |
-
创建机器人:
- 在 Telegram 中搜索 @BotFather
- 发送
/newbot创建新机器人,获取 Bot Token
-
系统配置:
- 进入 SublinkPro 「系统设置」 -> 「Telegram 设置」
- 填入 Bot Token
- (可选) 配置 代理设置,如果您的服务器无法直接访问 Telegram API
- (可选) 配置 远程访问域名,用于机器人生成可访问的订阅链接
-
绑定管理员:
- 在配置页面启用机器人并保存
- 向您的机器人发送
/start命令 - 系统会自动识别并绑定您的 Chat ID
Tip
订阅链接生成:机器人生成的订阅链接会自动使用您配置的「远程访问域名」。为了安全起见,生成的链接带有临时的这个 Token,建议按需生成。
Tip
推荐使用 Docker Compose 部署,便于管理配置、升级和维护。
创建 docker-compose.yml 文件:
services:
sublinkpro:
# image: zerodeng/sublink-pro:dev # 开发版(功能尝鲜使用)
image: zerodeng/sublink-pro # 稳定版
container_name: sublinkpro
ports:
- "8000:8000"
volumes:
- "./db:/app/db"
- "./template:/app/template"
- "./logs:/app/logs"
restart: unless-stopped启动服务:
docker-compose up -d稳定版
docker run --name sublinkpro -p 8000:8000 \
-v $PWD/db:/app/db \
-v $PWD/template:/app/template \
-v $PWD/logs:/app/logs \
-d zerodeng/sublink-pro开发版(功能尝鲜)
docker run --name sublinkpro -p 8000:8000 \
-v $PWD/db:/app/db \
-v $PWD/template:/app/template \
-v $PWD/logs:/app/logs \
-d zerodeng/sublink-pro:devwget https://raw.githubusercontent.com/ZeroDeng01/sublinkPro/refs/heads/main/install.sh && sh install.shNote
安装脚本支持以下功能:
- 全新安装:首次安装时自动完成所有配置
- 更新程序:检测到已安装时,可选择更新(保留所有数据)
- 重新安装:可选择是否保留现有数据
- 恢复安装:检测到旧数据时,可选择恢复安装
wget https://raw.githubusercontent.com/ZeroDeng01/sublinkPro/refs/heads/main/uninstall.sh && sh uninstall.shNote
卸载脚本会询问是否保留数据目录(db、logs、template),选择保留可用于后续重新安装时恢复数据。
Tip
推荐优先使用 Docker Compose 部署 以获得最佳兼容性和便捷的更新体验。
如果您使用一键脚本安装,可以再次运行安装脚本进行更新:
wget https://raw.githubusercontent.com/ZeroDeng01/sublinkPro/refs/heads/main/install.sh && sh install.sh脚本会自动检测已安装的版本,并提供以下选项:
- 更新程序:保留所有数据,仅更新程序文件
- 重新安装:可选择是否保留数据
如果您使用 Docker Compose 部署,可以通过以下命令手动更新:
# 进入 docker-compose.yml 所在目录
cd /path/to/your/sublinkpro
# 拉取最新镜像
docker-compose pull
# 重新创建并启动容器
docker-compose up -d
# (可选)清理旧镜像
docker image prune -f如果您使用 docker run 命令部署,可以通过以下步骤更新:
# 停止并删除旧容器
docker stop sublinkpro
docker rm sublinkpro
# 拉取最新镜像
docker pull zerodeng/sublink-pro
# 重新启动容器(使用与安装时相同的参数)
docker run --name sublinkpro -p 8000:8000 \
-v $PWD/db:/app/db \
-v $PWD/template:/app/template \
-v $PWD/logs:/app/logs \
-d zerodeng/sublink-pro
# (可选)清理旧镜像
docker image prune -fWatchtower 是一个可以自动更新 Docker 容器的工具,非常适合希望保持项目始终最新的用户。
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--interval 86400 \
sublinkproNote
--cleanup:更新后自动清理旧镜像--interval 86400:每 24 小时检查一次更新(单位:秒)- 最后的
sublinkpro是要监控更新的容器名称,不指定则监控所有容器
在您的 docker-compose.yml 中添加 Watchtower 服务:
services:
sublinkpro:
image: zerodeng/sublink-pro
container_name: sublinkpro
ports:
- "8000:8000"
volumes:
- "./db:/app/db"
- "./template:/app/template"
- "./logs:/app/logs"
restart: unless-stopped
watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Asia/Shanghai
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400
restart: unless-stopped
command: sublinkpro # 只监控 sublinkpro 容器启动服务:
docker-compose up -dTip
Watchtower 高级配置:
- 可以设置
WATCHTOWER_NOTIFICATIONS环境变量来配置更新通知(支持邮件、Slack、Gotify 等) - 更多配置请参考 Watchtower 官方文档
SublinkPro 支持多种配置方式,优先级从高到低为:
- 命令行参数 - 适用于临时覆盖,如
--port 9000 - 环境变量 - 推荐用于 Docker 部署
- 配置文件 -
db/config.yaml - 数据库存储 - 敏感配置自动存储
- 默认值 - 程序内置默认配置
| 环境变量 | 说明 | 默认值 |
|---|---|---|
SUBLINK_PORT |
服务端口 | 8000 |
SUBLINK_DB_PATH |
数据库目录 | ./db |
SUBLINK_LOG_PATH |
日志目录 | ./logs |
SUBLINK_JWT_SECRET |
JWT签名密钥 | (自动生成) |
SUBLINK_API_ENCRYPTION_KEY |
API加密密钥 | (自动生成) |
SUBLINK_EXPIRE_DAYS |
Token过期天数 | 14 |
SUBLINK_LOGIN_FAIL_COUNT |
登录失败次数限制 | 5 |
SUBLINK_LOGIN_FAIL_WINDOW |
登录失败窗口(分钟) | 1 |
SUBLINK_LOGIN_BAN_DURATION |
登录封禁时间(分钟) | 10 |
SUBLINK_GEOIP_PATH |
GeoIP数据库路径 | ./db/GeoLite2-City.mmdb |
SUBLINK_ADMIN_PASSWORD |
初始管理员密码 | 123456 |
SUBLINK_ADMIN_PASSWORD_REST |
重置管理员密码 | 输入新管理员密码 |
# 查看帮助
./sublinkpro help
# 指定端口启动
./sublinkpro run --port 9000
# 指定数据库目录
./sublinkpro run --db /data/db
# 重置管理员密码
./sublinkpro setting -username admin -password newpassTip
JWT Secret 和 API 加密密钥 是敏感配置,系统会按以下方式处理:
- 优先从环境变量读取
- 如未设置环境变量,从数据库读取
- 如数据库也没有,自动生成随机密钥并存储到数据库
特别说明:如果您通过环境变量设置了这些值,系统会自动同步到数据库。这样即使后续忘记设置环境变量,系统也能从数据库恢复,方便迁移部署。
Warning
如果您需要多实例部署或集群部署,请务必通过环境变量设置相同的 SUBLINK_JWT_SECRET 和 SUBLINK_API_ENCRYPTION_KEY,以确保各实例间的登录状态和 API Key 一致。
services:
sublinkpro:
image: zerodeng/sublink-pro:latest
container_name: sublinkpro
ports:
- "8000:8000"
volumes:
- "./db:/app/db"
- "./template:/app/template"
- "./logs:/app/logs"
environment:
- SUBLINK_PORT=8000
- SUBLINK_EXPIRE_DAYS=14
- SUBLINK_LOGIN_FAIL_COUNT=5
# GeoIP 数据库路径(可选,默认为 ./db/GeoLite2-City.mmdb)
# - SUBLINK_GEOIP_PATH=/app/db/GeoLite2-City.mmdb
# 敏感配置(可选,不设置则自动生成)
# - SUBLINK_JWT_SECRET=your-secret-key
# - SUBLINK_API_ENCRYPTION_KEY=your-encryption-key
restart: unless-stoppedNote
完整的 Docker Compose 模板请参考项目根目录的 docker-compose.example.yml 文件。
SublinkPro 支持使用 JavaScript 脚本对订阅内容进行自定义处理。
在生成订阅内容之前执行,用于对节点列表进行过滤或修改。
查看函数签名与示例
函数签名:
function filterNode(nodes, clientType) {
// nodes: 节点对象数组
// clientType: 客户端类型 (v2ray, clash, surge)
// 返回值: 修改后的节点对象数组
return nodes;
}示例:
function filterNode(nodes, clientType) {
// 过滤掉名称包含 "测试" 的节点
var newNodes = [];
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].Name.indexOf("测试") === -1) {
newNodes.push(nodes[i]);
}
}
return newNodes;
}在生成最终订阅内容之后执行,用于对最终的文本内容进行修改。
查看函数签名与示例
函数签名:
function subMod(input, clientType) {
// input: 原始输入内容
// clientType: 客户端类型
// 返回值: 修改后的内容字符串
return input;
}Note
- 脚本中可以使用
console.log()输出日志到后台 - 多个脚本会按照排序顺序依次执行
- 脚本支持的函数请查看 📚 脚本文档
欢迎参与 SublinkPro 的开发!以下是项目结构和开发相关说明。
sublinkPro/
├── 📂 api/ # API 接口层
│ ├── node.go # 节点相关 API
│ ├── sub.go # 订阅相关 API
│ ├── tag.go # 标签相关 API
│ ├── template.go # 模板相关 API
│ ├── setting.go # 设置相关 API
│ └── ...
├── 📂 models/ # 数据模型层
│ ├── node.go # 节点模型
│ ├── subcription.go # 订阅模型
│ ├── tag.go # 标签模型
│ ├── template.go # 模板模型
│ ├── db_migrate.go # 数据库迁移
│ └── ...
├── 📂 services/ # 业务服务层
│ ├── scheduler.go # 定时任务调度器
│ ├── tag_service.go # 标签服务
│ ├── 📂 geoip/ # GeoIP 服务
│ ├── 📂 mihomo/ # Mihomo 核心服务
│ └── 📂 sse/ # Server-Sent Events
├── 📂 routers/ # 路由定义
│ ├── node.go # 节点路由
│ ├── tag.go # 标签路由
│ └── ...
├── 📂 node/ # 节点协议解析
│ ├── sub.go # 订阅链接解析
│ └── 📂 protocol/ # 各协议解析器
├── 📂 utils/ # 工具函数
│ ├── speedtest.go # 测速工具
│ ├── node_renamer.go # 节点重命名工具
│ ├── script_executor.go # 脚本执行器
│ └── ...
├── 📂 middlewares/ # 中间件
├── 📂 constants/ # 常量定义
├── 📂 database/ # 数据库连接
├── 📂 cache/ # 缓存管理
├── 📂 dto/ # 数据传输对象
├── 📂 webs/ # 前端代码 (React)
│ └── 📂 src/
│ ├── 📂 api/ # API 调用
│ ├── 📂 views/ # 页面视图
│ │ ├── 📂 dashboard/ # 仪表盘
│ │ ├── 📂 nodes/ # 节点管理
│ │ ├── 📂 subscriptions/ # 订阅管理
│ │ ├── 📂 tags/ # 标签管理
│ │ ├── 📂 templates/ # 模板管理
│ │ ├── 📂 hosts/ # Host 映射管理
│ │ └── 📂 settings/ # 系统设置
│ ├── 📂 components/ # 公共组件
│ ├── 📂 contexts/ # React Context
│ ├── 📂 hooks/ # 自定义 Hooks
│ ├── 📂 themes/ # 主题配置
│ └── 📂 layout/ # 布局组件
├── 📂 template/ # 订阅模板文件
├── 📂 docs/ # 文档
├── main.go # 程序入口
├── go.mod # Go 依赖管理
├── Dockerfile # Docker 构建文件
└── README.md # 项目说明
| 层级 | 技术 |
|---|---|
| 后端框架 | Go + Gin |
| ORM | GORM |
| 数据库 | SQLite |
| 前端框架 | React 18 + Vite |
| UI 组件库 | Material UI (MUI) |
| 状态管理 | React Context |
| 构建工具 | Vite |
git clone https://github.com/ZeroDeng01/sublinkPro.git
cd sublinkPro# 安装 Go 依赖
go mod download
# 运行后端(开发模式)
go run main.go# 进入前端目录
cd webs
# 安装依赖
yarn install
# 启动开发服务器
yarn run run start# 构建前端
cd webs && yarn run build
# 构建后端(嵌入前端资源)
go build -o sublinkpro main.go- 代码风格:后端遵循 Go 官方规范,前端使用 ESLint + Prettier
- 提交规范:使用语义化提交信息(feat/fix/docs/refactor 等)
- 分支管理:
main为稳定分支,dev为开发分支 - API 设计:RESTful 风格,统一响应格式
| 模块 | 文件 | 说明 |
|---|---|---|
| 节点测速 | services/scheduler.go |
包含延迟测试、速度测试的核心逻辑 |
| 标签规则 | services/tag_service.go |
自动标签规则的执行与匹配 |
| 订阅生成 | api/clients.go |
订阅链接的生成与节点筛选 |
| 协议解析 | node/protocol/*.go |
各种代理协议的解析实现 |
| Host 管理 | models/host.go |
Host 映射 CRUD、批量操作、缓存管理 |
| DNS 解析 | services/mihomo/resolver.go |
自定义 DNS 服务器与代理解析 |
| 数据迁移 | models/db_migrate.go |
数据库版本升级迁移脚本 |
如果这个项目对您有帮助,欢迎:
- ⭐ Star 这个项目表示支持
- 🐛 提交 Issue 反馈问题或建议
- 🔧 提交 Pull Request 贡献代码
- 📖 完善文档和使用教程
感谢以下项目的开源贡献:
- sublinkX / sublinkE - 原始项目
- Berry Free React Admin Template - 前端模板
- Mihomo - 代理核心









