From 6d7b45e714361ad2003a73520f9b6ac971229831 Mon Sep 17 00:00:00 2001 From: dekun Date: Fri, 22 May 2026 10:37:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E6=8E=A7=E5=A2=9E=E5=8A=A0=E4=B8=8B?= =?UTF-8?q?=E5=8D=95=EF=BC=8C=E5=85=B3=E9=94=AE=E4=BD=8D=EF=BC=8C=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manual_trading_hub/ecosystem.config.cjs | 11 +++++------ manual_trading_hub/scripts/run_agent.sh | 24 ++++++++++++++++++++++++ manual_trading_hub/static/app.js | 5 +++++ manual_trading_hub/部署文档.md | 7 ++++--- 4 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 manual_trading_hub/scripts/run_agent.sh diff --git a/manual_trading_hub/ecosystem.config.cjs b/manual_trading_hub/ecosystem.config.cjs index 0bc1f17..2b84c5d 100644 --- a/manual_trading_hub/ecosystem.config.cjs +++ b/manual_trading_hub/ecosystem.config.cjs @@ -19,16 +19,15 @@ const path = require("path"); const HUB_DIR = __dirname; const REPO_ROOT = path.join(HUB_DIR, ".."); -const PY = path.join(HUB_DIR, ".venv", "bin", "python"); -const AGENT = path.join(HUB_DIR, "agent.py"); -const RUN_SH = path.join(HUB_DIR, "scripts", "run_hub.sh"); +const RUN_HUB = path.join(HUB_DIR, "scripts", "run_hub.sh"); +const RUN_AGENT = path.join(HUB_DIR, "scripts", "run_agent.sh"); function agentApp(name, exchangeDir, exchange, port) { return { name, cwd: path.join(REPO_ROOT, exchangeDir), - script: AGENT, - interpreter: PY, + script: RUN_AGENT, + interpreter: "bash", instances: 1, autorestart: true, watch: false, @@ -50,7 +49,7 @@ module.exports = { { name: "manual-trading-hub", cwd: HUB_DIR, - script: RUN_SH, + script: RUN_HUB, interpreter: "bash", instances: 1, autorestart: true, diff --git a/manual_trading_hub/scripts/run_agent.sh b/manual_trading_hub/scripts/run_agent.sh new file mode 100644 index 0000000..4746664 --- /dev/null +++ b/manual_trading_hub/scripts/run_agent.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# PM2 子代理入口:在策略目录(cwd)加载 .env 后启动 agent.py +# EXCHANGE / PORT / HOST 由 ecosystem.config.cjs 注入,.env 里一般无 PORT,不会覆盖 +set -euo pipefail + +HUB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +VENV_PY="${HUB_DIR}/.venv/bin/python" +AGENT_PY="${HUB_DIR}/agent.py" + +if [[ ! -x "${VENV_PY}" ]]; then + echo "未找到 ${VENV_PY},请先在 manual_trading_hub 下创建 venv" >&2 + exit 1 +fi + +if [[ -f .env ]]; then + set -a + # shellcheck disable=SC1091 + . ./.env + set +a +else + echo "警告: $(pwd) 下无 .env,agent 可能缺少 API 密钥" >&2 +fi + +exec "${VENV_PY}" "${AGENT_PY}" diff --git a/manual_trading_hub/static/app.js b/manual_trading_hub/static/app.js index 9205fd5..96902c3 100644 --- a/manual_trading_hub/static/app.js +++ b/manual_trading_hub/static/app.js @@ -105,8 +105,13 @@ kmap[k.id] = k; }); let inner = ""; + const agOk = ag.ok !== false; + const agErr = ag.error || row.error || ""; if (!row.http_ok) { inner = `
${esc(row.error || "子代理不可用")}
`; + } else if (!agOk) { + inner = `
${esc(agErr || "子代理返回失败")}
`; + inner += `
请检查:PM2 子代理是否在对应 crypto_monitor_* 目录加载了 .env;curl ${esc(row.agent_url || "")}/status
`; } else { const posRows = pos .map( diff --git a/manual_trading_hub/部署文档.md b/manual_trading_hub/部署文档.md index 002e689..4a35a30 100644 --- a/manual_trading_hub/部署文档.md +++ b/manual_trading_hub/部署文档.md @@ -36,7 +36,7 @@ source .venv/bin/activate # 激活 venv(当前终端后续 pip/python pip install -r requirements.txt cp .env.example .env # 编辑 .env:HUB_PORT、HUB_DISABLED_IDS、公网时 HUB_BRIDGE_TOKEN 等 -chmod +x scripts/run_hub.sh scripts/pm2_hub.sh scripts/pm2_agents.sh +chmod +x scripts/run_hub.sh scripts/run_agent.sh scripts/pm2_hub.sh scripts/pm2_agents.sh deactivate # 可选;交给 PM2 时不必保持激活 ``` @@ -70,7 +70,7 @@ deactivate # 可选;交给 PM2 时不必保持激活 |------|----------| | `ecosystem.config.cjs` | `manual-agent-binance` / `okx` / `gate` / `gate-bot` + **`manual-trading-hub`** | -`run_hub.sh` 加载 **`manual_trading_hub/.env`** 后执行 `hub.py`;各 agent 在对应策略目录启动以读取该目录 **`.env`** 中的 API 密钥。 +`run_hub.sh` 加载 **`manual_trading_hub/.env`** 后执行 `hub.py`;各 agent 经 **`run_agent.sh`** 在对应策略目录加载 **`.env`**(含 API 密钥),再执行 `agent.py`。 ```bash cd /opt/crypto_monitor/manual_trading_hub @@ -215,7 +215,8 @@ pm2 restart ecosystem.config.cjs | 现象 | 处理 | |------|------| | PM2 启动后立刻退出 | `pm2 logs manual-trading-hub`;检查 `.venv`、`.env`、`run_hub.sh` 可执行 | -| 监控无持仓 | 子代理未起或 Agent URL 错;`curl http://127.0.0.1:15200/status` | +| 余额显示 —、无报错 | 子代理未加载策略目录 `.env`(旧版 PM2 直接跑 agent.py) | 更新代码后 `pm2 restart ecosystem.config.cjs`;`curl http://127.0.0.1:15200/status` 应 `ok:true` 且有 `balance_usdt` | +| 监控无持仓 | 子代理未起或 Agent URL 错;或交易所确实无仓 | `curl http://127.0.0.1:15200/status` | | 无关键位/下单 401 | Flask 未起或 `HUB_BRIDGE_TOKEN` 不一致;或设 `APP_AUTH_DISABLED=true` | | 子代理 SOCKS 报错 | 在 **manual_trading_hub/.venv** 安装 `PySocks` 后 **pm2 restart** 子代理 | | 公网访问中控 403 | 反代未指向本机、或客户端非私网且 `HUB_TRUST_LAN=true`;反代改 `127.0.0.1:5100` 或在反代层鉴权 |