一个用于解析订阅、整理节点规则并生成 Mihomo 配置的 Web 工具。
支持配置预览、云端托管订阅链接,以及基于 Postgres/Neon 的配置持久化。
- 导入多种订阅输入:订阅链接、Base64 内容、YAML、节点 URI
- 解析常见协议:
vmess、vless、ss、ssr、trojan、hysteria、hysteria2、tuic、wireguard、snell - 生成
Mihomo配置 - 自定义代理组、规则和高级 DNS
- 保存配置到本地数据库
- 生成可访问的订阅托管链接
- 支持云端订阅自动更新
- 支持配置分支管理
- 在 Neon 创建 Postgres 数据库并复制
DATABASE_URL - 在 Vercel 导入仓库
- 配置环境变量
- 初始化数据库表结构
pnpm install
pnpm db:generate
pnpm db:migrate如果不想在本地或 CI 连接 Neon 执行迁移,也可以在 Neon 控制台手动执行 SQL。打开 Neon 项目的 SQL Editor,执行下面的初始化脚本:
CREATE TABLE IF NOT EXISTS "configs" (
"id" serial PRIMARY KEY,
"public_id" text NOT NULL UNIQUE,
"name" text NOT NULL,
"urls" text NOT NULL,
"platform" text NOT NULL DEFAULT 'mihomo',
"proxy_groups" jsonb NOT NULL DEFAULT '[]'::jsonb,
"rules" jsonb NOT NULL DEFAULT '[]'::jsonb,
"settings" jsonb NOT NULL DEFAULT '{}'::jsonb,
"node_count" integer NOT NULL DEFAULT 0,
"parsed_nodes" jsonb,
"generated_config" text,
"parent_id" integer REFERENCES "configs"("id") ON DELETE CASCADE,
"cloud_token" text UNIQUE,
"cloud_url" text,
"created_at" timestamp with time zone NOT NULL DEFAULT now(),
"updated_at" timestamp with time zone NOT NULL DEFAULT now()
);这段 SQL 适用于空的 Neon 数据库首次初始化。执行成功后,再把同一个 Neon 数据库的 DATABASE_URL 配置到 Vercel 环境变量即可。
Vercel 构建命令使用 pnpm build。
仓库内的 vercel.json 会配置 Vercel Cron,每天调用一次:
/api/internal/refresh-subscriptions如果需要启用主动定时刷新,需要在 Vercel 环境变量中配置:
ENABLE_AUTOUPDATE=true
CRON_SECRET=your-cron-secretVercel Cron 调用时会携带 Authorization: Bearer <CRON_SECRET>,接口会使用该值鉴权。
如果 ENABLE_AUTOUPDATE 不是 true,主动定时刷新会保持禁用;订阅客户端访问云端订阅链接时仍会使用现有的懒刷新逻辑。
Vercel Hobby/Free 账户对 Cron 频率有限制,因此默认使用每日一次的计划任务。如果需要每 6 小时刷新一次,需要升级 Vercel 计划,或改用 Docker 部署中的 subscription-refresher。
| 变量 | 说明 | 默认值 |
|---|---|---|
ADMIN_PASSWORD |
后台登录密码 | 无,必须设置 |
JWT_SECRET |
JWT 签名密钥 | 无,必须设置 |
DATABASE_URL |
Postgres/Neon 连接字符串 | 无,必须设置 |
NEXT_PUBLIC_APP_URL |
生成公开订阅链接时使用的外部访问地址 | 自动从 Vercel/请求推断 |
ALLOW_HTTP_SUBSCRIPTIONS |
是否允许抓取非 HTTPS 订阅链接 | false |
MAX_SUBSCRIPTION_URLS |
单次解析允许的订阅 URL 数量上限 | 10 |
MAX_SUBSCRIPTION_BYTES |
单个订阅响应体大小上限 | 5242880 |
SUBSCRIPTION_TIMEOUT_MS |
单个订阅请求超时时间 | 15000 |
SUBSCRIPTION_CONCURRENCY |
订阅抓取并发数 | 4 |
SUBSCRIPTION_CACHE_TTL_MS |
云端订阅生成缓存有效期,刷新失败时会回退到上一次成功生成的 YAML | 300000 |
ENABLE_AUTOUPDATE |
是否启用订阅主动定时刷新 | false |
CRON_SECRET |
订阅主动定时刷新接口鉴权密钥;启用主动刷新时必须设置 | 无 |
REFRESH_INTERVAL_SECONDS |
Docker 定时刷新间隔秒数 | 21600 |
docker-compose.yml 包含两个服务:
ruley:Web 应用服务subscription-refresher:定时调用订阅刷新接口的轻量 sidecar
Docker 部署需要在 .env 中至少配置:
ADMIN_PASSWORD=your-password
JWT_SECRET=your-jwt-secret
DATABASE_URL=postgres://user:password@host:5432/ruley
NEXT_PUBLIC_APP_URL=https://your-domain.example
ENABLE_AUTOUPDATE=true
CRON_SECRET=your-cron-secret
REFRESH_INTERVAL_SECONDS=21600如果不需要主动定时刷新,可以保持 ENABLE_AUTOUPDATE=false,并且不设置 CRON_SECRET。此时 subscription-refresher 会保持空闲,不会调用刷新接口。
启动:
docker compose up -dsubscription-refresher 默认每 6 小时请求一次 ruley 容器内的 /api/internal/refresh-subscriptions,触发所有已发布云端订阅配置重新拉取上游订阅并更新缓存。即使定时刷新失败,订阅客户端访问云端订阅链接时仍会使用现有的懒刷新逻辑作为兜底。
如果本机已经安装 PostgreSQL 二进制文件,可以直接使用本地服务,不需要 Docker。
- 启动本机 PostgreSQL 服务。
如果你已经通过安装包、Homebrew、Scoop、系统服务等方式启动了 PostgreSQL,只需要确认监听在 localhost:5432。
- 创建本地数据库。
createdb -U postgres ruley如果数据库已经存在,可以跳过这一步。
- 配置
.env.local。
ADMIN_PASSWORD=your-local-password
JWT_SECRET=your-local-jwt-secret
DATABASE_URL=postgres://postgres:postgres@localhost:5432/ruley
NEXT_PUBLIC_APP_URL=http://localhost:3000如果你的本机 PostgreSQL 用户、密码或端口不同,按实际值修改 DATABASE_URL。
- 安装依赖、迁移数据库并启动开发服务。
pnpm install
pnpm db:migrate
pnpm dev本地默认数据库连接示例:
DATABASE_URL=postgres://postgres:postgres@localhost:5432/ruley如果你没有安装 PostgreSQL,也可以使用仓库内的 compose 文件启动一个测试库:
docker compose -f docker-compose.db.yml up -d
pnpm db:migrate
pnpm dev如果你想直接使用 Neon 做本地测试,也可以把 .env / .env.local 中的 DATABASE_URL 换成 Neon 的 development branch 连接字符串,然后执行:
pnpm db:migrate
pnpm dev感谢 linux.do 提供社区支持和 AI 工具支持!
