跳到主内容

PRJ-07 WIP

CoBotrix 协熵云枢

cloud platform framework for robotics & smart devices

面向机器人与智能设备的 Rust 云平台框架

  • Rust
  • 云原生
  • 分布式
YEAR
2025–2026
ROLE
核心开发 · 模块设计
STATUS
WIP
TIER
项目

8 个

Cargo workspace 成员(cobotsrv / cobotusr / cobotlet / cobotnet / cobotmap 等)

3 种

部署形态:嵌入式单二进制 / 前后端分离 / 开发热重载

7 项

OIDC / OAuth 标准合规(Core 1.0、RFC 6749 / 7636 / 7517 / 7009 / 7662 / 6750)

// 01

问题背景

管理一群分布在各地的机器人 / 智能设备,痛点出奇一致:设备在 NAT 后面没有公网地址、每台设备网络环境不同、认证授权要同时服务人和机器。通用 IoT 平台要么太重,要么不解决 P2P 大流量传输。

CoBotrix 的思路是提供「框架」而非「全家桶」:核心通信用 MQTT 反向代理保证可达且可水平扩容,大流量走 EasyTier 组的 P2P VPN mesh,身份与权限做成标准 OIDC IdP + PDP,各业务应用按「声明权限 → 启动同步」接入。

// 02

系统架构

云端服务层

Server 侧核心组件

cobotsrv:设备管理后端 + PDP 权限决策(/enforce)cobotusr:OIDC 身份认证中心(IdP)cobotmap:地图代理服务SeaORM + PostgreSQL(实体 / 迁移 / 种子数据)

边缘与设备层

运行在各 Device 上的代理与工具

cobotlet:设备通信服务(命名灵感来自 kubelet),经 Net4mqtt 与 cobotsrv 通信cobotset:通用设备初始化设置工具cobotlog:设备异步日志管理

网络通信层

可达性与大流量分通道解决

Net4mqtt:MQTT Broker 上的 HTTP 反向代理,cobotsrv 与 cobotlet 实例 M:N 无状态扩容cobotnet:EasyTier P2P VPN(WireGuard 加密 + ICE 打洞),feature flag 可选启用IP 池分配 / 静态绑定 / 租约回收(easytier_network 表 + 每日回收任务)

前端与工具链层

管理界面与开发集群

cobotweb:Vue 3 + Vite 管理前端(cobotsrv / cobotusr / cobotlet 三端)rust-embed 编译期内嵌前端产物,单二进制发行cobotnil:一键启动本地虚拟集群(1 srv + 3 let + 内置 broker)

// 03

关键技术决策

每一条都包含「为什么这样选」与「代价是什么」——这是我理解这个项目的方式。

Net4mqtt 反向代理保核心通信,P2P VPN 扛大流量

设备在 NAT 后无法直连,常规做法是全部流量过云端中转——成本高且云端带宽成瓶颈。拆成两条路:控制面走 Net4mqtt(MQTT 上的 HTTP 反向代理),无状态可水平扩容;数据面(音视频、地图、大文件)走 EasyTier 组的 P2P mesh,虚拟 IP 直连。代价是两套网络模型并存、运维心智成本上升——README 也明确标注 Net4mqtt 不适合大规模数据传输和高性能网络。

内置标准 OIDC IdP,而非外挂 Keycloak

嵌入式 / 边缘场景要求单二进制、低依赖,外挂 Keycloak 太重。自己在 cobotusr 里实现 Authorization Code + PKCE、Client Credentials、Refresh Token 轮换,2048-bit RSA 密钥首次启动自动生成落盘,JWKS 端点对外发布。SPA 是 public client、权限同步是 confidential client——按 OAuth 规范拆成两个 client,bootstrap 时对「public 却带 client_credentials」的非法组合直接拒绝启动。代价是要自己守住 7 项 RFC 的合规细节,测试与文档成本不低。

权限平台:粗粒度走 JWT claims,细粒度走 PDP

路由级权限检查如果每次都远程调用,延迟与可用性都不可接受。用户登录时把 permission 数组解析进 JWT claims,应用侧用 require_perm! 宏本地 O(1) 判断;只有「用户只能操作自己的设备」这类需要匹配 resource_id 的细粒度场景才调 /enforce(glob 匹配 resource_pattern,建议调用方缓存 5s)。代价是 claims 有过期窗口内的权限滞后,用短 token + 刷新轮换缓解。

rust-embed 单二进制发行作为推荐生产形态

边缘网关与离线发行场景没有 Nginx、没有 CDN。前端产物编译期内嵌进 cobotsrv,一个进程同时供 SPA 与 API,交付物就是二进制。代价是前端改动要重编后端、二进制变大;三种部署形态(嵌入 / 分离 / 开发)共用一套配置模板派生流程(*.example 模板 → 本地派生、.gitignore 排除)来降低切换成本。

// 04

我的职责与产出

RESPONSIBILITIES

  • 参与 workspace 整体分层(云端 / 边缘 / 设备)与组件命名规范设计
  • 实现 OIDC 认证中心:授权流程、JWKS、Refresh Token 轮换
  • 实现权限平台:application / permission 数据模型、require_perm! 宏、/enforce PDP 端点
  • 实现 cobotnet 的 EasyTier 配置分发与 IP 池管理(分配 / 静态绑定 / 租约回收)
  • 搭建三种部署形态的配置模板派生与嵌入式单二进制构建链路

OUTCOMES

  • 设备在 NAT 后无需公网 IP 即可被云端管理与反向调用
  • OIDC 中心同时服务 SPA(PKCE)与机器间调用(Client Credentials)
  • 权限体系实现应用间隔离,新业务按「声明权限 → 启动同步」即可接入
  • cobotnil 一键起本地虚拟集群,开发联调不依赖真实设备

// 05

踩坑与复盘

最深的体会是「框架的克制」:cobotsrv 作为 IdP + PDP 坚决不碰业务权限规则,所有应用自己在配置里声明、启动时幂等同步——这条边界让平台没被任何一个业务拖进泥潭。不足是文档与代码的命名经历过一次迭代(cobotsrv / cobotusr 权责拆分),部分章节仍沿用旧命名;KVM 扩展等模块仍在 TODO。

// 06

技术栈

  • Rust
  • MQTT · Net4mqtt
  • EasyTier
  • OIDC
  • SeaORM
  • PostgreSQL
  • Vue 3

视觉风格