From 6ec5a2caf106fdd4faaabb79e2d52f7648bbc2c9 Mon Sep 17 00:00:00 2001 From: dekun Date: Mon, 25 May 2026 11:57:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=8D=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manual_trading_hub/.env.example | 1 + manual_trading_hub/README.md | 2 +- manual_trading_hub/云服务器部署说明.md | 289 +++++++++++++++++++++ manual_trading_hub/使用说明.md | 2 +- manual_trading_hub/局域网与反代部署说明.md | 2 + manual_trading_hub/常见问题.md | 24 +- manual_trading_hub/部署文档.md | 1 + 7 files changed, 311 insertions(+), 10 deletions(-) create mode 100644 manual_trading_hub/云服务器部署说明.md diff --git a/manual_trading_hub/.env.example b/manual_trading_hub/.env.example index 68835c2..f79451b 100644 --- a/manual_trading_hub/.env.example +++ b/manual_trading_hub/.env.example @@ -1,6 +1,7 @@ # ============================================================================= # 中控 hub.py / 子代理 agent.py 环境变量模板(可提交 Git) # 使用:cp .env.example .env 后填入真实值;启动前由 shell export 或 dotenv 加载 +# 云服务器完整说明:见 云服务器部署说明.md # ============================================================================= # hub.py 监听 diff --git a/manual_trading_hub/README.md b/manual_trading_hub/README.md index c46bfd6..30476c1 100644 --- a/manual_trading_hub/README.md +++ b/manual_trading_hub/README.md @@ -1,6 +1,6 @@ # 复盘系统中控(manual_trading_hub) -> **完整说明**:[使用说明.md](./使用说明.md) · **部署**:[部署文档.md](./部署文档.md) · **故障实录**:[常见问题.md](./常见问题.md) +> **完整说明**:[使用说明.md](./使用说明.md) · **部署**:[部署文档.md](./部署文档.md) · **云服务器**:[云服务器部署说明.md](./云服务器部署说明.md) · **局域网/反代**:[局域网与反代部署说明.md](./局域网与反代部署说明.md) · **故障**:[常见问题.md](./常见问题.md) 多账户 **监控聚合 + 紧急全平**;**不在中控网页下单**。人工下单、关键位、**策略交易**(`/strategy`)、复盘请在各 `crypto_monitor_*` 实例网页操作(监控卡片 **「实例」** / **「复盘」**)。**增加子账户**见 [使用说明 §4.3](./使用说明.md#43-增加账户例如再挂一个-gate)。 diff --git a/manual_trading_hub/云服务器部署说明.md b/manual_trading_hub/云服务器部署说明.md new file mode 100644 index 0000000..897b05e --- /dev/null +++ b/manual_trading_hub/云服务器部署说明.md @@ -0,0 +1,289 @@ +# 云服务器部署说明 + +本文说明在 **云服务器(VPS)** 上部署 `crypto_monitor` 中控与四实例的推荐配置:硬件、软件、防火墙、宝塔反代、环境变量、PM2 启动与验收。 + +云上标准做法:**域名 + 宝塔/Nginx 反代 + HTTPS**;业务端口(5100、5000~5004、15200~15203)**不对公网直连**。 + +相关文档: + +- [局域网与反代部署说明.md](./局域网与反代部署说明.md) — 局域网 IP:端口 与反代域名对照、SSO 行为 +- [部署文档.md](./部署文档.md) — PM2、依赖安装、日常运维 +- [使用说明.md](./使用说明.md) — 中控功能说明 +- [常见问题.md](./常见问题.md) — 故障排查 +- 环境变量模板:[.env.example](./.env.example) + +--- + +## 一、服务器硬件与系统 + +| 项目 | 建议 | +|------|------| +| 配置 | **2 核 4G** 起步;四实例 + 中控 + PM2 同时运行,**4G~8G 更稳** | +| 系统 | **Ubuntu 22.04 / 24.04**(项目文档按 Linux 编写) | +| 磁盘 | **20G+**;日志、SQLite、上传图片会占空间 | +| 网络 | 需能访问各交易所 API;若走代理,在对应 `crypto_monitor_*/.env` 配置 `OKX_SOCKS_PROXY`、`BINANCE_SOCKS_PROXY` 等 | + +--- + +## 二、软件环境 + +```bash +sudo apt update +sudo apt install -y python3 python3-venv python3-pip git curl + +# 进程守护(推荐) +sudo npm i -g pm2 +``` + +**宝塔面板(可选但推荐)**:安装 **Nginx**,用于反向代理与 **SSL**(Let’s Encrypt)。 + +Python 虚拟环境(分开安装,互不替代): + +| 目录 | 用途 | +|------|------| +| `manual_trading_hub/.venv` | 中控 `hub.py` + 子代理 `agent.py` | +| `crypto_monitor_binance/.venv` | 币安 Flask | +| `crypto_monitor_okx/.venv` | OKX Flask | +| `crypto_monitor_gate/.venv` | Gate 训练 Flask | +| `crypto_monitor_gate_bot/.venv` | Gate 趋势 Flask | + +各实例 `ecosystem.config.cjs` 一般已设置 **`PYTHONPATH=..`**(仓库根),以便加载 `hub_bridge.py`、`hub_auth.py` 等。 + +--- + +## 三、网络与端口(云上最重要) + +**原则:公网只暴露 Nginx 的 80/443;Flask 与 agent 只监听本机。** + +| 服务 | 本机端口(示例) | 是否对公网开放 | +|------|------------------|----------------| +| 中控 hub | 5100 | **否** → 仅 `https://hub.你的域名` 反代 | +| 币安 Flask | 5001 | **否** → `https://binance.你的域名` | +| OKX Flask | 5004 | **否** → `https://okx.你的域名` | +| Gate 训练 Flask | 5000 | **否** → `https://gate.你的域名` | +| Gate 趋势 Flask | 5002 | **否** → `https://gate-bot.你的域名` | +| 子代理 agent | 15200~15203 | **否**,必须 **127.0.0.1** | + +### 云厂商安全组 / 系统防火墙 + +- **放行**:`80`、`443`(给宝塔/Nginx) +- **不要放行**:`5100`、`5000`~`5004`、`15200`~`15203`(除非临时本机调试,用完即关) + +--- + +## 四、域名与宝塔反代 + +为 **中控 + 每个要对外打开的实例** 各建一个站点(子域名示例): + +| 站点(浏览器访问) | 反代目标 | +|--------------------|----------| +| `https://hub.example.com` | `http://127.0.0.1:5100` | +| `https://okx.example.com` | `http://127.0.0.1:5004` | +| `https://binance.example.com` | `http://127.0.0.1:5001` | +| `https://gate.example.com` | `http://127.0.0.1:5000` | +| `https://gate-bot.example.com` | `http://127.0.0.1:5002` | + +### 宝塔操作要点 + +1. 每个域名 → **网站** → **反向代理** → 目标 `http://127.0.0.1:对应端口`。 +2. 申请 **SSL**(Let’s Encrypt),强制 HTTPS。 +3. **不要**再给实例站加一层宝塔「访问密码」(会与 Flask `/login` 重复);直链鉴权用下文 **`APP_USERNAME` / `APP_PASSWORD`**。 +4. Nginx 建议保留常见代理头(宝塔默认通常已带): + +```nginx +proxy_set_header Host $host; +proxy_set_header X-Real-IP $remote_addr; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +``` + +中控请求实例 `/api/hub/*` 时会带 **`X-Hub-Token`**,一般无需额外配置。 + +--- + +## 五、环境变量(必配) + +### 5.1 中控 `manual_trading_hub/.env` + +```env +HUB_HOST=0.0.0.0 +HUB_PORT=5100 + +# 与四实例 .env 完全相同(API + SSO 签名) +HUB_BRIDGE_TOKEN=请填一长串随机字符 + +# 中控网页登录(公网务必设置) +HUB_USERNAME=admin +HUB_PASSWORD=强密码 +HUB_SESSION_SECRET=另一串随机字符 + +# 中控为 HTTPS 时建议 true +HUB_COOKIE_SECURE=true + +# 仅本机访问中控进程时可 true;公网反代访问建议 false +HUB_TRUST_LAN=false + +# 从中控打开实例的 SSO 链接有效期(秒),默认 7200 = 2 小时 +HUB_SSO_TTL_SEC=7200 + +# 各实例 hub_settings 里 flask_url 已写 https 域名时,一般可不设 +# HUB_PUBLIC_ORIGIN=https://hub.example.com +``` + +完整项见 [`.env.example`](./.env.example)。 + +### 5.2 四个实例 `crypto_monitor_*/.env` + +每个目录都要有(**直链** `https://okx.域名` 时用这套登录网页): + +```env +# 各所 API 密钥(按交易所填写) +# APP_PORT=5004 + +# 与中控 manual_trading_hub/.env 中 HUB_BRIDGE_TOKEN 完全一致 +HUB_BRIDGE_TOKEN=与中控相同 + +# 四实例建议统一(直链登录用) +APP_USERNAME=统一用户名 +APP_PASSWORD=统一强密码 + +# 云服务器切勿开启(会跳过网页登录): +# APP_AUTH_DISABLED=true +``` + +### 5.3 子代理 + +- `CONTROL_TOKEN` 可与 `HUB_BRIDGE_TOKEN` 相同。 +- 由 PM2 在对应 `crypto_monitor_*` 目录启动,`run_agent.sh` 加载该目录 `.env`。 +- 只监听 **127.0.0.1:1520x**,不映射到公网。 + +--- + +## 六、中控「系统设置」`hub_settings.json` + +在网页 **系统设置** 保存,或编辑 `manual_trading_hub/hub_settings.json`。 + +云上 **`flask_url` 必须写浏览器能打开的 HTTPS 域名**(不要写 `127.0.0.1`,除非配合 `HUB_PUBLIC_ORIGIN` 做替换): + +| 字段 | 云上填法 | 说明 | +|------|----------|------| +| `flask_url` | `https://okx.example.com` | 用户浏览器、SSO 打开实例 | +| `agent_url` | `http://127.0.0.1:15201` | 仅中控本机访问子代理 | +| `enabled` | 按需 | 不参与监控的户可关 | +| `capabilities` | 按需 | `key` / `trend` 等 | + +**同机部署的两种写法(二选一):** + +1. **推荐**:每个实例 `flask_url` 直接写该实例的 `https://子域名`。 +2. **备选**:`flask_url` 写 `http://127.0.0.1:5004`,中控 `.env` 设 `HUB_PUBLIC_ORIGIN=https://okx.example.com`(适合共用一个 IP、靠端口区分时)。 + +`agent_url` 始终用 **`http://127.0.0.1:1520x`**。 + +--- + +## 七、PM2 启动顺序 + +代码路径示例:`/opt/crypto_monitor/`(按实际替换)。 + +```bash +cd /opt/crypto_monitor + +# 1)四个实例 Flask(各目录 ecosystem.config.cjs,进程名以你机器为准) +cd crypto_monitor_okx && pm2 start ecosystem.config.cjs +cd ../crypto_monitor_binance && pm2 start ecosystem.config.cjs +cd ../crypto_monitor_gate && pm2 start ecosystem.config.cjs +cd ../crypto_monitor_gate_bot && pm2 start ecosystem.config.cjs + +# 2)中控 + 四个子代理(一条拉起 5 个进程) +cd ../manual_trading_hub +python3 -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +cp .env.example .env # 编辑填入真实值 +chmod +x scripts/run_hub.sh scripts/run_agent.sh +pm2 start ecosystem.config.cjs +pm2 save +pm2 startup # 按提示执行 sudo 命令后再 pm2 save +``` + +或: + +```bash +cd /opt/crypto_monitor/manual_trading_hub +bash scripts/pm2_hub.sh start +``` + +### PM2 进程一览 + +| 进程名 | 说明 | +|--------|------| +| `manual-trading-hub` | 中控 :5100 | +| `manual-agent-binance` | :15200 | +| `manual-agent-okx` | :15201 | +| `manual-agent-gate` | :15202 | +| `manual-agent-gate-bot` | :15203 | +| `crypto_*`(各目录自定) | 各 Flask `APP_PORT` | + +不用 OKX 时可在 `.env` 设 `HUB_DISABLED_IDS=1`,或 `pm2 stop manual-agent-okx`。 + +--- + +## 八、访问与登录(云上行为) + +| 访问方式 | 地址示例 | 需要什么 | +|----------|----------|----------| +| 中控监控 | `https://hub.example.com/monitor` | **中控** `HUB_USERNAME` / `HUB_PASSWORD` | +| 中控点「实例 / 策略交易 / 复盘」 | 自动打开 `https://okx.example.com/hub-sso?...` | 已登中控即可;**2 小时内、单次** SSO,**免输**实例密码 | +| 浏览器直链实例 | `https://okx.example.com` | 实例 **`APP_USERNAME` / `APP_PASSWORD`**(`/login`) | + +SSO 复用 **`HUB_BRIDGE_TOKEN`** 签名,详见 [局域网与反代部署说明.md §五](./局域网与反代部署说明.md)。 + +--- + +## 九、安全建议(云服务器必看) + +1. **SSH**:密钥登录,关闭密码登录;必要时改 SSH 端口。 +2. **`HUB_BRIDGE_TOKEN`**:足够长、随机;勿提交 Git、勿写进前端页面。 +3. **交易所 API Key**:仅放在各实例 `.env`;权限尽量最小化(勿随意开提币)。 +4. **中控**:公网必须设 `HUB_PASSWORD`;`HUB_TRUST_LAN=false`。 +5. **实例**:云上 **`APP_AUTH_DISABLED` 必须为 false**(或未设置)。 +6. **备份**:定期备份各实例数据库 / SQLite 与 `hub_settings.json`。 +7. **`.env` 换行**:Linux 上勿用 Windows CRLF;可用 `bash scripts/fix_env_crlf.sh`。 + +--- + +## 十、部署后验收清单 + +- [ ] `https://hub.你的域名` 能打开并登录中控 +- [ ] 监控卡片有持仓/余额(子代理在线) +- [ ] 已登录中控 → 点「实例」→ **无**实例登录页,直接进入 +- [ ] 隐身窗口直开 `https://okx.你的域名` → 出现 **`/login`**,统一账号密码可进 +- [ ] `pm2 status`:hub、4×agent、用到的 `crypto_*` 均为 online +- [ ] 云安全组 **未** 对公网开放 5100、5000~5004、15200~15203 +- [ ] 四实例 `.env` 与中控 `HUB_BRIDGE_TOKEN` 一致 +- [ ] 实例启动日志无长期 `[hub_bridge] ImportError` + +--- + +## 十一、常见问题速查 + +| 现象 | 处理 | +|------|------| +| 从中控打开仍要实例密码 | 见 [常见问题.md §4.3](./常见问题.md);检查 token、重启 Flask、`hub_settings` 的 `key` | +| 监控无持仓 / 子代理不可用 | `curl http://127.0.0.1:15201/status`;查 `.env` CRLF、API 密钥 | +| 复盘/实例链接是 127.0.0.1 | `flask_url` 改为 https 域名,或设 `HUB_PUBLIC_ORIGIN` | +| 仅 Gate 子代理反复重启 | `.env` CRLF:`bash manual_trading_hub/scripts/fix_env_crlf.sh` | + +--- + +## 十二、与局域网部署的区别(简要) + +| 项目 | 云服务器 | 局域网 | +|------|----------|--------| +| 对外地址 | `https://子域名` | `http://内网IP:端口` | +| `flask_url` | 写 **域名** | 写 **内网 IP:端口** | +| 防火墙 | 只开 80/443 | 内网可开 5100、500x | +| SSL | 必须(宝塔证书) | 通常 HTTP 即可 | +| `HUB_COOKIE_SECURE` | 建议 `true` | HTTP 时用 `false` | + +局域网详细步骤见 [局域网与反代部署说明.md §三](./局域网与反代部署说明.md)。 diff --git a/manual_trading_hub/使用说明.md b/manual_trading_hub/使用说明.md index 3629463..b928901 100644 --- a/manual_trading_hub/使用说明.md +++ b/manual_trading_hub/使用说明.md @@ -186,7 +186,7 @@ curl -s http://127.0.0.1:5100/api/ping | **机器人单** | 来自实例 `/api/hub/monitor` 的 `order_monitors`(active),为本地监控计划,**不等于**交易所条件单 | | **关键位** | 仅 `capabilities` 含 `key` 的户;展示门控摘要(`/api/price_snapshot`) | | **趋势计划** | 仅当该户勾选 **监控趋势计划** 时展示 `trend_pullback_plans`(active) | -| **实例 / 复盘** | 「实例」「策略交易」「复盘」经中控签发 **SSO 链接**(默认 2h、单次)打开,**免输**实例 `APP_USERNAME/PASSWORD`;直链实例 IP/域名仍走 `/login`。局域网与反代配置见 **[局域网与反代部署说明.md](./局域网与反代部署说明.md)** | +| **实例 / 复盘** | 「实例」「策略交易」「复盘」经中控签发 **SSO 链接**(默认 2h、单次)打开,**免输**实例 `APP_USERNAME/PASSWORD`;直链实例 IP/域名仍走 `/login`。**云服务器**见 **[云服务器部署说明.md](./云服务器部署说明.md)**;局域网/反代见 **[局域网与反代部署说明.md](./局域网与反代部署说明.md)** | | **关键位列表** | 来自 `/api/hub/monitor` + `/api/price_snapshot`;Flask 未连通时卡片提示原因;**Gate 趋势户**无关键位块 | | **该户全平** | `POST` 子代理 `/emergency/close-all`,仅平该 API Key 仓位 | | **全局紧急全平** | 对所有已启用户依次全平(不含 `HUB_DISABLED_IDS` 强制关闭的 id) | diff --git a/manual_trading_hub/局域网与反代部署说明.md b/manual_trading_hub/局域网与反代部署说明.md index 41ce1e6..c951f43 100644 --- a/manual_trading_hub/局域网与反代部署说明.md +++ b/manual_trading_hub/局域网与反代部署说明.md @@ -7,6 +7,8 @@ SSO 签名复用 **`HUB_BRIDGE_TOKEN`**(与中控调实例 API 相同,四所 `.env` 与 `manual_trading_hub/.env` 保持一致)。 +**云服务器(VPS)** 的硬件、安全组、宝塔、环境变量与验收清单见 **[云服务器部署说明.md](./云服务器部署说明.md)**。 + --- ## 一、两种访问方式对照 diff --git a/manual_trading_hub/常见问题.md b/manual_trading_hub/常见问题.md index 0a6edf0..f19392f 100644 --- a/manual_trading_hub/常见问题.md +++ b/manual_trading_hub/常见问题.md @@ -172,7 +172,13 @@ HUB_FLASK_TIMEOUT=8 --- -## 四、复盘链接与公网反代 +## 四、云服务器 / 公网反代 + +**云服务器完整配置(安全组、宝塔、环境变量、PM2、验收)** 见 **[云服务器部署说明.md](./云服务器部署说明.md)**。 + +--- + +## 五、复盘链接与公网反代 ### 4.1 监控里点「复盘」打开的是本机 127.0.0.1 @@ -207,7 +213,7 @@ HUB_PUBLIC_ORIGIN=http://192.168.8.6 --- -## 五、Gate 趋势 / 复盘相关(实例侧) +## 六、Gate 趋势 / 复盘相关(实例侧) ### 5.1 Gate 趋势 `/records` 或预览 500(`preview_created_at`) @@ -221,7 +227,7 @@ HUB_PUBLIC_ORIGIN=http://192.168.8.6 --- -## 六、环境与配置 +## 七、环境与配置 ### 6.1 OKX 默认不显示 @@ -241,7 +247,7 @@ PM2 须重启:`pm2 restart manual-trading-hub`(`run_hub.sh` 每次启动会 --- -## 七、功能边界(避免误用) +## 八、功能边界(避免误用) | 项目 | 说明 | |------|------| @@ -253,7 +259,7 @@ PM2 须重启:`pm2 restart manual-trading-hub`(`run_hub.sh` 每次启动会 --- -## 八、推荐排障顺序 +## 九、推荐排障顺序 1. `git pull` → `manual_trading_hub` 下 `bash scripts/fix_hub_deps.sh` → `bash scripts/verify_hub_deploy.sh` 2. `pm2 restart manual-trading-hub`(及 `ecosystem.config.cjs` 若 agent/Flask 也有问题) @@ -264,7 +270,7 @@ PM2 须重启:`pm2 restart manual-trading-hub`(`run_hub.sh` 每次启动会 --- -## 九、相关脚本 +## 十、相关脚本 | 脚本 | 作用 | |------|------| @@ -277,11 +283,13 @@ PM2 须重启:`pm2 restart manual-trading-hub`(`run_hub.sh` 每次启动会 --- -## 十、文档索引 +## 十一、文档索引 | 文档 | 内容 | |------|------| | [使用说明.md](./使用说明.md) | 架构、页面、环境变量、API | -| [部署文档.md](./部署文档.md) | Ubuntu/PM2 安装与反代 | +| [部署文档.md](./部署文档.md) | Ubuntu/PM2 安装与运维 | +| [云服务器部署说明.md](./云服务器部署说明.md) | VPS 配置、安全组、宝塔、env、验收 | +| [局域网与反代部署说明.md](./局域网与反代部署说明.md) | 内网 IP:端口 / 域名反代、SSO | | [README.md](./README.md) | 速览与快速启动 | | [.env.example](./.env.example) | 中控环境变量模板 | diff --git a/manual_trading_hub/部署文档.md b/manual_trading_hub/部署文档.md index 53c2312..94e02a5 100644 --- a/manual_trading_hub/部署文档.md +++ b/manual_trading_hub/部署文档.md @@ -3,6 +3,7 @@ 本文档说明在 **Ubuntu / Linux** 上部署 **manual_trading_hub**(复盘系统中控:监控区、系统设置、登录保护)的推荐步骤。 - 功能与界面:[使用说明.md](./使用说明.md) +- **云服务器(VPS)完整配置**:[云服务器部署说明.md](./云服务器部署说明.md) - **局域网 IP:端口 / 反代域名、中控打开实例免登录**:[局域网与反代部署说明.md](./局域网与反代部署说明.md) - 故障实录:[常见问题.md](./常见问题.md) - 环境变量模板:[.env.example](./.env.example)