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 = `
curl ${esc(row.agent_url || "")}/status