349 lines
8.0 KiB
Markdown
349 lines
8.0 KiB
Markdown
# `crypto_monitor` 本地部署 + SSH SOCKS 转发 + PM2 启动指南(Ubuntu)
|
||
|
||
本文面向:**本地 Ubuntu 机器运行项目**,但 **本机直连 OKX 会被 TLS/SNI reset** 的场景。解决思路是:
|
||
|
||
- 本机启动 `ssh -D` 动态转发,把 **SOCKS5 出口**放到你可正常访问 OKX 的 VPS 上
|
||
- 项目通过环境变量 `OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080` 让 `ccxt` 走 SOCKS
|
||
- 用 `pm2` 托管 **SSH 隧道** 与 **Flask 应用**(你也可以只用 `screen`,但本文按你要求用 PM2)
|
||
|
||
> 安全提醒:不要把 `.env`、私钥 `.pem`、OKX API Key 提交到 Git;文档里只用占位符。
|
||
|
||
---
|
||
|
||
## 0. 你需要准备的东西
|
||
|
||
- 一台 **Ubuntu** 本地机器(下文称“本机”)
|
||
- 一台可 SSH 登录、且 **能正常访问 OKX** 的 VPS(示例公网 IP:`47.76.87.111`,用户:`root`)
|
||
- VPS 登录方式:**SSH 私钥**(推荐)或密码(不推荐用于无人值守)
|
||
- 本机已安装:
|
||
- `python3`、`python3-venv`、`pip`(或 `python3-pip`)
|
||
- `git`(可选)
|
||
- `curl`、`ssh`
|
||
- `node` + `npm`(用于安装 `pm2`)
|
||
|
||
---
|
||
|
||
## 1. 从云服务器把项目同步到本地(推荐:打包下载)
|
||
|
||
在云服务器项目目录(包含 `app.py` 的目录)执行:
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||
|
||
# 可选:清理 Python 缓存,减少小文件传输
|
||
find . -type d -name __pycache__ -prune -exec rm -rf {} +
|
||
find . -type f -name "*.pyc" -delete
|
||
|
||
tar -czf crypto_monitor.tgz .
|
||
```
|
||
|
||
下载 `crypto_monitor.tgz` 到本机后解压:
|
||
|
||
```bash
|
||
mkdir -p /opt/crypto_monitor/crypto_monitor_okx
|
||
cd /opt/crypto_monitor
|
||
tar -xzf crypto_monitor.tgz -C crypto_monitor_okx
|
||
cd crypto_monitor_okx
|
||
cp -n .env.example .env # 若尚无 .env
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 配置 SSH 私钥与 `~/.ssh/config`(推荐)
|
||
|
||
把私钥放到本机(示例:`~/.ssh/vps1.pem`),并设置权限:
|
||
|
||
```bash
|
||
mkdir -p ~/.ssh
|
||
chmod 700 ~/.ssh
|
||
mv ~/Downloads/vps1.pem ~/.ssh/vps1.pem
|
||
chmod 600 ~/.ssh/vps1.pem
|
||
```
|
||
|
||
编辑 `~/.ssh/config`(没有就创建),添加:
|
||
|
||
```sshconfig
|
||
Host okx-vps
|
||
HostName 47.76.87.111
|
||
User root
|
||
IdentityFile ~/.ssh/vps1.pem
|
||
IdentitiesOnly yes
|
||
ServerAliveInterval 30
|
||
ServerAliveCountMax 3
|
||
ExitOnForwardFailure yes
|
||
BatchMode yes
|
||
```
|
||
|
||
测试:
|
||
|
||
```bash
|
||
ssh okx-vps true
|
||
```
|
||
|
||
> 如果你还没完全切到密钥登录(还会交互要密码),先把 `BatchMode yes` 注释掉,等密钥登录稳定后再打开。
|
||
|
||
---
|
||
|
||
## 3. 先手工验证:SSH SOCKS + OKX API
|
||
|
||
### 3.1 开一个本地 SOCKS(1080)
|
||
|
||
```bash
|
||
ssh -N -D 127.0.0.1:1080 okx-vps
|
||
```
|
||
|
||
保持该进程运行(另开终端继续下面步骤)。
|
||
|
||
### 3.2 验证 OKX 走 SOCKS 可用
|
||
|
||
```bash
|
||
curl -4 -Iv --max-time 15 --proxy socks5h://127.0.0.1:1080 https://www.okx.com/api/v5/public/time
|
||
```
|
||
|
||
看到 `HTTP/2 200`(或至少 TLS 握手成功且返回 JSON)即 OK。
|
||
|
||
---
|
||
|
||
## 4. Python 虚拟环境(venv)
|
||
|
||
在本机项目目录:
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||
|
||
python3 -m venv .venv
|
||
source .venv/bin/activate
|
||
|
||
python -m pip install -U pip
|
||
pip install flask requests ccxt werkzeug PySocks Pillow
|
||
```
|
||
|
||
> 说明:本仓库当前没有 `requirements.txt`。如果你希望“完全复刻云服务器依赖”,可以在云服务器项目环境里执行 `pip freeze > requirements.txt` 带回本机再 `pip install -r requirements.txt`(记得删掉明显无关/体积巨大的包)。
|
||
|
||
建议减少 `.pyc` 垃圾文件(可选):
|
||
|
||
```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_okx
|
||
|
||
cp -n .env.example .env # 已存在 .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 必填项检查(OKX + 代理)
|
||
|
||
至少确认/填写这些关键项(示例):
|
||
|
||
```env
|
||
APP_HOST=127.0.0.1
|
||
APP_PORT=5000
|
||
|
||
# OKX(如需实盘)
|
||
LIVE_TRADING_ENABLED=false
|
||
OKX_API_KEY=...
|
||
OKX_API_SECRET=...
|
||
OKX_API_PASSPHRASE=...
|
||
|
||
# OKX 出口:走本机 SSH 动态转发 SOCKS
|
||
OKX_SOCKS_PROXY=socks5h://127.0.0.1:1080
|
||
|
||
# 开仓多周期K线图(可选)
|
||
# ORDER_CHART_ENABLED=true
|
||
# ORDER_CHART_TFS=4h,1h,15m,5m
|
||
# ORDER_CHART_LIMIT=100
|
||
# ORDER_CHART_DIR=static/images/order_charts
|
||
# DAILY_OPEN_ALERT_THRESHOLD=5
|
||
|
||
# Ollama(如本机跑)
|
||
OLLAMA_API=http://127.0.0.1:11434/api/generate
|
||
AI_MODEL=你的模型名
|
||
```
|
||
|
||
> `OKX_SOCKS_PROXY` 使用 `socks5h`:让 SOCKS 侧做域名解析(更贴近你 `curl --proxy socks5h://...` 的成功路径)。
|
||
|
||
---
|
||
|
||
## 6. 本机手工启动(验证 Flask)
|
||
|
||
确保:
|
||
|
||
1. SOCKS 隧道已运行(127.0.0.1:1080)
|
||
2. 虚拟环境已 `activate`
|
||
3. `.env` 已配置
|
||
|
||
启动:
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||
source .venv/bin/activate
|
||
python app.py
|
||
```
|
||
|
||
浏览器访问:`http://127.0.0.1:5000`(或你在 `.env` 配的端口)。
|
||
|
||
---
|
||
|
||
## 7. 安装 PM2(Node)
|
||
|
||
```bash
|
||
sudo npm i -g pm2
|
||
pm2 -v
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 用 PM2 启动 SSH SOCKS 隧道(推荐:密钥免交互)
|
||
|
||
### 8.1 启动隧道进程
|
||
|
||
```bash
|
||
pm2 start "ssh" --name okx-socks-tunnel -- \
|
||
-N -D 127.0.0.1:1080 okx-vps \
|
||
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
|
||
-o ExitOnForwardFailure=yes -o BatchMode=yes
|
||
```
|
||
|
||
查看日志:
|
||
|
||
```bash
|
||
pm2 logs okx-socks-tunnel --lines 200
|
||
```
|
||
|
||
### 8.2 仍然验证 OKX
|
||
|
||
```bash
|
||
curl -4 -Iv --max-time 15 --proxy socks5h://127.0.0.1:1080 https://www.okx.com/api/v5/public/time
|
||
```
|
||
|
||
### 8.3 开机自启(可选)
|
||
|
||
```bash
|
||
pm2 save
|
||
pm2 startup
|
||
```
|
||
|
||
---
|
||
|
||
## 9. 用 PM2 启动 Flask(`app.py`)
|
||
|
||
`pm2` 管理 Python 的常用方式是直接启动解释器:
|
||
|
||
```bash
|
||
cd /opt/crypto_monitor/crypto_monitor_okx
|
||
|
||
pm2 start /opt/crypto_monitor/crypto_monitor_okx/.venv/bin/python --name crypto-monitor -- \
|
||
/opt/crypto_monitor/crypto_monitor_okx/app.py
|
||
```
|
||
|
||
> 若项目目录与上文不一致,请替换为实际绝对路径;或用 `readlink -f app.py` 得到绝对路径。
|
||
|
||
查看日志:
|
||
|
||
```bash
|
||
pm2 logs crypto-monitor --lines 200
|
||
```
|
||
|
||
保存进程列表:
|
||
|
||
```bash
|
||
pm2 save
|
||
```
|
||
|
||
---
|
||
|
||
## 10. 常见问题排查(高频)
|
||
|
||
### 10.1 OKX 仍然失败:先看隧道是否在
|
||
|
||
```bash
|
||
ss -lntp | grep 1080 || true
|
||
pm2 status
|
||
```
|
||
|
||
### 10.2 `pm2` 里的 `ssh` 立刻退出
|
||
|
||
常见原因:
|
||
|
||
- 私钥权限不对(`chmod 600`)
|
||
- `~/.ssh/config` 写错 `HostName/User/IdentityFile`
|
||
- 开了 `BatchMode yes` 但仍需要密码(会失败)
|
||
|
||
### 10.3 `ccxt` SOCKS 报错 / 代理不生效
|
||
|
||
本机 Python 依赖通常需要:
|
||
|
||
```bash
|
||
source .venv/bin/activate
|
||
pip install PySocks
|
||
```
|
||
|
||
### 10.4 `.pyc` 很多导致同步慢
|
||
|
||
`.pyc` 是缓存,删除不影响功能:
|
||
|
||
```bash
|
||
find . -type d -name __pycache__ -prune -exec rm -rf {} +
|
||
find . -type f -name "*.pyc" -delete
|
||
```
|
||
|
||
---
|
||
|
||
## 11. 推荐的启动顺序(固定习惯)
|
||
|
||
1. `pm2` 启动 `okx-socks-tunnel`
|
||
2. `curl --proxy socks5h://127.0.0.1:1080 ...` 验证 OKX
|
||
3. `pm2` 启动 `crypto-monitor`
|
||
|
||
---
|
||
|
||
## 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='保本止盈'`
|
||
|
||
如果你想,我还可以再给你一条“先自动备份 DB 再执行”的一键命令。 |