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
+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/fix_env_crlf.sh](./scripts/fix_env_crlf.sh) | 修复 .env 的 Windows 换行 |
| [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) §五。
> 故障实录:[常见问题.md](../常见问题.md)
**唯一推荐方式:PM2。**
`crypto_monitor_*` 策略目录:首次 **`cp .env.example .env`** 并编辑;**`.env` 不进 Git**`git pull` 不覆盖。升级前建议 `cp .env .env.backup.$(date +%Y%m%d)`。子代理启动前须 **`source` 该目录 `.env`**(见下文;PM2 经 `run_agent.sh` 会自动处理)
前台跑 `python agent.py` / `python hub.py` 时,关掉终端进程会结束。要**常驻后台**,可用下面三种之一(推荐 **systemd**)。
请勿使用 screen、nohup、systemd 与 PM2 **同时** 启动同一端口上的 `hub.py` / `agent.py`
---
## 一、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
cd /opt/crypto_monitor/manual_trading_hub
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`
停进程:`ps aux | grep hub.py``grep agent.py`,再 `kill <pid>`
一条 `ecosystem.config.cjs` 会拉起 **4 个子代理 + 1 个 hub**
---
## 三、systemd(推荐:开机自启、崩溃自动拉起)
1. 把下面两个示例里的 **`YOUR_REPO`** 改成 **`/opt/crypto_monitor`**(或你本机实际仓库根目录),`YOUR_USER` 改成 Linux 用户名。
2. 复制到 `/etc/systemd/system/`(需 sudo),文件名例如 `manual-hub.service``manual-agent-binance.service`
3. 执行:
## 常用命令
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now manual-hub.service
sudo systemctl enable --now manual-agent-binance.service
# 其余 OKX / Gate 同理再建 3 个 unit 或合并为多条
pm2 logs manual-trading-hub
pm2 restart manual-trading-hub
pm2 restart all
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`,错误文案完全不变**
子代理是**常驻进程**,首次请求已创建 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` 可复制后改路径使用。
历史 screen/systemd 示例已废弃,仅保留 PM2 运维。
+25 -62
View File
@@ -104,70 +104,32 @@ $env:HUB_DISABLED_IDS="1" # 默认即关闭 OKXid=1
---
## 3. 启动顺序(Windows 示例
## 3. 启动顺序(Ubuntu + PM2
**原则**先子代理与四实例 Flask,再中控
### 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`
验收(无需登录):
**原则**代码在 **`/opt/crypto_monitor`**,先四实例 Flask,再中控(一条 PM2 含 4 agent + hub)。环境见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**
```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
# 应含 "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 一起)。
更细的安装顺序、反代、验收见 **《部署文档.md》**screen / systemd 见 **scripts/**
更细的安装顺序、反代、验收见 **《部署文档.md》**PM2 见 **[scripts/后台运行-Ubuntu.md](./scripts/后台运行-Ubuntu.md)**。
---
@@ -478,4 +440,5 @@ pm2 save && pm2 startup
| [常见问题.md](./常见问题.md) | 故障实录与排障 |
| [README.md](./README.md) | 速览 |
| [.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
```
**预防**`.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**。
@@ -186,7 +186,7 @@ curl -s http://127.0.0.1:15202/status | head -c 200 # 应 ok:true
需**分别**起 agent 与 hub(与 PM2 合并启动不同):
```bash
# 子代理:scripts/start_agents_3screen.sh 或每目录手动 agent.py
# 子代理:由 ecosystem.config.cjs 经 run_agent.sh 启动(勿用手动多终端)
# 中控:
cd /opt/crypto_monitor/manual_trading_hub
bash scripts/run_hub.sh
@@ -303,12 +303,10 @@ pm2 restart ecosystem.config.cjs
---
## 十二、其它常驻方式
## 十二、进程托管说明
- **screen**`scripts/start_hub_screen.sh` / `stop_hub_screen.sh`
- **systemd**`scripts/example-systemd/manual-hub.service.example`(复制并改路径)
与 PM2 **二选一** 即可,避免同一端口启动两份 hub。
中控与子代理 **仅使用 PM2**`ecosystem.config.cjs`)。勿再用 screen / systemd / nohup 启动 `hub.py` 或 `agent.py`,以免端口冲突。
环境要求见 **[docs/ubuntu-server.md](../docs/ubuntu-server.md)**。
---
@@ -331,7 +329,8 @@ pm2 restart ecosystem.config.cjs
| [常见问题.md](./常见问题.md) | 故障实录 |
| [README.md](./README.md) | 速览 |
| [.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/verify_hub_deploy.sh` | 部署验收 |
| `scripts/fix_env_crlf.sh` | 修复 .env 换行 |