MiSub: 一款强大的开源订阅转换与聚合管理工具

前言

最近发现“赛博大善人” Cloudflare 貌似在内测 Cloudflare Snippets 功能,有可能后续都会开放!

官方说这只是付费用户的专属(仅对Pro、Business 和 Enterprise 计划免费提供),但我发现一些Free免费计划的域名竟然也能“白嫖”!想知道你是不是那个幸运儿吗?可以按以下路径检查:

  1. 登录 Cloudflare,选择你的域名。
  2. 导航至 规则 (Rules) → Snippets

如果你的界面如下图所示,那么恭喜你,可以抢先体验!我们下次会介绍如何将它与本次的项目结合,实现一个非常酷的功能,站在多位大佬的肩膀上。
Cloudflare Snippets

当然本文的主角是 MiSub ,一个我深度体验数月后极力推荐的强大订阅管理项目。 它由群内大佬开发,采用 Cloudflare 与 Vue 3 技术栈,创新地结合了订阅分组与 D1 数据库支持,完美解决了 KV 写入限制,让你能为自己或他人无忧地创建并分享高度定制化的订阅链接。 这篇博文将带你了解并完成它的整个部署过程。

MiSub 界面预览

MiSub 界面预览
MiSub 界面预览

应用特点

  • 强大的订阅分组 (Profiles)

    • 自由组合: 你可以建立任意数量的订阅组,例如「家庭共享」、「影音串流」、「游戏专用」等。
    • 精准控制: 每个组可以自由勾选包含哪些「机场订阅」和「手动节点」。
    • 专属连结: 每个订阅组都会生成一条独立的订阅连结,档名也会自动使用你的分组名称,分享和管理都极为清晰方便。
    • 全选/全不选: 在编辑分组时,可以一键选择或取消选择所有订阅和节点,操作便捷。
  • 订阅与节点分离管理

    • 我们将可线上更新的「机场订阅」和你手动新增的「单个节点」作为两种不同实体进行独立管理,逻辑清晰,互不干扰。
  • 智慧化的管理体验

    • 批量汇入: 一键贴上多个订阅连结或节点连结,系统会自动分类,分别存入「订阅」和「手动节点」列表。
    • 一键排序: 对大量手动节点感到头痛?一键即可按照地区(如 HK, TW, SG, US 等)自动排序。
    • 手动拖曳排序: 无论是机场订阅还是手动节点,都可以直接拖曳排序,调整其在最终订阅档中的顺序。
    • 流量与到期时间显示: 在订阅卡片上清晰地显示机场的已用/总流量以及订阅到期时间,并以不同颜色高亮提醒。
    • 自动获取节点资讯: 新增订阅或节点时,系统会自动从连结中提取名称。
  • 精致的 UI/UX

    • 支援明亮/暗黑模式,并能跟随系统自动切换,提供舒适的视觉体验。
    • 带有「磨砂玻璃」质感的现代化卡片设计,风格统一。
    • 对长列表(订阅和手动节点)提供分页功能,保证大量资料下的性能和可用性。
    • 完善的交互逻辑,如“你有未保存的变更”提示、“放弃更改”功能、模态框编辑、以及各种操作的载入状态提示,体验流畅。
  • 强大且易用的订阅连结生成

    • 一个面板,满足所有需求: 在右侧的「生成订阅连结」面板中,你可以一步完成“选择内容(分组或全部)”和“选择格式”。
    • 自适应连结: 提供一条通用连结,可智慧识别客户端类型 (Clash, Sing-Box 等) 并下发对应配置。
    • 多格式支援: 为 Clash, Sing-Box, Surge, Loon, Base64 等主流客户端和格式提供专属订阅连结。
  • 安全与客製化

    • 密码保护: 管理介面由你自订的管理员密码进行保护,确保你的数据安全。
    • 高度可客製化: 在设定中,你可以自订输出档名、subconverter 位址、TG 推播等多种选项。
    • 双重存储支持: 支持 Cloudflare KV 和 D1 数据库两种存储方式,可根据需求自由选择。
  • D1 数据库支持

    • 解决写入限制: D1 数据库没有 KV 的写入频率限制,适合频繁更新的场景。
    • 一键数据迁移: 内置迁移工具,可将现有 KV 数据无缝迁移到 D1。
    • 智能存储选择: 在设置中可以选择使用 KV 存储(默认)或 D1 数据库。
    • 性能优化: 针对不同存储类型进行了专门优化,确保最佳性能。
  • 技术栈

    • 前端: Vue 3 + Vite + Tailwind CSS,带来现代化、响应迅速的用户界面。
    • 后端: Cloudflare Pages Functions,实现无服务器、全球分布的后端逻辑。
    • 资料储存: Cloudflare KV + D1 数据库(双重支持),提供灵活、高效的数据存储方案。

部署指南

本项目天生为 Cloudflare Pages 设计,可以一键部署,享受全球 CDN 加速和无服务器的便利。

1. Fork 本仓库

首先打开 https://github.com/imzyb/MiSub 点击项目页面右上角 Star(点个星星!) 然后点击 Fork 按钮,将此项目复制到你自己的 GitHub 仓库中。

Fork 本仓库

2. 创建 Cloudflare Pages 项目

  1. 登录 Cloudflare 控制台,进入 Workers & Pages
    Workers & Pages
  2. 选择“创建应用程式” -> “Pages” -> “导入现有 Git 存储库”。
    导入现有 Git 存储库
  3. 选择你刚刚 Fork 的仓库。
    选择 Fork 的仓库
  4. “构建设置和部署” 页面,构建设定如下:
    • 框架预设: Vue (选择后,下方自动填写)
    • 构建命令: npm run build
    • 构建输出目录: dist
    • 点击“保存并部署”。
      构建部署

3. 绑定存储资源

存储类型选择指南

MiSub 提供 Cloudflare KV 和 D1 数据库两种存储方案,你可以根据自己的需求灵活选择:

特性 KV 存储 D1 数据库
写入限制 有限制(1000次/天) 无限制
查询速度 极快
适用场景 读多写少、配置简单 频繁更新、数据量大
配置复杂度 简单 中等
推荐使用 轻度使用、初次尝试 重度使用、追求无忧体验

如何选择:

  • 新用户: 建议直接配置 D1 数据库,避免后续遇到写入限制,省心无忧。
  • 现有用户: 如果遇到 KV 写入限制,可使用内置迁移工具迁移到 D1,提升使用体验。
  • 轻度使用: 如果你不频繁更新订阅和节点,KV 存储完全够用,且配置更为简单。
  • 重度使用: D1 数据库是最佳选择,提供无写入限制的流畅体验,适合管理大量订阅和节点。

3.1 绑定 KV 命名空间(必需)

  • 在项目创建完成后,首先去创建一个你自己的 KV 命名空间。
    创建 KV 命名空间

  • 创建完成,进入该项目的“设置” -> “绑定” -> “KV 命名空间”。

  • 变数名称 (Variable name): MISUB_KV

  • KV 命名空间 (KV namespace): 选择刚创建的 KV 命名空间。

绑定 KV 命名空间

3.2 绑定 D1 数据库(可选,推荐)

如果你希望使用 D1 数据库来避免 KV 写入限制,请按以下步骤操作:

创建 D1 数据库:

  • 创建 D1 数据库,名称随意,点击创建。
    创建 D1 数据库

创建数据库表结构:

  • 可以看到 你的数据库已成功创建! ,我们点击右上角的 Explore Data
    Explore Data
  • 来到 D1 数据库的 Query 界面,手动执行 schema.sql 中的 SQL 语句,原地址:https://github.com/imzyb/MiSub/blob/main/schema.sql 可以不用看原地址,我下面贴出来。
  • 创建第一个表,粘贴到 Query 编辑框中,然后点击蓝色 RUN 按钮。你应该能看到 左侧出现了一个 subscriptions 表,如下图,依次执行不在贴图。
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS subscriptions (
    id TEXT PRIMARY KEY,
    data TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );
    SQL
  • 创建第二个表,清空 Query 编辑框 的内容,执行下方所有的代码。
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS profiles (
    id TEXT PRIMARY KEY,
    data TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );
  • 创建第三个表,清空 Query 编辑框 的内容,执行下方所有的代码。
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS settings (
    key TEXT PRIMARY KEY,
    value TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );
  • 然后看左侧列表。 三张都齐了,最后,清空 Query 编辑框 的内容,执行下方所有的代码。
    1
    2
    3
    CREATE INDEX IF NOT EXISTS idx_subscriptions_updated_at ON subscriptions(updated_at);
    CREATE INDEX IF NOT EXISTS idx_profiles_updated_at ON profiles(updated_at);
    CREATE INDEX IF NOT EXISTS idx_settings_updated_at ON settings(updated_at);
    SQL
  • 这样你的 D1 数据库 就成功创建完成。

在项目设定中绑定 D1 数据库:

  • 进入项目的”设置” -> “绑定” -> “添加” -> “D1 数据库”
  • 变数名称 (Variable name): MISUB_DB
  • D1 数据库: 选择刚创建的数据库
    绑定 D1 数据库

4. 设定环境变数

在项目的“设定” -> “环境变数”中,添加以下两个生产环境变数:

  • ADMIN_PASSWORD
    • : 设定一个你自己的管理员登录密码。
      设定 ADMIN_PASSWORD
  • COOKIE_SECRET
    • : 设定一个用于加密 Cookie 的、足够长且随机的字串(例如,你可以使用密码产生器生成一个64位的随机字串)。随机密码生成器
      生成 64位的随机字串
      设定 COOKIE_SECRET

5. 部署完成!

完成以上设定后,回到“部署”选项卡,重新部署一次你的项目,使环境变量设置生效。现在,你的 MiSub 就可以通过 Cloudflare 提供所提供的域名访问了!你也可以自行设置自定义域名,更好记。
重新部署 使环境变量设置生效

简单使用

部署完成后,首要任务是进行全局设置。请打开你部署的 MiSub 项目地址,使用密码登录,然后点击右上角的“设置”按钮。

请务必先配置此处,因为这里的设置(如默认订阅格式、后端地址等)是所有功能的基石,并将作为最高优先级,被所有订阅组和订阅链接默认采用。

自定义订阅Token、订阅组分享Token

  • 简单来说,它就是让你给订阅链接自定义一个。 专属的、好记的“密码”或“名字” ,订阅组分享Token:比如,你给朋友一个链接。如果哪天不想让他用了,/zrfme/py 只需在后台改掉这个,这个名字为朋友,他手里的订阅链接就立刻失效了,而你自己的其他链接完全不受影响。

SubConverter后端地址

  • 后端地址默认是使用的肥羊的后端,我们可以自行设置一个 订阅转换前端后端 网站收集 这里的,都可以进行设置。你也可以使用我维护的 subapi.zrfme.com

数据迁移

  • 切换为 D1数据库 。(注意: 数据迁移是单向的,迁移后建议不要再切换回 KV 存储,以免数据不一致。)
  1. 配置 D1 数据库(参考上面的步骤 3.2,确保 D1 数据库已创建并绑定)。
  2. 登录管理界面,进入”设置”页面。
  3. 点击 迁移数据到 D1 数据 按钮。
  4. 确认迁移,系统会自动将数据从 KV 迁移到 D1。
  5. 迁移完成后,存储类型会自动切换为 D1 数据库。
    切换 D1数据库

Telegram Bot:

  • 设置成功后,每当 MiSub 自动或手动更新你的订阅时,它都会通过你自己创建的 Telegram 机器人,实时向你发送一条通知消息,你无需登录任何网站,只需看一眼 Telegram 消息,就能对自己的订阅状态了如指掌。

第一步:创建机器人并获取 Token

  1. 在 Telegram 中,搜索 @BotFather 并开始对话(这是官方用来创建和管理机器人的机器人)。
  2. 发送指令 /newbot 给它。
  3. 按照提示,依次为你的机器人取一个名字(例如 我的订阅助手)和一个用户名(必须以 bot 结尾,例如 zrfsub_bot)。
  4. 创建成功后,@BotFather 会发来一条包含 API Token 的消息。它是一长串字符,请完整复制下来,并且私聊一下你刚创建的机器人,避免收不到消息
    创建机器人并获取 Token

第二步:获取你的 Chat ID

  1. 在 Telegram 中,加入群组 https://t.me/lsmoo 并开始对话。
  2. 发送指令 /id@capoo_lottery_bot 给它。
  3. 机器人会立刻回复你的个人信息,其中就包含了你的 ID。它通常是一串数字,请复制下来。
    获取你的 Chat ID

第三步:在 MiSub 中填写信息

  1. 回到 MiSub 的设置页面。
  2. 找到 Telegram Bot 相关的输入框。
  3. 将刚刚复制的 Bot TokenChat ID 粘贴到对应的位置。
  4. 保存设置。
    在 MiSub 中填写信息

第四步:机器人订阅通知

  1. 随便使用一个软件,更新订阅地址,就可以收到订阅被访问的通知啦。这个还有流量使用提醒。
    机器人订阅通知

完结撒花!!!