197 lines
5.0 KiB
Markdown
197 lines
5.0 KiB
Markdown
# PRD ③ 管理端后端(Go managerd)V1
|
||
|
||
## 1. 目标与运行方式
|
||
|
||
- 提供本机 HTTP API 给 React UI 使用。
|
||
- 负责 UDP 广播发现(Option A),维护设备缓存与在线状态。
|
||
- 通过设备端 `rk3588-agent` 完成配置/模型等运维操作,并可通过 agent 代理读取 graphs/logs。
|
||
- 支持批量任务(并发、进度、失败原因)并通过 SSE 推送。
|
||
|
||
运行:单可执行 `managerd`,默认监听 `127.0.0.1:18080`(可配置)。
|
||
|
||
## 2. 外部依赖与约束
|
||
|
||
- Go 版本:>= 1.22(建议)
|
||
- 标准库优先;Web 框架可选 `chi`/`gin`(建议 chi + net/http)。
|
||
- 不需要数据库(V1 用内存 + 可选本地 JSON 持久化)。
|
||
|
||
## 3. 模块划分
|
||
|
||
### 3.1 Discovery
|
||
|
||
- 向所有可用网卡的广播地址发送 UDP discover。
|
||
- 监听本地 UDP socket 收集 replies(时间窗默认 1200ms)。
|
||
- 去重规则:按 `device_id` 去重,以最新 reply 为准。
|
||
|
||
### 3.2 Device Registry
|
||
|
||
- 内存缓存:
|
||
- `device_id -> {ip, agent_port, media_port, device_name, version, build_id, build_type, git_sha, last_seen_ms, online}`
|
||
- 定时刷新(可配置间隔):对 online 设备拉取 `GET /v1/graphs`(agent 代理),更新摘要。
|
||
- Offline 规则:超过 `offline_after_ms`(如 10000ms)未见到,则标记离线。
|
||
|
||
### 3.3 Device Client
|
||
|
||
- 统一超时:connect 1s、overall 3s(可配置)。
|
||
- 统一错误包装:返回 `error_code + message + device_id`。
|
||
- Token:
|
||
- 全局默认 token(V1)
|
||
- 可预留 per-device token(P1)
|
||
|
||
### 3.4 Templates/Config Builder
|
||
|
||
- 模板库来源:
|
||
- V1:managerd 内置(embed)或本地 `templates/` 目录读取
|
||
- 返回前端表单 schema:V1 允许手工维护(避免解析占位符带来的不确定性)。
|
||
- 生成 root config:基于模板与 params,产出 `{global,templates,instances}`。
|
||
|
||
### 3.5 Task Runner
|
||
|
||
- 任务类型:
|
||
- `config_apply`(对 N 台设备下发 config)
|
||
- `reload`
|
||
- `rollback`
|
||
- `model_upload`(V1 可先做单设备;批量后续)
|
||
- 并发控制:默认 5(可配置)。
|
||
- 状态:`pending/running/success/failed`(逐设备与整体)。
|
||
- 推送:SSE `GET /api/tasks/:id/events`。
|
||
|
||
## 4. managerd 对前端 API 规格(V1)
|
||
|
||
### 4.1 Discovery
|
||
|
||
#### `POST /api/discovery/search`
|
||
|
||
Request:
|
||
|
||
```json
|
||
{ "timeout_ms": 1200 }
|
||
```
|
||
|
||
Response:
|
||
|
||
```json
|
||
{ "items": [ {"device_id":"...","ip":"...","agent_port":9100,"media_port":9000,"device_name":"...","version":"...","build_id":"...","build_type":"release","git_sha":"..."} ] }
|
||
```
|
||
|
||
### 4.2 Devices
|
||
|
||
#### `GET /api/devices`
|
||
|
||
Response:
|
||
|
||
```json
|
||
{ "items": [ {"device_id":"...","online":true,"last_seen_ms":0,"ip":"...","agent_port":9100,"media_port":9000,"device_name":"...","version":"...","build_id":"...","build_type":"release","git_sha":"...","graphs":[...]} ] }
|
||
```
|
||
|
||
#### `GET /api/devices/:id`
|
||
|
||
Response:包含 `info`、`graphs_summary`、`last_seen`。
|
||
|
||
### 4.3 Device actions(代理调用)
|
||
|
||
以下全部通过 agent:
|
||
|
||
- `POST /api/devices/:id/reload` → agent `POST /v1/media-server/reload`
|
||
- `POST /api/devices/:id/rollback` → agent `POST /v1/media-server/rollback`
|
||
- `GET /api/devices/:id/graphs` → agent `GET /v1/graphs`
|
||
- `GET /api/devices/:id/graphs/:name` → agent `GET /v1/graphs/{name}`
|
||
- `GET /api/devices/:id/logs?limit=200` → agent `GET /v1/logs/recent?limit=200`
|
||
|
||
### 4.4 Config apply
|
||
|
||
#### `POST /api/devices/:id/config/apply`
|
||
|
||
Request:
|
||
|
||
```json
|
||
{ "config": { } }
|
||
```
|
||
|
||
Behavior:调用 agent `PUT /v1/config`。
|
||
|
||
### 4.5 Model upload
|
||
|
||
#### `POST /api/devices/:id/models/upload`
|
||
|
||
Request:`multipart/form-data`,字段:
|
||
|
||
- `name`: string
|
||
- `file`: binary
|
||
|
||
Behavior:读取文件流,转发为 agent `PUT /v1/models/{name}`(raw body)。
|
||
|
||
### 4.6 Templates
|
||
|
||
- `GET /api/templates`
|
||
- `GET /api/templates/:name`
|
||
|
||
### 4.7 Tasks
|
||
|
||
#### `POST /api/tasks`
|
||
|
||
Request:
|
||
|
||
```json
|
||
{
|
||
"type": "config_apply",
|
||
"device_ids": ["..."],
|
||
"payload": { "config": {} }
|
||
}
|
||
```
|
||
|
||
Response:
|
||
|
||
```json
|
||
{ "task_id": "..." }
|
||
```
|
||
|
||
#### `GET /api/tasks/:id/events` (SSE)
|
||
|
||
Event `device_update` data:
|
||
|
||
```json
|
||
{ "device_id":"...","status":"running|success|failed","progress":0.0,"error":"" }
|
||
```
|
||
|
||
## 5. 错误处理规范(managerd → 前端)
|
||
|
||
- 成功:2xx + `{"ok":true}` 或正常业务 JSON
|
||
- 失败:4xx/5xx +
|
||
|
||
```json
|
||
{ "error": { "code": "...", "message": "...", "device_id": "...", "detail": "..." } }
|
||
```
|
||
|
||
建议错误码:
|
||
|
||
- `DISCOVERY_FAILED`
|
||
- `DEVICE_NOT_FOUND`
|
||
- `DEVICE_OFFLINE`
|
||
- `DEVICE_HTTP_ERROR`
|
||
- `DEVICE_TIMEOUT`
|
||
- `TASK_NOT_FOUND`
|
||
- `VALIDATION_ERROR`
|
||
|
||
## 6. 配置文件(managerd)建议
|
||
|
||
`managerd.json`:
|
||
|
||
```json
|
||
{
|
||
"listen": "127.0.0.1:18080",
|
||
"discovery_port": 35688,
|
||
"discovery_timeout_ms": 1200,
|
||
"offline_after_ms": 10000,
|
||
"agent_token": "CHANGE_ME",
|
||
"concurrency": 5
|
||
}
|
||
```
|
||
|
||
## 7. 验收标准
|
||
|
||
1. Search 可发现设备并更新 registry;离线判断正确。
|
||
2. 可通过 agent 读取 graphs/logs(`GET /v1/graphs`、`GET /v1/logs/recent`)。
|
||
3. 单设备 `config/apply`、`reload`、`rollback` 可用,错误可定位。
|
||
4. 批量 `config_apply` 任务可并发执行并通过 SSE 输出逐台结果。
|