docs: unify Ubuntu root /opt PM2 deployment and refresh README

Add docs/ubuntu-server.md; remove Windows and alternate process managers from deployment guides; index strategy, key monitor, TP/SL, breakeven, and replay docs in root README.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-04 11:48:54 +08:00
parent 546bc7bcf1
commit 1282293e91
16 changed files with 355 additions and 491 deletions
+56 -112
View File
@@ -1,141 +1,85 @@
# 复盘交易系统(crypto_monitor # 复盘交易系统(crypto_monitor
本仓库为 **多交易所 USDT 永续** 的下单监控、关键位监控与交易复盘工具集:四个子项目分别对接 **Binance、Gate.io(主号)、Gate.io(机器人/趋势策略)、OKX**,共享相似的 Flask 架构与本地 SQLite 记账思路,可按账户独立部署、独立端口运行 多交易所 **USDT 永续** 的下单监控、**关键位**、**策略交易**、**止盈止损 / 移动保本** 与 **AI 复盘**,四所独立部署 + 可选 **中控** 聚合监控
**远程仓库(克隆地址)**[https://git.bz121.com/dekun/crypto_monitor.git](https://git.bz121.com/dekun/crypto_monitor.git) **远程仓库**[https://git.bz121.com/dekun/crypto_monitor.git](https://git.bz121.com/dekun/crypto_monitor.git)
---
## 部署环境(必读)
| 项 | 约定 |
|----|------|
| 系统 | **Ubuntu 22.04 / 24.04** |
| 用户 | **root** |
| 路径 | **`/opt/crypto_monitor`** |
| 进程 | **PM2**(唯一推荐的常驻方式) |
**环境详解**Python 3.10+、Node、PM2 安装与启动顺序):**[docs/ubuntu-server.md](./docs/ubuntu-server.md)**
**一键 venv**`bash deploy/setup_env.sh`**[deploy/README.md](./deploy/README.md)**
```bash ```bash
git clone https://git.bz121.com/dekun/crypto_monitor.git cd /opt
cd crypto_monitor git clone https://git.bz121.com/dekun/crypto_monitor.git crypto_monitor
cd /opt/crypto_monitor
bash deploy/setup_env.sh --install-system-deps
``` ```
### 一键环境部署 配置与运维脚本: **[docs/env-sync-scripts.md](./docs/env-sync-scripts.md)** · **[备份与恢复.md](./备份与恢复.md)**
| 系统 | 命令 |
|------|------|
| **Windows** | 双击根目录 **`一键部署.bat`**,或 `.\deploy\setup_env.ps1` |
| **Linux / macOS** | `bash deploy/setup_env.sh` |
会为各子项目创建 `.venv`、安装依赖、从 `.env.example` 生成 `.env`(不覆盖已有)。详见 **[deploy/README.md](./deploy/README.md)**。
四所 `.env` 同步脚本(计仓 + 自动划转):见 **[docs/env-sync-scripts.md](./docs/env-sync-scripts.md)**。
计仓模式(以损定仓 / 全仓杠杆):见 **[docs/position-sizing-mode.md](./docs/position-sizing-mode.md)**。
每日自动划转(双向归集至目标 U):见 **[docs/auto-transfer-daily.md](./docs/auto-transfer-daily.md)**。
Chrome 快捷方式图标:见 **[docs/shortcut-icon.md](./docs/shortcut-icon.md)**。
--- ---
## 一、仓库目录一览 ## 功能导航
| 目录 | 交易所 / 角色 | 说明文档 | | 功能 | 说明 | 文档 |
|------|-----------------|----------| |------|------|------|
| `crypto_monitor_binance/` | Binance USDT-M 永续 | [部署文档.md](./crypto_monitor_binance/部署文档.md) · [README.md](./crypto_monitor_binance/README.md) | | **关键位监控** | 箱体/收敛自动开仓、阻力支撑提醒、斐波限价;止盈止损方案与 **移动保本** 开关 | 各所 [关键位自动下单说明.md](./crypto_monitor_binance/关键位自动下单说明.md)(Gate/OKX 目录内同名);方案细则 **[关键位止盈止损与移动保本更新说明.md](./关键位止盈止损与移动保本更新说明.md)** |
| `crypto_monitor_gate/` | Gate.io 永续(主号) | [部署文档.md](./crypto_monitor_gate/部署文档.md) | | **实盘下单 / 下单监控** | 首仓、以损定仓;监控内 **止盈 / 止损**、**移动保本**(步进 R、偏移%) | 各所 [使用说明.md](./crypto_monitor_binance/使用说明.md) · 顶栏「实盘下单」`/trade` |
| `crypto_monitor_gate_bot/` | Gate.io 永续(机器人;含趋势回调等) | [部署文档.md](./crypto_monitor_gate_bot/部署文档.md) · [趋势回调策略说明.md](./crypto_monitor_gate_bot/趋势回调策略说明.md) · [策略交易说明.md](./策略交易说明.md) | | **策略交易** | **趋势回调** + **顺势加仓**`/strategy` 双栏) | **[策略交易说明.md](./策略交易说明.md)** · 趋势细则 [crypto_monitor_gate_bot/趋势回调策略说明.md](./crypto_monitor_gate_bot/趋势回调策略说明.md) |
| `crypto_monitor_okx/` | OKX 永续(功能对齐币安) | [部署文档.md](./crypto_monitor_okx/部署文档.md) · [使用说明.md](./crypto_monitor_okx/使用说明.md) · [README.md](./crypto_monitor_okx/README.md) | | **策略交易记录** | 已结束计划快照(最近 100 条)、筛选与展开详情 | [策略交易说明.md §五](./策略交易说明.md) · 顶栏 `/strategy/records` |
| `manual_trading_hub/` | 多账户中控(监控 + **行情 K 线** + 紧急全平 + 登录;**不在中控网页下单** | [README.md](./manual_trading_hub/README.md) · [使用说明.md](./manual_trading_hub/使用说明.md) · [行情区说明.md](./manual_trading_hub/行情区说明.md) · [部署文档.md](./manual_trading_hub/部署文档.md) · [常见问题.md](./manual_trading_hub/常见问题.md) | | **交易复盘** | 平仓记录、错过机会、图表;**AI 点评** | **[AI复盘与模型配置说明.md](./AI复盘与模型配置说明.md)** · 顶栏「交易记录与复盘」`/records` |
| 根目录 `strategy_*.py` | **策略交易**(趋势回调 + 顺势加仓共用逻辑) | [策略交易说明.md](./策略交易说明.md) | | **中控** | 多账户持仓/委托聚合、行情 K 线、紧急全平(**不在中控网页下单**) | [manual_trading_hub/使用说明.md](./manual_trading_hub/使用说明.md) · [部署文档.md](./manual_trading_hub/部署文档.md) |
| 根目录 `ai_client.py` | **AI 复盘**OpenAI 兼容网关 / Ollama 二选一) | [AI复盘与模型配置说明.md](./AI复盘与模型配置说明.md) |
前四列为四个 **`crypto_monitor_*`** 交易/监控应用;`manual_trading_hub` 与四者 **进程独立**,无需改四者代码即可并行使用。 其它专题:[计仓模式](./docs/position-sizing-mode.md) · [每日自动划转](./docs/auto-transfer-daily.md) · [Chrome 快捷方式图标](./docs/shortcut-icon.md)
--- ---
## 二、四个 `crypto_monitor_*` 子项目:共同点 ## 仓库目录
- **技术栈**Python 3.10+、`Flask` Web、`ccxt` 调交易所 API、本地 SQLite(默认 `crypto.db`)等。 | 目录 | 交易所 / 角色 | 部署文档 |
- **能力类型**(各所细节见各自 README / 部署文档): |------|----------------|----------|
- **关键位监控**、**下单监控**(含风控与移动保本等逻辑)、**交易复盘**(AI 点评,见 [AI复盘与模型配置说明.md](./AI复盘与模型配置说明.md)); | `crypto_monitor_binance/` | Binance U 本位永续 | [部署文档.md](./crypto_monitor_binance/部署文档.md) |
- **策略交易**(顶栏 `/strategy`:趋势回调 + 顺势加仓双栏,四所共用根目录逻辑,见 [策略交易说明.md](./策略交易说明.md)); | `crypto_monitor_gate/` | Gate 主号 | [部署文档.md](./crypto_monitor_gate/部署文档.md) |
- **实盘(可选)**:在对应 `.env` 中开启 `LIVE_TRADING_ENABLED=true` 并配置各所 API 后,由程序发起真实委托(请务必理解风险并做好权限与 IP 白名单控制)。 | `crypto_monitor_gate_bot/` | Gate 机器人 / 趋势户 | [部署文档.md](./crypto_monitor_gate_bot/部署文档.md) |
- **网络**:若本机直连交易所不稳定,可通过 **SSH 动态转发 SOCKS** 或 HTTP/S 代理;经 SOCKS 时依赖中需包含 **`PySocks`**(各《部署文档》中有说明)。 | `crypto_monitor_okx/` | OKX 永续 | [部署文档.md](./crypto_monitor_okx/部署文档.md) |
- **进程托管**Linux 上常用 **PM2** 托管 `app.py`;各目录内一般有 `ecosystem.config.cjs` 或文档中的等价命令。 | `manual_trading_hub/` | 中控 + 子代理 | [部署文档.md](./manual_trading_hub/部署文档.md) |
| 根目录 `strategy_*.py` | 策略共用库 | [策略交易说明.md](./策略交易说明.md) |
| 根目录 `key_*_lib.py` | 关键位 / 止盈止损共用库 | [关键位止盈止损与移动保本更新说明.md](./关键位止盈止损与移动保本更新说明.md) |
--- ---
## 三、四个子项目:差异速查 ## 技术要点
| 项目 | 环境变量前缀(示例) | 典型用途区分 | - **Python 3.10+**、Flask、ccxt、SQLite`crypto.db`
|------|----------------------|--------------| - 四所 `.env` 前缀不同(`BINANCE_*` / `GATE_*` / `OKX_*`),**不可混用**
| `crypto_monitor_binance` | `BINANCE_*` | 币安 U 本位永续;止盈止损以 `STOP_MARKET` / `TAKE_PROFIT_MARKET` 等与币安规则对齐 | - 实盘须 `LIVE_TRADING_ENABLED=true` 且理解 API 权限与 IP 白名单风险
| `crypto_monitor_gate` | `GATE_*` | Gate 主账户监控与交易页面 | -**SOCKS** 访问交易所时配置各所 `*_SOCKS_PROXY` 并安装 PySocks
| `crypto_monitor_gate_bot` | `GATE_*` | Gate 侧 **独立子账户 / 机器人**;文档中含 **趋势回调** 等策略说明 |
| `crypto_monitor_okx` | `OKX_*` | OKX 永续;需 API Key / Secret / Passphrase |
各目录根下:
- **`.env.example`**:配置模板(**可** `git pull` 同步),新机执行 `cp .env.example .env` 后编辑。
- **`.env`**:本机真实配置(**勿**提交 Git);`app.py` 只读此文件。`git pull` **不会**覆盖 `.env`;升级前建议 `cp .env .env.backup.$(date +%Y%m%d)`
变量名以前缀区分,**不可混用**(例如在 Gate 项目中写 OKX 变量会导致代理与密钥不生效)。
--- ---
## 四、与 `manual_trading_hub` 的关系(可选) ## 推荐阅读顺序
- **中控** `hub.py``:5100`):多账户 **监控聚合**、**行情 K 线**`/market`)、**紧急全平**、系统设置;可选 **用户名+密码** 登录(反代公网时务必配置)。 1. [docs/ubuntu-server.md](./docs/ubuntu-server.md) — 装 Python / Node / PM2PM2 启动四所 + 中控
- **子代理** `agent.py`:每账户一进程,默认 **`15200``15203`**,与四所 Flask **`APP_PORT`**5000/5001/5002/5004**必须错开**。 2. 各所 **`.env`**(从 `.env.example` 复制)
- **下单、关键位、策略交易、复盘**:在各 `crypto_monitor_*` 原网页操作(中控 **「实例」** / **「复盘」**);中控**已移除下单区**。增加子账户见 [manual_trading_hub/使用说明.md §4.3](./manual_trading_hub/使用说明.md#43-增加账户例如再挂一个-gate)。 3. 所用功能对应上表 **功能导航** 文档
- 账户列表由 **`hub_settings.json`**(网页「系统设置」)维护,**不再使用** `HUB_AGENTS` 4. [备份与恢复.md](./备份与恢复.md) — 生产机备份习惯
- 部署与排障:[manual_trading_hub/README.md](./manual_trading_hub/README.md)、[常见问题.md](./manual_trading_hub/常见问题.md)。
--- ---
## 五、Linux 推荐目录布局(可选) ## 安全
为与仓库内《部署文档》示例一致,可将整个克隆结果置于 **`/opt/crypto_monitor/`** 下,例如: - **勿** 将 `.env`、API Secret、`.pem` 提交 Git
- 公网暴露中控须配置登录、`HUB_BRIDGE_TOKEN`、HTTPS Cookie
- 实盘风险由使用者自行承担
- `/opt/crypto_monitor/crypto_monitor_binance` 若子目录 README 与本文冲突,以 **子目录《部署文档》与当前代码** 为准。
- `/opt/crypto_monitor/crypto_monitor_gate`
- `/opt/crypto_monitor/crypto_monitor_gate_bot`
- `/opt/crypto_monitor/crypto_monitor_okx`
- `/opt/crypto_monitor/manual_trading_hub`
具体 `mkdir``venv``pm2`**SSH SOCKS** 步骤以各子目录 **《部署文档.md》** 为准。
### 备份与恢复(服务器必读)
项目路径 **`/opt/crypto_monitor`**,数据备份 **`/root/backups`**
| 类型 | 说明 |
|------|------|
| **数据库 + 复盘图片** | 每天北京时间 0:00 自动备份,保留 30 天 |
| **`.env`** | 升级 / 改配置前手动备份与恢复 |
**一键复制命令(Ubuntu SSH** 见根目录 **[备份与恢复.md](./备份与恢复.md)**:含安装 cron、手动备份、`.env` 备份/恢复、从备份还原数据库等整段脚本。
---
## 六、推荐阅读顺序
1. 克隆本仓库后,执行 **一键环境部署**(上表),或手动在各子目录 `python -m venv .venv``pip install`
2. 根据实际交易所进入对应 **`crypto_monitor_*`** 目录,编辑 **`.env`**(填入 API 与密码等;部署脚本已可从 `.env.example` 复制)。
3. 阅读该目录下的 **《部署文档.md》**Ubuntu / PM2 / 代理 / 升级说明)。
4. 服务器部署完成后,按 **[备份与恢复.md](./备份与恢复.md)** 配置自动备份与 `.env` 备份习惯。
5. 需要 **策略交易**(趋势回调 / 顺势加仓)时,阅读 [策略交易说明.md](./策略交易说明.md);趋势细则另见 [crypto_monitor_gate_bot/趋势回调策略说明.md](./crypto_monitor_gate_bot/趋势回调策略说明.md)。
6. 需要 **AI 复盘**OpenAI 网关或 Ollama)时,阅读 [AI复盘与模型配置说明.md](./AI复盘与模型配置说明.md),并在各所 `.env` 配置 `AI_PROVIDER` 等。
7. 需要 **多账户一块看 + 紧急全平** 时,阅读 [manual_trading_hub](./manual_trading_hub/) 下 [使用说明](./manual_trading_hub/使用说明.md)、[部署文档](./manual_trading_hub/部署文档.md);遇问题先查 [常见问题](./manual_trading_hub/常见问题.md)。
---
## 七、安全与合规
- **切勿**将 `.env``.env.backup*`、API Secret、SSH 私钥 `.pem` 等提交到版本库或公开渠道;仅 **`.env.example`** 可提交(占位符,无真实密钥)。
### 从旧版仓库升级(曾把 `.env` 提交进 Git
**`git pull` 之前**按 **[备份与恢复.md](./备份与恢复.md)** 备份 `.env` 与数据库;pull 后若本地 `.env` 被误删,用备份恢复;再对照新的 **`.env.example`** 补全可能新增的变量名。
- 实盘前务必在 **`LIVE_TRADING_ENABLED=false`** 下验证页面与网络;API 权限与 IP 白名单遵循各交易所要求。
- 使用本仓库进行实盘交易的风险由使用者自行承担;请遵守当地法律法规与交易所用户协议。
---
## 八、仓库信息摘要
| 项 | 内容 |
|----|------|
| 远程地址 | `https://git.bz121.com/dekun/crypto_monitor.git` |
| 说明 | 复盘交易系统(骆驼比特币私有代码仓库,Gitea) |
| 本说明 | 仓库根目录 `README.md`,仅描述结构与文档索引,不包含业务代码变更说明 |
若各子项目 README 与根说明不一致,以 **子目录内当前代码与《部署文档》** 为准。
+11 -12
View File
@@ -19,9 +19,10 @@
安装示例: 安装示例:
```bash ```bash
python -m venv .venv # 推荐在 /opt/crypto_monitor 执行仓库根目录 deploy/setup_env.sh
source .venv/bin/activate # Windows: .venv\Scripts\activate cd /opt/crypto_monitor/crypto_monitor_binance
pip install flask requests ccxt werkzeug PySocks Pillow source .venv/bin/activate
pip install -r ../requirements.txt
``` ```
页面上的 **「当日资金(交易账户)」** 与 **「可开仓」可用 U** 仅统计 **Binance U 本位永续合约账户**`fetch_balance``swap` / FAPI `assets` 中的 USDT),**不会**再用现货余额顶替。 页面上的 **「当日资金(交易账户)」** 与 **「可开仓」可用 U** 仅统计 **Binance U 本位永续合约账户**`fetch_balance``swap` / FAPI `assets` 中的 USDT),**不会**再用现货余额顶替。
@@ -46,19 +47,17 @@ pip install flask requests ccxt werkzeug PySocks Pillow
其余变量(登录、企业微信、风控参数、**`AI_PROVIDER` / `OPENAI_*` / `OLLAMA_*`**、数据库路径等)见 **`.env.example` 内注释** 或 `app.py` 顶部默认值。 其余变量(登录、企业微信、风控参数、**`AI_PROVIDER` / `OPENAI_*` / `OLLAMA_*`**、数据库路径等)见 **`.env.example` 内注释** 或 `app.py` 顶部默认值。
## 本地运行 ## 运行
**WindowsUTF-8 控制台)** 可使用 生产环境使用 **PM2**`ecosystem.config.cjs`)。临时调试
```powershell ```bash
.\start_utf8.ps1 cd /opt/crypto_monitor/crypto_monitor_binance
source .venv/bin/activate
python app.py
``` ```
或直接: 环境说明见 [docs/ubuntu-server.md](../docs/ubuntu-server.md)。
```powershell
python .\app.py
```
默认监听端口由 `.env``APP_PORT` 决定(未设置时多为 `5000`)。 默认监听端口由 `.env``APP_PORT` 决定(未设置时多为 `5000`)。
+3 -3
View File
@@ -1,12 +1,12 @@
# `crypto_monitor_binance` 部署指南:SSH SOCKS + Binance + PM2Ubuntu # `crypto_monitor_binance` 部署指南:SSH SOCKS + Binance + PM2Ubuntu
项目功能、环境变量总览与本地运行说明**[README.md](./README.md)**。 项目功能、环境变量总览见 **[README.md](./README.md)**。Ubuntu 环境(Python / Node / PM2)见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**。
本文面向:**在本机或 VPS 上运行本项目**,但 **直连 Binance API 不稳定、超时或被网络策略拦截** 的场景。思路是: 本文面向:**在本机或 VPS 上运行本项目**,但 **直连 Binance API 不稳定、超时或被网络策略拦截** 的场景。思路是:
- 本机用 `ssh -D` 做动态转发,把 **SOCKS5 出口**放到能稳定访问 Binance 的机器(常见为一台境外 VPS) - 本机用 `ssh -D` 做动态转发,把 **SOCKS5 出口**放到能稳定访问 Binance 的机器(常见为一台境外 VPS)
- 项目在 `.env` 中设置 **`BINANCE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**(或你实际端口),`ccxt` 经 SOCKS 访问交易所 - 项目在 `.env` 中设置 **`BINANCE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**(或你实际端口),`ccxt` 经 SOCKS 访问交易所
- **SSH 隧道**:用 `ssh -D` 在本机常驻即可(screen / tmux / systemd 等),**不必交给 PM2** - **SSH 隧道**:用 `ssh -D` 在本机常驻(可用 **tmux****autossh** 保持连接),**不要** 把 `ssh` 交给 PM2
- 使用 **PM2** 仅托管 **Flask 应用**;仓库根目录 **`ecosystem.config.cjs`** 默认进程名为 **`crypto-monitor-binance`** - 使用 **PM2** 仅托管 **Flask 应用**;仓库根目录 **`ecosystem.config.cjs`** 默认进程名为 **`crypto-monitor-binance`**
> 安全提醒:不要把 `.env`、私钥 `.pem`、Binance API Key / Secret 提交到 Git;下文只用占位符。 > 安全提醒:不要把 `.env`、私钥 `.pem`、Binance API Key / Secret 提交到 Git;下文只用占位符。
@@ -323,7 +323,7 @@ pm2 startup
### 10.1 SSH SOCKS(自行后台常驻,不推荐用 PM2) ### 10.1 SSH SOCKS(自行后台常驻,不推荐用 PM2)
示例(前台;实际可用 `screen`/`tmux`/`-f` 后台化或 systemd): 示例(前台调试;生产请用 **PM2**,见本文 §6 与 [docs/ubuntu-server.md](../docs/ubuntu-server.md)):
```bash ```bash
ssh -N -D 127.0.0.1:1080 bn-vps \ ssh -N -D 127.0.0.1:1080 bn-vps \
+8 -12
View File
@@ -31,9 +31,9 @@
安装示例: 安装示例:
```bash ```bash
python -m venv .venv cd /opt/crypto_monitor/crypto_monitor_gate
source .venv/bin/activate # Windows: .venv\Scripts\activate source .venv/bin/activate
pip install flask requests ccxt werkzeug PySocks Pillow pip install -r ../requirements.txt
``` ```
## 配置(`.env.example` → `.env` ## 配置(`.env.example` → `.env`
@@ -56,19 +56,15 @@ pip install flask requests ccxt werkzeug PySocks Pillow
其余见 **`.env.example` 内注释** 或 **`app.py` 顶部默认值**。 其余见 **`.env.example` 内注释** 或 **`app.py` 顶部默认值**。
## 本地运行 ## 运行
**Windows** 推荐使用 UTF-8 控制台脚本 生产使用 **PM2**`ecosystem.config.cjs`)。调试
```powershell ```bash
.\start_utf8.ps1 source .venv/bin/activate && python app.py
``` ```
或直接: 见 [docs/ubuntu-server.md](../docs/ubuntu-server.md)。
```powershell
python .\app.py
```
端口由 **`APP_PORT`** 控制(未设置默认 **5000**)。浏览器登录 **`/login`**,口令为 **`APP_PASSWORD`**。 端口由 **`APP_PORT`** 控制(未设置默认 **5000**)。浏览器登录 **`/login`**,口令为 **`APP_PASSWORD`**。
+4 -2
View File
@@ -1,10 +1,12 @@
# `crypto_monitor_gate` 部署指南:SSH SOCKS + Gate.io + PM2Ubuntu # `crypto_monitor_gate` 部署指南:SSH SOCKS + Gate.io + PM2Ubuntu
Ubuntu 环境(Python / Node / PM2、/opt 路径)见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**。
本文面向:**在本机运行本项目**,但 **直连 Gate.io API 不稳定或被重置** 的场景。思路是: 本文面向:**在本机运行本项目**,但 **直连 Gate.io API 不稳定或被重置** 的场景。思路是:
- 本机用 `ssh -D` 做动态转发,把 **SOCKS5 出口**放到能正常访问 Gate 的机器(常见为一台境外 VPS) - 本机用 `ssh -D` 做动态转发,把 **SOCKS5 出口**放到能正常访问 Gate 的机器(常见为一台境外 VPS)
- 项目在 `.env` 中设置 **`GATE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**(或你实际端口),`ccxt` 经 SOCKS 访问交易所 - 项目在 `.env` 中设置 **`GATE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**(或你实际端口),`ccxt` 经 SOCKS 访问交易所
- **SSH 隧道**:用 `ssh -D` 在本机常驻即可(screen / tmux / systemd 等),**不必交给 PM2** - **SSH 隧道**:用 `ssh -D` 在本机常驻(可用 **tmux****autossh** 保持连接),**不要** 把 `ssh` 交给 PM2
- 使用 **PM2** 仅托管 **Flask 应用**;仓库根目录 **`ecosystem.config.cjs`** 只定义 `crypto-monitor-gate` - 使用 **PM2** 仅托管 **Flask 应用**;仓库根目录 **`ecosystem.config.cjs`** 只定义 `crypto-monitor-gate`
> 安全提醒:不要把 `.env`、私钥 `.pem`、Gate API Key 提交到 Git;下文只用占位符。 > 安全提醒:不要把 `.env`、私钥 `.pem`、Gate API Key 提交到 Git;下文只用占位符。
@@ -238,7 +240,7 @@ pm2 startup
### 9.1 SSH SOCKS(自行后台常驻,不推荐用 PM2) ### 9.1 SSH SOCKS(自行后台常驻,不推荐用 PM2)
示例(前台;实际可用 `screen`/`tmux`/`-f` 后台化或 systemd): 示例(前台调试;生产请用 **PM2**,见本文与 [docs/ubuntu-server.md](../docs/ubuntu-server.md)):
```bash ```bash
ssh -N -D 127.0.0.1:1080 gate-vps \ ssh -N -D 127.0.0.1:1080 gate-vps \
+5 -3
View File
@@ -1,10 +1,12 @@
# `crypto_monitor_gate` 部署指南:SSH SOCKS + Gate.io + PM2Ubuntu # `crypto_monitor_gate_bot` 部署指南:SSH SOCKS + Gate.io + PM2Ubuntu
Ubuntu 环境总览见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**。
本文面向:**在本机运行本项目**,但 **直连 Gate.io API 不稳定或被重置** 的场景。思路是: 本文面向:**在本机运行本项目**,但 **直连 Gate.io API 不稳定或被重置** 的场景。思路是:
- 本机用 `ssh -D` 做动态转发,把 **SOCKS5 出口**放到能正常访问 Gate 的机器(常见为一台境外 VPS) - 本机用 `ssh -D` 做动态转发,把 **SOCKS5 出口**放到能正常访问 Gate 的机器(常见为一台境外 VPS)
- 项目在 `.env` 中设置 **`GATE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**(或你实际端口),`ccxt` 经 SOCKS 访问交易所 - 项目在 `.env` 中设置 **`GATE_SOCKS_PROXY=socks5h://127.0.0.1:1080`**(或你实际端口),`ccxt` 经 SOCKS 访问交易所
- **SSH 隧道**:用 `ssh -D` 在本机常驻即可(screen / tmux / systemd 等),**不必交给 PM2** - **SSH 隧道**:用 `ssh -D` 在本机常驻(可用 **tmux****autossh** 保持连接),**不要** 把 `ssh` 交给 PM2
- 使用 **PM2** 仅托管 **Flask 应用**;仓库根目录 **`ecosystem.config.cjs`** 只定义 `crypto-monitor-gate` - 使用 **PM2** 仅托管 **Flask 应用**;仓库根目录 **`ecosystem.config.cjs`** 只定义 `crypto-monitor-gate`
> 安全提醒:不要把 `.env`、私钥 `.pem`、Gate API Key 提交到 Git;下文只用占位符。 > 安全提醒:不要把 `.env`、私钥 `.pem`、Gate API Key 提交到 Git;下文只用占位符。
@@ -272,7 +274,7 @@ pm2 startup
### 9.1 SSH SOCKS(自行后台常驻,不推荐用 PM2) ### 9.1 SSH SOCKS(自行后台常驻,不推荐用 PM2)
示例(前台;实际可用 `screen`/`tmux`/`-f` 后台化或 systemd): 示例(前台调试;生产请用 **PM2**,见本文与 [docs/ubuntu-server.md](../docs/ubuntu-server.md)):
```bash ```bash
ssh -N -D 127.0.0.1:1080 gate-vps \ ssh -N -D 127.0.0.1:1080 gate-vps \
+5 -5
View File
@@ -28,15 +28,15 @@
完整模板见 **`.env.example`**。 完整模板见 **`.env.example`**。
## 本地运行 ## 运行
```powershell ```bash
cd crypto_monitor_okx cd /opt/crypto_monitor/crypto_monitor_okx
$env:PYTHONPATH=".." source .venv/bin/activate
python app.py python app.py
``` ```
默认端口 **`APP_PORT`**常为 `5004`,与中控登记一致) 生产使用 **PM2**;见 [docs/ubuntu-server.md](../docs/ubuntu-server.md)。默认 **`APP_PORT`** 常为 `5004`
## 部署 ## 部署
+2 -2
View File
@@ -1,6 +1,6 @@
# `crypto_monitor_okx` 部署文档(Ubuntu # `crypto_monitor_okx` 部署文档(Ubuntu
**功能与页面操作** 见同目录 **[使用说明.md](./使用说明.md)**。策略与 AI 见仓库根 **[策略交易说明.md](../策略交易说明.md)**、**[AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)**。 **功能与页面操作** 见同目录 **[使用说明.md](./使用说明.md)**。Ubuntu 环境(Python / Node / PM2)见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**。策略与 AI 见 **[策略交易说明.md](../策略交易说明.md)**、**[AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)**。
--- ---
@@ -10,7 +10,7 @@
- 本机启动 `ssh -D` 动态转发,把 **SOCKS5 出口**放到你可正常访问 OKX 的 VPS 上 - 本机启动 `ssh -D` 动态转发,把 **SOCKS5 出口**放到你可正常访问 OKX 的 VPS 上
- 项目通过环境变量 `OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080``ccxt` 走 SOCKS - 项目通过环境变量 `OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080``ccxt` 走 SOCKS
- `pm2` 托管 **SSH 隧道****Flask 应用**(你也可以只用 `screen`,但本文按你要求用 PM2 - **SSH 隧道**用 `ssh -D` 常驻(可用 tmux / autossh);**Flask 应用** 仅用 **PM2** 托管(见 [docs/ubuntu-server.md](../docs/ubuntu-server.md)
> 安全提醒:不要把 `.env`、私钥 `.pem`、OKX API Key 提交到 Git;文档里只用占位符。 > 安全提醒:不要把 `.env`、私钥 `.pem`、OKX API Key 提交到 Git;文档里只用占位符。
+39 -84
View File
@@ -1,65 +1,48 @@
# 环境一键部署 # 环境一键部署Ubuntu / root /opt
为仓库内各子项目创建 Python 虚拟环境、安装依赖、初始化 `.env` 与静态目录 **`/opt/crypto_monitor`** 下以 **root** 为各子项目创建 Python **`.venv`**、安装依赖、 `.env.example` 生成 `.env`(不覆盖已有),并可选安装 **PM2**
## Windows(推荐) 完整系统要求(Python / Node / PM2 版本、启动顺序)见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**。
双击仓库根目录 **`一键部署.bat`**,或在 PowerShell 中: ---
```powershell ## 前置条件
cd C:\path\to\crypto_monitor
.\deploy\setup_env.ps1
```
仅部署部分项目: - **Ubuntu 22.04 / 24.04**,用户 **root**
- 已安装 **git**,仓库位于 **`/opt/crypto_monitor`**
```powershell
.\deploy\setup_env.ps1 -Only binance,gate_bot
```
重建虚拟环境:
```powershell
.\deploy\setup_env.ps1 -RecreateVenv
```
跳过 PM2、跳过复制 `.env`
```powershell
.\deploy\setup_env.ps1 -SkipPm2 -SkipEnvCopy
```
## Linux / macOS
**Ubuntu / Debian 首次部署**(若 `python -m venv``ensurepip is not available`):
```bash ```bash
apt update apt update
apt install -y python3.10-venv python3-pip curl # 版本号与 python3 --version 一致 apt install -y python3 python3-pip python3-venv curl git ca-certificates
bash deploy/setup_env.sh # Node 20 + PM2 见 docs/ubuntu-server.md §3
``` ```
脚本在 **root** 下会自动尝试 `apt install python*-venv`;非 root 请先装系统包或使用: ---
```bash ## 一键执行
sudo bash deploy/setup_env.sh --install-system-deps
```
```bash ```bash
cd /opt/crypto_monitor cd /opt/crypto_monitor
bash deploy/setup_env.sh bash deploy/setup_env.sh --install-system-deps
bash deploy/setup_env.sh --only binance,gate
bash deploy/setup_env.sh --recreate-venv
``` ```
若在 Windows 编辑过脚本后在 Linux 报错 `set: pipefail: invalid option name`,先去掉 CRLF 再执行 常用参数
```bash
bash deploy/setup_env.sh --only binance,gate_bot # 仅部分子项目
bash deploy/setup_env.sh --recreate-venv # 重建虚拟环境
bash deploy/setup_env.sh --skip-pm2 # 不尝试安装 pm2
bash deploy/setup_env.sh --skip-env-copy # 不复制 .env.example
```
若在其它环境编辑过脚本后报 `pipefail` 错误,先转 LF
```bash ```bash
sed -i 's/\r$//' deploy/setup_env.sh sed -i 's/\r$//' deploy/setup_env.sh
# 或: apt install -y dos2unix && dos2unix deploy/setup_env.sh
bash deploy/setup_env.sh
``` ```
---
## 脚本会做什么 ## 脚本会做什么
| 步骤 | 说明 | | 步骤 | 说明 |
@@ -67,57 +50,29 @@ bash deploy/setup_env.sh
| 检查 Python | 需要 **3.10+** | | 检查 Python | 需要 **3.10+** |
| `crypto_monitor_*` | 各目录 `.venv` + `pip install -r ../requirements.txt` | | `crypto_monitor_*` | 各目录 `.venv` + `pip install -r ../requirements.txt` |
| `manual_trading_hub` | 独立 `requirements.txt` | | `manual_trading_hub` | 独立 `requirements.txt` |
| `.env` | 不存在则从 `.env.example` 复制**不覆盖**已有) | | `.env` | 不存在则从 `.env.example` 复制 |
| 目录 | 创建 `static/images``static/images/order_charts` | | 目录 | `static/images``static/images/order_charts` |
| PM2 | 已装 Node.js 且未 `-SkipPm2`,尝试 `npm install -g pm2` | | PM2 | 已装 Node `npm install -g pm2` |
---
## 部署之后 ## 部署之后
1. 编辑各子目录 **`.env`**API、登录密码、SOCKS 代理、**AI 复盘** 等)。AI 默认走 OpenAI 兼容网关 `https://op.bz121.com/v1``AI_PROVIDER=openai``OPENAI_API_KEY` 等),详见根目录 [AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md) 1. 编辑各子目录 **`.env`**API、登录密码、SOCKS、AI 复盘等)
2. 本地试运行(以 Binance 为例): 2. **仅用 PM2 常驻**(见 [docs/ubuntu-server.md](../docs/ubuntu-server.md) §3):
```bash ```bash
cd crypto_monitor_binance cd /opt/crypto_monitor/crypto_monitor_binance && pm2 start ecosystem.config.cjs
source .venv/bin/activate # Windows: .\.venv\Scripts\activate # … 其余三所 …
python app.py cd /opt/crypto_monitor/manual_trading_hub && pm2 start ecosystem.config.cjs
pm2 save
``` ```
3. 服务器长期运行见各目录 **《部署文档.md》**SSH SOCKS、PM2 3. 四所 `.env` 同步脚本见 **[docs/env-sync-scripts.md](../docs/env-sync-scripts.md)**
4. **多账户中控**`manual_trading_hub`):编辑 `manual_trading_hub/.env``HUB_PASSWORD`、`HUB_BRIDGE_TOKEN` 等与四实例一致),再 `pm2 start ecosystem.config.cjs`;验收 `bash manual_trading_hub/scripts/verify_hub_deploy.sh`。详见 [manual_trading_hub/部署文档.md](../manual_trading_hub/部署文档.md)、[常见问题.md](../manual_trading_hub/常见问题.md)。
## 四所 `.env` 同步脚本(已有 .env 时) ---
在仓库根目录用 Python 脚本**补全或更新**四所 `crypto_monitor_*` 下的 `.env`(不覆盖 API 密钥;无 `.env` 的目录会跳过)。
```bash
cd /path/to/crypto_monitor
git pull
# 推荐:计仓 + 自动划转 一次补全
python scripts/sync_four_exchange_env.py
# 预览
python scripts/sync_four_exchange_env.py --dry-run
# 常见:划转目标 50U 并开启 + 计仓补全
python scripts/sync_four_exchange_env.py --set-transfer-amount 50 --enable-auto-transfer
# 无仓后切全仓杠杆
python scripts/sync_four_exchange_env.py --set-mode full_margin
pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate crypto-monitor-gate-bot
```
| 脚本 | 作用 |
|------|------|
| `scripts/sync_four_exchange_env.py` | 一键:计仓 + 划转 |
| `scripts/sync_four_exchange_transfer_env.py` | 仅自动划转 |
| `scripts/sync_four_exchange_position_sizing_env.py` | 仅计仓模式 |
**完整参数、缺项默认值与示例**见 **[docs/env-sync-scripts.md](../docs/env-sync-scripts.md)**。
功能说明:[计仓模式](../docs/position-sizing-mode.md)、[每日自动划转](../docs/auto-transfer-daily.md)。
## 依赖说明 ## 依赖说明
- 四个监控子项目共用仓库根目录 **[requirements.txt](../requirements.txt)**。 - 四个监控子项目共用根目录 **[requirements.txt](../requirements.txt)**。
- 走 SOCKS 代理时必须安装 **PySocks**(已包含在 requirements 中)。 - 走 SOCKS **PySocks**(已包含在 requirements 中)。
+2 -3
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# crypto_monitor 一键环境部署(Linux / macOS / Git Bash # crypto_monitor 一键环境部署(Ubuntu / root /opt/crypto_monitor
# #
# 用法: # 用法:
# bash deploy/setup_env.sh # bash deploy/setup_env.sh
@@ -253,6 +253,5 @@ install_pm2
echo "" echo ""
echo "部署完成。下一步:" echo "部署完成。下一步:"
echo " 1. 编辑各子目录 .env" echo " 1. 编辑各子目录 .env"
echo " 2. 启动示例: cd crypto_monitor_binance && source .venv/bin/activate && python app.py" echo " 2. 编辑各目录 .env 后使用 PM2: pm2 start ecosystem.config.cjs(见 docs/ubuntu-server.md"
echo " 3. Windows 可用: powershell -File deploy/setup_env.ps1"
echo "" echo ""
+160
View File
@@ -0,0 +1,160 @@
# Ubuntu 服务器部署与环境说明
本文档为 **生产环境唯一推荐路径****Ubuntu**、**root** 用户、代码目录 **`/opt/crypto_monitor`**、进程托管 **PM2**。不使用 Windows 部署、不使用 systemd/screen/nohup 托管应用(SSH 隧道除外)。
---
## 1. 系统要求
| 项 | 要求 |
|----|------|
| 操作系统 | **Ubuntu 22.04 LTS****24.04 LTS**64 位) |
| 运行用户 | **root**(下文命令均按 root 编写) |
| 项目路径 | **`/opt/crypto_monitor`**(整仓克隆到此目录) |
| 进程管理 | **PM2**(全局安装,见 §3 |
| 网络 | 能 `git clone` 私有仓库;访问交易所不稳定时需 **SSH SOCKS**(见各所《部署文档》) |
---
## 2. Python 环境
| 项 | 说明 |
|----|------|
| **版本** | **Python 3.10 或 3.11**`python3 --version` ≥ 3.10);脚本会拒绝 3.9 及以下 |
| **虚拟环境** | 每个子项目独立 **`.venv`**`deploy/setup_env.sh` 自动创建) |
| **依赖文件** | 四所监控共用仓库根目录 **`requirements.txt`**;中控用 **`manual_trading_hub/requirements.txt`** |
| **SOCKS** | 走代理时必须安装 **PySocks**(已写入 requirements |
### 2.1 系统包(root
```bash
apt update
apt install -y python3 python3-pip python3-venv curl git ca-certificates
# 若 python3 为 3.10
apt install -y python3.10-venv
# 若为 3.12
apt install -y python3.12-venv
```
### 2.2 一键创建各目录 venv
```bash
cd /opt/crypto_monitor
bash deploy/setup_env.sh --install-system-deps
# 或已是 root 且已装 venv 包:
bash deploy/setup_env.sh
```
完成后各目录使用 **`.venv/bin/python`** 运行 `app.py` / `hub.py`**PM2 的 ecosystem 脚本已指向该解释器**。
---
## 3. Node.js 与 PM2
| 项 | 说明 |
|----|------|
| **Node.js** | 建议 **18 LTS****20 LTS**(用于安装 PM2;应用本体为 Python |
| **PM2** | 全局安装,托管所有 Flask 与中控/子代理 |
### 3.1 安装 Node + PM2root
```bash
# 方式 ANodeSource(示例 Node 20
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
node -v # v20.x
npm -v
npm install -g pm2
pm2 -v
pm2 startup # 按提示执行,保证重启后 PM2 自启
```
`deploy/setup_env.sh` 在检测到 Node 时也会尝试 `npm install -g pm2`(未装 Node 则跳过并提示手动安装)。
### 3.2 PM2 启动顺序(推荐)
```bash
# 1) 四所 Flask(在各子目录执行,或分别 start)
cd /opt/crypto_monitor/crypto_monitor_binance && pm2 start ecosystem.config.cjs
cd /opt/crypto_monitor/crypto_monitor_gate && pm2 start ecosystem.config.cjs
cd /opt/crypto_monitor/crypto_monitor_gate_bot && pm2 start ecosystem.config.cjs
cd /opt/crypto_monitor/crypto_monitor_okx && pm2 start ecosystem.config.cjs
# 2) 中控 + 四子代理(一条配置 5 进程)
cd /opt/crypto_monitor/manual_trading_hub
pm2 start ecosystem.config.cjs
pm2 save
pm2 list
```
升级代码后:
```bash
cd /opt/crypto_monitor && git pull
# 若 requirements 有变,对各目录 .venv/bin/pip install -r ...
pm2 restart all # 或按进程名 restart
```
**不要** 再用 systemd unit、screen、nohup 启动 `app.py` / `hub.py` / `agent.py`,避免与 PM2 抢端口。
### 3.3 常见 PM2 进程名
| 目录 | ecosystem 内典型名称 |
|------|---------------------|
| `crypto_monitor_binance` | `crypto-monitor-binance` |
| `crypto_monitor_gate` | `crypto-monitor-gate` |
| `crypto_monitor_gate_bot` | `crypto-monitor-gate-bot` |
| `crypto_monitor_okx` | `crypto-monitor-okx` |
| `manual_trading_hub` | `manual-trading-hub``manual-agent-*` |
以各目录 **`ecosystem.config.cjs`** 为准。
---
## 4. 目录与权限
```bash
mkdir -p /opt
cd /opt
git clone https://git.bz121.com/dekun/crypto_monitor.git crypto_monitor
chown -R root:root /opt/crypto_monitor
```
- 数据库默认:各所 **`crypto.db`**SQLite
- 备份目录建议:**`/root/backups`**(见 [备份与恢复.md](../备份与恢复.md)
- **`.env`**:仅本机编辑,**勿提交 Git**;升级前 `cp .env .env.backup.$(date +%Y%m%d)`
---
## 5. SSH 动态转发(SOCKS
若交易所 API 需经境外 VPS
- 在本机用 **`ssh -N -D 127.0.0.1:1080 别名`** 建立隧道(配置见各所《部署文档》`~/.ssh/config`
- 隧道进程可用 **tmux****autossh** 保持常驻;**不必** 也不建议把 `ssh` 交给 PM2
- 各所 `.env` 设置对应 `*_SOCKS_PROXY=socks5h://127.0.0.1:1080`
---
## 6. 部署后检查
```bash
# 中控验收(需已 start hub
bash /opt/crypto_monitor/manual_trading_hub/scripts/verify_hub_deploy.sh
pm2 logs manual-trading-hub --lines 50
curl -sS http://127.0.0.1:5100/api/monitor/board | head
```
---
## 7. 相关文档
| 文档 | 内容 |
|------|------|
| [deploy/README.md](../deploy/README.md) | `setup_env.sh` 参数说明 |
| [备份与恢复.md](../备份与恢复.md) | 数据库与 `.env` 备份 |
| 各 `crypto_monitor_*/部署文档.md` | 交易所 SOCKS、`.env`、PM2 细节 |
| [manual_trading_hub/部署文档.md](../manual_trading_hub/部署文档.md) | 中控 PM2、端口、反代 |
+2 -1
View File
@@ -87,7 +87,8 @@ curl -s http://127.0.0.1:5100/api/ping
| [scripts/verify_hub_deploy.sh](./scripts/verify_hub_deploy.sh) | 验收代码版本与 ping | | [scripts/verify_hub_deploy.sh](./scripts/verify_hub_deploy.sh) | 验收代码版本与 ping |
| [scripts/fix_env_crlf.sh](./scripts/fix_env_crlf.sh) | 修复 .env 的 Windows 换行 | | [scripts/fix_env_crlf.sh](./scripts/fix_env_crlf.sh) | 修复 .env 的 Windows 换行 |
| [scripts/pm2_hub.sh](./scripts/pm2_hub.sh) | PM2 启停 hub+agent | | [scripts/pm2_hub.sh](./scripts/pm2_hub.sh) | PM2 启停 hub+agent |
| [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | screen / systemd | | [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | PM2 常驻 |
| [docs/ubuntu-server.md](../docs/ubuntu-server.md) | Ubuntu / Python / Node / PM2 |
--- ---
+22 -179
View File
@@ -1,201 +1,44 @@
# Ubuntu 后台运行(中控 + 子代理 # 中控与子代理 · 后台常驻(Ubuntu
> **推荐生产**:用本目录 **`ecosystem.config.cjs`** + PM2 一次启动 4 agent + hub,见 [部署文档.md](../部署文档.md) §五。 **唯一推荐方式:PM2。**
> 故障实录:[常见问题.md](../常见问题.md)
`crypto_monitor_*` 策略目录:首次 **`cp .env.example .env`** 并编辑;**`.env` 不进 Git**`git pull` 不覆盖。升级前建议 `cp .env .env.backup.$(date +%Y%m%d)`。子代理启动前须 **`source` 该目录 `.env`**(见下文;PM2 经 `run_agent.sh` 会自动处理) 请勿使用 screen、nohup、systemd 与 PM2 **同时** 启动同一端口上的 `hub.py` / `agent.py`
前台跑 `python agent.py` / `python hub.py` 时,关掉终端进程会结束。要**常驻后台**,可用下面三种之一(推荐 **systemd**)。
--- ---
## 一、tmux / screen(最简单,适合先试用) ## 启动
仓库已提供 **一键起 3 个 agent(不含 OKX** 的 screen 脚本(需可执行权限):
```bash
chmod +x manual_trading_hub/scripts/start_agents_3screen.sh
chmod +x manual_trading_hub/scripts/start_hub_screen.sh
chmod +x manual_trading_hub/scripts/stop_agents_3screen.sh
chmod +x manual_trading_hub/scripts/stop_hub_screen.sh
./manual_trading_hub/scripts/start_agents_3screen.sh
./manual_trading_hub/scripts/start_hub_screen.sh
# 关闭:
./manual_trading_hub/scripts/stop_hub_screen.sh
./manual_trading_hub/scripts/stop_agents_3screen.sh
```
脚本默认认为:`manual_trading_hub` 的**上一级目录**里并列放着三个 `crypto_monitor_*`。若你把 hub 单独放在 `/opt/crypto_monitor/manual_trading_hub`,而策略项目在例如 `/opt/crypto_monitor/` 下的其他位置,请先执行
`export MANUAL_TRADING_REPO_ROOT=/opt/crypto_monitor` 再运行 `start_agents_3screen.sh`
启动后若 `screen -ls` 里没有 `mt-agent-*`,看日志:`tail -80 /opt/crypto_monitor/manual_trading_hub/logs/mt-agent-bn.log`
### 局域网内其他电脑访问中控
中控 **默认** `HUB_HOST=0.0.0.0``HUB_TRUST_LAN=开启`,同一局域网内可用 `http://<中控机局域网IP>:5100/monitor` 打开(本机 `http://127.0.0.1:5100/`)。请确保防火墙放行端口,例如:`sudo ufw allow 5100/tcp`
-`.env` 设置了 **`HUB_PASSWORD`**,须先访问 `/login`(用户名见 `HUB_USERNAME`,默认 `admin`)。
- **公网** 建议只经 **HTTPS 反代** 访问,勿把 5100 直接暴露公网;详见 [部署文档.md](../部署文档.md) §八。
-**域名 HTTPS 能登录、内网 IP:5100 HTTP 不能**,见 [常见问题.md](../常见问题.md) §2.1Cookie Secure)。
若改为 **仅本机** 访问:`HUB_HOST=127.0.0.1``HUB_TRUST_LAN=0`,重启 hub。
也可把上述变量写进 `manual_trading_hub/.env`,再用 `start_hub_screen.sh` 启动。
以下为手工 tmux 示例:
```bash
# 新建会话,在里面照常启动 agent 或 hub,然后按键 Ctrl+B 再按 D 脱离
tmux new -s hub
cd /opt/crypto_monitor/manual_trading_hub && source .venv/bin/activate && python hub.py
# Ctrl+B, D
tmux new -s agent-bn
cd /opt/crypto_monitor/crypto_monitor_binance && set -a && source .env && set +a
export EXCHANGE=binance PORT=15200 HOST=127.0.0.1
source /opt/crypto_monitor/manual_trading_hub/.venv/bin/activate
python /opt/crypto_monitor/manual_trading_hub/agent.py
# Ctrl+B, D
```
重新连上:`tmux attach -t hub`
---
## 二、nohup(快速、无守护重启)
```bash ```bash
cd /opt/crypto_monitor/manual_trading_hub cd /opt/crypto_monitor/manual_trading_hub
source .venv/bin/activate source .venv/bin/activate
nohup python hub.py > /tmp/manual-hub.log 2>&1 & pip install -r requirements.txt
cp -n .env.example .env # 首次
pm2 start ecosystem.config.cjs
pm2 save
pm2 list
``` ```
子代理同理(每个账户一条):**先 `source` 该策略目录的 `.env`**`agent.py` 不会自己读文件),再 `nohup python …/agent.py` 一条 `ecosystem.config.cjs` 会拉起 **4 个子代理 + 1 个 hub**
停进程:`ps aux | grep hub.py``grep agent.py`,再 `kill <pid>`
--- ---
## 三、systemd(推荐:开机自启、崩溃自动拉起) ## 常用命令
1. 把下面两个示例里的 **`YOUR_REPO`** 改成 **`/opt/crypto_monitor`**(或你本机实际仓库根目录),`YOUR_USER` 改成 Linux 用户名。
2. 复制到 `/etc/systemd/system/`(需 sudo),文件名例如 `manual-hub.service``manual-agent-binance.service`
3. 执行:
```bash ```bash
sudo systemctl daemon-reload pm2 logs manual-trading-hub
sudo systemctl enable --now manual-hub.service pm2 restart manual-trading-hub
sudo systemctl enable --now manual-agent-binance.service pm2 restart all
# 其余 OKX / Gate 同理再建 3 个 unit 或合并为多条 bash scripts/verify_hub_deploy.sh
``` ```
查看状态:`sudo systemctl status manual-hub`
日志:`journalctl -u manual-hub -f`
### 示例:`/etc/systemd/system/manual-hub.service`
```ini
[Unit]
Description=手工交易中控 hub
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=YOUR_USER
WorkingDirectory=YOUR_REPO/manual_trading_hub
Environment=HUB_HOST=0.0.0.0
Environment=HUB_TRUST_LAN=1
Environment=HUB_PORT=5100
ExecStart=YOUR_REPO/manual_trading_hub/.venv/bin/python YOUR_REPO/manual_trading_hub/hub.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
```
**注意:** `agent.py` **不会**像 Flask 那样自动加载目录里的 `.env`,密钥必须由 **systemd 的 `EnvironmentFile=`** 注入,或用下面 `bash -c` 方式 `source .env` 后再启动。
### 示例:`/etc/systemd/system/manual-agent-binance.service`
```ini
[Unit]
Description=手工交易子代理 Binance
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=YOUR_USER
WorkingDirectory=YOUR_REPO/crypto_monitor_binance
Environment=PATH=YOUR_REPO/manual_trading_hub/.venv/bin:/usr/bin:/bin
Environment=EXCHANGE=binance
Environment=PORT=15200
Environment=HOST=127.0.0.1
# 把该账户的 .env 注入进程(与 Flask 同一份即可;仅支持 KEY=VALUE 行,勿写 shell 语法)
EnvironmentFile=-YOUR_REPO/crypto_monitor_binance/.env
ExecStart=YOUR_REPO/manual_trading_hub/.venv/bin/python YOUR_REPO/manual_trading_hub/agent.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
```
`.env`**systemd 无法解析** 的内容(复杂引号、`export` 等),改用:
```ini
ExecStart=/bin/bash -lc 'set -a; source YOUR_REPO/crypto_monitor_binance/.env; set +a; exec YOUR_REPO/manual_trading_hub/.venv/bin/python YOUR_REPO/manual_trading_hub/agent.py'
```
并删掉或注释掉 `EnvironmentFile=` 行,避免重复注入。
**OKX / Gate / Gate-Bot**:各复制一份 `.service`,改 `Description``WorkingDirectory`、以及 `EXCHANGE` / `PORT``15201``15202``15203`)。
--- ---
## 四、常见问题(子代理 / screen / 依赖) ## 详细说明
1. **`curl http://127.0.0.1:15202/status`(或其它端口)返回 `ok:false`,错误里提到 pysocks / SOCKS** | 文档 | 内容 |
策略目录 `.env` 里配置了 `GATE_SOCKS_PROXY`(或 `BINANCE_SOCKS_PROXY``OKX_SOCKS_PROXY`)时,ccxt 需要 **PySocks**。在 **`/opt/crypto_monitor/manual_trading_hub/.venv`**(或你本机的 `manual_trading_hub/.venv`)中执行: |------|------|
`pip install PySocks``pip install -r requirements.txt` | [../部署文档.md](../部署文档.md) | 端口、反代、故障排查 |
| [../../docs/ubuntu-server.md](../../docs/ubuntu-server.md) | Python / Node / PM2 版本与四所启动顺序 |
2. **已经 `pip install PySocks`,错误文案完全不变** 历史 screen/systemd 示例已废弃,仅保留 PM2 运维。
子代理是**常驻进程**,首次请求已创建 ccxt;在运行中的进程里**仅安装包不会自动生效**。须**重启**该 agent:例如
`screen -S mt-agent-gate -X quit`
再执行 `start_agents_3screen.sh`(或你的等价启动方式)。**不要**依赖「会话还在、以为已经更新」的旧进程。
3. **`start_agents_3screen.sh` 打印「已存在会话、跳过」**
脚本检测到 `mt-agent-*` 已在跑会跳过创建。需要先停再启:
`./stop_agents_3screen.sh`
或对单个会话:`screen -S mt-agent-gate -X quit`,再跑启动脚本。
4. **确认 15200/15202/15203 上的进程用的是 hub 的 venv**
```bash
ps aux | grep agent.py
tr '\0' ' ' < /proc/<PID>/cmdline; echo
```
应看到 `…/manual_trading_hub/.venv/bin/python` 与 `…/manual_trading_hub/agent.py`。若用的是系统 `python3`,要么在**同一解释器环境**里装依赖,要么改为用 `start_agents_3screen.sh` 启动(脚本内写死 `VENV_PY`)。
5. **中控某账户一直红 / 非 JSON**
对应该端口的 agent 未启动,或 **系统设置** 里 Agent URL 与 `PORT`15200~15203)不一致。本机先测:
`curl -sS http://127.0.0.1:1520x/status | head -c 400`
再看 `logs/mt-agent-*.log` 或 `pm2 logs manual-agent-*`。
6. **PM2 日志仍见 `api_trade_key` / 添加关键位 SyntaxError**
多为旧版 hub 或未重启。`git pull` → `bash scripts/fix_hub_deps.sh` → `bash scripts/verify_hub_deploy.sh` → `pm2 restart manual-trading-hub`。中控**已移除下单区**,关键位请在监控卡片 **「实例」** 进各 Flask 操作。详见 [常见问题.md](../常见问题.md) §1。
7. **子代理端口与 Flask 冲突**
agent 使用环境变量 **`PORT`**(脚本里 15200、15202、15203);各策略 `.env` 里的 **`APP_PORT`** 给 Flask。二者**不能**相同。
8. **systemd 下改依赖或 `.env` 后**
与 screen 相同:`pip install` 或改 `EnvironmentFile` 后需 **`systemctl restart <unit>`**,否则仍是旧进程。
---
## 五、注意
- 子代理与中控仍建议只监听 **127.0.0.1**Flask 的 `APP_HOST=0.0.0.0` 与中控无关。
- 若策略项目用**自己的** `.venv`,把 `ExecStart` 里的 Python 改成该 venv 的 `python`,但 `agent.py` 路径仍指向 `manual_trading_hub/agent.py`。
同目录下另有 `example-systemd/*.service.example` 可复制后改路径使用。
+25 -62
View File
@@ -104,70 +104,32 @@ $env:HUB_DISABLED_IDS="1" # 默认即关闭 OKXid=1
--- ---
## 3. 启动顺序(Windows 示例 ## 3. 启动顺序(Ubuntu + PM2
**原则**先子代理与四实例 Flask,再中控 **原则**代码在 **`/opt/crypto_monitor`**,先四实例 Flask,再中控(一条 PM2 含 4 agent + hub)。环境见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**
### 3.1 子代理(每所一个终端)
在对应策略目录加载 `.env` 后:
```powershell
# 币安
cd c:\Users\dekun\Desktop\crypto_monitor\crypto_monitor_binance
$env:EXCHANGE="binance"; $env:PORT="15200"; $env:HOST="127.0.0.1"
# 可选:$env:CONTROL_TOKEN="你的随机串"
python ..\manual_trading_hub\agent.py
```
```powershell
# OKX(若启用)
cd ..\crypto_monitor_okx
$env:EXCHANGE="okx"; $env:PORT="15201"
python ..\manual_trading_hub\agent.py
```
```powershell
# Gate 训练
cd ..\crypto_monitor_gate
$env:EXCHANGE="gate"; $env:PORT="15202"
python ..\manual_trading_hub\agent.py
```
```powershell
# Gate 趋势
cd ..\crypto_monitor_gate_bot
$env:EXCHANGE="gate"; $env:PORT="15203"
python ..\manual_trading_hub\agent.py
```
### 3.2 四实例 Flask
在各目录按原有方式启动 `app.py`(确保 `APP_PORT` 与设置页 Flask URL 一致)。
### 3.3 中控
```powershell
cd c:\Users\dekun\Desktop\crypto_monitor\manual_trading_hub
$env:HUB_HOST="0.0.0.0" # 仅本机可改为 127.0.0.1
$env:HUB_PORT="5100"
$env:HUB_BRIDGE_TOKEN="你的随机串" # 与各实例、子代理一致
python hub.py
```
浏览器打开:
- 监控区:http://127.0.0.1:5100/monitor
- 行情区:http://127.0.0.1:5100/market
- 系统设置:http://127.0.0.1:5100/settings
- 登录页:http://127.0.0.1:5100/login(已设 `HUB_PASSWORD` 时)
- 旧链接 `/trade` 会自动跳转到 `/monitor`
验收(无需登录):
```bash ```bash
# 四所 Flask(示例:币安;其余三所同理)
cd /opt/crypto_monitor/crypto_monitor_binance
pm2 start ecosystem.config.cjs
# 中控 + 子代理
cd /opt/crypto_monitor/manual_trading_hub
pm2 start ecosystem.config.cjs
pm2 save
```
浏览器(本机或反代):
- 监控区:`http://127.0.0.1:5100/monitor`
- 行情区:`http://127.0.0.1:5100/market`
- 系统设置:`http://127.0.0.1:5100/settings`
验收:
```bash
bash /opt/crypto_monitor/manual_trading_hub/scripts/verify_hub_deploy.sh
curl -s http://127.0.0.1:5100/api/ping curl -s http://127.0.0.1:5100/api/ping
# 应含 "build":"20260521-no-trade-ui", "trade_ui":false
``` ```
--- ---
@@ -451,7 +413,7 @@ pm2 save && pm2 startup
快捷:`bash scripts/pm2_hub.sh start|restart|logs`(同样 hub+agent 一起)。 快捷:`bash scripts/pm2_hub.sh start|restart|logs`(同样 hub+agent 一起)。
更细的安装顺序、反代、验收见 **《部署文档.md》**screen / systemd 见 **scripts/** 更细的安装顺序、反代、验收见 **《部署文档.md》**PM2 见 **[scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md)**。
--- ---
@@ -478,4 +440,5 @@ pm2 save && pm2 startup
| [常见问题.md](./常见问题.md) | 故障实录与排障 | | [常见问题.md](./常见问题.md) | 故障实录与排障 |
| [README.md](./README.md) | 速览 | | [README.md](./README.md) | 速览 |
| [.env.example](./.env.example) | 环境变量模板 | | [.env.example](./.env.example) | 环境变量模板 |
| [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | screen / systemd | | [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | PM2 常驻 |
| [docs/ubuntu-server.md](../docs/ubuntu-server.md) | Ubuntu 环境总览 |
+7 -8
View File
@@ -175,7 +175,7 @@ pm2 save
curl -s http://127.0.0.1:15202/status | head -c 200 # 应 ok:true curl -s http://127.0.0.1:15202/status | head -c 200 # 应 ok:true
``` ```
**预防**`.env` 保存为 **LF**Windows `deploy/setup_env.ps1` 复制 `.env.example` 时已写 LF。子代理须经 **`scripts/run_agent.sh`** 启动(内置去 CRLF 的 `load_dotenv_file`),勿裸跑 `python agent.py` **预防**`.env` 保存为 **LF**(勿在 Windows 记事本直接保存 CRLF。子代理须经 **`scripts/run_agent.sh`** 启动(内置去 CRLF 的 `load_dotenv_file`),勿裸跑 `python agent.py`
详见 [常见问题.md](./常见问题.md) **§3.1**、**§3.3**。 详见 [常见问题.md](./常见问题.md) **§3.1**、**§3.3**。
@@ -186,7 +186,7 @@ curl -s http://127.0.0.1:15202/status | head -c 200 # 应 ok:true
需**分别**起 agent 与 hub(与 PM2 合并启动不同): 需**分别**起 agent 与 hub(与 PM2 合并启动不同):
```bash ```bash
# 子代理:scripts/start_agents_3screen.sh 或每目录手动 agent.py # 子代理:由 ecosystem.config.cjs 经 run_agent.sh 启动(勿用手动多终端)
# 中控: # 中控:
cd /opt/crypto_monitor/manual_trading_hub cd /opt/crypto_monitor/manual_trading_hub
bash scripts/run_hub.sh bash scripts/run_hub.sh
@@ -303,12 +303,10 @@ pm2 restart ecosystem.config.cjs
--- ---
## 十二、其它常驻方式 ## 十二、进程托管说明
- **screen**`scripts/start_hub_screen.sh` / `stop_hub_screen.sh` 中控与子代理 **仅使用 PM2**`ecosystem.config.cjs`)。勿再用 screen / systemd / nohup 启动 `hub.py``agent.py`,以免端口冲突。
- **systemd**`scripts/example-systemd/manual-hub.service.example`(复制并改路径) 环境要求见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**。
与 PM2 **二选一** 即可,避免同一端口启动两份 hub。
--- ---
@@ -331,7 +329,8 @@ pm2 restart ecosystem.config.cjs
| [常见问题.md](./常见问题.md) | 故障实录 | | [常见问题.md](./常见问题.md) | 故障实录 |
| [README.md](./README.md) | 速览 | | [README.md](./README.md) | 速览 |
| [.env.example](./.env.example) | 环境变量模板 | | [.env.example](./.env.example) | 环境变量模板 |
| [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | screen / systemd | | [scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md) | PM2 常驻(唯一推荐) |
| [docs/ubuntu-server.md](../docs/ubuntu-server.md) | Ubuntu / Python / Node / PM2 |
| `scripts/fix_hub_deps.sh` | 安装依赖 | | `scripts/fix_hub_deps.sh` | 安装依赖 |
| `scripts/verify_hub_deploy.sh` | 部署验收 | | `scripts/verify_hub_deploy.sh` | 部署验收 |
| `scripts/fix_env_crlf.sh` | 修复 .env 换行 | | `scripts/fix_env_crlf.sh` | 修复 .env 换行 |
+4 -3
View File
@@ -129,11 +129,11 @@ strategy_records_register.py # /strategy/records 路由与列表数据
```bash ```bash
cd /opt/crypto_monitor cd /opt/crypto_monitor
git pull git pull
# 四所 PM2 若用到滚仓/趋势 lib,建议重启 pm2 restart crypto-monitor-binance crypto-monitor-okx crypto-monitor-gate crypto-monitor-gate-bot manual-trading-hub
pm2 restart crypto_binance crypto_gate crypto_gate_bot crypto_okx manual-trading-hub pm2 save
``` ```
仅改 Python 库、未改模板时,重启对应 Flask 进程即可 部署约定:**Ubuntu + root + /opt/crypto_monitor + PM2** → [docs/ubuntu-server.md](./docs/ubuntu-server.md)
--- ---
@@ -144,6 +144,7 @@ pm2 restart crypto_binance crypto_gate crypto_gate_bot crypto_okx manual-trading
| [crypto_monitor_gate_bot/趋势回调策略说明.md](./crypto_monitor_gate_bot/趋势回调策略说明.md) | 趋势回调细则(与四所共用逻辑一致) | | [crypto_monitor_gate_bot/趋势回调策略说明.md](./crypto_monitor_gate_bot/趋势回调策略说明.md) | 趋势回调细则(与四所共用逻辑一致) |
| [AI复盘与模型配置说明.md](./AI复盘与模型配置说明.md) | 复盘页 AI(与策略无关) | | [AI复盘与模型配置说明.md](./AI复盘与模型配置说明.md) | 复盘页 AI(与策略无关) |
| [manual_trading_hub/使用说明.md](./manual_trading_hub/使用说明.md) | 中控监控、全屏趋势卡两列布局 | | [manual_trading_hub/使用说明.md](./manual_trading_hub/使用说明.md) | 中控监控、全屏趋势卡两列布局 |
| [docs/ubuntu-server.md](./docs/ubuntu-server.md) | Ubuntu / root /opt / PM2 部署 |
| [fib_key_monitor_lib.py](./fib_key_monitor_lib.py) | 斐波公式共用 | | [fib_key_monitor_lib.py](./fib_key_monitor_lib.py) | 斐波公式共用 |
--- ---