# evorule-server
**Repository Path**: evorule/evorule-server
## Basic Information
- **Project Name**: evorule-server
- **Description**: EvoRule核心的官方HTTP服务入口
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-01
- **Last Updated**: 2026-09-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# EvoRule Server
**EvoRule 核心的官方 HTTP 服务入口**
> 把 evorule 的确定性反应式执行能力,封装成可远程访问、可监控、可集成的服务
[](Cargo.toml)
[](LICENSE)
[](CHANGELOG.md)
[](https://github.com/tokio-rs/axum)
[快速开始](#快速开始) ·
[认证](#认证与用户体系) ·
[架构](#架构) ·
[API 概览](#api-概览) ·
[实战指南](docs/INTEGRATION_GUIDE.md) ·
[避坑记录](docs/PITFALLS.md) ·
[配置](#配置) ·
[部署](#部署) ·
[路线图](#已知限制--路线图)
---
> ## ✅ v0.4.2 — 稳定发布 (2026-09-06)
>
> 本仓库**独立 release**,不绑其他仓的发布节奏;版本号只与本仓 [CHANGELOG](CHANGELOG.md) 对应。
>
> **0.4.2**:发版链补全——方案 A 全自动分发包流水线(双平台零依赖包:server.exe + rule-serve 0.3.1 配套 + web 静态 + 规则 + 启动脚本 + 中文说明,gitee/github 双 Release 自动回传);Docker 镜像 smoke 修复(fail-closed 安全防护与镜像默认配置冲突定因,smoke 显式传临时 token)。server 运行时行为零变更。
>
> **0.4.1**:核心引擎依赖 0.4.0 → 0.4.1;`GET /api/sessions/:id/diff` 版本不可达由"空 diff"改为 `400 BAD_REQUEST`;宪法文件更名 `core_eval.json` → `server_eval.json`(启动期旧名兼容检测,不静默回退)。
>
> **0.4.0**:核心引擎升级(单会话长跑 O(n²) 性能缺陷修复,实测 10000 命令会话 51s 全程平坦;⚠️ WAL 事实格式升级单向);**平台用户体系与统一认证**(bootstrap 首启 / 登录 / 用户 / 角色 / 权限点,业务 API 双凭据中间件);审计档案只读 API(从 WAL 重建历史会话审计链);插件清单三级配置(`--plugins`);`physics-services` / `indicator-services` 两个确定性原生插件;模板市场 / 服务端 PDF 导出 / 执行侧知识通道 API 族;负载演练与性能基准三件套;AGPL + 商业双许可体系。
>
> **版本策略**:生态内各仓版本号**独立发展、独立发布**,互不强求一致——核心仓(evorule)技术定位稳定、几乎不改动,本仓与其他各仓快速演进。
>
> 本仓库**不是** EvoRule 的核心引擎 —— 核心引擎以 `evorule-tcb` / `evorule-reactor` / `evorule-governance` 形式发布到 crates.io。本仓的定位是**框架的官方 HTTP server 实现** + server 配套的 lib(auth / io_handlers / metrics / hot_reload / debug_control / semantic_invariants / time_machine / rule_tools / rule_schema / workspace)。
>
> **使用风险自负**。issue / PR 欢迎,但不保证响应时间。
---
## 一句话定位
**EvoRule Server = 把 evorule 核心跑成 HTTP 服务。**
核心引擎提供 `execute_transition` 纯函数 + 反应器运行时;本仓提供 HTTP 入口、Session 管理、审计流、Prometheus 指标、认证与用户体系、I/O handler 编排、调试控制、模板市场与导出。
**适合谁用**:
- 想把 evorule 集成进现有系统的**集成商 / SRE**
- 需要远程 session 管理的**规则工程师**
- 需要审计流 SSE 接口、审计档案与因果追溯的**审计员 / 合规官**
- 需要多用户 / 角色权限管理的**平台管理员**
- 想要 devops 友好(Docker / Prometheus / Grafana / OpenAPI / Swagger UI)的**运维**
---
## 架构
```
┌─────────────────────────────────────────────────────────────┐
│ evorule-server 进程 (单端口 18080) │
├─────────────────────────────────────────────────────────────┤
│ axum HTTP (18080) + /metrics 端点 (Prometheus 抓取) │
├─────────────────────────────────────────────────────────────┤
│ Session API Audit SSE Debug API Metrics │
│ /api/sessions/… /api/sessions/{id}/events /api/sessions/{id}/debug/… │
├─────────────────────────────────────────────────────────────┤
│ evorule-server (本仓) ← 编排 + 路由 + 状态 │
│ ├── api/server session / 审计 / 时间机器 / 调试 路由 │
│ ├── api/platform_auth 平台用户体系 + 统一认证中间件(双凭据) │
│ ├── api/permissions 权限点注册表 + 提交/评审流 │
│ ├── api/bundles 规则包导入(6 项校验+原子落盘) │
│ ├── api/marketplace 模板市场(CRUD + 在线编辑 + 下载) │
│ ├── api/pdf_export 服务端 PDF 导出(中文字体子集嵌入) │
│ ├── api/knowledge 执行侧数据资产只读通道 │
│ ├── api/openapi OpenAPI 单一真相源 │
│ ├── core/io_handlers DB / HTTP / Memory 适配器 │
│ ├── core/auth Bearer + 速率限制 + 恒定时间比较 │
│ ├── core/metrics Prometheus 指标(7 个核心 metric) │
│ ├── core/hot_reload rules/ 目录监控 + 零停机重载 │
│ ├── core/debug_control pause / resume / step / inspect │
│ ├── core/semantic_invariants 规则一致性自检 │
│ ├── core/time_machine rewind / diff / fork │
│ ├── core/rule_tools 规则脚手架 + 校验 │
│ ├── core/rule_schema 规则 Schema 门禁 │
│ ├── core/plugin-kit 插件路由机制件(插件为薄壳具名委托) │
│ ├── core/workspace 多租户工作空间 + 规则元数据管理 │
│ └── plugins/ 业务服务插件(demo / physics / indicator) │
├─────────────────────────────────────────────────────────────┤
│ evorule 核心 (crates.io 依赖) │
│ ├── evorule-tcb 纯函数执行 + 类型安全 │
│ ├── evorule-reactor 反应式 runtime + 哈希链 WAL │
│ └── evorule-governance SessionManager + Auditor + time_machine │
└─────────────────────────────────────────────────────────────┘
```
**关键约束**:
- 本仓**不改核心引擎代码** —— 核心引擎变更走 crates.io release
- 本仓**独立 release**,不绑其他仓的发布节奏
- publish 状态:`evorule-server` 与 `core/*` 内部 lib 均 `publish = false`(应用层,不进 crates.io)
---
## 快速开始
### 1. 编译
```bash
git clone https://gitee.com/evorule/evorule-server.git
cd evorule-server
cargo build --release
```
### 2. 启动
**最小启动(基础 session / 审计 / 时间机器 / 规则热重载)**——默认监听 `0.0.0.0:18080`,数据存 `./data/`:
```bash
./target/release/evorule-server
```
> ⚠️ **启用 `call_external` / `call_service`(角色 1/3 外部服务调用)必须显式挂载服务注册表**,否则 `ServiceRegistry` 为空,任何 `service_name` 调用都会返回 `unknown service_name`:
>
> ```bash
> ./target/release/evorule-server \
> --service-registry ./service_registry.json \
> --allow-loopback
> ```
>
> 仓库已内置 `service_registry.json`(含 `echo_svc` / `llm_advisor` 示例)与 `echo_server.py` 演示后端。可用 `dev-start.sh` 一键拉起完整本地演示环境,并跑通 `role13_demo` 端到端验证。详见[实战指南](docs/INTEGRATION_GUIDE.md)。
### 3. 第一个 session
```bash
# 健康检查
curl http://localhost:18080/api/health
# 创建 session(无需请求体)
curl -X POST http://localhost:18080/api/sessions
# 提交命令(set counter=1)
curl -X POST http://localhost:18080/api/sessions//command \
-H "Content-Type: application/json" \
-d '{"instruction":{"type":"set","params":{"attr":"counter","operation":"set","value":1}}}'
# 查询状态
curl http://localhost:18080/api/sessions//state
```
### 4. 平台认证(多用户场景)
单机 / 内嵌场景可跳过此节(不配置认证 = 全开放,仅限开发)。生产部署推荐启用平台用户体系:
```bash
# 首启创建管理员(仅当平台无用户时可用,否则 409)
curl -X POST http://localhost:18080/api/platform/auth/bootstrap \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"<至少8位>","display_name":"管理员"}'
# 登录获取会话 token
curl -X POST http://localhost:18080/api/platform/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"<密码>"}'
```
业务 API 由统一认证中间件保护,**双凭据**:静态 Bearer token(`--auth-token`)或平台会话 token 任一均可;统一 401 语义。`bootstrap` / `login` / `auth/status` 公开,其余平台端点需平台 token。演示场景可开 `--demo-auth`(体验包默认开,生产建议关闭)。
完整路由(OpenAPI 收录 **84 条**,另有工作空间路由族)见 `GET /api/openapi.json`;Swagger UI 需 `--openapi-ui` 显式开启(`GET /api/docs`)。
---
## API 概览
> 下表为人工梳理的主要端点;**单一真相源是 `GET /api/openapi.json`**(84 条路径)。
### 健康与元信息
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/health` | GET | 健康检查(响应含插件挂载事实) |
| `/api/health/liveness` | GET | 存活检查(始终 200) |
| `/api/health/readiness` | GET | 就绪检查(退出期间 503) |
| `/api/openapi.json` | GET | OpenAPI 文档(单一真相源) |
### Session 与执行
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/sessions` | POST/GET | 创建 / 列出 session |
| `/api/sessions/{id}` | GET/DELETE | 详情 / 关闭 |
| `/api/sessions/{id}/command` | POST | 提交命令 |
| `/api/sessions/{id}/io_response` | POST | 回应外部 I/O 请求 |
| `/api/sessions/{id}/payload` | POST | 更新 payload |
| `/api/sessions/{id}/state` | GET | 当前状态快照 |
| `/api/sessions/{id}/snapshot` | GET | 完整快照 |
| `/api/sessions/{id}/events` | GET (SSE) | 事件流(含心跳) |
| `/api/sessions/{id}/finished` | GET | 会话是否已终结 |
| `/api/sessions/reap` | POST | 清理已终结会话 |
| `/api/command` ` /api/payload` ` /api/state` ` /api/audit` | POST/GET | 单反应器模式便捷端点(向后兼容,免 session id) |
### 时间机器
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/sessions/{id}/rewind` | GET | 时间回溯(`?version=N`) |
| `/api/sessions/{id}/diff` | GET | 时点对比(`?a=N&b=M`;版本不可达 = 400) |
| `/api/sessions/{id}/history` | GET | 版本历史 |
| `/api/sessions/{id}/replay` | GET | 重放 |
| `/api/sessions/fork/{parent_id}` | POST | 时点分支(`?version=N`) |
| `/api/sessions/from/{parent_id}` | POST | 从父会话派生 |
### 调试控制
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/sessions/{id}/debug/phase` | GET | 当前 phase |
| `/api/sessions/{id}/debug/queue` | GET | 队列状态 |
| `/api/sessions/{id}/debug/pending_io` | GET | 待处理 I/O |
| `/api/sessions/{id}/pending_io_count` | GET | 待处理 I/O 计数 |
| `/api/sessions/{id}/step` | GET | 单步执行 |
| `/api/sessions/{id}/interrupt` | POST | 中断反应器 |
| `/api/sessions/{id}/abort` | POST | 强制中止(**默认 404**,需 `--allow-abort` 显式开启) |
| `/api/sessions/{id}/invariants` | GET | 语义不变量自检结果 |
| `/api/sessions/{id}/causal_depth` | GET | 因果深度 |
### 审计
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/sessions/{id}/audit` | GET | 审计报告(支持 `include_content`) |
| `/api/sessions/{id}/audit/verify` | GET | 验证审计链完整性 |
| `/api/sessions/{id}/audit/export` | GET | 导出审计链 JSON(另有 `/compressed`) |
| `/api/sessions/{id}/audit/import` | POST | 导入审计链(另有 `/compressed`) |
| `/api/sessions/{id}/audit/auto_verify` | GET | 自动验证状态 |
| `/api/sessions/{id}/audit/causal/{fact_id}` | GET | 因果链追溯 |
| `/api/audit-archive/sessions` | GET | 审计档案:从 WAL 重建历史会话列表(只读) |
| `/api/audit-archive/sessions/{id}/audit` | GET | 审计档案:历史会话审计链 |
| `/api/audit/platform-events` | GET | 平台认证事件报表(只读派生事实链) |
### 事实与共享事实
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/sessions/{id}/facts` | GET | 按前缀查询会话事实 |
| `/api/shared/facts` | GET | 共享事实查询 |
| `/api/shared/facts/version` | GET | 共享事实版本 |
| `/api/shared/facts/rollup` | POST | 共享事实汇总 |
| `/api/shared/facts/{fact_id}/source` ` /used_by` | GET | 事实来源 / 消费方追溯 |
| `/api/sessions/{id}/used_at_startup` | GET | 启动期使用的事实 |
### 平台认证 / 用户 / 角色(0.4.0)
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/platform/auth/bootstrap` | POST | 首启创建管理员(已有用户则 409) |
| `/api/platform/auth/login` / `logout` | POST | 登录 / 登出 |
| `/api/platform/auth/me` / `status` | GET | 当前用户 / 认证状态 |
| `/api/platform/auth/change-password` | POST | 改密 |
| `/api/platform/users` ` /users/{username}` | GET/POST/PATCH/DELETE | 用户管理 |
| `/api/platform/roles` ` /roles/{name}` | GET/POST/… | 角色管理 |
| `/api/platform/permissions` | GET | 权限点注册表 |
### 权限 / 规则包 / 规则
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/permissions` | GET/POST | 权限列表 / 创建 |
| `/api/permissions/evaluate` | POST | 权限评估 |
| `/api/permissions/{id}/submit` ` /review` | POST | 提交 / 评审 |
| `/api/bundles/import` | POST | 导入规则包(6 项校验+原子落盘) |
| `/api/bundles/import/dry-run` | POST | 导入预检(只校验不落盘) |
| `/api/bundles/active` | GET | 当前激活规则包 |
| `/api/bundles/imports` | GET | 导入历史 |
| `/api/rules` | GET | 当前规则集 |
| `/api/rules/validate` | POST | 规则校验 |
| `/api/rules/reload` | POST | 热重载 |
### 数据与服务
| 路径 | 方法 | 说明 |
| --- | --- | --- |
| `/api/knowledge` | GET | 数据集列表(执行侧只读通道) |
| `/api/knowledge/{ds}/entries` ` /{entry_id}` | GET | 条目查询 |
| `/api/services` | GET | 已绑定服务列表 |
| `/api/export/pdf` | POST | 服务端 PDF 导出(纯 Rust 文本型,中文字体子集嵌入;body 上限 32MB) |
| `/api/marketplace/templates` | GET/POST | 模板市场:列表 / 上传 |
| `/api/marketplace/templates/{id}` | GET/PATCH/DELETE | 模板详情 / 在线编辑 / 删除 |
| `/api/marketplace/templates/{id}/download` | GET | 模板下载 |
| `/api/workspaces` 族 | GET/POST/PATCH/DELETE | 多租户工作空间 + 成员 + 规则 CRUD / 版本 / 激活 / 沙盒 |
| `/metrics` | GET | Prometheus 指标(需 `--metrics-auth` 时带 Bearer) |
### 深入阅读
- [实战集成指南](docs/INTEGRATION_GUIDE.md) — I/O handler 架构、session 生命周期、审计链完整使用、规则编写实战要点、本地开发环境搭建
- [踩坑记录与避坑指南](docs/PITFALLS.md) — 15 个实际集成中遇到的坑(I/O 超时 / SSRF / HTTP 头语义 / 规则 path / TCB 类型限制等),每个含现象、根因、修复方案
---
## 认证与用户体系
两层机制,可单独或组合使用:
| 层 | 启用方式 | 凭据 | 适用 |
| --- | --- | --- | --- |
| 静态 token | `--auth-token ` | Bearer token | 单管理员 / 服务间调用 |
| 平台用户体系 | bootstrap 首启即启用 | 平台会话 token | 多用户 / 角色 / 审计需求 |
- **双凭据**:启用后业务 API 接受静态 token **或** 平台会话 token;统一 401 语义
- 受信服务管道:`--service-token`(service 身份,可写受保护域 `stable.llm` / `stable.system`)
- 认证事件全部落审计事实链,可经 `/api/audit/platform-events` 报表查询
- `/metrics` 可独立要求认证(`--metrics-auth`)
---
## 配置
配置加载优先级:**CLI 参数 > 环境变量(前缀 `EVORULE_`)> JSON 配置文件 > 内置默认值**。
### 环境变量 / CLI 参数
| 变量 | CLI 参数 | 默认 | 说明 |
| ------------------------- | ------------------- | ---------------------------- | --------------------------------------- |
| `EVORULE_CONFIG` | `--config` | (无) | JSON 配置文件路径 |
| `EVORULE_ADDR` | `--addr` | `0.0.0.0:18080` | 监听地址 |
| `EVORULE_AUTH_TOKEN` | `--auth-token` | (空) | Bearer token(留空 = 关闭认证,仅 dev) |
| `EVORULE_SERVICE_TOKEN` | `--service-token` | (空) | 受信服务管道 token(service 身份,可写受保护域 `stable.llm`/`stable.system`;仅认证启用时生效) |
| `EVORULE_CORE_EVAL` | `--core-eval` | `./resources/server_eval.json` | 宪法文件路径(不可热重载) |
| `EVORULE_RULES_DIR` | `--rules-dir` | `./rules` | 业务规则目录(热重载监听) |
| `EVORULE_DB_PATH` | `--db-path` | `./data/evorule.db` | SQLite 数据库路径 |
| `EVORULE_MEMORY_DIR` | `--memory-dir` | `./data/memory` | Memory handler 存储目录 |
| `EVORULE_MAX_ROUNDS` | `--max-rounds` | `1000` | 反应器最大指令执行步数 |
| `EVORULE_LOG_LEVEL` | `--log-level` | `info` | tracing 级别 |
| `EVORULE_LOG_FORMAT` | `--log-format` | `plain` | 日志格式(`plain` / `json`) |
| `EVORULE_LOG_FILE` | `--log-file` | (空) | 日志文件路径(不设则仅输出 stderr) |
| `EVORULE_WAL_DIR` | `--wal-dir` | (空) | WAL 目录(指定后启用持久化;未配置时启动有数据风险警示) |
| `EVORULE_WAL_FSYNC` | `--wal-fsync` | `false` | 每次 WAL 写入后 fsync |
| `EVORULE_WAL_MAX_SIZE_MB` | `--wal-max-size-mb` | `100` | 单个 WAL 文件最大大小(0 = 不轮换) |
| `EVORULE_AUTO_VERIFY` | `--auto-verify` | `false` | 审计链实时验证 |
| `EVORULE_NO_RATE_LIMIT` | `--no-rate-limit` | `false` | 禁用速率限制(仅 benchmark) |
| `EVORULE_ALLOWED_ORIGINS` | `--allowed-origins` | (空) | CORS 允许的 Origin 列表(逗号分隔;空 = 仅同源;`*` = 全放行,仅开发) |
| `EVORULE_WORKSPACE_DB` | `--workspace-db` | `./data/workspace.db` | Workspace 元数据库路径(独立于业务 db_path) |
| `EVORULE_LOG_MAX_DAYS` | `--log-max-days` | `7` | 日志文件保留天数 |
| `EVORULE_LOG_MAX_SIZE_MB` | `--log-max-size-mb` | `1024` | 日志目录最大占用空间(MB) |
| `EVORULE_AUTO_VERIFY_THRESHOLD` | `--auto-verify-threshold` | `1000` | 审计条目数超过此值时跳过验证(0 = 不限制) |
| `EVORULE_AUTO_VERIFY_INTERVAL` | `--auto-verify-interval` | `1` | 每 N 次 audit_new 验证一次 |
| `EVORULE_SERVICE_REGISTRY` | `--service-registry` | (空) | service_name→URL 映射文件(call_service/call_external 用);**不配置则注册表为空,所有外部服务调用报 `unknown service_name`** |
| `EVORULE_PLUGINS` | `--plugins` | (空) | 插件清单文件(未配置 = 进程内原生插件全部启用;见[插件清单](#插件清单)) |
| `EVORULE_STATEMENT_WHITELIST` | `--statement-whitelist` | (空) | SQL 语句模板白名单文件(未设置则 QUERY_DB 全部返回错误) |
| `EVORULE_ALLOW_LOOPBACK` | `--allow-loopback` | `false` | 允许 HTTP handler 访问 loopback 地址(仅本地开发, 生产禁用) |
| `EVORULE_METRICS_AUTH` | `--metrics-auth` | `false` | 启用 /metrics 端点认证(需 Bearer token) |
| `EVORULE_OPENAPI_UI` | `--openapi-ui` | `false` | 挂载 Swagger UI(`GET /api/docs`;`/api/openapi.json` 始终可用) |
| `EVORULE_ALLOW_ABORT` | `--allow-abort` | `false` | 启用强制中止会话端点(`POST /api/sessions/{id}/abort`, 默认 404) |
| `EVORULE_DEMO_AUTH` | `--demo-auth` | `false` | 演示登录入口开关(体验包默认开;生产建议关) |
| `EVORULE_WEB_DIR` | `--web-dir` | (空) | 静态前端托管目录(SPA 回退 index.html;不设则不托管) |
### JSON 配置文件
```bash
evorule-server --config evorule.json
```
```json
{
"server": { "addr": "0.0.0.0:18080", "max_rounds": 1000 },
"auth": { "token": "" },
"paths": {
"core_eval": "./resources/server_eval.json",
"rules_dir": "./rules",
"db_path": "./data/evorule.db",
"memory_dir": "./data/memory",
"wal_dir": "./data/wal",
"plugins": "./plugin_manifest.json"
},
"log": { "level": "info", "format": "json", "file": "./logs/evorule.log" }
}
```
文件不存在或解析失败时降级为纯 CLI/环境变量启动(仅 warn 日志,不报错)。
### 插件清单
进程内原生插件(`plugins/` 下各 crate,如 `demo-services`、`physics-services`、`indicator-services`)支持**部署期启用/裁剪**:通过清单文件声明各插件启用集,改清单 + 重启即生效(不做运行时热启停——运行时热变更与确定性审计链的兼容性未论证)。
```bash
evorule-server --plugins ./plugin_manifest.json
```
清单文件形态(多插件,键 = 插件 id;`services` 省略 = 该插件全部服务启用;显式列出 = 子集启用;未列出的插件全启):
```json
{
"plugins": {
"demo-services": {
"enabled": true,
"services": ["inverse_kinematics_solver", "llm_advisor", "robot_move_joints",
"shadow_ik_solver", "sampling_service", "rule_sandbox", "config_persist"]
},
"physics-services": {
"enabled": true,
"services": ["physics_simulate", "physics_energy", "physics_grav_band"]
},
"indicator-services": {
"enabled": true,
"services": ["indicator_sma", "indicator_ema", "indicator_macd", "indicator_rsi"]
}
}
}
```
语义约定:
| 清单写法 | 行为 |
|---|---|
| 未配置 `--plugins`(缺省) | 全部原生插件/服务启用——存量部署零迁移 |
| `enabled: true` + `services` 省略 | 该插件全部服务启用 |
| `enabled: true` + `services` 列出子集 | 仅启用列出的服务;未启用服务名回落 HTTP 注册表(`--service-registry`) |
| `enabled: false` | 不挂载该插件,`call_service`/`call_external` 直连 HTTP 注册表 |
校验为 **fail-fast**(启动期拒绝,不静默忽略):清单文件不可读、JSON 非法、未知插件 id、`services` 为空、服务名未注册/重复声明,均报错退出并附自诊断指引(合法服务名清单、修复路径)。
**运行可见性**:`GET /api/health` 响应含 `plugins` 节,如实呈现启动期挂载事实——
```json
{
"success": true,
"message": "ok",
"plugins": {
"demo-services": { "enabled": true, "services": ["config_persist"] },
"physics-services": { "enabled": true, "services": ["physics_energy"] },
"indicator-services": { "enabled": true, "services": ["indicator_sma"] }
}
}
```
**新增原生插件/服务** = 新建(或在既有)插件 crate 的 `NATIVE_SERVICES` 声明表追加服务项 + 在 `src/main.rs` 的 `PLUGIN_DEFS` 登记表登记声明表指针(清单解析/挂载链/健康可见性机制代码零改动;路由器机制件由 [`core/plugin-kit`](core/plugin-kit) 公共 crate 提供,插件为薄壳具名委托)——部署方按需在清单中启用;详见 [plugins/demo-services/README.md](plugins/demo-services/README.md)、[plugins/physics-services/README.md](plugins/physics-services/README.md)、[plugins/indicator-services/README.md](plugins/indicator-services/README.md)。进程外能力不走本清单,一律经 `--service-registry` 声明文件接入。
---
## 部署
### Docker(推荐)
```bash
docker build -t evorule-server:0.4.2 .
docker run -d --name evorule-server -p 18080:18080 -v $(pwd)/data:/data -e EVORULE_AUTH_TOKEN= evorule-server:0.4.2
```
### 二进制
```bash
cargo build --release
./target/release/evorule-server
```
### 性能基准(参考,实测时点数据)
| 场景 | 吞吐 | 基准代码 |
| ------------------- | ----------------- | -------- |
| 单 session 顺序命令 | 5000 cmd/s | `evorule-server/examples/bench_determinism.rs` |
| 多 session 并发 | 800 cmd/s/session | `evorule-server/examples/bench_throughput.rs` |
| 100k 命令长 session | 1.2 GB WAL | `evorule-server/examples/bench_long_session.rs` |
负载演练脚本见 `scripts/load-drill.ps1`。0.4.0 修复单会话长跑 O(n²) 缺陷后,10000 命令会话 51s 全程平坦(修复前同规模推算需数十小时)。
---
## 已知限制 / 路线图
| 项 | 状态 | 说明 |
| ---------------------------------------- | -------- | ------------------------------------- |
| `cargo build --release` 编译时间 | ~3-4 min | cold build |
| 启动时间(冷启动) | ~2s | 含 WAL 校验 |
| 平台用户体系 + 统一认证(双凭据) | ✅ | bootstrap / 登录 / 用户 / 角色 / 权限点;统一 401 |
| 审计档案(WAL 重建历史会话,只读) | ✅ | `/api/audit-archive/*` + 平台事件报表 |
| 插件部署期启用/裁剪(`--plugins` 三级配置) | ✅ | fail-fast 校验 + `/api/health` 挂载事实 |
| 确定性原生插件(physics / indicator) | ✅ | 辛积分器物理内核;pandas 逐位对齐技术指标 |
| 模板市场 / 服务端 PDF 导出 / 知识通道 | ✅ | marketplace CRUD+在线编辑;PDF 中文字体子集;`/api/knowledge` 只读 |
| OpenAPI 单一真相源 | ✅ | `GET /api/openapi.json`(84 条);Swagger UI 需 `--openapi-ui` |
| 多租户工作空间 (`core/workspace`) | ✅ | 工作空间 / 成员 / 规则 CRUD + 版本 + 激活 |
| 输入净化 (Prompt 注入防御) | ✅ | `InputSanitizer` 公共服务, 静默改写 |
| API 版本化 (`/api/v1/` 锁定) | ❌ | 1.0 之前不承诺 |
| 多反应器协作原语 | ❌ | 路线图 |
| 插件运行时热启停 | ❌ | 与确定性审计链的兼容性未论证,只做部署期配置 |
| 第三方安全审计 | ❌ | 1.0 之前不做 |
| 集群模式 (cluster/) | ❌ | 已弃用,见 commit 历史 |
当前以本节"已知限制 / 路线图"表格为准。
---
## 依赖关系
本仓依赖以下 crates.io 包(核心引擎):
- `evorule-tcb` — 纯函数执行 + 类型安全
- `evorule-reactor` — 反应式 runtime + 哈希链 WAL
- `evorule-governance` — SessionManager + Auditor + time_machine
本仓**独立发布**,不绑核心仓的发布节奏。
---
## 贡献
见 [CONTRIBUTING.md](CONTRIBUTING.md)。
> Issue 与 PR 请提交到 [Gitee](https://gitee.com/evorule/evorule-server)。
---
## 许可证
EvoRule Server 采用 **AGPL + 商业授权双轨许可**(与[核心仓](https://gitee.com/evorule/evorule)一致):
- **代码(本仓所有 Rust 代码)**:AGPL-3.0-or-later(见 [LICENSE](LICENSE));闭源商业/白标场景提供**商业许可**,详见 [DUAL_LICENSE.md](DUAL_LICENSE.md) / [COMMERCIAL_LICENSE.md](COMMERCIAL_LICENSE.md);政府/学术界/非营利可申请免费豁免,见 [FREE_COMMERCIAL_LICENSE.md](FREE_COMMERCIAL_LICENSE.md)
- **文档**:`docs/` 下文档以 CC-BY-4.0 发布,本 README 顶部为 AGPL 头部
- **宪法(server 业务规则集)**:`resources/server_eval.json` 采用 CC0 1.0 公共领域(0.4.1 前旧名 `core_eval.json`;与核心仓宪法原则职责不同、独立演进)
---
## 联系方式
- 邮箱:
- Gitee:[@evorule](https://gitee.com/evorule)