这是一个基于 Cloudflare Workers 和 Supabase 的节点订阅管理系统,支持节点自动上传、聚合管理、订阅生成等功能。
- ✅ 完全免费部署(使用 Cloudflare Workers 免费套餐)
- ✅ 自动节点管理和过期清理
- ✅ 支持自定义节点和订阅链接聚合
- ✅ 关键词过滤功能
- ✅ 优选 IP 和端口自动替换
- ✅ 响应式 Web 管理界面
- 支持节点自动上传和更新
- 自动清理过期节点
- 节点列表查看和单独删除
- 手动添加自定义节点
- 支持订阅链接聚合
- 支持 v2ray 格式节点
- 支持添加关键词过滤规则
- 自动过滤包含关键词的节点
- 支持批量管理过滤规则
- 自动生成订阅链接
- 支持优选 IP 和端口替换
- Base64 编码输出
- 访问 Cloudflare
- 注册并登录账号
- 访问 Supabase
- 注册并登录账号
- 创建新项目
在 Supabase 项目的 SQL Editor 中执行以下 SQL:
-- 创建URLs表(自动上传的节点)
CREATE TABLE IF NOT EXISTS urls (
id BIGSERIAL PRIMARY KEY,
url_name TEXT NOT NULL,
url TEXT NOT NULL,
last_update BIGINT NOT NULL,
expiration_ttl INTEGER NOT NULL
);
-- 创建自定义节点表
CREATE TABLE IF NOT EXISTS sub2_urls (
id BIGSERIAL PRIMARY KEY,
url TEXT NOT NULL
);
-- 创建关键词过滤表
CREATE TABLE IF NOT EXISTS exclude_keywords (
id BIGSERIAL PRIMARY KEY,
keyword TEXT NOT NULL
);
-- 创建背景图片表
CREATE TABLE IF NOT EXISTS background_images (
id BIGSERIAL PRIMARY KEY,
image_url TEXT NOT NULL,
created_at BIGINT DEFAULT EXTRACT(EPOCH FROM NOW())::BIGINT
);
-- 初始化所有表的函数
CREATE OR REPLACE FUNCTION init_tables()
RETURNS void AS $$
BEGIN
CREATE TABLE IF NOT EXISTS urls (
id BIGSERIAL PRIMARY KEY,
url_name TEXT NOT NULL,
url TEXT NOT NULL,
last_update BIGINT NOT NULL,
expiration_ttl INTEGER NOT NULL
);
CREATE TABLE IF NOT EXISTS sub2_urls (
id BIGSERIAL PRIMARY KEY,
url TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS exclude_keywords (
id BIGSERIAL PRIMARY KEY,
keyword TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS background_images (
id BIGSERIAL PRIMARY KEY,
image_url TEXT NOT NULL,
created_at BIGINT DEFAULT EXTRACT(EPOCH FROM NOW())::BIGINT
);
END;
$$ LANGUAGE plpgsql;
-- 删除过期URLs的函数
CREATE OR REPLACE FUNCTION delete_expired_urls(expired_time BIGINT)
RETURNS void AS $$
BEGIN
DELETE FROM urls WHERE last_update < expired_time;
END;
$$ LANGUAGE plpgsql;
-- 删除所有URLs的函数
CREATE OR REPLACE FUNCTION delete_all_urls()
RETURNS void AS $$
BEGIN
DELETE FROM urls;
END;
$$ LANGUAGE plpgsql;
-- 删除所有SUB2 URLs的函数
CREATE OR REPLACE FUNCTION delete_all_sub2_urls()
RETURNS void AS $$
BEGIN
DELETE FROM sub2_urls;
END;
$$ LANGUAGE plpgsql;
-- 删除所有关键词的函数
CREATE OR REPLACE FUNCTION delete_all_keywords()
RETURNS void AS $$
BEGIN
DELETE FROM exclude_keywords;
END;
$$ LANGUAGE plpgsql;
-- 删除所有背景图片的函数
CREATE OR REPLACE FUNCTION delete_all_background_images()
RETURNS void AS $$
BEGIN
DELETE FROM background_images;
END;
$$ LANGUAGE plpgsql;
- 登录 Supabase 控制台
- 进入项目设置(Settings)
- 点击 API 选项
- 复制以下信息:
Project URL(SUPABASE_URL)anon public key(SUPABASE_ANON_KEY)
- 登录 Cloudflare 控制台
- 进入 Workers & Pages
- 点击「创建应用程序」
- 选择「创建 Worker」
- 给 Worker 命名(例如:sub-manager)
- 点击「部署」
- 点击「编辑代码」
- 删除默认代码
- 复制完整的 worker.js 代码并粘贴
- 点击「保存并部署」
- 返回 Worker 设置页面
- 点击「设置」标签
- 找到「变量」部分
- 添加以下环境变量:
| 变量名 | 类型 | 值 | 说明 |
|---|---|---|---|
PSWD |
加密 | 你的登录密码 | 登录密码,建议使用强密码 |
SUPABASE_URL |
文本 | 你的项目URL | 从 Supabase 复制 |
SUPABASE_ANON_KEY |
加密 | 你的匿名密钥 | 从 Supabase 复制 |
- 点击「保存」
在代码顶部的 CONFIG 对象中修改以下参数:
const CONFIG = {
UUID: 'your-uuid', // 管理页面访问路径
APITOKEN: 'your-api-token', // API路径密钥(建议使用随机字符串)
UP: 'your-upload-key', // 节点上传密钥
TOKEN: 'your-sub-token', // 订阅地址密钥
USER: 'admin', // 登录用户名
DEFAULT_DOMAIN: '', // 默认即可
EXPIRATION_TIME: 1200, // 链接有效期(秒)
MAX_LOGIN_ATTEMPTS: 3, // 最大登录尝试次数
BACKGROUND_IMAGE: 'https://example.com/bg1.jpg;https://example.com/bg2.jpg' // 背景图片URL,多个用分号隔开
};安全建议:
UUID: 使用随机字符串,例如:a1b2c3d4APITOKEN: 使用长随机字符串,例如:sk_live_1234567890abcdefUP: 使用随机字符串,例如:upload_xyz789TOKEN: 使用随机字符串,例如:sub_abc123
- 修改完配置后,点击「保存并部署」
- 等待部署完成
| 参数 | 说明 | 示例 |
|---|---|---|
UUID |
管理页面访问路径 | 访问地址为:https://your-worker.workers.dev/sub-your-uuid |
APITOKEN |
API路径密钥 | 用于保护管理接口,不会暴露给前端 |
UP |
节点上传密钥 | 上传地址为:https://your-worker.workers.dev/upload-your-upload-key |
TOKEN |
订阅地址密钥 | 订阅地址为:https://your-worker.workers.dev/token=your-sub-token?cf_ip=...&cf_port=... |
USER |
登录用户名 | 管理页面登录用户名 |
EXPIRATION_TIME |
节点有效期 | 单位:秒,超过此时间未更新的节点会被自动删除 |
MAX_LOGIN_ATTEMPTS |
最大登录尝试次数 | 超过次数后需要等待一段时间 |
BACKGROUND_IMAGE |
背景图片 | 多个图片用分号;隔开,系统会随机选择 |
访问地址:https://your-worker.workers.dev/sub-{你的UUID}
例如:https://my-sub.workers.dev/sub-a1b2c3d4
- 用户名:CONFIG 中设置的
USER值 - 密码:环境变量中设置的
PSWD值
登录后可以看到:
https://your-worker.workers.dev/upload-{你的UP值}
使用方法:
POST https://your-worker.workers.dev/upload-your-upload-key
Content-Type: application/json
{
"URL_NAME": "node-name",
"URL": "vmess://xxx..."
}https://your-worker.workers.dev/token={你的TOKEN值}?cf_ip=ip.sb&cf_port=443
参数说明:
cf_ip: 优选域名(必填),会自动替换节点中的ip.sb或YOUXUAN_IPcf_port: 优选端口(必填),会自动替换节点中的443或8443
使用示例:
https://my-sub.workers.dev/token=sub_abc123?cf_ip=cf.example.com&cf_port=443
- 查看节点列表:显示所有已上传的节点
- 刷新列表:重新加载节点列表
- 删除单个节点:点击节点右侧的「删除」按钮
- 全部删除:清空所有上传的节点
- 在文本框中输入节点,每行一个
- 支持格式:
协议://内容 - 点击「添加更新」
示例:
vmess://eyJhZGQiOiIxMjcuMC4w...
vless://uuid@domain:443?encryption=none...
https://example.com/subscription
- 查看列表:显示所有自定义节点
- 刷新列表:重新加载列表
- 删除单个:点击节点右侧的「删除」按钮
- 全部删除:清空所有自定义节点
- 在文本框中输入关键词,每行一个
- 点击「添加更新」
示例:
过期
失效
测试
- 查看列表:显示所有过滤关键词
- 刷新列表:重新加载列表
- 删除单个:点击关键词右侧的「删除」按钮
- 全部删除:清空所有关键词
A: 请检查:
- 是否成功上传过节点
- 节点是否过期(超过
EXPIRATION_TIME设置的时间) - 点击「刷新列表」按钮重新加载
A: 请确保:
- 订阅地址中包含
cf_ip和cf_port参数 - TOKEN 值正确
- 至少有一个有效节点
A: 有两种方式:
方式 1:通过 API 上传
curl -X POST https://your-worker.workers.dev/upload-your-upload-key \
-H "Content-Type: application/json" \
-d '{
"URL_NAME": "node1",
"URL": "vmess://xxx..."
}'方式 2:通过管理页面手动添加
- 在「自定义节点或链接」标签页中添加
A: 支持以下格式:
vmess://开头的 VMess 节点vless://开头的 VLESS 节点http://或https://开头的订阅链接(会自动解析)
A: 修改 CONFIG 中的 BACKGROUND_IMAGE:
BACKGROUND_IMAGE: 'https://example.com/bg1.jpg;https://example.com/bg2.jpg;https://example.com/bg3.jpg'多个图片用分号 ; 隔开,系统会随机选择一张显示。
A:
- 登录 Cloudflare Workers 控制台
- 进入你的 Worker 设置
- 在「变量」部分修改
PSWD的值 - 保存后即可使用新密码登录
A: 修改 CONFIG 中的 EXPIRATION_TIME:
EXPIRATION_TIME: 1200, // 单位:秒(1200秒 = 20分钟)A:
- 上传节点时,将优选域名设置为
ip.sb,端口设置为443或8443 - 订阅时通过
cf_ip和cf_port参数指定要替换的域名和端口 - 系统会自动替换节点中的优选域名和端口
示例:
原节点: vmess://[email protected]:443?...
订阅地址: ?cf_ip=cf.example.com&cf_port=2053
结果: vmess://[email protected]:2053?...
A:
- 登录 Supabase 控制台
- 进入你的项目
- 使用 SQL Editor 导出数据:
-- 导出上传节点
SELECT * FROM urls;
-- 导出自定义节点
SELECT * FROM sub2_urls;
-- 导出过滤关键词
SELECT * FROM exclude_keywords;A:
- 在新 Worker 中部署相同的代码
- 配置相同的环境变量
- 使用相同的 Supabase 项目
- 数据会自动同步
- 在 Cloudflare Workers 设置中点击「触发器」
- 点击「添加自定义域」
- 输入你的域名(需要在 Cloudflare 托管)
- 配置 DNS 记录
访问地址变为:https://your-domain.com/sub-{UUID}
如果需要添加访问限制,可以在代码中添加:
// 在 handleRequest 函数开头添加
const rateLimiter = {
// 实现你的速率限制逻辑
};在 Supabase 中创建日志表:
CREATE TABLE access_logs (
id BIGSERIAL PRIMARY KEY,
path TEXT,
ip TEXT,
timestamp TIMESTAMP DEFAULT NOW()
);- 使用强密码:
PSWD应该使用复杂的随机字符串 - 定期更换密钥:定期更换
APITOKEN、UP、TOKEN等密钥 - 限制访问:可以使用 Cloudflare 的访问规则限制访问来源
- 启用日志:记录访问日志以便审计
- 备份数据:定期备份 Supabase 数据库
如果遇到问题:
- 检查 Cloudflare Workers 的日志
- 检查 Supabase 的数据库连接
- 确认环境变量配置正确
- 查看浏览器控制台的错误信息
- ✅ 初始版本发布
- ✅ 支持节点自动上传管理
- ✅ 支持自定义节点管理
- ✅ 支持关键词过滤
- ✅ 支持优选 IP 替换
- ✅ 响应式管理界面
- ✅ 背景图片支持
版权所有 © 2025 FsMs
本项目仅供学习交流使用,请勿用于非法用途。
祝你使用愉快! 🎉