diff --git a/crypto_monitor_binance/ecosystem.config.cjs b/crypto_monitor_binance/ecosystem.config.cjs index 2f7c221..a61a670 100644 --- a/crypto_monitor_binance/ecosystem.config.cjs +++ b/crypto_monitor_binance/ecosystem.config.cjs @@ -1,7 +1,7 @@ /** * PM2 进程定义(Ubuntu / Linux)。 * - * 仅托管 Flask 应用。**SSH SOCKS 隧道请在本机用 screen/tmux/systemd 等方式单独常驻**, + * 仅托管 Flask 应用。**SSH SOCKS 隧道**用 `ssh -D` 常驻(可用 tmux / autossh),勿交给 PM2。 * 与 `.env` 里 `BINANCE_SOCKS_PROXY` 端口一致即可;不必交给 PM2。 * * 使用前:项目根目录存在 `.venv`,且已安装依赖(走 SOCKS 时需 PySocks)。 diff --git a/crypto_monitor_binance/start_utf8.ps1 b/crypto_monitor_binance/start_utf8.ps1 deleted file mode 100644 index 4a8fd0c..0000000 Binary files a/crypto_monitor_binance/start_utf8.ps1 and /dev/null differ diff --git a/crypto_monitor_gate/ecosystem.config.cjs b/crypto_monitor_gate/ecosystem.config.cjs index 8fa8d8f..71b25fe 100644 --- a/crypto_monitor_gate/ecosystem.config.cjs +++ b/crypto_monitor_gate/ecosystem.config.cjs @@ -1,7 +1,7 @@ /** * PM2 进程定义(Ubuntu / Linux)。 * - * 仅托管 Flask 应用。**SSH SOCKS 隧道请在本机用 screen/tmux/systemd 等方式单独常驻**, + * 仅托管 Flask 应用。**SSH SOCKS 隧道**用 `ssh -D` 常驻(可用 tmux / autossh),勿交给 PM2。 * 与 `.env` 里 `GATE_SOCKS_PROXY` 端口一致即可;不必交给 PM2。 * * 使用前:项目根目录存在 `.venv`,且已安装依赖(走 SOCKS 时需 PySocks)。 diff --git a/crypto_monitor_gate/start_utf8.ps1 b/crypto_monitor_gate/start_utf8.ps1 deleted file mode 100644 index 4a8fd0c..0000000 Binary files a/crypto_monitor_gate/start_utf8.ps1 and /dev/null differ diff --git a/crypto_monitor_gate_bot/ecosystem.config.cjs b/crypto_monitor_gate_bot/ecosystem.config.cjs index f1e4926..a3c340c 100644 --- a/crypto_monitor_gate_bot/ecosystem.config.cjs +++ b/crypto_monitor_gate_bot/ecosystem.config.cjs @@ -1,7 +1,7 @@ /** * PM2 进程定义(Ubuntu / Linux)。 * - * 仅托管 Flask 应用。**SSH SOCKS 隧道请在本机用 screen/tmux/systemd 等方式单独常驻**, + * 仅托管 Flask 应用。**SSH SOCKS 隧道**用 `ssh -D` 常驻(可用 tmux / autossh),勿交给 PM2。 * 与 `.env` 里 `GATE_SOCKS_PROXY` 端口一致即可;不必交给 PM2。 * * 使用前:项目根目录存在 `.venv`,且已安装依赖(走 SOCKS 时需 PySocks)。 diff --git a/crypto_monitor_gate_bot/start_utf8.ps1 b/crypto_monitor_gate_bot/start_utf8.ps1 deleted file mode 100644 index 4a8fd0c..0000000 Binary files a/crypto_monitor_gate_bot/start_utf8.ps1 and /dev/null differ diff --git a/crypto_monitor_okx/ecosystem.config.cjs b/crypto_monitor_okx/ecosystem.config.cjs index 3377ddf..a5ce781 100644 --- a/crypto_monitor_okx/ecosystem.config.cjs +++ b/crypto_monitor_okx/ecosystem.config.cjs @@ -1,7 +1,7 @@ /** * PM2 进程定义(Ubuntu / Linux)。 * - * 仅托管 Flask 应用。**SSH SOCKS 隧道请在本机用 screen/tmux/systemd 等方式单独常驻**, + * 仅托管 Flask 应用。**SSH SOCKS 隧道**用 `ssh -D` 常驻(可用 tmux / autossh),勿交给 PM2。 * 与 `.env` 里 `OKX_SOCKS_PROXY` 端口一致即可;不必交给 PM2。 * * 使用前:项目根目录存在 `.venv`,且已安装依赖(走 SOCKS 时需 PySocks)。 diff --git a/crypto_monitor_okx/start_utf8.ps1 b/crypto_monitor_okx/start_utf8.ps1 deleted file mode 100644 index 4a8fd0c..0000000 Binary files a/crypto_monitor_okx/start_utf8.ps1 and /dev/null differ diff --git a/manual_trading_hub/scripts/example-systemd/manual-agent-binance.service.example b/manual_trading_hub/scripts/example-systemd/manual-agent-binance.service.example deleted file mode 100644 index 366174f..0000000 --- a/manual_trading_hub/scripts/example-systemd/manual-agent-binance.service.example +++ /dev/null @@ -1,20 +0,0 @@ -[Unit] -Description=手工交易子代理 Binance(复制为 manual-agent-binance.service 并修改路径) -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 -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 diff --git a/manual_trading_hub/scripts/example-systemd/manual-hub.service.example b/manual_trading_hub/scripts/example-systemd/manual-hub.service.example deleted file mode 100644 index 702f82f..0000000 --- a/manual_trading_hub/scripts/example-systemd/manual-hub.service.example +++ /dev/null @@ -1,18 +0,0 @@ -[Unit] -Description=手工交易中控 hub(复制到 /etc/systemd/system/manual-hub.service 并修改路径) -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 diff --git a/manual_trading_hub/scripts/start_agents_3screen.sh b/manual_trading_hub/scripts/start_agents_3screen.sh deleted file mode 100644 index dbdd5eb..0000000 --- a/manual_trading_hub/scripts/start_agents_3screen.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env bash -# 一键用 screen 后台启动 3 个子代理(不含 OKX):Binance:15200、Gate:15202、Gate-Bot:15203 -# 用法:在任意目录执行 bash /path/to/manual_trading_hub/scripts/start_agents_3screen.sh -# 若 hub 单独在 /opt/manual_trading_hub,四个策略目录在别的路径,请先: -# export MANUAL_TRADING_REPO_ROOT=/path/to/含_crypto_monitor_*_的目录 -# 依赖:各策略目录已 cp .env.example .env 并配置;manual_trading_hub/.venv 已 pip install -r requirements.txt -# 日志:manual_trading_hub/logs/<会话名>.log(若 screen 里进程秒退,tail 该文件排查) -# 查看:screen -ls 接入:screen -r mt-agent-bn 停:./stop_agents_3screen.sh - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -HUB_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" -if [[ -n "${MANUAL_TRADING_REPO_ROOT:-}" ]]; then - REPO_ROOT="$(cd "${MANUAL_TRADING_REPO_ROOT}" && pwd)" -else - REPO_ROOT="$(cd "${HUB_DIR}/.." && pwd)" -fi -AGENT_PY="${HUB_DIR}/agent.py" -VENV_PY="${HUB_DIR}/.venv/bin/python" -LOG_DIR="${HUB_DIR}/logs" -mkdir -p "${LOG_DIR}" - -echo "REPO_ROOT=${REPO_ROOT} (其下应有 crypto_monitor_binance、crypto_monitor_gate 等目录)" - -if ! command -v screen >/dev/null 2>&1; then - echo "未找到 screen,请先安装:sudo apt install screen" >&2 - exit 1 -fi - -if [[ ! -f "${VENV_PY}" ]]; then - echo "未找到 ${VENV_PY},请先在 manual_trading_hub 下创建 venv 并 pip install -r requirements.txt" >&2 - exit 1 -fi - -if [[ ! -f "${AGENT_PY}" ]]; then - echo "未找到 agent.py:${AGENT_PY}" >&2 - exit 1 -fi - -start_one() { - local name="$1" subdir="$2" exchange="$3" port="$4" - local work="${REPO_ROOT}/${subdir}" - local logf="${LOG_DIR}/${name}.log" - if [[ ! -d "${work}" ]]; then - echo "目录不存在,跳过:${work}" >&2 - echo " 若项目在别处,请设置 export MANUAL_TRADING_REPO_ROOT=/正确上级目录 后重跑" >&2 - return 1 - fi - if screen -ls 2>/dev/null | grep -qF ".${name}"; then - echo "已存在会话 ${name},跳过。要重建请先: screen -S ${name} -X quit" >&2 - return 0 - fi - screen -dmS "${name}" bash -c " -cd '${work}' || { echo 'cd failed' >>'${logf}'; exit 1; } -# shellcheck source=lib_load_dotenv.sh -source '${HUB_DIR}/scripts/lib_load_dotenv.sh' -if [[ -f .env ]]; then - load_dotenv_file .env >>'${logf}' 2>&1 || echo 'load .env failed' >>'${logf}' -fi -export EXCHANGE='${exchange}' PORT='${port}' HOST=127.0.0.1 -exec '${VENV_PY}' '${AGENT_PY}' >>'${logf}' 2>&1 -" - sleep 0.5 - if screen -ls 2>/dev/null | grep -qF ".${name}"; then - echo "已启动 screen:${name} (${subdir} EXCHANGE=${exchange} PORT=${port}) 日志:${logf}" - else - echo "错误:${name} 启动后立刻退出。请执行: tail -80 '${logf}'" >&2 - fi -} - -start_one "mt-agent-bn" "crypto_monitor_binance" "binance" "15200" -start_one "mt-agent-gate" "crypto_monitor_gate" "gate" "15202" -start_one "mt-agent-gatebot" "crypto_monitor_gate_bot" "gate" "15203" - -echo "" -echo "下一步(一键中控 screen):" -echo " chmod +x ${SCRIPT_DIR}/start_hub_screen.sh && ${SCRIPT_DIR}/start_hub_screen.sh" -echo "或手动:cd ${HUB_DIR} && source .venv/bin/activate && export HUB_AGENTS=... && python hub.py" -echo "" -echo "查看会话: screen -ls" diff --git a/manual_trading_hub/scripts/start_hub_screen.sh b/manual_trading_hub/scripts/start_hub_screen.sh deleted file mode 100644 index 010f8f2..0000000 --- a/manual_trading_hub/scripts/start_hub_screen.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env bash -# 一键用 screen 后台启动中控 hub.py(默认对接 3 个 agent:不含 OKX) -# 用法:先启动 3 个 agent(start_agents_3screen.sh),再执行本脚本 -# bash /path/to/manual_trading_hub/scripts/start_hub_screen.sh -# 可在运行前 export 覆盖:HUB_AGENTS、HUB_AGENT_NAMES、HUB_HOST、HUB_PORT、CONTROL_TOKEN、HUB_TRUST_LAN -# 默认 HUB_HOST=0.0.0.0、HUB_TRUST_LAN=1(局域网可访问私网 IP)。仅本机: export HUB_HOST=127.0.0.1 HUB_TRUST_LAN=0 -# 查看:screen -ls 接入:screen -r mt-hub 停:./stop_hub_screen.sh - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -HUB_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" -VENV_PY="${HUB_DIR}/.venv/bin/python" -HUB_PY="${HUB_DIR}/hub.py" - -HUB_AGENTS="${HUB_AGENTS:-http://127.0.0.1:15200,http://127.0.0.1:15202,http://127.0.0.1:15203}" -# 不设 HUB_AGENT_NAMES 时不在此写死,由 hub.py 里 _DEFAULT_FOLDER_LABELS 生效;要覆盖可: export HUB_AGENT_NAMES="名1,名2,名3" 或写在 manual_trading_hub/.env -HUB_AGENT_NAMES="${HUB_AGENT_NAMES:-}" -HUB_HOST="${HUB_HOST:-0.0.0.0}" -HUB_PORT="${HUB_PORT:-5100}" -HUB_TRUST_LAN="${HUB_TRUST_LAN:-1}" - -if ! command -v screen >/dev/null 2>&1; then - echo "未找到 screen,请先安装:sudo apt install screen" >&2 - exit 1 -fi - -if [[ ! -f "${VENV_PY}" ]]; then - echo "未找到 ${VENV_PY},请先在 manual_trading_hub 下创建 venv 并 pip install -r requirements.txt" >&2 - exit 1 -fi - -if [[ ! -f "${HUB_PY}" ]]; then - echo "未找到 hub.py:${HUB_PY}" >&2 - exit 1 -fi - -if screen -ls 2>/dev/null | grep -qF ".mt-hub"; then - echo "已存在会话 mt-hub,跳过。要重建请先: screen -S mt-hub -X quit" >&2 - exit 0 -fi - -# 仅当外层显式设置了 HUB_AGENT_NAMES 时才 export,避免 export 空串覆盖 .env 里已有配置 -EXTRA_NAMES="" -if [[ -n "${HUB_AGENT_NAMES:-}" ]]; then - EXTRA_NAMES="export HUB_AGENT_NAMES=$(printf '%q' "${HUB_AGENT_NAMES}")" -fi - -screen -dmS mt-hub bash -c " -set -e -cd '${HUB_DIR}' -# shellcheck source=lib_load_dotenv.sh -source '${HUB_DIR}/scripts/lib_load_dotenv.sh' -if [[ -f .env ]]; then - load_dotenv_file .env -fi -export HUB_AGENTS='${HUB_AGENTS}' -${EXTRA_NAMES} -export HUB_HOST='${HUB_HOST}' -export HUB_PORT='${HUB_PORT}' -export HUB_TRUST_LAN='${HUB_TRUST_LAN}' -exec '${VENV_PY}' '${HUB_PY}' -" - -echo "已启动 screen:mt-hub" -echo " HUB_AGENTS=${HUB_AGENTS}" -if [[ -n "${HUB_AGENT_NAMES}" ]]; then - echo " HUB_AGENT_NAMES=${HUB_AGENT_NAMES}" -else - echo " HUB_AGENT_NAMES=(未设,使用 hub.py 内 _DEFAULT_FOLDER_LABELS)" -fi -echo " 监听:${HUB_HOST}:${HUB_PORT} HUB_TRUST_LAN=${HUB_TRUST_LAN}(默认允许私网访问中控)" -echo " 本机:http://127.0.0.1:${HUB_PORT}/ 局域网:http://<本机局域网IP>:${HUB_PORT}/" -echo " 仅本机请: export HUB_HOST=127.0.0.1 HUB_TRUST_LAN=0 后重启本脚本" -echo "接入: screen -r mt-hub" diff --git a/manual_trading_hub/scripts/stop_agents_3screen.sh b/manual_trading_hub/scripts/stop_agents_3screen.sh deleted file mode 100644 index 81d89f5..0000000 --- a/manual_trading_hub/scripts/stop_agents_3screen.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -# 关闭 start_agents_3screen.sh 启动的 3 个 screen 会话 -set -euo pipefail -for s in mt-agent-bn mt-agent-gate mt-agent-gatebot; do - if screen -ls 2>/dev/null | grep -qF ".${s}"; then - screen -S "${s}" -X quit && echo "已关闭:${s}" || true - else - echo "未运行:${s}" - fi -done diff --git a/manual_trading_hub/scripts/stop_hub_screen.sh b/manual_trading_hub/scripts/stop_hub_screen.sh deleted file mode 100644 index 49f25c5..0000000 --- a/manual_trading_hub/scripts/stop_hub_screen.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -# 关闭 start_hub_screen.sh 启动的中控 screen 会话 -set -euo pipefail -if screen -ls 2>/dev/null | grep -qF ".mt-hub"; then - screen -S mt-hub -X quit && echo "已关闭:mt-hub" || true -else - echo "未运行:mt-hub" -fi diff --git a/manual_trading_hub/scripts/后台运行-Ubuntu.md b/manual_trading_hub/scripts/后台运行-Ubuntu.md index 5d5d0ad..368c73e 100644 --- a/manual_trading_hub/scripts/后台运行-Ubuntu.md +++ b/manual_trading_hub/scripts/后台运行-Ubuntu.md @@ -2,7 +2,7 @@ **唯一推荐方式:PM2。** -请勿使用 screen、nohup、systemd 与 PM2 **同时** 启动同一端口上的 `hub.py` / `agent.py`。 +请仅使用 PM2 托管 `hub.py` 与 `agent.py`,勿与 nohup 等方式重复启动同一端口。 --- @@ -40,5 +40,3 @@ bash scripts/verify_hub_deploy.sh |------|------| | [../部署文档.md](../部署文档.md) | 端口、反代、故障排查 | | [../../docs/ubuntu-server.md](../../docs/ubuntu-server.md) | Python / Node / PM2 版本与四所启动顺序 | - -历史 screen/systemd 示例已废弃,仅保留 PM2 运维。