架构总览
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 + zerolog | API 中枢;4 个入口分组(public/user/admin/api/internal-agent) |
gateway/ | Rust + tokio + tokio-tungstenite + windows-rs | Windows 主机 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(月分区)
技术决策(已锁定)
| # | 项 | 选定 |
|---|---|---|
| 1 | API 中枢语言 | Go 1.22 + Echo |
| 2 | 支付 | 第四方平台(MD5 sign + OnLinePay V2.0) |
| 3 | 出站长连接 | wss + JSON / binary stream frame |
| 4 | mir2 编排 | 保留(feature flag default-on) |
| 5 | Gateway 入站 | 保留 :23456 + GUI 改端口 |
| 6 | Gateway 实现语言 | Rust(windows-rs + tokio + axum) |
| 7 | 调用流水存储 | PostgreSQL 月分区;量起再加 ClickHouse |
| 8 | agent_token 续期 | ed25519 challenge-response |