面向代理规则与客户端配置的管理平台,提供规则编辑、客户端管理与公开分发。
- 规则编排与自动化管理,支持本地 / 远程 / 引用 / Geosite 多种数据源混合
- JS 自定义转换器(goja 沙箱执行,内置
console/atob/btoa/URL/URLSearchParams/TextEncoder/TextDecoder/helpers.*)- 内置
replace/remove_lines
- 内置
- 规则更新记录与差异追溯
- 客户端配置文件编辑与管理
- 公开分享与下载
- 数据源定时同步(interval / cron)
- WAF 速率限制 + IP 封禁
- 完整数据库备份与恢复
- 系统级参数(抓取超时 / 输出体积上限 / 速率限制等)可在 UI 调整并随备份保存
本版本是 Node.js → Go 的完整重写,数据库格式不兼容。
项目附带迁移脚本 scripts/migrate-legacy-backup.sh,可把旧版导出的备份 zip
重写为新版可直接 restore 的格式。
- 在旧版:管理面板 → 系统配置 → 数据库备份与恢复 → 备份数据库
会下载
proxy-rule-manager-backup-YYYY-MM-DD.zip。 - 本机:跑迁移脚本(需要
python3/unzip/zip):脚本会同时打印迁移摘要(规则 / 客户端 / 转换器 / 数据源 / 客户端文件 / 同步元数据)。./scripts/migrate-legacy-backup.sh proxy-rule-manager-backup-YYYY-MM-DD.zip # 输出:proxy-rule-manager-backup-YYYY-MM-DD-migrated.zip - 部署新版:替换镜像 / 二进制,启动新服务(admin token 会自动生成,见启动日志)。
- 新版:管理面板 → 系统配置 → 数据库备份与恢复 → 恢复数据库
上传上一步生成的
*-migrated.zip即可。 - 首次同步:管理面板 → 触发一次全量同步以重新生成
Rules/输出。
config:全部规则、转换器(含自定义 JS 脚本)、客户端覆盖、合并策略clients:客户端 ID / 名称 / 全局 transformsartifacts元数据(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_<ts>_<rand>改为 UUID v4,历史无意义)。
- 配置模板导入 / 导出:新版统一通过"数据库备份与恢复"做配置迁移。
镜像:ghcr.io/fl0w1nd/proxy-rule-manager
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 |
管理员令牌。不设时自动从 <DATA_DIR>/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环境变量已设置 → 直接使用,不写入文件- 读取
<DATA_DIR>/admin-token(权限应为0600)→ 使用文件中的令牌 - 以上都没有 → 自动生成 32 字节随机令牌,写入
<DATA_DIR>/admin-token(0600),并在启动 banner 中大字打印令牌值与文件路径 - 仅当显式设置
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/ # 工具函数
pnpm install
# 同时启动前端(Next.js dev :3000)和后端(go run :3001)
pnpm run dev
# 或分别启动
pnpm run dev:fe # 前端
pnpm run dev:be # 后端# 构建前端(静态输出到 ./out)+ 后端二进制(./bin/proxy-rule-manager)
make build
# 或单独构建
make build-fe # 前端
make build-be # 后端
# 启动生产服务
./bin/proxy-rule-manager# 一键跑完所有 CI 检查(lint + typecheck + test)
make check
# 或单独运行
make lint # 前端 ESLint + 后端 gofmt / go vet / staticcheck
make typecheck # TypeScript 类型检查
make test # Go 测试(-race)# 本地构建 + 运行(当前平台,数据挂载 ./data)
make docker-run
# docker compose 部署
docker compose up -d # 启动
docker compose down # 停止
make logs # 查看日志make help # 查看所有 make 目标
make version # 显示版本号
make clean # 清理构建产物

