Files
csm/wiki/server.md
iven 60ee38a3c2 feat: 新增补丁管理和异常检测插件及相关功能
feat(protocol): 添加补丁管理和行为指标协议类型
feat(client): 实现补丁管理插件采集功能
feat(server): 添加补丁管理和异常检测API
feat(database): 新增补丁状态和异常检测相关表
feat(web): 添加补丁管理和异常检测前端页面
fix(security): 增强输入验证和防注入保护
refactor(auth): 重构认证检查逻辑
perf(service): 优化Windows服务恢复策略
style: 统一健康评分显示样式
docs: 更新知识库文档
2026-04-11 15:59:53 +08:00

3.8 KiB
Raw Blame History

Server服务端

设计思想

csm-server 是整个系统的核心枢纽,同时承载三个协议:

  1. TCP 二进制协议 (端口 9999) — 接入 Client 代理
  2. HTTP REST API (端口 9998) — 服务 Web 面板
  3. WebSocket (/ws) — 实时推送设备状态变更到前端

关键设计决策:

  • SQLite + WAL — 单机部署零依赖WAL 模式支持并发读写
  • include_dir 嵌入前端 — 编译时将 web/dist/ 打包进二进制,部署只需一个文件
  • 三层权限 — public登录/健康检查)→ authenticated只读→ admin写操作
  • ClientRegistryArc<RwLock<HashMap>> 管理在线客户端的 TCP 写端,支持 push_to_targets() 三级作用域推送

代码逻辑

启动流程

main() → load config → init SQLite → run migrations → ensure admin
       → spawn TCP listener (9999)
       → spawn alert cleanup task
       → spawn health score task
       → build HTTP router (9998) with CORS/security headers/SPA fallback
       → axum::serve()

TCP 接入层 (tcp.rs)

  • start_tcp_server() — 监听 TCP每连接 spawn 一个 task
  • process_frame() — 根据 MessageType 分发到对应 handler需先 verify_device_uid
  • ClientRegistry — 线程安全的在线设备注册表,支持 list_online()send_frame()
  • push_to_targets(db, clients, msg_type, payload, target_type, target_id) — 三级作用域推送global/group/device
  • 帧速率限制100 帧/5秒/连接
  • HMAC 验证:心跳帧必须携带 HMAC-SHA256 签名,连续 3 次失败断开
  • 空闲超时180 秒无数据断开
  • 最大并发连接500

HTTP API (api/)

路由分三层:

  • public: /api/auth/login, /api/auth/refresh, /health
  • authenticated (require_auth 中间件): GET 类设备/资产/告警/插件查询
  • admin (require_admin + require_auth): 设备删除、策略增删改、插件配置写入

统一响应格式 ApiResponse<T>{ success, data, error },分页默认 page=1, page_size=20, 上限 100。

WebSocket (ws.rs)

  • WsHub 广播设备上线/离线/状态变更事件给所有连接的前端客户端
  • JWT 认证通过 query parameter ?token=xxx

后台任务

  • alert::cleanup_task() — 定期清理过期告警
  • health::health_score_task() — 定期计算设备健康评分

关联模块

  • protocol — 使用 Frame 编解码和 MessageType 分发
  • client — TCP 连接的对端
  • web-frontend — HTTP API 和 WebSocket 的消费者
  • plugins — API 层的 plugins/ 子模块处理所有插件相关路由
  • database — 数据库操作集中在 db.rs

关键文件

文件 职责
crates/server/src/main.rs 启动入口、数据库初始化、迁移、路由组装、SPA fallback
crates/server/src/tcp.rs TCP 监听、帧处理、ClientRegistry、push_to_targets
crates/server/src/ws.rs WebSocket hub 广播
crates/server/src/api/mod.rs 路由定义、ApiResponse 信封、Pagination
crates/server/src/api/auth.rs JWT 登录/刷新/改密、限流、require_auth/require_admin 中间件
crates/server/src/api/devices.rs 设备列表/详情/状态/历史/健康评分 API
crates/server/src/api/plugins/mod.rs 插件路由注册read_routes + write_routes
crates/server/src/api/plugins/*.rs 各插件 API handler每个插件一个文件
crates/server/src/db.rs DeviceRepo 数据库操作方法集合
crates/server/src/config.rs AppConfig TOML 配置加载
crates/server/src/health.rs 设备健康评分计算
crates/server/src/anomaly.rs 异常检测逻辑
crates/server/src/alert.rs 告警处理与清理
crates/server/src/audit.rs 审计日志