StockPro 采用参考 BitPro 的单机生产模式:GitHub Actions 构建 React 前端,rsync 到生产服务器,远端 deploy.sh 安装依赖、运行 Postgres migrations、重启 FastAPI systemd 服务,并由 Nginx 对外提供静态前端和 /api 反代。
| 项目 | 值 |
|---|---|
| 服务器 | root@47.79.36.92 |
| 应用目录 | /opt/stockpro |
| 公网入口 | http://47.79.36.92:4444 |
| 后端监听 | 127.0.0.1:4445 |
| Nginx | :4444 静态前端 + /api/ 反代 |
| 数据库 | PostgreSQL 服务端,新建 stockpro_prod |
| systemd | stockpro-backend |
/opt/stockpro/
├── backend/ # FastAPI 源码 + venv
├── frontend/dist/ # Vite 构建产物
├── deploy/ # deploy.sh、setup、nginx、systemd
├── logs/ # 运行日志
├── strategies/ # 预置策略脚本(后续迁移到 PG strategy_versions)
└── scripts/ # 运维脚本
在服务器上执行:
ssh root@47.79.36.92
bash /opt/stockpro/deploy/setup-server.sh如果 /opt/stockpro/deploy 还没有同步,先从本地同步部署目录:
rsync -azP deploy/ root@47.79.36.92:/opt/stockpro/deploy/
ssh root@47.79.36.92 "bash /opt/stockpro/deploy/setup-server.sh"setup-server.sh 会安装 PostgreSQL 服务端和客户端;随后使用脚本创建独立数据库和最小权限用户。密码只通过环境变量传入,不写入仓库:
ssh root@47.79.36.92
STOCKPRO_DB_PASSWORD='replace-with-strong-password' \
bash /opt/stockpro/deploy/setup-postgres.sh脚本默认创建:
- 数据库:
stockpro_prod - 用户:
stockpro_app
复制示例文件并填写真实值:
cp /opt/stockpro/backend/.env.example /opt/stockpro/backend/.env
vim /opt/stockpro/backend/.env关键项:
DB_MODE=postgres
DATABASE_URL=postgresql://stockpro_app:<password>@127.0.0.1:5432/stockpro_prod
ENABLE_SCHEDULER=false
ENABLE_REALTIME_SYNC=false
ENABLE_STRATEGY_EXECUTION=false
ENABLE_LEGACY_SQLITE_MODULES=false
BACKEND_CORS_ORIGINS=["http://47.79.36.92:4444"]
QWEN_API_KEY=<your-qwen-api-key>不要提交 .env、数据库密码、API key 或券商凭证。
# 构建前端
cd frontend
VITE_API_URL=/api/v1 npm run build
cd ..
# 同步到服务器
rsync -azP --delete --exclude='venv/' --exclude='.env' --exclude='*.db' --exclude='*.sqlite' \
backend/ root@47.79.36.92:/opt/stockpro/backend/
rsync -azP --delete frontend/dist/ root@47.79.36.92:/opt/stockpro/frontend/dist/
rsync -azP deploy/ root@47.79.36.92:/opt/stockpro/deploy/
rsync -azP --delete strategies/ root@47.79.36.92:/opt/stockpro/strategies/
rsync -azP --delete scripts/ root@47.79.36.92:/opt/stockpro/scripts/
# 远端部署
ssh root@47.79.36.92 "chmod +x /opt/stockpro/deploy/deploy.sh && bash /opt/stockpro/deploy/deploy.sh"deploy.sh 会:
- 校验
/opt/stockpro/backend/.env存在。 - 校验
DB_MODE=postgres且ENABLE_LEGACY_SQLITE_MODULES=false。 - 安装 Python 依赖。
- 编译后端源码。
- 运行
python -m app.db.postgres_migrations。 - 安装/启动
stockpro-backendsystemd 服务。 - 安装/重载 Nginx 配置。
- 轮询后端和前端健康检查。
工作流:.github/workflows/deploy.yml
触发方式:
- push 到
main - 每 5 分钟 schedule 兜底
workflow_dispatch,支持force_deploy
生产 runner:
- self-hosted runner label:
stockpro-production
GitHub Secrets:
SERVER_HOST=47.79.36.92SERVER_USER=rootSSH_PRIVATE_KEY
部署成功并通过健康检查后,工作流写入:
/opt/stockpro/deploy/last_deployed_sha
同一个 main SHA 已部署时,后续 schedule 会跳过,除非手动 force_deploy=true。
服务器本机:
curl http://127.0.0.1:4445/api/v1/health/health
curl http://127.0.0.1:4445/api/v1/health/storage
curl -I http://127.0.0.1:4444/外网:
curl http://47.79.36.92:4444/api/v1/health/health
curl http://47.79.36.92:4444/api/v1/health/storage
curl -I http://47.79.36.92:4444/运维:
systemctl status stockpro-backend
journalctl -u stockpro-backend -f
nginx -t && systemctl reload nginx- 生产入口暂时是 IP + 端口,未启用 HTTPS;接入真实交易前应迁移到域名 + TLS。
- 仓库仍包含 legacy SQLite 服务代码,但 PG-only 生产默认不挂载旧 SQLite API,也不启动旧后台任务;旧模块需要按 sprint 逐步迁移到 PG repositories。
- 实盘交易默认不启用;broker adapter 和 live order submission 必须单独开 contract。