220 lines
9.6 KiB
Markdown
220 lines
9.6 KiB
Markdown
# 手工交易中控 — 部署文档
|
||
|
||
本文档描述在本机(以 Windows 为主)将 **manual_trading_hub** 部署为「多账户监控 + 紧急全平」的推荐步骤、验收方法与注意事项。功能说明与配置项详见同目录 **《README.md》**。
|
||
|
||
---
|
||
|
||
## 一、部署目标
|
||
|
||
- 本机或局域网可访问 **中控页面**(默认监听 `0.0.0.0:5100`,私网 IP 可打开;本机可用 `127.0.0.1`)。
|
||
- 每个需要纳入监控的交易所账户,有独立的 **子代理** 进程(默认端口 **`15200`~`15203`**,与各 `crypto_monitor_*` 里 Flask 的 **`APP_PORT`** 错开)。
|
||
- 策略项目 `crypto_monitor_binance` / `crypto_monitor_okx` / `crypto_monitor_gate` / `crypto_monitor_gate_bot` **无需修改代码**,与中控并行运行。
|
||
|
||
---
|
||
|
||
## 二、前置条件
|
||
|
||
1. 已安装 **Python 3.10+**,且 `pip` 可用。
|
||
2. 各策略目录下已配置好交易所 API(与平时运行 Flask 时相同的 `.env` 或环境变量)。各项目 `app.py` 会读取同目录 `.env` 中的 **`APP_HOST` / `APP_PORT`** 用于 **Flask**;子代理使用环境变量 **`PORT`**,二者不能占用同一端口。
|
||
3. 本机端口 **`15200`~`15203`、5100**(及你各策略 `.env` 里的 `APP_PORT`)无冲突;若被占用,须改子代理 `PORT` 并同步修改 `HUB_AGENTS`。
|
||
4. **Linux 路径约定(可选)**:若部署在 Ubuntu 等环境,建议将整个代码树放在 **`/opt/crypto_monitor/`** 下(与 `scripts/后台运行-Ubuntu.md` 示例一致),例如策略目录为 `/opt/crypto_monitor/crypto_monitor_binance`、中控为 `/opt/crypto_monitor/manual_trading_hub`。
|
||
|
||
---
|
||
|
||
## 三、目录与文件
|
||
|
||
```
|
||
manual_trading_hub/
|
||
agent.py # 子代理(单账户)
|
||
hub.py # 中控
|
||
requirements.txt # Python 依赖
|
||
static/
|
||
index.html # 中控前端页面
|
||
README.md # 说明文档
|
||
部署文档.md # 本文档
|
||
```
|
||
|
||
---
|
||
|
||
## 四、安装依赖
|
||
|
||
在 `manual_trading_hub` 目录执行:
|
||
|
||
```powershell
|
||
cd manual_trading_hub
|
||
python -m venv .venv
|
||
.\.venv\Scripts\Activate.ps1
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
Linux / macOS:
|
||
|
||
```bash
|
||
cd manual_trading_hub
|
||
python3 -m venv .venv
|
||
source .venv/bin/activate
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
后续启动 `hub.py` / `agent.py` 时,请使用**同一虚拟环境**中的 `python`,保证已安装 `fastapi`、`uvicorn`、`httpx`、`ccxt`;若各策略 `.env` 中配置了 **SOCKS 代理**(`GATE_SOCKS_PROXY` / `BINANCE_SOCKS_PROXY` / `OKX_SOCKS_PROXY` 等),还需 **`PySocks`**(已写入 `requirements.txt`,新环境 `pip install -r requirements.txt` 即可)。
|
||
|
||
---
|
||
|
||
## 五、部署步骤(推荐顺序)
|
||
|
||
### 步骤 1:确认策略进程(可选)
|
||
|
||
若你平时已运行各目录下的 Flask(`app.py`),可保持运行;中控与子代理**不依赖** Flask 是否启动。
|
||
|
||
### 步骤 2:为每个账户启动子代理
|
||
|
||
**每个账户一个终端窗口**,在对应策略项目目录进入后加载环境变量,再启动 agent(路径按你仓库实际位置调整)。
|
||
|
||
示例:**Binance 账户 → 子代理端口 15200**(Flask 的 `APP_PORT` 可为 5000、5001 等,由该目录 `.env` 决定,二者不同即可)
|
||
|
||
```powershell
|
||
cd D:\你的路径\交易复盘系统\crypto_monitor_binance
|
||
.\.venv\Scripts\Activate.ps1 # 若策略项目使用独立 venv,可在此激活
|
||
# 确保已加载 .env(若你用 dotenv-cli 等工具,在此执行)
|
||
$env:EXCHANGE="binance"
|
||
$env:PORT="15200"
|
||
$env:HOST="127.0.0.1"
|
||
python ..\manual_trading_hub\agent.py
|
||
```
|
||
|
||
**OKX → 子代理 `PORT=15201`**、`EXCHANGE=okx`;**Gate → 15202**、**Gate-Bot → 15203**,`EXCHANGE=gate`。
|
||
|
||
**可选安全**:各 agent 与中控制台设置相同随机串:
|
||
|
||
```powershell
|
||
$env:CONTROL_TOKEN="你的长随机串"
|
||
```
|
||
|
||
子代理与中控均需设置同一 `CONTROL_TOKEN`。
|
||
|
||
### 步骤 3:启动中控
|
||
|
||
新开终端:
|
||
|
||
```powershell
|
||
cd D:\你的路径\交易复盘系统\manual_trading_hub
|
||
.\.venv\Scripts\Activate.ps1
|
||
$env:HUB_HOST="0.0.0.0"
|
||
$env:HUB_PORT="5100"
|
||
# 若暂不使用 OKX,可在服务端固定关闭 id=1:
|
||
# $env:HUB_DISABLED_IDS="1"
|
||
python hub.py
|
||
```
|
||
|
||
控制台无报错即表示监听成功(日志级别为 `warning`,默认不刷屏)。
|
||
|
||
### 步骤 4:浏览器验收
|
||
|
||
1. 打开 **http://127.0.0.1:5100/** 或 **http://本机局域网IP:5100/** 。
|
||
2. 应看到与 `HUB_AGENTS` 配置一致的账户卡片;已启动子代理的行应能显示余额或持仓(无持仓则显示「无持仓」)。
|
||
3. 点击 **立即刷新**,数据应更新。
|
||
4. 取消某一行的 **「参与监控」**,该行应变灰且不再刷新数据;再勾选应恢复。
|
||
|
||
**不建议**在生产环境对实盘轻易点击「全平」做测试;若必须测试,请使用测试网或小资金账户。
|
||
|
||
---
|
||
|
||
## 六、接口验收(可选)
|
||
|
||
在已启动 hub 的本机 PowerShell:
|
||
|
||
```powershell
|
||
Invoke-RestMethod "http://127.0.0.1:5100/api/agents"
|
||
Invoke-RestMethod "http://127.0.0.1:5100/api/snapshot"
|
||
```
|
||
|
||
子代理单测(需 agent 已启动):
|
||
|
||
```powershell
|
||
Invoke-RestMethod "http://127.0.0.1:15200/health"
|
||
Invoke-RestMethod "http://127.0.0.1:15200/status"
|
||
```
|
||
|
||
若启用了 `CONTROL_TOKEN`,需加请求头(PowerShell 示例):
|
||
|
||
```powershell
|
||
$h = @{ "X-Control-Token" = "你的长随机串" }
|
||
Invoke-RestMethod "http://127.0.0.1:15200/status" -Headers $h
|
||
```
|
||
|
||
---
|
||
|
||
## 七、自定义端口与账户数量
|
||
|
||
仅部署 3 个账户时,可只启动 3 个 agent,并设置:
|
||
|
||
```powershell
|
||
$env:HUB_AGENTS="http://127.0.0.1:15200,http://127.0.0.1:15202,http://127.0.0.1:15203"
|
||
$env:HUB_AGENT_NAMES="Binance,Gate,Gate-Bot"
|
||
```
|
||
|
||
`HUB_AGENT_NAMES` 与 URL **数量、顺序**一一对应。
|
||
|
||
---
|
||
|
||
## 八、常驻运行(可选)
|
||
|
||
**不必一直开着终端。** Ubuntu 下可用 **tmux 脱离**、**nohup &**、或 **systemd**(推荐:崩溃自启、可开机启动)。
|
||
|
||
详细命令、**常见问题(screen / PySocks / 重启)**与 **systemd 单元示例**见:
|
||
|
||
- `manual_trading_hub/scripts/后台运行-Ubuntu.md`
|
||
- `manual_trading_hub/scripts/example-systemd/*.service.example`(改路径后复制到 `/etc/systemd/system/`)
|
||
|
||
Windows 可将 `hub.py` 与各 `agent.py` 写入「启动」文件夹,或使用 **NSSM** / **任务计划程序** 在登录后启动;注意工作目录与环境变量要在任务里写全。
|
||
|
||
---
|
||
|
||
## 九、升级与回滚
|
||
|
||
- **升级**:在 `manual_trading_hub` 下 `git pull`(若使用 Git)后,重新 `pip install -r requirements.txt` 即可。
|
||
- **回滚**:恢复上一版本代码与依赖;配置仅环境变量与浏览器 localStorage,无数据库。
|
||
|
||
---
|
||
|
||
## 十、故障排查
|
||
|
||
### 10.1 现象速查表
|
||
|
||
| 现象 | 可能原因 | 处理 |
|
||
|------|----------|------|
|
||
| 页面打不开 | 中控未启动或端口错 | 检查 `HUB_PORT`、防火墙、是否用 127.0.0.1 访问 |
|
||
| 某账户一直报错 | 子代理未启动或端口不一致 | 核对 `HUB_AGENTS` 与该 agent 的 `PORT` |
|
||
| 中控 JSON 报错 / `Expecting value` | 子代理未启动、返回非 JSON、或端口错 | 本机 `curl http://127.0.0.1:1520x/status`;确认 agent 已起且端口与 `HUB_AGENTS` 一致 |
|
||
| 401 / 连不上子代理 | `CONTROL_TOKEN` 不一致 | 中控与子代理设为同一令牌,或全部去掉令牌 |
|
||
| 有密钥仍报缺密钥 | 启动 agent 时未加载策略目录的 `.env` | 在对应目录启动,或手动 export 全部密钥变量 |
|
||
| `/status` 里 `ok:false`,文案含 **pysocks** / **SOCKS** | 使用 SOCKS 代理但未装 **PySocks** | 在 **`manual_trading_hub/.venv`** 执行 `pip install PySocks` 或 `pip install -r requirements.txt` |
|
||
| **已安装 PySocks**,`/status` 仍报同样 pysocks 文案 | 子代理进程未重启 | 子代理是常驻进程,**仅 pip 不会替换已运行进程**;退出对应 screen / systemd 单元后重新拉起(Ubuntu 见 `scripts/后台运行-Ubuntu.md` §四) |
|
||
| 跑 `start_agents_3screen.sh` 无新会话 | screen 会话已存在被脚本跳过 | 先 `stop_agents_3screen.sh`,或 `screen -S mt-agent-xxx -X quit` 后再启动 |
|
||
| 子代理行为异常、依赖已装仍报错 | 实际用的不是 hub 的 venv | `ps aux` 查看命令行,应为 **`/opt/crypto_monitor/manual_trading_hub/.venv/bin/python`** `…/manual_trading_hub/agent.py`(路径按你机器实际根目录调整);否则在**当前使用的解释器**对应环境中装依赖,或改用官方脚本启动 |
|
||
| 子代理端口与 Flask 抢端口 | `PORT` 与策略目录 `.env` 的 `APP_PORT` 相同 | 子代理用 **15200~15203**(或自改),Flask 继续用 `APP_PORT`,二者勿重复 |
|
||
| 全平失败 | 持仓模式、精度、交易所维护 | 看返回 JSON 中 `errors` 字段;对照交易所 App |
|
||
|
||
### 10.2 依赖或代码更新后
|
||
|
||
- **`pip install -r requirements.txt` 或单独 `pip install` 之后**:须**重启**受影响的 **hub**、**各子代理** 进程,变更才会生效。
|
||
- **拉取新版本代码后**:同样重启进程;若曾遇 `'function' object has no attribute load_markets'` 等旧版 agent 异常,升级后重启子代理即可。
|
||
|
||
---
|
||
|
||
## 十一、安全清单(部署前自检)
|
||
|
||
- [ ] 若机器暴露在公网,已用防火墙限制 `HUB_PORT` 或已改为 `HUB_HOST=127.0.0.1` / `HUB_TRUST_LAN=0` 仅本机。
|
||
- [ ] API Key 权限最小化;生产环境建议启用 IP 白名单。
|
||
- [ ] `CONTROL_TOKEN` 已设为足够长的随机串(若启用)。
|
||
- [ ] 已告知实际操作人员:**全局全平**不可撤销。
|
||
|
||
---
|
||
|
||
## 十二、与说明文档的关系
|
||
|
||
- **《README.md》**:产品能力、架构、环境变量表、API 简表、常见问题。
|
||
- **《部署文档.md》**:按步骤安装、启动、验收与运维注意(本文)。
|
||
|
||
两处如有端口/变量不一致,以**当前代码**与 **README 中的表格**为准。
|