架构总览

Gateway New 是一套远程主机控制平面 SaaS。 核心思想:把 RMM/远控的”控制台 + 命令调度 + 计费”做成多租户云服务,agent 端尽量轻。

模块图

┌──────────────┐                         ┌──────────────────┐
│ 用户浏览器    │                         │ 用户的 Windows 主机 │
│ (user-web)   │ ──── BFF / cookie ──→  │ (m2-gateway agent) │
└──────────────┘                         └────────┬─────────┘

                                                wss

┌──────────────┐                                  ↓
│ admin 浏览器 │                         ┌──────────────────┐
│ (admin-web)  │ ──── BFF / cookie ──→  │   API 中枢       │
└──────────────┘                         │   (api/, Go)     │
                                         └────────┬─────────┘

                                              PG + Redis

                                         ┌────────┴─────────┐
                                         │   PostgreSQL 16  │
                                         └──────────────────┘

模块清单

模块语言 / 技术角色
api/Go 1.22 + Echo + pgx + zerologAPI 中枢;4 个入口分组(public/user/admin/api/internal-agent)
gateway/Rust + tokio + tokio-tungstenite + windows-rsWindows 主机 agent,~3 MB
user-web/Next.js 14 + TS + Tailwind用户控制台(注册 / 主机 / API Key / 充值 / 远程终端)
admin-web/Next.js 14 + TS + Tailwind管理员台(看板 / 用户 / 计费规则 / 版本 / 审计)
marketing-site/Astro 5 静态官网 + 文档
sdk-clients/Go / Python / TypeScript 三语言薄客户端用户调用 API 的 SDK
db/PostgreSQL 16 (17 表,月分区)主存
infra/Docker / k8s部署(待补)

数据流:典型调用

用户在自己代码里调 SDK:

SDK.exec_shell(host_id, req)
  ↓ HTTPS
中枢 /v1/api/hosts/{id}/process/shell
  middleware:
    1. AuthAPIKey      → 解 ak_xxx.yyy → 验 sha256 → 注入 user_id / api_key_id
    2. BillingCharge   → 查 pricing_rules → SELECT FOR UPDATE balance → 扣 5 token
                       → 不够 → 直接返 402
                       → 够 → next()
  handler:
    3. host 归属校验:host.user_id == ctx.user_id
    4. wshub.IsOnline(host_id) → 不在线返 409
    5. wshub.SendCmd({controls: 1<<13, ...}) → 阻塞等回包(30s deadline)
       ↓ wss frame: {type:"cmd", ...}
       Rust agent.controls::dispatch
         → proc_ops::exec_shell(async tokio::process)
         → 同步等命令 + 捕获 stdout/stderr/exit_code
       ↑ wss frame: {type:"cmd_resp", data: {stdout, stderr, exit_code, ...}}
    6. 异步写 call_logs(不阻塞响应)
  ← HTTP 200 + JSON

协议层

  • L1(向下兼容):HTTP POST /gateway + AES-256-CBC + 16 个老 controls
  • L2(新协议):POST /v2/gateway + AES-GCM;agent ↔ 中枢用 wss + JSON envelope + binary stream frame

详见 Agent ↔ 中枢 协议

计费

  • 每个 user_id 维护一个 billing_balances 表的 token 余额
  • 每条 /v1/api/* 路由按 billing_pricing_rules 表的 code 扣(如 control.exec_shell.per_call = 5 token)
  • 充值:1 CNY = 100 token
  • 退款 / 调整:admin 手工,自动落 audit
  • 流水:billing_events + call_logs(月分区)

技术决策(已锁定)

#选定
1API 中枢语言Go 1.22 + Echo
2支付第四方平台(MD5 sign + OnLinePay V2.0)
3出站长连接wss + JSON / binary stream frame
4mir2 编排保留(feature flag default-on)
5Gateway 入站保留 :23456 + GUI 改端口
6Gateway 实现语言Rust(windows-rs + tokio + axum)
7调用流水存储PostgreSQL 月分区;量起再加 ClickHouse
8agent_token 续期ed25519 challenge-response