Private Rules 是一个操作简单、维护方便的私有自托管规则控制台,支持 Cloudflare Workers 和 Docker Compose 部署。它把自定义规则、远程订阅、GeoSite 与 GeoIP 数据源集中到同一个后台,自动去重,并按客户端需要生成 YAML、LIST、TXT 与 JSON 订阅。
规则和会话保存在你自己的 Cloudflare D1 或自托管 SQLite 数据库中。每条规则可独立选择私密链接、公开链接或禁止访问,不必把整个规则库暴露给同一种访问策略。
公开规则集很方便,但个人规则往往来自多个维护者,也会包含只适合自己的媒体、AI、地区或代理策略。手动复制这些内容容易重复、失去更新,甚至把不该公开的规则一起暴露。
Private Rules 保留上游的持续更新能力,同时让自定义内容和访问权限仍由你控制。
| 能力 | 结果 |
|---|---|
| 多来源聚合 | 组合远程 YAML/LIST、GeoSite、GeoIP 与自定义规则,按“类型 + 内容”自动去重 |
| 私有发布 | 为每条规则独立配置 Token、公开或禁用访问,并生成多种文件后缀 |
| 可视化维护 | 在响应式后台中创建、同步、搜索、批量预览、备份和恢复规则 |
上游镜像保持只读,自定义规则不会被下一次同步覆盖。GeoSite 与 GeoIP 可以组合使用,例如同时引入 Telegram 域名与 IP 网段。
| 能力 | Cloudflare Workers | Docker Compose |
|---|---|---|
| 运行时 | Workers | Node.js |
| 数据库 | D1 | SQLite |
| 定时任务 | Cron Trigger | Node Scheduler |
| 静态资源 | Workers Assets | Node Static |
| 持久化 | Cloudflare | Docker Volume |
| 运维成本 | 低 | 用户自行维护 |
| 适用场景 | 无服务器部署 | VPS、NAS、本地服务器 |
Fork 本仓库,然后在 Cloudflare Dashboard 打开 Workers & Pages → Create application → Import a repository,选择自己的 Fork。
| Cloudflare 构建设置 | 值 |
|---|---|
| Production branch | main |
| Build command | pnpm build |
| Deploy command | pnpm deploy |
| Root directory | 留空 |
项目通过 wrangler.toml 声明静态资源、定时同步任务和名为 DB 的 D1 binding。首次部署后请在 Worker 的 Settings → Bindings 中确认 DB 已连接。
首次使用或仓库新增 migration 后执行:
pnpm db:migrate:remotewrangler.toml 中的 Cron Trigger 每 5 分钟触发一次扫描;真正的同步间隔仍由每条数据源在数据库中的配置决定。自定义域名绑定后可设置 BASE_URL,也可以在管理后台设置站点基础 URL。
在 Settings → Variables and Secrets 中添加:
| Secret | 用途 | 必需 |
|---|---|---|
ADMIN_PASSWORD |
登录管理后台 | 是 |
SESSION_SECRET |
签名登录会话,建议至少 32 个随机字符 | 是 |
RULE_TOKEN |
生成私密订阅地址 | 使用私密访问时 |
部署完成后访问:
https://<your-worker-domain>/admin/login
如需自定义域名,在 Worker 的 Domains & Routes 中添加域名,再到后台“设置”填写相同的站点基础 URL。
Docker 部署直接使用 Docker Hub 上的多架构镜像,适合 VPS、NAS 和本地服务器。
mkdir -p private-rules && cd private-rules
curl -fsSLO https://raw.githubusercontent.com/Cyclince/Private_rules/main/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/Cyclince/Private_rules/main/.env.example -o .env
# 编辑 .env,填写 ADMIN_PASSWORD、SESSION_SECRET 和 RULE_TOKEN
docker compose pull
docker compose up -d默认拉取 cyclince/private-rules:latest 获取最新版本,访问 http://服务器地址:5173/admin/login。
先把域名解析到服务器,并放行 TCP 端口 80 和 443。Caddy 会自动申请和续期 HTTPS 证书。在 /etc/caddy/Caddyfile 中加入:
rules.example.com {
reverse_proxy 127.0.0.1:5173
}将 rules.example.com 替换为你的域名,然后校验并重载配置:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy在 /etc/nginx/conf.d/private-rules.conf 中加入以下配置:
server {
listen 80;
listen [::]:80;
server_name rules.example.com;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:5173;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}将 rules.example.com 替换为你的域名,校验配置后重载 Nginx:
sudo nginx -t
sudo systemctl reload nginx以上配置先提供 HTTP;生产环境还应配置 HTTPS,例如使用 Certbot:
sudo certbot --nginx -d rules.example.comCompose 已启用 TRUST_PROXY。不要让不受信任的上游代理覆盖 Host、X-Forwarded-For 或 X-Forwarded-Proto,也不要将管理端口 5173 直接暴露到公网;建议通过防火墙仅允许本机或反向代理访问。
常用运维命令:
docker compose ps
docker compose logs -f --no-color
docker compose stop
docker compose pull
docker compose up -d故障排查:docker compose ps 检查健康状态,docker compose logs --no-color 查看启动错误。
不要把密码、Cookie 或完整私密订阅地址贴进公开日志。
需要 Node.js 与 pnpm;只有调试 Cloudflare Workers 运行时或部署到 Cloudflare 时才需要 Cloudflare 账号。
pnpm install
cp .dev.vars.example .dev.vars
pnpm db:migrate:local
pnpm dev打开 http://localhost:5173/admin/login。.dev.vars 已被 Git 忽略,请在其中设置本地密码和密钥。
生产构建检查:
pnpm build- 在“规则”中选择从零构建、远程订阅或 Geo 数据库
- 为规则选择图标、同步间隔,并按需添加自定义域名、关键词、IP 或 CIDR
- 同步上游后,在批量预览中检查新增、重复和无效内容
- 在“订阅”详情中选择当前规则的访问策略并复制对应格式链接
- 在“设置”中导出完整 JSON 备份,或恢复已有备份
同一规则按文件后缀适配不同客户端,不再为每个软件重复生成入口。
| 后缀 | 适用范围 |
|---|---|
.yaml |
Mihomo、Clash、OpenClash、Stash |
.list |
Loon、Surge、Shadowrocket、Egern 等 |
.txt |
纯文本规则,便于脚本继续处理 |
.json |
sing-box source Rule Set(在 rule_set 中使用 format: "source") |
/rules/emby.yaml
/sub/<RULE_TOKEN>/emby.yaml
/sub/<RULE_TOKEN>/emby.list
/sub/<RULE_TOKEN>/emby.json
sing-box 远程订阅示例:
{
"route": {
"rules": [
{ "rule_set": "emby", "outbound": "proxy" }
],
"rule_set": [
{
"tag": "emby",
"type": "remote",
"format": "source",
"url": "https://example.com/sub/<RULE_TOKEN>/emby.json",
"update_interval": "1d"
}
]
},
"experimental": {
"cache_file": { "enabled": true }
}
}文本规则文件包含生成来源与最后修改时间:
# Generated for emby by Private Rules
# UPDATED: 2026-07-14 08:30:00
payload:
- DOMAIN-SUFFIX,example.com- 远程订阅:支持同时引用多个 YAML、LIST 或纯文本地址
- GeoSite:来自
v2fly/domain-list-community - GeoIP:使用
Loyalsoldier/geoiprelease 分支中的纯文本数据 - 图标包:来源
Koolson/Qure - 自动同步:按规则配置 15 分钟至每天的更新间隔,也可随时手动同步
远程订阅、GeoSite 和 GeoIP 保持来源独立;更换来源类型时建议新建规则,避免不同数据库语义互相覆盖。
- 后台读写接口要求登录会话
- Token 订阅用于隐藏访问路径,不等同于内容加密
- 获得完整订阅地址的人可以读取对应规则,请妥善保存
RULE_TOKEN - 每条规则可以独立关闭订阅访问
- 不要提交
.dev.vars、密码、Token 或生产数据库内容
Fork 用户可以同步上游仓库后重新部署,D1 中的规则不会因前端更新被覆盖。升级前建议在设置页导出完整 .json 备份。
数据库结构变更时执行:
pnpm db:migrate:remote- Cloudflare Workers、Hono 与 D1
- Node.js、Docker Compose 与 SQLite
- React 19、TypeScript 与 Vite
- Cloudflare Cron Triggers
- Qure Color 与自定义 JSON 图标包