# VPS 原生大脑部署(Option B:vnpy native,无 docker) 2026-07-15 落地。生产大脑从 NAS 迁到 VPS Windows 宿主**原生运行**(非容器), vnpy 4.4.0 源码引用 + vnpy_qmt 进程内直连 miniQMT(同机同会话)。三机角色切分: **VPS=实盘生产 / Mac=开发 / NAS=研究·回测·测试备份**(NAS `live.enabled=false`)。 ## 头号风险已实证解除 vnpy_qmt 0.3.3 只测过 vnpy 3.5;本项目 vnpy 4.4.0。逐符号核对全部 vnpy import (BaseGateway / OrderData / Status 枚举成员 / ZoneInfo 等)对 4.4.0 源码**零漂移**; VPS 真机 `from vnpy_qmt import QmtGateway` import+实例化通过,**连真实 miniQMT 读到真实 账户(66639661 余额 9999998.51)+ 持仓(600000.SSE 200股 / 000001.SZSE 100股,与 bridge 完全一致)+ 7551 合约**。无需改 gateway 代码。 ## VPS 安装清单(C:\sanguo_vnpy_v2\) | 组件 | 来源 | 位置 | |------|------|------| | vnpy 4.4.0 源码 | 项目内 `vnpy_v4.4.0/`(纯 Python,零 C 扩展,scp) | `C:\sanguo_vnpy_v2\vnpy_v4.4.0\` | | sanguo_* 大脑包 | 项目 tar(scp) | `C:\sanguo_vnpy_v2\sanguo_*\` | | vnpy-qmt 0.3.3 | pip(阿里镜像) | site-packages | | TA-Lib 0.6.8 | pip(self-contained wheel) | site-packages | | vnpy_ctastrategy 1.4.1 / vnpy_sqlite 1.1.3 | pip | site-packages | | pyarrow 24.0.0 / pandas / numpy / fastapi / uvicorn / sqlalchemy / apscheduler / auth(web) | pip | site-packages | | 数据(策略标的 raw/qfq 日线 parquet) | NAS 同步→VPS | `C:\sanguo_vnpy_v2\data\{raw,qfq}\{year}\` | > **pip 镜像必配**:VPS 默认直连 pypi.org(从国内极慢/超时)。已配 > `pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/`(写入 > `C:\Users\Administrator\AppData\Roaming\pip\pip.ini`)。 ## 配置本地化(env 覆盖,保 git 真相) 不改部署态 yaml,全部走环境变量(代码见 `sanguo_data/config.py::load_config` + `sanguo_api/main.py::build_app`): | env | 作用 | VPS 值 | |-----|------|--------| | `SANGUO_DATA_ROOT` | 重映射 daily/raw/qfq/15min*/vnpy_db 到该根下 | `C:\sanguo_vnpy_v2\data` | | `SANGUO_DB_PATH` | API 的 db_path(paper_* 表+回测结果) | `C:\sanguo_vnpy_v2\data\backtest_results.db` | | `SANGUO_LIVE_ENABLED` | live 总开关 | `true` | | `SANGUO_BRIDGE_URL` | 影子下单 bridge 地址(**本机**,不再走 Mac tunnel) | `http://127.0.0.1:8765` | | `BRIDGE_TOKEN` | bridge 鉴权(`live_orchestrator` 已有 env fallback) | `` | 不设这些 env(NAS/Mac)则用 yaml 原值 → 三机共用同一份 git config,零漂移。 ## 服务(schtasks,脱离 ssh 持久,开机自启) | 任务 | 命令 | 端口 | |------|------|------| | `sanguo-api` | `powershell -File C:\sanguo_vnpy_v2\run_api.ps1`(设 env + `run_web.py`) | 8000(`/docs`、`/api/v1/*`) | | `sanguo-bridge` | `C:\run_bridge.ps1`(xtquant→miniQMT 执行通道) | 8765 | | `sanguo-caddy` | `C:\run_caddy.ps1`(反代 bridge.mysanguo.top) | 80/443 | 管理(同 bridge): ```bash ssh -i ~/.ssh/id_ed25519 Administrator@49.232.102.198 \ "schtasks /end /tn sanguo-api; schtasks /run /tn sanguo-api" ``` ## 验证记录(2026-07-15,全部通过) 1. `import sanguo_api.main` + `create_app()` — 大脑原生可导入。 2. schtasks sanguo-api 常驻,`:8000/docs` → 200。 3. DB 自动建库(init_db 幂等),6 张 paper_* 表齐。 4. **live_step(2026-07-13)全链路**:warmup 重放 2024-01-01→07-12 → 读 raw/qfq bar (pyarrow)→ PaperEngine.step → 存 daily_balance(cash=1M/equity=1M)。当日 DoubleMa 无交叉信号→无交易(正常)。 5. **影子 transport**:brain 的 `BridgeClient(localhost:8765).get_account/get_positions` 读到真实 miniQMT 账户/持仓 → brain→本机 bridge→miniQMT transport 通(POST /order 同 transport,策略出信号即镜像)。 ## 数据 staging(NAS→VPS) NAS 是数据权威(baostock 5.5 年干净数据)。策略标的的 raw+qfq 日线 parquet 从 NAS rsync 到 Mac 再 scp 到 VPS(`{raw,qfq}/{year}/sh{sym}_daily.parquet`,每股全历史 ~200KB)。 当前已 staging:600000(2021-2026)。新增标的照此同步。 > 光猫拦 NAS→VPS,故走 NAS→Mac→VPS 两跳。Mac tunnel(旧 NAS→VPS bridge 通道)**已废弃** > (brain 在 VPS 本机,不再需要)。 ## Phase 2(vnpy_qmt 进程内换 bridge)—— 暂缓 用户初衷"vnpy_qmt 直接对接 miniQMT、bridge 废弃"针对的是 **bridge 跨机依赖**(Mac tunnel)。 现在 brain+bridge **同机 VPS**(localhost),跨机问题已消除,bridge 退化为本机执行适配器 (仍 vnpy 原生、wrap xtquant)。进程内换 vnpy_qmt 的收益仅是少一个本地进程 + 一个 localhost HTTP 跳(延迟可忽略),代价是要写 async→sync 适配器 + 把 xtquant 生命周期塞进 brain 进程 (xtquant 崩溃会拖垮 brain,反而损失进程隔离)。**故暂缓**,bridge 保留为本机执行通道。 待 bridge 本机化成为实测瓶颈再重启 Phase 2。