diff --git a/manual_trading_hub/ecosystem.config.cjs b/manual_trading_hub/ecosystem.config.cjs index 2b84c5d..16b409d 100644 --- a/manual_trading_hub/ecosystem.config.cjs +++ b/manual_trading_hub/ecosystem.config.cjs @@ -32,6 +32,9 @@ function agentApp(name, exchangeDir, exchange, port) { autorestart: true, watch: false, max_memory_restart: "400M", + restart_delay: 3000, + max_restarts: 15, + merge_logs: true, env: { EXCHANGE: exchange, PORT: String(port), diff --git a/manual_trading_hub/scripts/run_agent.sh b/manual_trading_hub/scripts/run_agent.sh index 4746664..5da8527 100644 --- a/manual_trading_hub/scripts/run_agent.sh +++ b/manual_trading_hub/scripts/run_agent.sh @@ -1,14 +1,19 @@ #!/usr/bin/env bash # PM2 子代理入口:在策略目录(cwd)加载 .env 后启动 agent.py -# EXCHANGE / PORT / HOST 由 ecosystem.config.cjs 注入,.env 里一般无 PORT,不会覆盖 -set -euo pipefail +set -e +set -o pipefail HUB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" VENV_PY="${HUB_DIR}/.venv/bin/python" AGENT_PY="${HUB_DIR}/agent.py" +# PM2 ecosystem 注入,须在 source .env 之后再次强制(避免 .env 覆盖 PORT/EXCHANGE) +_PM2_EXCHANGE="${EXCHANGE:-}" +_PM2_PORT="${PORT:-}" +_PM2_HOST="${HOST:-}" + if [[ ! -x "${VENV_PY}" ]]; then - echo "未找到 ${VENV_PY},请先在 manual_trading_hub 下创建 venv" >&2 + echo "未找到 ${VENV_PY},请先在 manual_trading_hub: python3 -m venv .venv && pip install -r requirements.txt" >&2 exit 1 fi @@ -21,4 +26,9 @@ else echo "警告: $(pwd) 下无 .env,agent 可能缺少 API 密钥" >&2 fi +[[ -n "${_PM2_EXCHANGE}" ]] && export EXCHANGE="${_PM2_EXCHANGE}" +[[ -n "${_PM2_PORT}" ]] && export PORT="${_PM2_PORT}" +[[ -n "${_PM2_HOST}" ]] && export HOST="${_PM2_HOST}" + +echo "agent start: exchange=${EXCHANGE:-?} port=${PORT:-?} cwd=$(pwd)" >&2 exec "${VENV_PY}" "${AGENT_PY}" diff --git a/manual_trading_hub/部署文档.md b/manual_trading_hub/部署文档.md index 4a35a30..53b0619 100644 --- a/manual_trading_hub/部署文档.md +++ b/manual_trading_hub/部署文档.md @@ -216,6 +216,7 @@ pm2 restart ecosystem.config.cjs |------|------| | PM2 启动后立刻退出 | `pm2 logs manual-trading-hub`;检查 `.venv`、`.env`、`run_hub.sh` 可执行 | | 余额显示 —、无报错 | 子代理未加载策略目录 `.env`(旧版 PM2 直接跑 agent.py) | 更新代码后 `pm2 restart ecosystem.config.cjs`;`curl http://127.0.0.1:15200/status` 应 `ok:true` 且有 `balance_usdt` | +| PM2 里 agent **stopped**(hub 仍 online) | 启动失败:端口占用、无 `.env`/密钥、`run_agent.sh` 无执行权限、venv 缺失 | `pm2 logs manual-agent-binance --lines 80`;`chmod +x scripts/run_agent.sh`;`ss -tlnp \| grep 15200` | | 监控无持仓 | 子代理未起或 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** 子代理 |