https://github.com/fl0w1nd/proxy-rule-manager
一个实现代理规则集编排管理的 WEBUI
https://github.com/fl0w1nd/proxy-rule-manager
clash-meta geosite loon mihomo mihomo-config mihomo-rules shadowsocks stash
Last synced: 25 days ago
JSON representation
一个实现代理规则集编排管理的 WEBUI
- Host: GitHub
- URL: https://github.com/fl0w1nd/proxy-rule-manager
- Owner: fl0w1nd
- License: mit
- Created: 2026-01-15T15:33:13.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-05-23T23:06:29.000Z (29 days ago)
- Last Synced: 2026-05-24T01:11:46.851Z (29 days ago)
- Topics: clash-meta, geosite, loon, mihomo, mihomo-config, mihomo-rules, shadowsocks, stash
- Language: TypeScript
- Homepage: https://ruleset.zcsouls.com
- Size: 11 MB
- Stars: 2
- Watchers: 0
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Proxy Rule Manager
面向代理规则与客户端配置的管理平台,提供规则编辑、客户端管理与公开分发。
## 预览
## 功能
- 规则编排与自动化管理,支持本地 / 远程 / 引用 / Geosite 多种数据源混合
- JS 自定义转换器(goja 沙箱执行,内置 `console` / `atob` / `btoa` /
`URL` / `URLSearchParams` / `TextEncoder` / `TextDecoder` / `helpers.*`)
+ 内置 `replace` / `remove_lines`
- 规则更新记录与差异追溯
- 客户端配置文件编辑与管理
- 公开分享与下载
- 数据源定时同步(interval / cron)
- WAF 速率限制 + IP 封禁
- 完整数据库备份与恢复
- 系统级参数(抓取超时 / 输出体积上限 / 速率限制等)可在 UI 调整并随备份保存
---
## ⚠️ 从 TypeScript 后端升级(≤ 0.3.x)
本版本是 Node.js → Go 的完整重写,**数据库格式不兼容**。
项目附带迁移脚本 `scripts/migrate-legacy-backup.sh`,可把旧版导出的备份 zip
重写为新版可直接 restore 的格式。
### 升级流程
1. **在旧版**:管理面板 → 系统配置 → 数据库备份与恢复 → 备份数据库
会下载 `proxy-rule-manager-backup-YYYY-MM-DD.zip`。
2. **本机**:跑迁移脚本(需要 `python3` / `unzip` / `zip`):
```bash
./scripts/migrate-legacy-backup.sh proxy-rule-manager-backup-YYYY-MM-DD.zip
# 输出:proxy-rule-manager-backup-YYYY-MM-DD-migrated.zip
```
脚本会同时打印迁移摘要(规则 / 客户端 / 转换器 / 数据源 / 客户端文件 / 同步元数据)。
3. **部署新版**:替换镜像 / 二进制,启动新服务(admin token 会自动生成,见启动日志)。
4. **新版**:管理面板 → 系统配置 → 数据库备份与恢复 → 恢复数据库
上传上一步生成的 `*-migrated.zip` 即可。
5. **首次同步**:管理面板 → 触发一次全量同步以重新生成 `Rules/` 输出。
### 迁移脚本会带过来什么
- `config`:全部规则、转换器(含自定义 JS 脚本)、客户端覆盖、合并策略
- `clients`:客户端 ID / 名称 / 全局 transforms
- `artifacts` 元数据(dict → list,自动回填 `blobPath`)
- `clientFiles` 元数据(dict → list,含 `displayName` / `description` / `isPublic`)
- 同步元数据:`lastSyncInfo` / `cdnSettings` / `syncSchedule`
- 资源目录:`client-files/` / `sources/` / `iconset/`
### 不会自动迁移的内容
- **WAF 封禁列表**:新版只读 SQLite,迁移脚本会把旧版 `waf/bans.json` 中仍处于
生效期的封禁导出到 `*-waf-bans.txt` 旁路文件,**需要你在新版重新封禁**。
- **活动历史**(`data/records/`):新版改用 SQLite,无逐文件迁移路径。
- **Geosite 缓存**:新版首次访问时从上游重新拉取。
- **Rules/ 输出**:恢复后由首次全量同步重新生成。
- **任务历史 / 锁 / 每日统计 / configRev**:均不携带(jobs ID 格式由
`job__` 改为 UUID v4,历史无意义)。
### 已废弃的功能
- **配置模板导入 / 导出**:新版统一通过"数据库备份与恢复"做配置迁移。
---
## 安装(Docker Compose)
镜像:`ghcr.io/fl0w1nd/proxy-rule-manager`
```yaml
services:
proxy-rule-manager:
image: ghcr.io/fl0w1nd/proxy-rule-manager:latest
container_name: proxy-rule-manager
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./data:/app/data
environment:
- PORT=3000
# ADMIN_TOKEN 是可选的;不设时自动生成并持久化到 data/admin-token
# - ADMIN_TOKEN=your-secure-token-here
- ALLOWED_ORIGINS=__self
```
### 环境变量
| 变量 | 说明 | 默认值 |
| --- | --- | --- |
| `PORT` | 服务端口 | `3000` |
| `DATA_DIR` | 数据目录(SQLite + 产物) | `/app/data` |
| `OUT_DIR` | 前端静态文件目录 | `/app/out` |
| `ADMIN_TOKEN` | 管理员令牌。不设时自动从 `/admin-token` 读取或生成 32 字节随机令牌(详见下方说明) | 空 |
| `ALLOW_EMPTY_ADMIN_TOKEN` | 设为 `1` 时允许无令牌运行(完全开放模式),启动日志将持续打印安全警告。**切勿在不可信网络下启用** | 空 |
| `INITIAL_CONFIG_PATH` | 首次初始化使用的模板 JSON 文件路径 | 自动探测 `out/templates/` 与 `public/templates/` |
| `ALLOWED_ORIGINS` | 浏览器跨源白名单(逗号分隔,如 `https://rules.example.com`)。特殊值 `__self` 表示回显请求 Origin + 启用 credentials,效果为仅允许访问者自身域名(推荐默认值)。**不设**时默认 `Access-Control-Allow-Origin: *` 且不开启 credentials;管理认证使用 Bearer token,浏览器不会跨源自动携带,所以默认是安全的。仅当你需要在另一个域名下的前端通过 `credentials: include` 调用本服务时才需要显式设置域名列表。 | `__self`(推荐) |
### 管理员令牌(Admin Token)
启动时按以下顺序解析管理员令牌:
1. **`ADMIN_TOKEN` 环境变量已设置** → 直接使用,不写入文件
2. **读取 `/admin-token`**(权限应为 `0600`)→ 使用文件中的令牌
3. **以上都没有** → 自动生成 32 字节随机令牌,写入 `/admin-token`(`0600`),并在启动 banner 中大字打印令牌值与文件路径
4. **仅当显式设置 `ALLOW_EMPTY_ADMIN_TOKEN=1`** 时才保留"无需认证"的完全开放模式,启动日志将持续打印安全警告
首次部署若不设置 `ADMIN_TOKEN`,请留意启动日志中的生成令牌,或查看 `data/admin-token` 文件。
> 所有可调的运行时参数(抓取超时、转换器执行上限、速率限制阈值等)都在
> 管理面板「系统配置」页中调整,存放在数据库 `kv_settings` 表里并随备份归档。
### 健康检查
运行时镜像为 distroless(无 `wget`/`curl`)。容器内置健康检查通过二进制自身实现:
```
CMD ["/app/proxy-rule-manager", "--healthcheck"]
```
执行时,程序向 `http://127.0.0.1:$PORT/api/status` 发出 HTTP GET 请求,成功返回 0,失败返回 1。
---
## 开发者
### 环境要求
- Node.js >= 18
- pnpm >= 10
- Go >= 1.22
### 项目结构
```
src/ # 前端(Next.js + React)
app/ # 页面 Shell
components/ # UI 组件
lib/ # API 客户端、Schema、工具函数
hooks/ # React Hooks
backend/ # 后端(Go)
cmd/server/ # 程序入口(main.go)
internal/
api/ # chi 路由与 HTTP 处理器
config/ # 环境变量加载
schema/ # 共享数据结构
store/ # SQLite 持久化层
syncengine/ # 同步引擎
geosite/ # Geosite 数据管理
diff/ # Diff 生成
transformer/# 内容转换器
util/ # 工具函数
```
### 开发
```bash
pnpm install
# 同时启动前端(Next.js dev :3000)和后端(go run :3001)
pnpm run dev
# 或分别启动
pnpm run dev:fe # 前端
pnpm run dev:be # 后端
```
### 构建与运行
```bash
# 构建前端(静态输出到 ./out)+ 后端二进制(./bin/proxy-rule-manager)
make build
# 或单独构建
make build-fe # 前端
make build-be # 后端
# 启动生产服务
./bin/proxy-rule-manager
```
### 检查与测试
```bash
# 一键跑完所有 CI 检查(lint + typecheck + test)
make check
# 或单独运行
make lint # 前端 ESLint + 后端 gofmt / go vet / staticcheck
make typecheck # TypeScript 类型检查
make test # Go 测试(-race)
```
### Docker
```bash
# 本地构建 + 运行(当前平台,数据挂载 ./data)
make docker-run
# docker compose 部署
docker compose up -d # 启动
docker compose down # 停止
make logs # 查看日志
```
### 其他
```bash
make help # 查看所有 make 目标
make version # 显示版本号
make clean # 清理构建产物
```