Files
leaudit-platform-backend/docs/规则编辑/yaml规则在线编辑设计.md
T

8.2 KiB
Raw Blame History

LeAudit YAML 规则在线编辑设计

1. 背景

LeAudit 内核当前以本地 YAML/DSL 文件作为规则输入载体执行评查流程。现阶段 不修改 leaudit 核心,但平台侧需要逐步具备以下能力:

  • 在线查看 YAML 规则内容
  • 在线编辑 YAML 规则
  • 校验规则语法与 DSL 语义
  • 规则版本化保存
  • 规则发布、回滚、审计

因此需要在 leaudit-platform 中补充一套“规则管理真相源”方案,使平台能够支持规则后台,而运行时仍然兼容 leaudit 只读取本地 YAML 的既有行为。


2. 结论

可以不改 leaudit 核心,同时把 DSL YAML 存储到 OSS,并把路径、版本、哈希等元数据存入数据库。

运行时通过 bridge 层完成一次“远端规则 → 本地临时文件”的转换:

数据库读取规则版本信息
  → 获取 rules.yaml 的 oss_url
  → 从 OSS 下载到本地临时文件
  → 调用 leaudit.dsl.loader.load_rules_file(local_tmp_path)
  → 交给 leaudit 原生执行链继续处理

也就是说:

  • 规则真相源OSS + 数据库
  • 执行载体:本地临时 YAML 文件
  • LeAudit 输入接口:保持不变

这是当前约束下最稳妥、最容易演进的方案。


3. 为什么不能继续把本地 rules/ 目录作为正式真相源

如果未来要开放 YAML 在线编辑界面,本地目录方案会迅速暴露问题:

3.1 不利于在线编辑

  • 前端编辑后的内容最终仍要人工写回服务器目录
  • 多实例部署时,需要同步到多台机器
  • 容器化部署时,本地文件可能不是稳定持久层

3.2 不利于版本管理

  • 难以明确记录“这次评查到底使用了哪一版规则”
  • 覆盖同一路径的 rules.yaml 后,历史执行很难追溯
  • 回滚通常会退化为“手工替换文件”

3.3 不利于审计与权限

  • 谁改的、何时改的、为什么发布,很难形成正式审计链
  • 无法自然承载“编辑 / 审核 / 发布 / 回滚”权限流程

3.4 不利于多实例一致性

  • API 节点 A 和 Worker 节点 B 可能读取到不同版本本地文件
  • 扩容后所有节点都要同步规则目录,运维成本高

因此,本地 rules/ 目录更适合保留为:

  • 种子规则导入源
  • 紧急回退备份
  • 开发环境本地调试资源

而不应该继续承担正式规则真相源角色。


4. 为什么采用“OSS + DB + 本地临时文件”模式

该方案同时兼顾了 不改核心平台化管理 两个目标。

4.1 对 leaudit 零侵入

leaudit 仍然读取本地 YAML 文件,无需改造其解析器、执行器或 DSL 加载逻辑。

4.2 支持在线编辑界面

前端提交 YAML 文本后,平台可以执行标准流程:

编辑
  → 保存草稿
  → 语法校验
  → DSL 语义校验
  → 上传 OSS
  → 写入规则版本表
  → 发布 / 回滚

这让规则成为“平台可管理资产”,而不是“服务器磁盘文件”。

4.3 规则版本可追溯

每次评查运行都可以记录:

  • rule_set_id
  • rule_version_id
  • rule_source_oss_url
  • rule_source_sha256

这样可以准确回答:

  • 这个结果用的是哪一版规则?
  • 规则文件是否被篡改?
  • 是否可以按历史版本回放?

4.4 发布与回滚简单

  • 发布:切换 leaudit_rule_sets.current_version_id
  • 回滚:切回旧版本 ID

无需登录服务器替换目录文件,也不要求应用重新发版。

4.5 多实例一致

所有 API / Worker 都从同一份 DB + OSS 真相源取规则,不再依赖本地目录是否同步。


5. 建议的系统分层

5.1 真相源

  • OSS:存储 rules.yaml 正文文件
  • 数据库:存储规则集、规则版本、绑定关系、发布状态、哈希、编辑人、发布时间等元数据

5.2 执行层

  • bridge 层负责把 OSS 文件下载到本地临时路径
  • 临时路径交给 leaudit.dsl.loader.load_rules_file() 使用

5.3 回退层

  • 本地 rules/ 目录保留为 fallback 或 emergency backup
  • 当 OSS 不可用或某些历史规则尚未迁移时可临时使用

6. 在线编辑功能设计

6.1 目标能力

平台应逐步具备以下功能:

  • 查看规则集列表
  • 查看规则版本历史
  • 查看某版本 YAML 内容
  • 在线编辑 YAML
  • 保存草稿版本
  • 校验 YAML 语法
  • 校验 LeAudit DSL 语义
  • 发布指定版本
  • 回滚到历史版本
  • 查看发布日志与校验日志

6.2 推荐流程

编辑保存

前端提交 YAML 文本
  → 后端做 YAML 语法校验
  → 后端做 LeAudit DSL 语义校验
  → 生成新版本号 / version_seq
  → 上传 rules.yaml 到 OSS
  → 写 leaudit_rule_versions
  → 返回版本信息

发布生效

选择版本发布
  → 更新 leaudit_rule_sets.current_version_id
  → 记录发布日志
  → 清理规则缓存
  → 后续新 run 自动使用新版本

回滚

选择旧版本
  → 切换 current_version_id 到旧版本
  → 写回滚日志
  → 清理规则缓存

7. 运行时加载设计

7.1 核心原则

运行时不直接让 leaudit 读取 OSS,也不直接读取数据库文本;而是通过 bridge 统一适配。

7.2 推荐加载链路

document/type 确定
  → leaudit_rule_type_bindings 查规则集
  → leaudit_rule_sets.current_version_id
  → leaudit_rule_versions.oss_url
  → 下载 OSS 文件到本地临时目录
  → 校验 sha256
  → load_rules_file(local_path)
  → 执行 leaudit pipeline

7.2.1 当前项目已落地状态

当前 bridge 已按这条路线开始落地,分成两条对称链路:

  • 文档文件链:
    • leaudit_document_files.local_path / oss_url
    • 下载或读取后落本地临时文件
    • 再交给原生 AuditCtx.file_path
  • 规则文件链:
    • leaudit_rule_type_bindings
    • leaudit_rule_sets.current_version_id
    • leaudit_rule_versions.oss_url
    • 下载到本地临时 rules.yaml
    • RulesLoader.load(local_path)
    • NativeRunner -> AuditService.audit(ctx)

这意味着后续开放 YAML 在线编辑界面时,不需要改 leaudit 核心,只要继续维护 “OSS + DB + 本地临时文件” 这条桥接链即可。

7.3 为什么必须保留“本地临时文件”

因为当前约束是:

  • 不修改 leaudit 核心
  • leaudit 仍以本地路径作为 DSL 加载输入

所以本地临时文件不是“倒退”,而是一个必要的兼容层。


8. 与现有文档的一致性

该方案与当前 docs/leaudit 目录中的设计方向保持一致:

  • docs/leaudit/dsl_rule_schema_design.md
    • 已提出“规则真相源 = OSS 文件 + 数据库索引”
    • 已提出“运行时 DB → OSS → 本地临时 YAML → LeAudit loader”
  • docs/leaudit/bridge_directory_design.md
    • 已明确 bridge 负责规则加载与缓存
  • docs/leaudit/processing_logic.md
    • 已明确 rules resolve 属于桥接层职责

本文件的重点是把“为了未来开放 YAML 编辑界面,为什么必须这样设计”单独说明清楚。


9. 当前项目建议

9.1 短期

  • 保持本地 rules/ 目录可用,确保现有流程可运行
  • 将其视为 fallback,而非长期正式真相源

9.2 中期

  • 增加规则内容查看 / 编辑 / 保存 / 发布接口
  • 补齐 leaudit_rule_versions 的 OSS 文件上传和版本切换能力
  • 补统一 OSS 客户端与 presign / upload / version publish 能力

9.3 长期

  • 后台提供完整 YAML 在线编辑器
  • 支持草稿、发布、回滚、审计
  • 清理本地硬编码规则映射,统一走规则绑定表

10. 最终结论

如果未来要开放 YAML 编辑界面,那么当前项目最合适的规则架构不是“继续依赖本地目录”,而是:

  • OSS 存规则文件正文
  • 数据库存路径、版本、哈希、状态、发布信息
  • 运行时下载到本地临时文件后交给 leaudit 执行

这样既能保证:

  • 不修改 leaudit
  • 兼容现有 DSL 加载方式

又能保证:

  • 在线编辑方便
  • 版本管理清晰
  • 发布回滚简单
  • 多实例一致
  • 运行结果可审计可追溯

这是当前项目向“规则可运营平台”演进时最合理的方案。