304 lines
8.9 KiB
Markdown
304 lines
8.9 KiB
Markdown
# `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` 的项目放到固定目录,例如:
|
||
|
||
```bash
|
||
mkdir -p /opt/crypto_monitor
|
||
cd /opt/crypto_monitor
|
||
git clone https://git.bz121.com/dekun/crypto_monitor.git
|
||
cd crypto_monitor/crypto_monitor_gate
|
||
```
|
||
|
||
下文用 **`/opt/crypto_monitor/crypto_monitor_gate`** 仅为示例,请换成你的实际绝对路径。
|
||
|
||
拉取代码后,若目录下尚无 `.env`:
|
||
|
||
```bash
|
||
cp -n .env.example .env
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 配置 SSH 私钥与 `~/.ssh/config`
|
||
|
||
```bash
|
||
mkdir -p ~/.ssh
|
||
chmod 700 ~/.ssh
|
||
# 私钥示例:~/.ssh/vps1.pem
|
||
chmod 600 ~/.ssh/vps1.pem
|
||
```
|
||
|
||
编辑 `~/.ssh/config`(示例别名 **`gate-vps`**,与你手工启动 `ssh -D ... gate-vps` 一致即可):
|
||
|
||
```sshconfig
|
||
Host gate-vps
|
||
HostName 你的_VPS_IP
|
||
User root
|
||
IdentityFile ~/.ssh/vps1.pem
|
||
IdentitiesOnly yes
|
||
ServerAliveInterval 30
|
||
ServerAliveCountMax 3
|
||
ExitOnForwardFailure yes
|
||
BatchMode yes
|
||
```
|
||
|
||
测试:
|
||
|
||
```bash
|
||
ssh gate-vps true
|
||
```
|
||
|
||
> 若尚未完全改为密钥登录,可暂时注释 `BatchMode yes`,调试完成后再打开。
|
||
|
||
---
|
||
|
||
## 3. 手工验证:SSH SOCKS + Gate API
|
||
|
||
### 3.1 本地 SOCKS(示例端口 1080)
|
||
|
||
```bash
|
||
ssh -N -D 127.0.0.1:1080 gate-vps
|
||
```
|
||
|
||
保持运行,另开终端继续。
|
||
|
||
### 3.2 验证经 SOCKS 可访问 Gate
|
||
|
||
```bash
|
||
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 虚拟环境
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_gate
|
||
|
||
python3 -m venv .venv
|
||
source .venv/bin/activate
|
||
python -m pip install -U pip
|
||
pip install flask requests ccxt werkzeug PySocks Pillow
|
||
```
|
||
|
||
走 SOCKS 时 **必须** 安装 **`PySocks`**,否则易出现代理相关报错。
|
||
|
||
可选:
|
||
|
||
```bash
|
||
export PYTHONDONTWRITEBYTECODE=1
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 配置环境变量(`.env.example` → `.env`)
|
||
|
||
| 文件 | 是否进 Git | 说明 |
|
||
|------|------------|------|
|
||
| **`.env.example`** | ✅ 是 | 变量模板与注释,可随 `git pull` 更新 |
|
||
| **`.env`** | ❌ 否 | 本机真实配置;`app.py` **只读此文件** |
|
||
|
||
### 5.1 首次配置
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_gate
|
||
|
||
cp -n .env.example .env
|
||
nano .env
|
||
```
|
||
|
||
### 5.2 备份与 `git pull`
|
||
|
||
- **`.env` 不在 Git 中**:`git pull` **不会**覆盖本地 `.env`。
|
||
- 远端若更新 **`.env.example`**,pull 后请**手动**把新增变量补进你的 `.env`。
|
||
- **升级前备份**:`cp .env .env.backup.$(date +%Y%m%d)`;恢复:`cp .env.backup.YYYYMMDD .env`。
|
||
- **换机**:`scp` 复制 `.env`,或新机 `cp .env.example .env` 后重填。
|
||
|
||
### 5.3 AI 复盘与模型(可选)
|
||
|
||
共用根目录 **`ai_client.py`**(`PYTHONPATH=..`)。`.env` 中 **`AI_PROVIDER=openai`**(默认)时使用 `OPENAI_API_BASE=https://op.bz121.com/v1`、`OPENAI_API_KEY`、`OPENAI_MODEL=gemma4:e4b`;改 **`ollama`** 则用 `OLLAMA_API` + `AI_MODEL`。详见 **[AI复盘与模型配置说明.md](../AI复盘与模型配置说明.md)**。
|
||
|
||
### 5.4 自动备份(数据库 + 复盘图片)
|
||
|
||
与 Binance 实例相同:每天 **北京时间 0:00** → **`/root/backups`**,保留 **30 天**。
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_gate
|
||
chmod +x scripts/backup_data.sh scripts/install_backup_cron.sh
|
||
bash scripts/install_backup_cron.sh
|
||
bash scripts/backup_data.sh # 试跑
|
||
```
|
||
|
||
备份目录:`/root/backups/crypto_monitor_gate/YYYY-MM-DD/`。详见 Binance 项目 `部署文档.md` 第 5.4 节(恢复步骤、可选 `.env` 变量相同)。
|
||
|
||
若还部署了 **`crypto_monitor_gate_bot`**,请在该目录同样执行 `bash scripts/install_backup_cron.sh`。
|
||
|
||
### 5.5 必填项检查(Gate + 代理)
|
||
|
||
与交易所相关的变量必须是 **Gate** 前缀(**不要**再写 OKX 变量,否则代理不会生效、密钥也不会被识别)。至少确认:
|
||
|
||
```env
|
||
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://...` 行为一致。
|
||
|
||
---
|
||
|
||
## 6. 手工启动 Flask(验证)
|
||
|
||
1. SOCKS 已监听 `127.0.0.1:1080`
|
||
2. 已 `source .venv/bin/activate`
|
||
3. `.env` 已含 `GATE_SOCKS_PROXY`
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_gate
|
||
source .venv/bin/activate
|
||
python app.py
|
||
```
|
||
|
||
浏览器访问:`http://127.0.0.1:5000`(或你在 `.env` 中的端口)。
|
||
|
||
---
|
||
|
||
## 7. 安装 PM2
|
||
|
||
```bash
|
||
sudo npm i -g pm2
|
||
pm2 -v
|
||
```
|
||
|
||
---
|
||
|
||
## 8. PM2:使用仓库内 `ecosystem.config.cjs`(推荐)
|
||
|
||
在项目根目录:
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_gate
|
||
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`。
|
||
|
||
### 开机自启
|
||
|
||
```bash
|
||
pm2 save
|
||
pm2 startup
|
||
# 按屏幕提示执行一条 sudo 命令
|
||
```
|
||
|
||
---
|
||
|
||
## 9. 等价手工命令(不使用 ecosystem 文件时)
|
||
|
||
### 9.1 SSH SOCKS(自行后台常驻,不推荐用 PM2)
|
||
|
||
示例(前台;实际可用 `screen`/`tmux`/`-f` 后台化或 systemd):
|
||
|
||
```bash
|
||
ssh -N -D 127.0.0.1:1080 gate-vps \
|
||
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
|
||
-o ExitOnForwardFailure=yes
|
||
```
|
||
|
||
### 9.2 Flask
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_gate
|
||
pm2 start /opt/crypto_monitor/crypto_monitor_gate/.venv/bin/python --name crypto-monitor-gate -- \
|
||
/opt/crypto_monitor/crypto_monitor_gate/app.py
|
||
```
|
||
|
||
---
|
||
|
||
## 10. 交易所「连接不上」排查清单
|
||
|
||
1. **`.env` 是否为 Gate 变量**:必须是 `GATE_SOCKS_PROXY` / `GATE_API_KEY` / `GATE_API_SECRET`,不是 OKX。
|
||
2. **隧道是否在本机端口监听**(若配置了 `GATE_SOCKS_PROXY`):
|
||
```bash
|
||
ss -lntp | grep 1080 || true
|
||
```
|
||
3. **curl 复测 Gate**(与第 3.2 节相同);curl 不通则应用也不会通。
|
||
4. **PySocks**:`pip show PySocks`,缺失则 `pip install PySocks`。
|
||
5. **SSH 隧道连不上**:检查私钥权限、`~/.ssh/config`、VPS 出站与端口是否与 `.env` 一致。
|
||
6. **启动顺序**:先保证 SOCKS 已监听,再 `pm2 start` 应用(或重启应用)。
|
||
|
||
---
|
||
|
||
## 11. 推荐启动顺序(习惯)
|
||
|
||
1. 若走代理:先启动并确认 SSH SOCKS 已监听,再 `curl --proxy socks5h://127.0.0.1:1080 https://api.gateio.ws/api/v4/spot/time` 成功
|
||
2. `pm2 start ecosystem.config.cjs`
|
||
3. 再确认页面与余额等接口正常
|
||
|
||
---
|
||
|
||
## 12. 免责声明
|
||
|
||
交易所有合规与地区政策要求。请确保使用方式符合当地法律法规与交易所条款。本文仅描述网络与工程部署路径。
|
||
|
||
---
|
||
|
||
## 附录:数据库标签修复脚本 `scripts/fix_breakeven_labels.py`
|
||
|
||
在 Ubuntu 上:
|
||
|
||
1)预览(不写库):
|
||
|
||
```bash
|
||
python scripts/fix_breakeven_labels.py --db ./crypto.db --dry-run
|
||
```
|
||
|
||
2)确认后执行:
|
||
|
||
```bash
|
||
python scripts/fix_breakeven_labels.py --db ./crypto.db --apply
|
||
```
|
||
|
||
默认修复条件:`monitor_type='下单监控'` 且 `result='止损'` 且 `pnl_amount > 0` → 改为 `result='保本止盈'`。
|