Restructure into modules/ with single-process CTP and config/ layout.

Move business code under modules/, env template to config/, PM2 single qihuo process, and _legacy shims for old imports.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-01 14:42:16 +08:00
parent b354d6c701
commit e5a586f903
209 changed files with 21962 additions and 20963 deletions
+50
View File
@@ -0,0 +1,50 @@
# 主目录结构
```
qihuo/ # 主文件夹(仓库根)
├── app.py # 主程序入口(Flask 启动)
├── requirements.txt
├── deploy.sh # 一键部署脚本
├── ecosystem.config.cjs # PM2 启动配置
├── config/
│ ├── .env.example # 环境变量模板
│ └── .env # 运行时配置(git 忽略)
├── modules/ # 业务模块(每个模块 register(deps)
│ ├── core/ # DB、路径、公共工具
│ ├── web/ # 页面路由 + static/ + templates/
│ ├── trading/ # 下单监控、持仓、推荐
│ ├── ctp/ # vn.py / CTP 连接与报单
│ ├── risk/ # 账户风控
│ ├── strategy/ # 趋势、滚仓策略
│ ├── keys/ # 关键位
│ ├── plans/ # 开单计划
│ ├── market/ # 行情、K 线
│ ├── records/ # 交易记录、复盘
│ ├── stats/ # 统计、看板
│ ├── settings/ # 系统设置
│ ├── notify/ # 微信、AI 消息
│ ├── fees/ # 手续费
│ └── backup/ # 备份
├── _legacy/ # 旧 import 兼容 shimPM2 PYTHONPATH
├── data/ # 静态数据(如 fee_rates.json
├── docs/ # 文档
├── scripts/ # 运维/诊断脚本(非运行时)
├── futures.db # SQLite(未配 PG 时)
├── uploads/
└── logs/
```
根目录 `_legacy/` 为旧 `import db_conn` 等路径的兼容层;新代码请 `from modules.xxx import ...`
## 进程模型
- **单进程**PM2 仅 `qihuo``app.py` + CTP 同进程)
- 详见 [DEPLOY.md](./DEPLOY.md)
## 模块契约
每个 `modules/<name>/` 提供 `register(deps: AppDeps)`;主程序 `app.py` 只做串联,不写业务。
## 发布
见 [DEPLOY.md](./DEPLOY.md)**本地修改 → git push → 服务器 git pull**,禁止 SCP。
+15 -16
View File
@@ -43,7 +43,7 @@ pm2 save
以下文件 **不**`git pull` 更新,卸载/重装时须 **单独备份与恢复**
- `/opt/qihuo/.env`
- `/opt/qihuo/config/.env`(兼容旧版 `/opt/qihuo/.env`
- `/opt/qihuo/futures.db`SQLite)或 PostgreSQL 数据
- `/opt/qihuo/uploads/`
- `/opt/qihuo/backups/`(若有)
@@ -58,18 +58,17 @@ pm2 save
| 运行用户 | `root`(与 `deploy.sh` / PM2 配置一致) |
| Web 端口 | `6600`(对外) |
| CTP Worker 端口 | `6601`(仅 `127.0.0.1`,Web 进程 IPC 调用,勿对外开放) |
| 进程管理 | PM2`qihuo`Flask Web+ `qihuo-ctp`CTP / vn.py 独立进程) |
| 进程管理 | PM2**仅** `qihuo`Flask + CTP 单进程) |
| 数据库 | **生产推荐 PostgreSQL**(见 [POSTGRES.md](./POSTGRES.md));未配置 `DATABASE_URL` 时使用 SQLite `futures.db` |
| 仓库 | https://git.bz121.com/dekun/qihuo.git |
### 进程架构(2026-03 起)
### 进程架构(2026-07:单进程
| PM2 应用 | 角色 | 说明 |
|----------|------|------|
| `qihuo` | Web`QIHUO_CTP_ROLE=client`) | Flask、页面、API、数据库;通过 HTTP 调用本机 Worker |
| `qihuo-ctp` | Worker`QIHUO_CTP_ROLE=worker` | **唯一** 加载 vn.py / vnpy_ctp;CTP 连接、报单、持仓回调、止盈止损 tick、滚仓监控 |
| PM2 应用 | 说明 |
|----------|------|
| `qihuo` | Flask Web + **vn.py / CTP 同进程**`vnpy_bridge.CtpBridge` |
Web 进程崩溃或重启 **不会** 直接带走 CTP 原生连接;Worker 重启后 Web 会自动通过 IPC 恢复读写。两个进程的 Token 须一致(见 `ecosystem.config.cjs``QIHUO_CTP_WORKER_TOKEN`
详见 [ARCHITECTURE.md](./ARCHITECTURE.md)。旧版 `qihuo-ctp` 独立 Worker **已废弃**`ecosystem.config.cjs` 不再启动该进程
---
@@ -110,7 +109,7 @@ bash deploy.sh
6. 首次生成 `.env`,并补全 `SIMNOW_ENV=实盘``CTP_AUTO_RECONNECT=true` 等缺项
7. **自动探测 SimNow 前置**`nc` 测端口),写入可用的 `SIMNOW_TD/MD_ADDRESS`(优先 `182.254.243.31`,其次 `180.168.146.187`
8. 若已配置 SimNow 账号,运行 `scripts/test_simnow.py` 验证连接
9. `pm2 restart ecosystem.config.cjs --update-env` 或首次 `pm2 start ecosystem.config.cjs`,并 `pm2 save`同时启动 **`qihuo`** **`qihuo-ctp`**
9. `pm2 restart ecosystem.config.cjs --update-env` 或首次 `pm2 start ecosystem.config.cjs`,并 `pm2 save` **`qihuo`** 一个进程
部署完成后访问:`http://<服务器IP>:6600`
@@ -141,7 +140,7 @@ MIGRATE_SQLITE=1 sudo bash scripts/deploy_postgres.sh
```bash
# 在服务器上
cp /opt/qihuo/.env /root/qihuo.env.bak
cp /opt/qihuo/config/.env /root/qihuo.env.bak 2>/dev/null || cp /opt/qihuo/.env /root/qihuo.env.bak 2>/dev/null || true
# SQLite
cp /opt/qihuo/futures.db /root/futures.db.bak 2>/dev/null || true
# PostgreSQL 见 POSTGRES.md 备份命令
@@ -151,8 +150,8 @@ tar czf /root/qihuo_uploads.bak.tar.gz -C /opt/qihuo uploads 2>/dev/null || true
### 2. 卸载 PM2 与代码目录
```bash
pm2 stop qihuo qihuo-ctp 2>/dev/null || true
pm2 delete qihuo qihuo-ctp 2>/dev/null || true
pm2 stop qihuo 2>/dev/null || true
pm2 delete qihuo 2>/dev/null || true
pm2 save
rm -rf /opt/qihuo
```
@@ -174,7 +173,7 @@ bash deploy.sh
```bash
cd /opt/qihuo && git log -1 --oneline # 须与远端 main 最新提交一致
pm2 status # qihuo、qihuo-ctp 均为 online
pm2 status # qihuo 为 online
```
浏览器访问 `http://<服务器IP>:6600` 登录验证。
@@ -225,8 +224,8 @@ python -c "from vnpy_ctp import CtpGateway; print('vnpy_ctp OK')"
若提示找不到模块,查看本文「CTP / vnpy 故障排查」一节。
```bash
cp .env.example .env
nano .env
cp config/.env.example config/.env
nano config/.env
```
| 变量 | 说明 |
@@ -318,7 +317,7 @@ pm2 restart ecosystem.config.cjs --update-env
pm2 save
```
> 须 **同时重启** `qihuo` 与 `qihuo-ctp`。仅 `pm2 restart qihuo` 会导致 Web 与 Worker 代码/协议不一致
> 更新后执行 `pm2 restart ecosystem.config.cjs --update-env` 即可(仅 `qihuo`
若服务器曾用 SCP 覆盖文件导致 `git pull` 冲突,用 `git reset --hard origin/main` 与远端对齐。