8.7 KiB
crypto_monitor_gate 部署指南:SSH SOCKS + Gate.io + PM2(Ubuntu)
本文面向:在本机运行本项目,但 直连 Gate.io API 不稳定或被重置 的场景。思路是:
- 本机用
ssh -D做动态转发,把 SOCKS5 出口放到能正常访问 Gate 的机器(常见为一台境外 VPS) - 项目在
.env中设置GATE_SOCKS_PROXY=socks5h://127.0.0.1:1080(或你实际端口),ccxt经 SOCKS 访问交易所 - SSH 隧道:用
ssh -D在本机常驻即可(screen / tmux / systemd 等),不必交给 PM2 - 使用 PM2 仅托管 Flask 应用;仓库根目录
ecosystem.config.cjs只定义crypto-monitor-gate
安全提醒:不要把
.env、私钥.pem、Gate API Key 提交到 Git;下文只用占位符。
0. 你需要准备的东西
- 一台 Ubuntu(或同类 Linux)运行项目的机器(下文称「本机」)
- 一台可 SSH 登录、且 能正常访问 Gate.io API 的 VPS(示例:
HostName填你的服务器 IP,用户如root) - SSH:私钥登录(推荐,便于隧道脚本无人值守)
- 本机已安装:
python3、python3-venv、pip、curl、ssh、git(可选)、node+npm(安装 PM2)
1. 获取代码与目录
将包含 app.py 的项目放到固定目录,例如:
mkdir -p /opt/crypto_monitor
cd /opt/crypto_monitor
# git clone ... 或解压同步的包
cd crypto_monitor_gate_bot
下文用 /opt/crypto_monitor/crypto_monitor_gate_bot 仅为示例,请换成你的实际绝对路径。
2. 配置 SSH 私钥与 ~/.ssh/config
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 私钥示例:~/.ssh/vps1.pem
chmod 600 ~/.ssh/vps1.pem
编辑 ~/.ssh/config(示例别名 gate-vps,与你手工启动 ssh -D ... gate-vps 一致即可):
Host gate-vps
HostName 你的_VPS_IP
User root
IdentityFile ~/.ssh/vps1.pem
IdentitiesOnly yes
ServerAliveInterval 30
ServerAliveCountMax 3
ExitOnForwardFailure yes
BatchMode yes
测试:
ssh gate-vps true
若尚未完全改为密钥登录,可暂时注释
BatchMode yes,调试完成后再打开。
3. 手工验证:SSH SOCKS + Gate API
3.1 本地 SOCKS(示例端口 1080)
ssh -N -D 127.0.0.1:1080 gate-vps
保持运行,另开终端继续。
3.2 验证经 SOCKS 可访问 Gate
curl -4 -sS --max-time 15 --proxy socks5h://127.0.0.1:1080 https://api.gateio.ws/api/v4/spot/time
应返回 JSON(含服务器时间字段)。若此处失败,不要先启动应用:先修隧道或 VPS 出站。
4. Python 虚拟环境
cd /opt/crypto_monitor/crypto_monitor_gate_bot
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install flask requests ccxt werkzeug PySocks Pillow
走 SOCKS 时 必须 安装 PySocks,否则易出现代理相关报错。
可选:
export PYTHONDONTWRITEBYTECODE=1
5. 配置 .env(关键:Gate + 代理)
项目通过 app.py 启动时 自动加载项目根目录的 .env。与交易所相关的变量必须是 Gate 前缀(不要再写 OKX 变量,否则代理不会生效、密钥也不会被识别)。
至少确认:
APP_HOST=127.0.0.1
APP_PORT=5000
# 实盘(按需)
LIVE_TRADING_ENABLED=false
GATE_API_KEY=你的_Key
GATE_API_SECRET=你的_Secret
# 经本机 SSH 动态转发访问 Gate(端口与隧道一致)
GATE_SOCKS_PROXY=socks5h://127.0.0.1:1080
# 若不用 SOCKS,可改用 HTTP 代理(一般二选一)
# GATE_HTTP_PROXY=http://127.0.0.1:7890
# GATE_HTTPS_PROXY=http://127.0.0.1:7890
说明:推荐 socks5h://,由 SOCKS 端解析域名,与 curl --proxy socks5h://... 行为一致。
5.1 趋势回调策略(可选)
若使用「交易执行」页的 趋势回调 计划:
- 详细规则见项目根目录
趋势回调策略说明.md。 - 两阶段:先「生成预览」(默认 120 秒内有效),再「确认执行」;执行时若可用余额与预览快照偏差超过 5% 会拒绝(可调
.env)。 - 补仓档位数默认 5,预览有效期与余额偏差阈值可在
.env覆盖:
TREND_PULLBACK_DCA_LEGS=5
TREND_PULLBACK_PREVIEW_TTL_SECONDS=120
TREND_PREVIEW_MAX_BALANCE_DRIFT_PCT=5
- 生成预览与确认执行时都会读取 Gate 永续账户 USDT 可用余额;请尽量使用 单独子账户 承载策略资金。
界面与对账(与策略说明 3.4–3.5 节一致)
- 页顶 计划历史:仅 已结束 的趋势计划(不含未执行预览);可 删除 计划行,并删除
trend_plan_id关联的「趋势回调」trade_records(新数据;旧行无trend_plan_id不级联)。 - 运行中计划展示交易所 未实现盈亏(浮盈亏)。
- 交易记录:趋势单在配置 API Key 后,打开「交易执行 / 交易记录」页会按节流(约 25 秒内同进程最多一次)拉取 Gate 平仓历史,回填
exchange_realized_pnl等;列表展示优先用交易所口径(见策略说明)。
与交易所对齐的可选环境变量
# 平仓历史同步起点:北京日期 YYYY-MM-DD 的 0 点(与 APP_TIMEZONE 一致);留空则从近 90 天拉取
# EXCHANGE_POSITION_SYNC_FROM_BJ=2026-05-14
# EXCHANGE_POSITION_HISTORY_LIMIT=200
说明:同步 只读 交易所接口,不要求 LIVE_TRADING_ENABLED=true;无 Key 时不拉取,界面仍可用(浮盈亏可能为「—」、交易记录仍为本地「估」)。
交易记录 CSV:导出为 v3,含 trend_plan_id 与交易所对齐列(详见策略说明数据库一节)。
6. 手工启动 Flask(验证)
- SOCKS 已监听
127.0.0.1:1080 - 已
source .venv/bin/activate .env已含GATE_SOCKS_PROXY
cd /opt/crypto_monitor/crypto_monitor_gate_bot
source .venv/bin/activate
python app.py
浏览器访问:http://127.0.0.1:5000(或你在 .env 中的端口)。
7. 安装 PM2
sudo npm i -g pm2
pm2 -v
8. PM2:使用仓库内 ecosystem.config.cjs(推荐)
在项目根目录:
cd /opt/crypto_monitor/crypto_monitor_gate_bot
pm2 start ecosystem.config.cjs
pm2 status
pm2 logs --lines 200
默认只启动 crypto-monitor-gate(.venv/bin/python app.py)。
本机已可直连 Gate、不需要隧道时
.env 里应 去掉或留空 GATE_SOCKS_PROXY(除非仍要走别的代理),再 pm2 start ecosystem.config.cjs。
开机自启
pm2 save
pm2 startup
# 按屏幕提示执行一条 sudo 命令
9. 等价手工命令(不使用 ecosystem 文件时)
9.1 SSH SOCKS(自行后台常驻,不推荐用 PM2)
示例(前台;实际可用 screen/tmux/-f 后台化或 systemd):
ssh -N -D 127.0.0.1:1080 gate-vps \
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-o ExitOnForwardFailure=yes
9.2 Flask
cd /opt/crypto_monitor/crypto_monitor_gate_bot
pm2 start /opt/crypto_monitor/crypto_monitor_gate_bot/.venv/bin/python --name crypto-monitor-gate -- \
/opt/crypto_monitor/crypto_monitor_gate_bot/app.py
10. 交易所「连接不上」排查清单
.env是否为 Gate 变量:必须是GATE_SOCKS_PROXY/GATE_API_KEY/GATE_API_SECRET,不是 OKX。- 隧道是否在本机端口监听(若配置了
GATE_SOCKS_PROXY):ss -lntp | grep 1080 || true - curl 复测 Gate(与第 3.2 节相同);curl 不通则应用也不会通。
- PySocks:
pip show PySocks,缺失则pip install PySocks。 - SSH 隧道连不上:检查私钥权限、
~/.ssh/config、VPS 出站与端口是否与.env一致。 - 启动顺序:先保证 SOCKS 已监听,再
pm2 start应用(或重启应用)。
11. 推荐启动顺序(习惯)
- 若走代理:先启动并确认 SSH SOCKS 已监听,再
curl --proxy socks5h://127.0.0.1:1080 https://api.gateio.ws/api/v4/spot/time成功 pm2 start ecosystem.config.cjs- 再确认页面与余额等接口正常
12. 免责声明
交易所有合规与地区政策要求。请确保使用方式符合当地法律法规与交易所条款。本文仅描述网络与工程部署路径。
附录:数据库标签修复脚本 scripts/fix_breakeven_labels.py
在 Ubuntu 上:
1)预览(不写库):
python scripts/fix_breakeven_labels.py --db ./crypto.db --dry-run
2)确认后执行:
python scripts/fix_breakeven_labels.py --db ./crypto.db --apply
默认修复条件:monitor_type='下单监控' 且 result='止损' 且 pnl_amount > 0 → 改为 result='保本止盈'。