arbitrage-engine/docs/ai/05-build-run-test.md
fanziqi 22787b3e0a docs: add AI documentation suite and comprehensive code review report
- Generate full AI-consumable docs (docs/ai/): system overview, architecture,
  module cheatsheet, API contracts, data model, build guide, decision log,
  glossary, and open questions (deep tier coverage)
- Add PROBLEM_REPORT.md: categorized bug/risk summary
- Add DETAILED_CODE_REVIEW.md: full line-by-line review of all 15 backend
  files, documenting 4 fatal issues, 5 critical deployment bugs, 4 security
  vulnerabilities, and 6 architecture defects with prioritized fix plan
2026-03-03 19:01:18 +08:00

252 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
generated_by: repo-insight
version: 1
created: 2026-03-03
last_updated: 2026-03-03
source_commit: 0d9dffa
coverage: deep
---
# 05 — Build, Run & Test
## Purpose
所有构建、运行、测试、部署相关命令及环境变量配置说明。
## TL;DR
- 无 CI/CD 流水线;手动部署到 GCP VMPM2 管理进程。
- 后端无构建步骤,直接 `python3 main.py` 或 PM2 启动。
- 前端标准 Next.js`npm run dev` / `npm run build` / `npm start`
- 测试文件未发现;验证通过 backtest.py 回测和 paper trading 模拟盘进行。
- 本地开发:前端 `/api/*` 通过 Next.js rewrite 代理到 `http://127.0.0.1:4332`(即 uvicorn 端口)。
- 数据库 schema 自动在启动时初始化(`init_schema()`),无独立 migration 工具。
## Canonical Facts
### 环境要求
| 组件 | 要求 |
|------|------|
| Python | 3.10+(使用 `list[dict]` 等 3.10 语法) |
| Node.js | 推荐 20.xpackage.json `@types/node: ^20` |
| PostgreSQL | 本地实例 + Cloud SQL`10.106.0.3` |
| PM2 | 用于进程管理(需全局安装) |
### 后端依赖安装
```bash
cd backend
pip install -r requirements.txt
# requirements.txt 内容fastapi, uvicorn, httpx, python-dotenv, psutil
# 实际还需要(从源码 import 推断):
# asyncpg, psycopg2-binary, aiohttp, websockets
```
> [inference] `requirements.txt` 内容不完整,仅列出 5 个包,但源码 import 了 `asyncpg`、`psycopg2`、`aiohttp` 等。运行前需确认完整依赖已安装。
### 后端启动
#### 单进程开发模式
```bash
cd backend
# FastAPI HTTP API默认端口 4332从 next.config.ts 推断)
uvicorn main:app --host 0.0.0.0 --port 4332 --reload
# 信号引擎(独立进程)
python3 signal_engine.py
# aggTrades 收集器
python3 agg_trades_collector.py
# 市场数据收集器
python3 market_data_collector.py
# 清算数据收集器
python3 liquidation_collector.py
# 实盘执行器
TRADE_ENV=testnet python3 live_executor.py
# 风控模块
TRADE_ENV=testnet python3 risk_guard.py
# 信号推送Discord
python3 signal_pusher.py
```
#### PM2 生产模式
```bash
cd backend
# 使用 ecosystem 配置(目前只定义了 arb-dev-signal
pm2 start ecosystem.dev.config.js
# 查看进程状态
pm2 status
# 查看日志
pm2 logs arb-dev-signal
# 停止所有
pm2 stop all
# 重启
pm2 restart all
```
> [inference] `ecosystem.dev.config.js` 当前只配置了 `signal_engine.py`,其他进程需手动启动或添加到 PM2 配置。
### 环境变量配置
#### 数据库(所有后端进程共用)
```bash
export PG_HOST=127.0.0.1 # 本地 PG
export PG_PORT=5432
export PG_DB=arb_engine
export PG_USER=arb
export PG_PASS=arb_engine_2026 # 测试网默认,生产需覆盖
export CLOUD_PG_HOST=10.106.0.3 # Cloud SQL
export CLOUD_PG_ENABLED=true
```
#### 认证
```bash
export JWT_SECRET=<> # 生产环境必填,长度 ≥32
# 测试网有默认值 "arb-engine-jwt-secret-v2-2026",生产环境 TRADE_ENV != testnet 时必须设置
```
#### 交易环境
```bash
export TRADE_ENV=testnet # 或 production
export LIVE_STRATEGIES='["v52_8signals"]'
export RISK_PER_TRADE_USD=2 # 每笔风险 USD
export MAX_POSITIONS=4 # 最大同时持仓数
```
#### 实盘专用live_executor + risk_guard
```bash
export DB_HOST=10.106.0.3
export DB_PASSWORD=<生产密码>
export DB_NAME=arb_engine
export DB_USER=arb
# 币安 API Key需在 Binance 配置)
export BINANCE_API_KEY=<key>
export BINANCE_API_SECRET=<secret>
```
#### 前端
```bash
# .env.local 或部署环境
NEXT_PUBLIC_API_URL= # 留空=同源,生产时设为 https://arb.zhouyangclaw.com
```
### 数据库初始化
```bash
# schema 在 FastAPI 启动时自动创建init_schema + ensure_auth_tables
# 手动初始化:
cd backend
python3 -c "from db import init_schema; init_schema()"
# 分区维护(自动在 init_schema 内调用):
python3 -c "from db import ensure_partitions; ensure_partitions()"
```
### 前端构建与启动
```bash
cd frontend
npm install
# 开发模式(热重载,端口 3000
npm run dev
# 生产构建
npm run build
npm start
# Lint
npm run lint
```
### 前端 API 代理配置
`frontend/next.config.ts``/api/*` 代理到 `http://127.0.0.1:4332`
- 本地开发时 uvicorn 需监听 **4332 端口**
- 生产部署时通过 `NEXT_PUBLIC_API_URL` 或 nginx 反向代理处理跨域。
### 回测(离线验证)
```bash
cd backend
# 指定天数回测
python3 backtest.py --symbol BTCUSDT --days 20
# 指定日期范围回测
python3 backtest.py --symbol BTCUSDT --start 2026-02-08 --end 2026-02-28
# 输出:胜率、盈亏比、夏普比率、最大回撤等统计
```
### 模拟盘Paper Trading
通过 `paper_config.json` 控制:
```json
{
"enabled": true,
"enabled_strategies": ["v52_8signals"],
"initial_balance": 10000,
"risk_per_trade": 0.02,
"max_positions": 4
}
```
修改后 signal_engine 下次循环自动读取(无需重启)。
监控模拟盘:
```bash
cd backend
python3 paper_monitor.py
```
### 管理员 CLI
```bash
cd backend
python3 admin_cli.py gen_invite [count] [max_uses]
python3 admin_cli.py list_invites
python3 admin_cli.py disable_invite <code>
python3 admin_cli.py list_users
python3 admin_cli.py ban_user <user_id>
python3 admin_cli.py unban_user <user_id>
python3 admin_cli.py set_admin <user_id>
python3 admin_cli.py usage
```
### 日志位置
| 进程 | 日志文件 |
|------|---------|
| signal_engine | `signal-engine.log`(项目根目录) |
| risk_guard | `backend/logs/risk_guard.log`RotatingFileHandler10MB×5 |
| 其他进程 | stdout / PM2 logs |
### 无测试框架
项目中未发现 `pytest`、`unittest` 或任何测试文件。验证策略依赖:
1. **回测**`backtest.py` 逐 tick 回放历史数据
2. **模拟盘**paper trading 实时验证信号质量
3. **手动测试**:前端页面人工验证
## Interfaces / Dependencies
- uvicorn 端口:**4332**(从 `next.config.ts` 推断)
- 前端开发端口:**3000**Next.js 默认)
- CORS 允许 `localhost:3000``localhost:3001`
## Unknowns & Risks
- [inference] uvicorn 端口 4332 从 `next.config.ts` 推断,未在 `main.py` 或启动脚本中显式确认。
- [inference] `requirements.txt` 不完整,实际依赖需从源码 import 语句归纳。
- [unknown] 生产部署的 nginx 配置未在仓库中。
- [risk] 无自动化测试,代码变更风险完全依赖人工回测和 paper trading 验证。
## Source Refs
- `frontend/next.config.ts` — API rewrite 代理到 `127.0.0.1:4332`
- `backend/ecosystem.dev.config.js` — PM2 配置(仅 signal_engine
- `backend/requirements.txt` — 后端依赖(不完整)
- `backend/backtest.py:1-13` — 回测用法说明
- `backend/paper_config.json` — 模拟盘配置
- `backend/admin_cli.py:88` — CLI usage 函数
- `backend/risk_guard.py:81-82` — 日志 RotatingFileHandler 配置