Files
qihuo/docs/DEPLOY.md
T
2026-06-30 20:56:33 +08:00

16 KiB
Raw Blame History

部署文档

国内期货 · 交易复盘系统 — Ubuntu 服务器部署、更新与运维说明。


先选部署场景(重要)

场景 代码 说明
你自己(完整版) 分支 main 含 K 线、可开仓品种表、复盘自动 K 线等
客户交付(个人用户版) tag v1.0.0-user 不含上述三项,见 RELEASE-v1.0.0-user.md

不要混用:客户服务器 checkout v1.0.0-user;你自己的服务器用 main

仓库地址https://git.bz121.com/dekun/qihuo.git


部署概要

项目 默认值
部署目录 /opt/qihuo
运行用户 root(与 deploy.sh / PM2 配置一致)
服务端口 6600
进程管理 PM2,应用名 qihuo
数据库 SQLite futures.db
完整版代码 分支 main
用户版代码 tag v1.0.0-user

环境要求

  • 系统Ubuntu 20.04+(推荐)
  • Python3.10+vnpy_ctp 要求 ≥3.10
  • Node.js + PM2:进程守护与开机自启
  • 编译工具(安装 vnpy_ctp 时需要):build-essentialpython3-devpkg-config
  • 网络
    • hq.sinajs.cn(新浪现价,内部逻辑)
    • 企业微信 API(若启用推送)
    • git.bz121.com(拉取代码)
    • pypi.orgpip 安装依赖)
    • SimNow / 期货公司 CTP 前置地址(下单与持仓,见下文)

一键部署(推荐)

root 登录服务器后执行。
deploy.sh 会装系统依赖、locale、venv、PM2 等;首次须先 clone 并 checkout 到正确版本

A. 你自己部署(完整版 · main

首次:

git clone https://git.bz121.com/dekun/qihuo.git /opt/qihuo
cd /opt/qihuo
git checkout main
bash deploy.sh
nano /opt/qihuo/.env    # ADMIN_*、SIMNOW_* 等
pm2 restart qihuo

已有目录、日常更新:

cd /opt/qihuo
git checkout main
bash deploy.sh

B. 客户交付(个人用户版 · v1.0.0-user

首次(SSH 帮客户部署):

git clone https://git.bz121.com/dekun/qihuo.git /opt/qihuo
cd /opt/qihuo
git fetch --tags
git checkout v1.0.0-user
bash deploy.sh
nano /opt/qihuo/.env    # 客户 ADMIN_*、SIMNOW_* 等
pm2 restart qihuo

已有目录、用户版小版本升级(如 v1.0.1-user):

cd /opt/qihuo
git fetch --tags
git checkout v1.0.1-user    # 换成新 tag
bash deploy.sh

用户版再次执行 deploy.sh 时,脚本会识别 edition.py保持在用户版 tag,不会误拉到 main

访问:http://<服务器IP>:6600


deploy.sh 会自动完成

  1. 安装系统依赖:python3gitbuild-essentialpython3-devpkg-configlocalesnetcat-openbsdpm2
  2. 时区设为 Asia/Shanghai(与 SimNow 交易时段一致)
  3. locale:生成 zh_CN.GB18030zh_CN.UTF-8CTP 登录必需,缺则进程崩溃)
  4. git pull(完整版 main)或 git checkout 用户版 tag,或 git clone/opt/qihuo
  5. 创建/保留虚拟环境 venvpip install -r requirements.txt,验证 vnpy_ctp
  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 --update-env 或首次 pm2 start,并 pm2 save

部署完成后访问:http://<服务器IP>:6600

完整版日常更新:cd /opt/qihuo && git checkout main && bash deploy.sh
用户版:git checkout v1.0.0-user && bash deploy.sh(见上文 B


手动部署

与一键部署相同,请先 clone + checkout 到 mainv1.0.0-user,再执行下列步骤。

1. 安装系统依赖

apt update
apt install -y python3 python3-venv python3-pip python3-dev pkg-config git nodejs npm build-essential locales netcat-openbsd
timedatectl set-timezone Asia/Shanghai
sed -i '/^# zh_CN.GB18030/s/^# //' /etc/locale.gen
sed -i '/^# zh_CN.UTF-8/s/^# //' /etc/locale.gen
locale-gen zh_CN.GB18030 zh_CN.UTF-8
update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
npm install -g pm2

build-essentialpython3-devpkg-config 用于编译安装 vnpy_ctpCTP 网关)。Meson 通过 pkg-config 查找 Python 头文件;缺 pkg-config 时会报 Python dependency not found

2. 克隆代码

完整版(自己):

git clone https://git.bz121.com/dekun/qihuo.git /opt/qihuo
cd /opt/qihuo
git checkout main

用户版(客户):

git clone https://git.bz121.com/dekun/qihuo.git /opt/qihuo
cd /opt/qihuo
git fetch --tags
git checkout v1.0.0-user

3. Python 虚拟环境与依赖

python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt

依赖已包含 vnpyvnpy_ctpCTP 报单)、akshare(手续费同步)。安装完成后可验证:

python -c "from vnpy_ctp import CtpGateway; print('vnpy_ctp OK')"

若提示找不到模块,查看本文「CTP / vnpy 故障排查」一节。

cp .env.example .env
nano .env
变量 说明
HOST 监听地址,默认 0.0.0.0
PORT 端口,默认 6600
SECRET_KEY Flask Session 密钥,务必随机
ADMIN_USERNAME 初始管理员用户名
ADMIN_PASSWORD 初始管理员密码(仅首次建库生效)
ADMIN_SYNC_FROM_ENV true 时重启可从 .env 同步账号密码
WECHAT_WEBHOOK 企业微信机器人地址(可选)
QUOTE_SOURCE sina(默认)/ ths / auto
THS_REFRESH_TOKEN 同花顺 iFinD token(机构用户)
SIMNOW_USER SimNow 仿真账号(模拟盘必填)
SIMNOW_PASSWORD SimNow 密码
SIMNOW_TD_ADDRESS SimNow 交易前置(以官网最新为准)
SIMNOW_MD_ADDRESS SimNow 行情前置
CTP_LIVE_* 期货公司实盘 CTP(后期接入,见 .env.example
TRADING_MODE simulationSimNow/ live(实盘)

示例:

HOST=0.0.0.0
PORT=6600
SECRET_KEY=请替换为随机长字符串
ADMIN_USERNAME=admin
ADMIN_PASSWORD=你的强密码
ADMIN_SYNC_FROM_ENV=false
WECHAT_WEBHOOK=
QUOTE_SOURCE=sina

# —— SimNow 模拟盘(注册步骤见 docs/SIMNOW.md)——
SIMNOW_USER=你的SimNow账号
SIMNOW_PASSWORD=你的密码
SIMNOW_BROKER_ID=9999
SIMNOW_TD_ADDRESS=tcp://180.168.146.187:10201
SIMNOW_MD_ADDRESS=tcp://180.168.146.187:10211
SIMNOW_APP_ID=simnow_client_test
SIMNOW_AUTH_CODE=0000000000000000
SIMNOW_ENV=实盘
TRADING_MODE=simulation

SimNow 前置地址会随官网更新,部署前请到 SimNow 官网 核对 7×24 或交易时段地址。

6. PM2 启动

cd /opt/qihuo
pm2 start ecosystem.config.cjs
pm2 save
pm2 startup   # 按提示执行命令,实现开机自启

7. 创建日志目录(若不存在)

mkdir -p /opt/qihuo/logs /opt/qihuo/uploads

更新部署

完整版(你自己 · main

cd /opt/qihuo
git fetch origin
git checkout main
git reset --hard origin/main
source venv/bin/activate
pip install -r requirements.txt
pm2 restart qihuo

或:git checkout main && bash deploy.sh

个人用户版(客户 · tag

cd /opt/qihuo
git fetch origin --tags
git checkout v1.0.0-user          # 或新版本 tag
bash deploy.sh

若服务器曾用 SCP 覆盖文件导致冲突:完整版用 git reset --hard origin/main;用户版用 git checkout -f v1.0.0-user

vnpy_ctp 安装失败(常见于缺少编译环境):

apt install -y build-essential python3-dev pkg-config
source venv/bin/activate
pip install --no-cache-dir vnpy vnpy_ctp
pm2 restart qihuo

应用启动时会自动执行 SQLite 表结构迁移(ALTER TABLE 容错),一般无需手工改库。

首次启用 CTP 下单

  1. 浏览器登录 → 系统设置 确认 模拟盘 · SimNow
  2. 打开 下单监控 页 → 点击 连接 CTP
  3. 连接成功后:权益来自柜台、显示 CTP 持仓、可报单(用户版含小账户四品种限制)

详见 TRADING.md


PM2 常用命令

pm2 status              # 查看状态
pm2 logs qihuo          # 查看日志
pm2 logs qihuo --lines 100
pm2 restart qihuo       # 重启
pm2 stop qihuo          # 停止
pm2 delete qihuo        # 删除进程
pm2 save                # 保存进程列表

日志文件:

  • /opt/qihuo/logs/pm2-out.log
  • /opt/qihuo/logs/pm2-error.log

本地开发

完整版(默认):

git clone https://git.bz121.com/dekun/qihuo.git qihuo
cd qihuo
git checkout main
python3 -m venv venv
source venv/bin/activate   # Windows: venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
python app.py

浏览器访问:http://127.0.0.1:6600


账号与密码

场景 操作
首次部署 .env 中设置 ADMIN_USERNAME / ADMIN_PASSWORD 后启动
已部署后改 .env 密码 ADMIN_SYNC_FROM_ENV=truepm2 restart qihuo
网页改密码 登录 → 系统设置
忘记密码 cd /opt/qihuo && source venv/bin/activate && python reset_admin.py

账号数据在 futures.dbsettings 表,不会仅因改 .env 自动更新(除非开启 ADMIN_SYNC_FROM_ENV)。


数据库与数据文件

路径 说明
/opt/qihuo/futures.db 主数据库
/opt/qihuo/uploads/ 复盘截图(完整版含自动 K 线图)
/opt/qihuo/data/fee_rates.json 默认手续费表(可重载)
/root/qihuo_backup/ 系统自动备份目录(.tar.gz

自动备份(推荐)

系统设置 → 数据备份与恢复

  • 默认每天 03:00 自动备份到 /root/qihuo_backup
  • futures.dbuploads/,可在其他服务器恢复
  • 设置页可立即备份、下载历史压缩包

完整说明见 BACKUP.md

手工备份(备选)

cp /opt/qihuo/futures.db /opt/qihuo/futures.db.bak.$(date +%Y%m%d)

手工补列(极少需要)

若极老版本库缺少字段,可对照报错执行(新版本启动会自动迁移):

sqlite3 /opt/qihuo/futures.db "ALTER TABLE key_monitors ADD COLUMN sina_code TEXT;"

Nginx 反向代理(可选)

将 6600 反代到 80/443,并配置 HTTPS

server {
    listen 80;
    server_name your.domain.com;

    location / {
        proxy_pass http://127.0.0.1:6600;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

防火墙

若使用 ufw,开放端口:

ufw allow 6600/tcp
# 或使用 Nginx 时只开放 80/443

故障排查

现象 可能原因 处理
无法访问 6600 服务未启动 / 防火墙 pm2 statuspm2 logs qihuo
登录失败 密码未同步 网页改密或 reset_admin.py
现价一直 -- 新浪网络不可达 检查服务器能否访问 hq.sinajs.cn
关键位 500 sina_code git pull 重启;或手工 ALTER TABLE
K 线生成失败 matplotlib 未装 pip install matplotlib==3.9.2
手续费同步失败 akshare 异常 使用「重载 JSON」或检查 akshare
未安装 vnpy / vnpy_ctp 依赖未装或编译失败 见下方「CTP / vnpy 故障排查」
CTP 连接超时 SimNow 地址/账号/非交易时段 核对 .env 与 SimNow 官网前置
下单监控无持仓 未连接 CTP 或确实无仓 先点「连接 CTP」
Could not resolve host 服务器 DNS 故障 配置 systemd-resolved 公共 DNS,见下方
database is locked SQLite 并发 更新代码后重启
git pull 冲突 本地有修改 / SCP 部署 完整版:git reset --hard origin/main;用户版:git checkout -f v1.0.0-user
用户版跑完变成完整版 deploy.sh 误拉 main git checkout v1.0.0-user,再 bash deploy.sh(新版脚本已防误拉)

查看应用是否在监听:

ss -tlnp | grep 6600

DNS 无法解析(git / curl 均失败)

curl cip.ccgit pullCould not resolve host

mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/dns.conf <<'EOF'
[Resolve]
DNS=223.5.5.5 8.8.8.8
FallbackDNS=1.1.1.1
EOF
systemctl restart systemd-resolved
resolvectl flush-caches

验证:resolvectl query git.bz121.comcurl cip.cc


页面提示 「未安装 vnpy / vnpy_ctp」 表示 Python 环境未成功安装 CTP 网关,下单与柜台持仓不可用(看盘、策略、复盘仍可用)。

1. 安装依赖

cd /opt/qihuo
source venv/bin/activate
apt install -y build-essential python3-dev pkg-config   # 首次需要
pip install -r requirements.txt
python -c "from vnpy_ctp import CtpGateway; print('OK')"
pm2 restart qihuo

2. 配置 SimNow.env

注册与查投资者代码见 SIMNOW.md。填写 SIMNOW_USER(投资者代码)、SIMNOW_PASSWORD,前置地址以 SimNow 官网为准。

3. 连接

登录系统 → 下单监控连接 CTP。成功则顶栏显示「CTP 已连接」,权益变为 SimNow 账户资金。

4. 常见错误

日志/现象 处理
pip install vnpy_ctp 编译失败 / Python dependency not found 安装 build-essential python3-dev pkg-config 后重试
CTP 连接超时 检查前置 IP、端口、SimNow 是否维护、是否在允许连接时段
连接后立即崩溃 locale::facet::_S_create_c_locale CTP 需 zh_CN.GB18030sed -i '/^# zh_CN.GB18030/s/^# //' /etc/locale.gen && locale-gen zh_CN.GB18030,再 pm2 restart qihuo --update-env
服务器 180.168.146.187 超时 换 SimNow 备用前置 182.254.243.31:30001/30011(见 SIMNOW.md
已连接但下单拒单 检查合约代码、价格精度、是否有足够保证金

安全建议

  1. 部署后立即修改默认密码
  2. 勿将 .envfutures.db 提交到公开仓库
  3. 生产环境使用 HTTPS + 限制访问 IP
  4. 定期备份:系统设置页自动备份至 /root/qihuo_backup,或见 BACKUP.md

目录结构(部署后)

/opt/qihuo/
├── app.py
├── vnpy_bridge.py          # CTP 执行层
├── recommend_store.py      # 可开仓品种缓存
├── recommend_stream.py     # 可开仓品种 SSE 推送
├── venv/
├── futures.db
├── .env
├── logs/
│   ├── pm2-out.log
│   └── pm2-error.log
├── uploads/
├── data/fee_rates.json
├── ecosystem.config.cjs
├── deploy.sh
├── requirements.txt        # 含 vnpy、vnpy_ctp
└── docs/
    ├── FEATURES.md
    ├── DEPLOY.md
    └── TRADING.md

相关文档