Files
crypto_okx_hub/设计文档.md
T

257 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# crypto_okx_hub 设计文档(第一期)
> 状态:**第一期骨架已落地**(登录 / 实例 CRUD / 总览拉取 / 内嵌+新标签 SSO)
> 仓库:[https://git.bz121.com/dekun/crypto_okx_hub.git](https://git.bz121.com/dekun/crypto_okx_hub.git)
---
## 1. 目标与边界
### 1.1 第一期要做
| 能力 | 说明 |
|------|------|
| 中控登录 | 独立账号(与客户端账号分离) |
| 客户端注册表 | 名称、公网 URL、Bridge Token、标签、启用状态 |
| 多机持仓总览 | 定时拉取各客户端只读快照,卡片/表格展示持仓与浮盈 |
| 一键打开 | **默认内嵌**中控(iframe / embed 壳);同时提供 **新标签打开** |
| 在线探测 | 心跳/拉快照失败则标离线 |
### 1.2 第一期明确不做
- 中控代下单 / 代改 env / 统一密钥
- 跨机资金划转、策略编排引擎
- 把中控塞进每台 `crypto_okx` 同进程部署
### 1.3 原则
- **中控 = 编排 + 只读聚合**;**客户端 = 唯一执行面**(密钥、下单、模拟盘均在客户端)。
- 浏览器「打开客户端」依赖用户能访问客户端 **公网域名**;中控拉快照依赖中控机器能访问同一公网 URL。
---
## 2. 关联仓库
| 仓库 | 角色 | 地址 |
|------|------|------|
| **crypto_okx_hub** | 中控(本仓库) | https://git.bz121.com/dekun/crypto_okx_hub.git |
| **crypto_okx** | 期权客户端 / 执行机 | https://git.bz121.com/dekun/crypto_okx.git |
客户端对外:**公网域名**(如 `https://okx-eth.example.com`)。
中控可部署在:**局域网机器** 或云服务器(第一期可用局域网)。
协议靠约定对齐,不强制 monorepo。客户端侧需提供(实现阶段在 `crypto_okx` 补):
1. 只读 Bridge API(Token 鉴权)— 持仓/资金/模式快照
2. Embed 入口 — 供中控 iframe 打开(可带短期 SSO / token)
---
## 3. 总体架构
```
┌─────────────────────┐ HTTPS 公网 ┌──────────────────────┐
│ 浏览器(操作员) │────────────────────────────▶│ crypto_okx Worker A │
│ │ iframe / 新标签打开 │ 公网域名 + 密钥/DB │
│ ┌───────────────┐ │ └──────────────────────┘
│ │ crypto_okx_hub│ │ 中控服务端拉快照
│ │ (局域网或云) │──┼────────────────────────────▶┌──────────────────────┐
│ └───────────────┘ │ GET /api/hub/options/... │ crypto_okx Worker B │
└─────────────────────┘ Header: X-Hub-Token └──────────────────────┘
```
- **中控 → 客户端**:服务端用 `base_url + bridge_token` 拉快照(不经过浏览器 CORS)。
- **浏览器 → 客户端**:内嵌 iframe 或新标签,走客户端公网域名(用户网络可达即可)。
---
## 4. 中控信息架构(页面)
| 页面 | 用途 |
|------|------|
| `/login` | 中控登录 |
| `/` 或 `/dashboard` | **多机总览**:每台一卡片(在线、模式 sim/live、总浮盈、持仓笔数、简表) |
| `/instances` | 客户端 CRUD(名称、URL、Token、标签、启用) |
| `/desk?id=…` | **工作台**:左侧实例列表,右侧 **iframe 内嵌** 该客户端;工具条含「新标签打开」 |
| (可选)`/desk` 无 id | 提示先选实例 |
总览卡片操作:
- **打开(内嵌)** → `/desk?id=`
- **新标签** → `window.open(public_url + embed路径)`
- 显示最近拉取时间 / 错误信息
---
## 5. 数据模型(中控本地 SQLite)
### 5.1 `hub_users`(可选极简:仅 env 账号也行)
第一期可用 `.env` 的 `HUB_USERNAME` / `HUB_PASSWORD`,表可后补。
### 5.2 `hub_instances`(核心)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | INTEGER PK | |
| name | TEXT | 展示名,如 `ETH-保守` |
| base_url | TEXT | 公网根,`https://okx-eth.example.com`(无尾斜杠) |
| bridge_token | TEXT | 与客户端 `HUB_BRIDGE_TOKEN` 一致 |
| embed_path | TEXT | 默认 `/embed` 或 `/options`(以实现为准) |
| tags | TEXT | JSON 或逗号标签 |
| enabled | INTEGER | 1=参与拉取 |
| sort_order | INTEGER | |
| created_at / updated_at | TEXT | |
拉取结果可 **内存缓存**(第一期),不必落库;需要历史再加 `hub_snapshot_cache`。
---
## 6. 客户端 Bridge 约定(crypto_okx 侧,实现期补齐)
### 6.1 鉴权
```
GET {base_url}/api/hub/options/snapshot
Header: X-Hub-Token: <与 HUB_BRIDGE_TOKEN 相同>
```
或 `Authorization: Bearer <token>`(二选一,实现时定一种)。
### 6.2 响应草案(version 字段便于演进)
```json
{
"ok": true,
"version": 1,
"instance": {
"label": "okx_sim",
"mode": "sim",
"options_enabled": true
},
"funds": {
"total_usdt": 0,
"trading_usdt": 0
},
"pnl": {
"unrealized_usdt": 0
},
"positions": [
{
"inst_id": "ETH-USD-...",
"opt_type": "C",
"sheets": 1,
"pnl_usdt": 12.3,
"mark": 0.01
}
],
"ts": "2026-10-01 10:00:00"
}
```
字段与现有 `lib/options/options_hub_lib.py` 的 `build_options_hub_snapshot` 对齐即可,减少客户端改动。
### 6.3 Embed / 打开
- 内嵌 URL:`{base_url}{embed_path}`,建议客户端提供可嵌套的 `/embed`(已有壳可复用)。
- 新标签:同一 URL。
- SSO(实现期):中控签发短时 `hub_sso` query,客户端校验后建 session;第一期也可先要求用户在 iframe 内再登一次(体验较差,优先做短期 token)。
---
## 7. 中控内部模块(建议目录)
```
crypto_okx_hub/
app.py # Flask 入口
requirements.txt
.env.example
ecosystem.config.cjs # 可选 PM2
lib/
auth_lib.py # 登录 session
instances_lib.py # 注册表 CRUD
bridge_client_lib.py # 拉取各机 snapshot(超时、并发)
dashboard_lib.py # 聚合总览
templates/ # 登录、总览、实例管理、desk(iframe)
static/
deploy/ # 安装脚本(第二期可细化)
使用说明.md
部署文档.md
设计文档.md
```
技术选型(第一期):
- Python + Flask(与客户端同栈,好维护)
- SQLite 存注册表
- 服务端 `concurrent.futures` / 线程池并发拉多机
- 前端:总览轮询 5–15s;desk 页 iframe + 顶栏按钮
---
## 8. 打开方式详细设计
| 方式 | 行为 | 默认 |
|------|------|------|
| 内嵌 | 进入 `/desk?id=`,右侧 iframe `src=客户端embed URL` | **是** |
| 新标签 | `target=_blank` 打开同一 URL | 提供按钮 |
注意:
- iframe 需客户端不设过于严格的 `X-Frame-Options: DENY`(或对中控 Origin 放行)。实现期在 `crypto_okx` 配置。
- 混合内容:中控若 HTTPS,客户端必须 HTTPS。局域网中控用 HTTP 时,客户端 HTTPS iframe 一般仍可用。
- Cookie:跨站 iframe 第三方 Cookie 受限 → **强烈建议短期 SSO token**,不要依赖第三方 Cookie。
---
## 9. 安全
| 项 | 做法 |
|----|------|
| Bridge Token | 每客户端独立;中控库中加密或至少权限收紧;只服务端使用 |
| 中控登录 | 强密码;仅局域网可再加 IP 限制 |
| 客户端防火墙 | 可选:仅允许中控出口 IP 访问 `/api/hub/*` |
| 密钥 | 永不到中控 |
| SSO | 短时、一次性、绑定 instance_id |
---
## 10. 实现分期
| 阶段 | 内容 | 仓库 |
|------|------|------|
| **H1** | 中控骨架:登录、实例 CRUD、总览拉快照、desk 内嵌 + 新标签 | hub |
| **C1** | 客户端:稳定 `/api/hub/options/snapshot` + Token;embed 允许被中控嵌;SSO | crypto_okx |
| **H2** | 总览体验:离线红标、错误条、标签筛选 | hub |
| 以后 | 告警汇总、代操作(慎重) | 双仓 |
建议顺序:**先 C1 最小快照可用 → 再 H1 总览能绿**;或 H1 用 mock 快照并行,联调时接真 API。
---
## 11. 验收标准(第一期)
1. 中控能登记 ≥2 个公网客户端(URL + Token)。
2. 总览能显示各机在线状态、浮盈、持仓列表(或空仓)。
3. 「打开」进入内嵌工作台,iframe 内可见客户端期权页。
4. 「新标签打开」可独立打开同一客户端。
5. 关掉某客户端进程后,总览在一轮拉取后显示离线/错误,不拖垮整页。
6. 文档写明关联仓库与部署步骤(本仓库已具备设计/说明/部署文档)。
---
## 12. 待实现时拍板的小项
- Bridge 路径最终用 `/api/hub/options/snapshot` 还是复用现有 hub 扩展点名。
- Embed 默认进 `/embed` 还是 `/options`。
- SSO 第一期是否必须(建议必须,否则 iframe 二次登录体验差)。
设计以上述默认为准;写代码时若有变,改本文件「变更记录」。
### 变更记录
| 日期 | 说明 |
|------|------|
| 2026-10-01 | 初稿:双仓、公网客户端、内嵌+新标签、总览第一期 |
| 2026-10-01 | 骨架实现:Flask 中控 + 客户端 Bridge/SSO |