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:
@@ -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 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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.1(Cookie 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
@@ -104,70 +104,32 @@ $env:HUB_DISABLED_IDS="1" # 默认即关闭 OKX(id=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 环境总览 |
|
||||
|
||||
@@ -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 换行 |
|
||||
|
||||
Reference in New Issue
Block a user