fix: 修复登录500错误和移除明文密码提示
- 修复 deps.py 中 get_vn_service 的引用错误 (vn_service.vn_service -> vn_service) - 移除登录页面上的明文密码提示 - 改进前端错误处理,避免数据加载失败导致登录显示错误
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
# 部署文档
|
||||
|
||||
本目录包含 Sanguo VeighNa 平台的部署相关文档。
|
||||
|
||||
## 文档列表
|
||||
|
||||
### Docker 部署
|
||||
|
||||
- **[docker-deployment.md](./docker-deployment.md)** - Docker 容器部署指南
|
||||
- 前置要求和安装
|
||||
- 快速开始步骤
|
||||
- 配置说明
|
||||
- 生产部署建议
|
||||
|
||||
### Synology NAS 部署
|
||||
|
||||
- **[synology-nas.md](./synology-nas.md)** - Synology NAS 专用部署指南
|
||||
- NAS 环境配置
|
||||
- 数据持久化设置
|
||||
- 自动备份配置
|
||||
- 故障排除
|
||||
|
||||
## 快速链接
|
||||
|
||||
### 部署方式对比
|
||||
|
||||
| 方式 | 适用场景 | 难度 | 推荐度 |
|
||||
|------|----------|------|--------|
|
||||
| Docker Compose | 开发/测试/小规模部署 | 简单 | ⭐⭐⭐⭐⭐ |
|
||||
| Synology NAS | 家庭 NAS 部署 | 中等 | ⭐⭐⭐⭐ |
|
||||
| Kubernetes | 大规模/高可用部署 | 复杂 | ⭐⭐⭐ |
|
||||
|
||||
### 部署检查清单
|
||||
|
||||
- [ ] 硬件要求满足(内存、存储)
|
||||
- [ ] Docker/Docker Compose 已安装
|
||||
- [ ] 网络端口已开放
|
||||
- [ ] 数据目录已创建
|
||||
- [ ] 环境变量已配置
|
||||
- [ ] SSL 证书已准备(生产环境)
|
||||
- [ ] 备份策略已制定
|
||||
|
||||
## 配置文件
|
||||
|
||||
### 环境变量示例
|
||||
|
||||
```env
|
||||
# 数据目录
|
||||
DATA_DIR=/volume1/docker/stock/sanguo_vnpy
|
||||
|
||||
# 端口配置
|
||||
HTTP_PORT=8000
|
||||
WS_PORT=8080
|
||||
|
||||
# 时区
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# 日志级别
|
||||
VNPY_LOG_LEVEL=INFO
|
||||
|
||||
# 安全配置
|
||||
JWT_SECRET_KEY=your-secure-secret-key
|
||||
```
|
||||
|
||||
### 目录结构
|
||||
|
||||
```
|
||||
{DATA_DIR}/
|
||||
├── data/ # 数据库和数据文件
|
||||
├── logs/ # 运行日志
|
||||
├── config/ # 配置文件
|
||||
├── temp/ # 临时文件
|
||||
├── redis/ # Redis 持久化
|
||||
└── nginx/ # Nginx 相关
|
||||
```
|
||||
|
||||
## 数据备份
|
||||
|
||||
### 重要提示
|
||||
|
||||
**所有重要数据都存储在配置的 DATA_DIR 中**,请确保:
|
||||
|
||||
1. 该目录有足够的存储空间
|
||||
2. 定期备份该目录
|
||||
3. 备份包含所有子目录
|
||||
|
||||
### 备份命令
|
||||
|
||||
```bash
|
||||
# 创建备份
|
||||
tar czf vnpy_backup_$(date +%Y%m%d).tar.gz {DATA_DIR}
|
||||
|
||||
# 恢复备份
|
||||
tar xzf vnpy_backup_YYYYMMDD.tar.gz -C /
|
||||
```
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **容器无法启动**
|
||||
- 检查端口占用: `netstat -tulpn | grep :8000`
|
||||
- 查看日志: `docker-compose logs vnpy`
|
||||
|
||||
2. **数据丢失**
|
||||
- 确保使用绑定挂载
|
||||
- 检查 DATA_DIR 配置
|
||||
|
||||
3. **性能问题**
|
||||
- 调整资源限制
|
||||
- 增加 Worker 数量
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [开发文档](../development.md)
|
||||
- [运维文档](../operations/)
|
||||
- [API 文档](../api/)
|
||||
- [用户指南](../user_guide/)
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2026-07-01
|
||||
@@ -0,0 +1,409 @@
|
||||
# Docker 部署指南
|
||||
|
||||
本指南介绍如何使用 Docker Compose 部署 Sanguo VeighNa 量化交易平台。
|
||||
|
||||
## 目录
|
||||
|
||||
- [前置要求](#前置要求)
|
||||
- [快速开始](#快速开始)
|
||||
- [配置说明](#配置说明)
|
||||
- [启动服务](#启动服务)
|
||||
- [访问界面](#访问界面)
|
||||
- [数据管理](#数据管理)
|
||||
- [生产部署](#生产部署)
|
||||
- [常见问题](#常见问题)
|
||||
|
||||
---
|
||||
|
||||
## 前置要求
|
||||
|
||||
### 系统要求
|
||||
|
||||
- **操作系统**: Linux, macOS, Windows (with WSL2)
|
||||
- **Docker**: 20.10+
|
||||
- **Docker Compose**: 2.0+
|
||||
- **内存**: 至少 2GB 可用内存
|
||||
- **存储**: 至少 10GB 可用存储空间
|
||||
|
||||
### 安装 Docker
|
||||
|
||||
#### Linux
|
||||
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
curl -fsSL https://get.docker.com | bash
|
||||
sudo usermod -aG docker $USER
|
||||
|
||||
# 启用 Docker Compose
|
||||
sudo apt-get install docker-compose-plugin
|
||||
```
|
||||
|
||||
#### macOS
|
||||
|
||||
下载并安装 [Docker Desktop for Mac](https://www.docker.com/products/docker-desktop/)
|
||||
|
||||
#### Windows
|
||||
|
||||
下载并安装 [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/)
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 克隆项目
|
||||
|
||||
```bash
|
||||
git clone https://github.com/sanguo/sanguo_vnpy_v2.git
|
||||
cd sanguo_vnpy_v2
|
||||
```
|
||||
|
||||
### 2. 配置环境变量
|
||||
|
||||
```bash
|
||||
cd docker
|
||||
cp .env.example .env
|
||||
vi .env # 编辑配置
|
||||
```
|
||||
|
||||
### 3. 启动服务
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 4. 查看状态
|
||||
|
||||
```bash
|
||||
docker-compose ps
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 配置说明
|
||||
|
||||
### 环境变量
|
||||
|
||||
编辑 `.env` 文件配置以下参数:
|
||||
|
||||
```env
|
||||
# 数据目录
|
||||
DATA_DIR=./data
|
||||
|
||||
# 端口配置
|
||||
HTTP_PORT=8000
|
||||
WS_PORT=8080
|
||||
|
||||
# 时区
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# 日志级别
|
||||
VNPY_LOG_LEVEL=INFO
|
||||
|
||||
# 数据库配置
|
||||
DB_TYPE=sqlite
|
||||
DB_PATH=/app/data/vnpy.db
|
||||
|
||||
# Web 服务配置
|
||||
WEB_HOST=0.0.0.0
|
||||
WEB_PORT=8000
|
||||
WEB_WORKERS=2
|
||||
|
||||
# 安全配置
|
||||
JWT_SECRET_KEY=your-secret-key-here
|
||||
SESSION_TIMEOUT=3600
|
||||
```
|
||||
|
||||
### 目录映射
|
||||
|
||||
默认目录映射:
|
||||
|
||||
| 容器路径 | 宿主机路径 | 说明 |
|
||||
|----------|------------|------|
|
||||
| /app/data | `{DATA_DIR}/data` | 数据库和数据文件 |
|
||||
| /app/logs | `{DATA_DIR}/logs` | 运行日志 |
|
||||
| /app/config | `{DATA_DIR}/config` | 配置文件 |
|
||||
| /app/temp | `{DATA_DIR}/temp` | 临时文件 |
|
||||
|
||||
---
|
||||
|
||||
## 启动服务
|
||||
|
||||
### 基本命令
|
||||
|
||||
```bash
|
||||
# 启动所有服务
|
||||
docker-compose up -d
|
||||
|
||||
# 仅启动核心服务
|
||||
docker-compose up -d vnpy redis
|
||||
|
||||
# 启动并包含 Nginx
|
||||
docker-compose --profile nginx up -d
|
||||
|
||||
# 启动并包含 PostgreSQL
|
||||
docker-compose --profile postgres up -d
|
||||
```
|
||||
|
||||
### 查看状态
|
||||
|
||||
```bash
|
||||
# 查看容器状态
|
||||
docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose logs -f vnpy
|
||||
|
||||
# 查看所有服务日志
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
### 停止服务
|
||||
|
||||
```bash
|
||||
# 停止服务
|
||||
docker-compose down
|
||||
|
||||
# 停止并删除数据卷
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
### 重启服务
|
||||
|
||||
```bash
|
||||
# 重启所有服务
|
||||
docker-compose restart
|
||||
|
||||
# 重启特定服务
|
||||
docker-compose restart vnpy
|
||||
```
|
||||
|
||||
### 进入容器
|
||||
|
||||
```bash
|
||||
# 进入 VeighNa 容器
|
||||
docker-compose exec vnpy bash
|
||||
|
||||
# 进入 Redis 容器
|
||||
docker-compose exec redis sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 访问界面
|
||||
|
||||
### Web 界面
|
||||
|
||||
启动成功后,访问:
|
||||
|
||||
```
|
||||
http://localhost:8000
|
||||
```
|
||||
|
||||
### 默认登录
|
||||
|
||||
- **用户名**: `admin`
|
||||
- **密码**: `admin123`
|
||||
|
||||
### WebSocket 端点
|
||||
|
||||
```
|
||||
ws://localhost:8080
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 数据管理
|
||||
|
||||
### 数据备份
|
||||
|
||||
```bash
|
||||
# 备份数据目录
|
||||
tar czf vnpy_backup_$(date +%Y%m%d).tar.gz ./data
|
||||
|
||||
# 恢复数据
|
||||
tar xzf vnpy_backup_YYYYMMDD.tar.gz
|
||||
```
|
||||
|
||||
### 数据库操作
|
||||
|
||||
#### SQLite
|
||||
|
||||
```bash
|
||||
# 进入容器
|
||||
docker-compose exec vnpy bash
|
||||
|
||||
# 访问数据库
|
||||
sqlite3 /app/data/vnpy.db
|
||||
|
||||
# 常用命令
|
||||
.tables # 列出所有表
|
||||
.schema # 查看表结构
|
||||
.quit # 退出
|
||||
```
|
||||
|
||||
#### PostgreSQL
|
||||
|
||||
```bash
|
||||
# 进入 PostgreSQL 容器
|
||||
docker-compose exec postgres psql -U vnpy -d vnpy
|
||||
|
||||
# 常用命令
|
||||
\l # 列出所有数据库
|
||||
\dt # 列出所有表
|
||||
\q # 退出
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 生产部署
|
||||
|
||||
### 使用 Nginx 反向代理
|
||||
|
||||
```bash
|
||||
# 启用 Nginx
|
||||
docker-compose --profile nginx up -d
|
||||
```
|
||||
|
||||
### 配置 HTTPS
|
||||
|
||||
1. 获取 SSL 证书
|
||||
|
||||
```bash
|
||||
# 使用 Let's Encrypt
|
||||
mkdir -p data/nginx/ssl
|
||||
# 将证书文件复制到该目录
|
||||
cp cert.pem data/nginx/ssl/
|
||||
cp key.pem data/nginx/ssl/
|
||||
```
|
||||
|
||||
2. 更新 nginx 配置
|
||||
|
||||
3. 重启服务
|
||||
|
||||
```bash
|
||||
docker-compose restart nginx
|
||||
```
|
||||
|
||||
### 资源限制
|
||||
|
||||
在 `.env` 文件中配置:
|
||||
|
||||
```env
|
||||
VNPY_CPU_LIMIT=2.0
|
||||
VNPY_MEMORY_LIMIT=2G
|
||||
WEB_WORKERS=4
|
||||
```
|
||||
|
||||
### 安全建议
|
||||
|
||||
1. **修改默认密码**
|
||||
2. **使用强 JWT 密钥**
|
||||
3. **启用 HTTPS**
|
||||
4. **配置防火墙**
|
||||
5. **定期备份**
|
||||
6. **监控日志**
|
||||
|
||||
---
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 端口冲突
|
||||
|
||||
如果端口被占用,修改 `.env` 中的端口配置:
|
||||
|
||||
```env
|
||||
HTTP_PORT=8001
|
||||
WS_PORT=8081
|
||||
```
|
||||
|
||||
### 权限问题
|
||||
|
||||
```bash
|
||||
# 修复数据目录权限
|
||||
sudo chown -R $USER:$USER ./data
|
||||
sudo chmod -R 755 ./data
|
||||
```
|
||||
|
||||
### 容器无法启动
|
||||
|
||||
```bash
|
||||
# 查看详细日志
|
||||
docker-compose logs vnpy
|
||||
|
||||
# 重新构建
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
### 数据丢失
|
||||
|
||||
确保使用绑定挂载而非命名卷:
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 高级配置
|
||||
|
||||
### 使用 PostgreSQL
|
||||
|
||||
```bash
|
||||
# 启用 PostgreSQL
|
||||
export USE_POSTGRES=1
|
||||
docker-compose --profile postgres up -d
|
||||
```
|
||||
|
||||
### 自定义配置
|
||||
|
||||
```bash
|
||||
# 挂载自定义配置
|
||||
mkdir -p config
|
||||
cp your_config.yaml config/
|
||||
```
|
||||
|
||||
### 多实例部署
|
||||
|
||||
```bash
|
||||
# 修改端口和数据目录
|
||||
docker-compose -f docker-compose.yml -p vnpy2 up -d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 附录
|
||||
|
||||
### Docker Compose 命令参考
|
||||
|
||||
| 命令 | 说明 |
|
||||
|------|------|
|
||||
| `up -d` | 后台启动服务 |
|
||||
| `down` | 停止并删除容器 |
|
||||
| `ps` | 查看服务状态 |
|
||||
| `logs` | 查看日志 |
|
||||
| `exec` | 在容器中执行命令 |
|
||||
| `restart` | 重启服务 |
|
||||
| `build` | 重新构建镜像 |
|
||||
|
||||
### 目录结构
|
||||
|
||||
```
|
||||
sanguo_vnpy_v2/
|
||||
├── docker/
|
||||
│ ├── .env # 环境变量配置
|
||||
│ ├── .env.example # 配置示例
|
||||
│ ├── docker-compose.yml # 编排配置
|
||||
│ ├── Dockerfile # 镜像构建
|
||||
│ ├── entrypoint.sh # 启动脚本
|
||||
│ └── nginx/ # Nginx 配置
|
||||
├── data/ # 数据目录
|
||||
├── logs/ # 日志目录
|
||||
└── docs/ # 文档
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2026-07-01
|
||||
**文档版本**: 1.0.0
|
||||
@@ -0,0 +1,677 @@
|
||||
# Synology NAS 部署指南
|
||||
|
||||
本指南介绍如何在 Synology NAS 上部署 Sanguo VeighNa 量化交易平台。
|
||||
|
||||
## 目录
|
||||
|
||||
- [前置要求](#前置要求)
|
||||
- [快速开始](#快速开始)
|
||||
- [详细步骤](#详细步骤)
|
||||
- [配置说明](#配置说明)
|
||||
- [访问界面](#访问界面)
|
||||
- [数据备份](#数据备份)
|
||||
- [故障排除](#故障排除)
|
||||
- [升级指南](#升级指南)
|
||||
|
||||
---
|
||||
|
||||
## 前置要求
|
||||
|
||||
### 硬件要求
|
||||
|
||||
- **Synology NAS**:DSM 7.x 或更高版本
|
||||
- **内存**:至少 2GB 可用内存(推荐 4GB+)
|
||||
- **存储**:至少 10GB 可用存储空间(用于数据和日志)
|
||||
|
||||
### 软件要求
|
||||
|
||||
- **Container Manager**(或 Docker 套件)
|
||||
- SSH 访问权限(用于高级操作)
|
||||
- 文本编辑器(如 Text Editor、vim)
|
||||
|
||||
### 网络要求
|
||||
|
||||
- 固定 IP 地址(推荐)
|
||||
- 或使用 DDNS 服务
|
||||
- 开放相应端口(默认 8000)
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 开启 SSH 访问
|
||||
|
||||
在 DSM 控制面板中:
|
||||
1. 进入 **控制面板** > **终端机和 SNMP**
|
||||
2. 勾选 **启用 SSH 服务**
|
||||
3. 端口使用默认 22
|
||||
4. 点击 **应用**
|
||||
|
||||
### 2. SSH 登录 NAS
|
||||
|
||||
```bash
|
||||
ssh admin@your-nas-ip
|
||||
# 或
|
||||
ssh your-username@your-nas-ip
|
||||
```
|
||||
|
||||
### 3. 创建数据目录
|
||||
|
||||
```bash
|
||||
# 创建主目录
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy
|
||||
|
||||
# 创建子目录
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/{data,logs,config,temp,redis,nginx}
|
||||
```
|
||||
|
||||
### 4. 上传项目文件
|
||||
|
||||
在本地电脑上执行:
|
||||
|
||||
```bash
|
||||
# 压缩项目文件
|
||||
tar czf sanguo_vnpy_v2.tar.gz sanguo_vnpy_v2/
|
||||
|
||||
# 上传到 NAS
|
||||
scp sanguo_vnpy_v2.tar.gz admin@your-nas-ip:/tmp/
|
||||
|
||||
# 或使用 rsync
|
||||
rsync -avz sanguo_vnpy_v2/ admin@your-nas-ip:/volume1/docker/containers/sanguo_vnpy_v2/
|
||||
```
|
||||
|
||||
在 NAS 上解压:
|
||||
|
||||
```bash
|
||||
# SSH 登录后执行
|
||||
cd /volume1/docker/containers/
|
||||
sudo tar xzf /tmp/sanguo_vnpy_v2.tar.gz
|
||||
```
|
||||
|
||||
### 5. 配置环境变量
|
||||
|
||||
```bash
|
||||
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
|
||||
sudo cp .env.example .env
|
||||
sudo vi .env # 或使用其他编辑器
|
||||
```
|
||||
|
||||
关键配置项:
|
||||
|
||||
```env
|
||||
# 数据目录 - 确保 此目录存在
|
||||
DATA_DIR=/volume1/docker/stock/sanguo_vnpy
|
||||
|
||||
# 端口配置 - 根据需要修改
|
||||
HTTP_PORT=8000
|
||||
WS_PORT=8080
|
||||
|
||||
# 时区
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# JWT 密钥 - 请修改为随机字符串
|
||||
JWT_SECRET_KEY=your-random-secret-key-here
|
||||
```
|
||||
|
||||
### 6. 启动服务
|
||||
|
||||
```bash
|
||||
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
### 7. 检查运行状态
|
||||
|
||||
```bash
|
||||
# 查看容器状态
|
||||
sudo docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
sudo docker-compose logs -f vnpy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 详细步骤
|
||||
|
||||
### 步骤 1: 准备数据目录
|
||||
|
||||
创建完整的目录结构:
|
||||
|
||||
```bash
|
||||
# 主目录
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy
|
||||
|
||||
# 数据子目录
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/data # 数据库和数据文件
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/logs # 运行日志
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/config # 配置文件
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/temp # 临时文件
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/redis # Redis 持久化
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/nginx # Nginx 相关
|
||||
sudo mkdir -p /volume1/docker/stock/sanguo_vnpy/nginx/ssl # SSL 证书
|
||||
|
||||
# 设置权限
|
||||
sudo chmod -R 755 /volume1/docker/stock/sanguo_vnpy
|
||||
```
|
||||
|
||||
### 步骤 2: 配置 Docker Compose
|
||||
|
||||
编辑 `.env` 文件:
|
||||
|
||||
```bash
|
||||
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
|
||||
sudo cp .env.example .env
|
||||
sudo vi .env
|
||||
```
|
||||
|
||||
完整配置示例:
|
||||
|
||||
```env
|
||||
# ============================================
|
||||
# 数据目录配置
|
||||
# ============================================
|
||||
DATA_DIR=/volume1/docker/stock/sanguo_vnpy
|
||||
|
||||
# ============================================
|
||||
# 端口配置
|
||||
# ============================================
|
||||
HTTP_PORT=8000
|
||||
WS_PORT=8080
|
||||
NGINX_HTTP_PORT=80
|
||||
NGINX_HTTPS_PORT=443
|
||||
|
||||
# ============================================
|
||||
# 时区配置
|
||||
# ============================================
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# ============================================
|
||||
# VeighNa 配置
|
||||
# ============================================
|
||||
VNPY_LOG_LEVEL=INFO
|
||||
VNPY_LOG_FILE=/app/logs/vnpy.log
|
||||
|
||||
# ============================================
|
||||
# 数据库配置
|
||||
# ============================================
|
||||
DB_TYPE=sqlite
|
||||
DB_PATH=/app/data/vnpy.db
|
||||
|
||||
# ============================================
|
||||
# Web 服务配置
|
||||
# ============================================
|
||||
WEB_HOST=0.0.0.0
|
||||
WEB_PORT=8000
|
||||
WEB_WORKERS=2
|
||||
|
||||
# ============================================
|
||||
# 安全配置
|
||||
# ============================================
|
||||
JWT_SECRET_KEY=please-change-this-to-a-secure-random-key
|
||||
SESSION_TIMEOUT=3600
|
||||
|
||||
# ============================================
|
||||
# 资源限制
|
||||
# ============================================
|
||||
VNPY_CPU_LIMIT=2.0
|
||||
VNPY_MEMORY_LIMIT=2G
|
||||
```
|
||||
|
||||
### 步骤 3: 构建和启动
|
||||
|
||||
```bash
|
||||
# 构建镜像(首次运行)
|
||||
sudo docker-compose build
|
||||
|
||||
# 启动服务
|
||||
sudo docker-compose up -d
|
||||
|
||||
# 查看启动日志
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
|
||||
### 步骤 4: 验证部署
|
||||
|
||||
```bash
|
||||
# 检查容器状态
|
||||
sudo docker-compose ps
|
||||
|
||||
# 应该看到类似输出:
|
||||
# NAME STATUS PORTS
|
||||
# sanguo-vnpy Up 0.0.0.0:8000->8000/tcp
|
||||
# sanguo-redis Up 6379/tcp
|
||||
|
||||
# 检查日志
|
||||
sudo docker-compose logs vnpy | tail -20
|
||||
|
||||
# 进入容器检查
|
||||
sudo docker-compose exec vnpy bash
|
||||
ls -la /app/data
|
||||
exit
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 配置说明
|
||||
|
||||
### 端口配置
|
||||
|
||||
| 端口 | 用途 | 说明 |
|
||||
|------|------|------|
|
||||
| 8000 | HTTP API | Web 界面和 REST API |
|
||||
| 8080 | WebSocket | 实时数据推送 |
|
||||
| 80 | Nginx HTTP | 反向代理(可选) |
|
||||
| 443 | Nginx HTTPS | SSL 反向代理(可选) |
|
||||
|
||||
### 目录映射
|
||||
|
||||
| 容器路径 | 宿主机路径 | 说明 |
|
||||
|----------|------------|------|
|
||||
| /app/data | `{DATA_DIR}/data` | 数据库和数据文件 |
|
||||
| /app/logs | `{DATA_DIR}/logs` | 运行日志 |
|
||||
| /app/config | `{DATA_DIR}/config` | 配置文件 |
|
||||
| /app/temp | `{DATA_DIR}/temp` | 临时文件 |
|
||||
| /data | `{DATA_DIR}/redis` | Redis 持久化数据 |
|
||||
|
||||
### 资源限制
|
||||
|
||||
默认资源限制(可在 `.env` 中调整):
|
||||
|
||||
| 服务 | CPU 限制 | 内存限制 |
|
||||
|------|----------|----------|
|
||||
| vnpy | 2.0 | 2G |
|
||||
| redis | 0.5 | 256M |
|
||||
| nginx | 0.5 | 256M |
|
||||
|
||||
---
|
||||
|
||||
## 访问界面
|
||||
|
||||
### Web 界面
|
||||
|
||||
启动成功后,可以通过以下地址访问:
|
||||
|
||||
```
|
||||
http://your-nas-ip:8000
|
||||
```
|
||||
|
||||
### 默认登录凭据
|
||||
|
||||
- **用户名**: `admin`
|
||||
- **密码**: `admin123`
|
||||
|
||||
**重要**: 首次登录后请立即修改密码!
|
||||
|
||||
### WebSocket 连接
|
||||
|
||||
WebSocket 端点:
|
||||
|
||||
```
|
||||
ws://your-nas-ip:8080
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 数据备份
|
||||
|
||||
### 重要数据位置
|
||||
|
||||
所有重要数据都存储在 `/volume1/docker/stock/sanguo_vnpy/`:
|
||||
|
||||
```
|
||||
/volume1/docker/stock/sanguo_vnpy/
|
||||
├── data/ # 数据库和数据文件
|
||||
├── logs/ # 运行日志
|
||||
├── config/ # 配置文件
|
||||
├── redis/ # Redis 持久化数据
|
||||
└── nginx/ # Nginx 配置和证书
|
||||
```
|
||||
|
||||
### 备份方法
|
||||
|
||||
#### 方法 1: 使用 Hyper Backup 套件(推荐)
|
||||
|
||||
1. 打开 **Hyper Backup**
|
||||
2. 创建新备份任务
|
||||
3. 选择 **从文件夹备份**
|
||||
4. 选择 `/volume1/docker/stock/sanguo_vnpy/`
|
||||
5. 配置备份目标和计划
|
||||
|
||||
#### 方法 2: 手动备份
|
||||
|
||||
```bash
|
||||
# 创建备份
|
||||
sudo tar czf \
|
||||
/volume1/Backup/vnpy_backup_$(date +%Y%m%d_%H%M%S).tar.gz \
|
||||
/volume1/docker/stock/sanguo_vnpy/
|
||||
|
||||
# 列出备份文件
|
||||
ls -lh /volume1/Backup/vnpy_backup_*
|
||||
|
||||
# 恢复备份
|
||||
sudo tar xzf \
|
||||
/volume1/Backup/vnpy_backup_YYYYMMDD_HHMMSS.tar.gz \
|
||||
-C /
|
||||
```
|
||||
|
||||
#### 方法 3: 使用 rsync 同步到其他位置
|
||||
|
||||
```bash
|
||||
# 同步到另一个共享文件夹
|
||||
sudo rsync -avz \
|
||||
/volume1/docker/stock/sanguo_vnpy/ \
|
||||
/volume1/Backup/sanguo_vnpy_backup/
|
||||
|
||||
# 同步到远程服务器
|
||||
rsync -avz -e ssh \
|
||||
/volume1/docker/stock/sanguo_vnpy/ \
|
||||
user@remote-server:/backup/path/
|
||||
```
|
||||
|
||||
### 自动备份脚本
|
||||
|
||||
创建定时任务:
|
||||
|
||||
```bash
|
||||
# 创建备份脚本
|
||||
sudo vi /volume1/docker/stock/backup_vnpy.sh
|
||||
```
|
||||
|
||||
脚本内容:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Sanguo VeighNa 自动备份脚本
|
||||
|
||||
BACKUP_DIR="/volume1/Backup"
|
||||
DATA_DIR="/volume1/docker/stock/sanguo_vnpy"
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_FILE="$BACKUP_DIR/vnpy_backup_$TIMESTAMP.tar.gz"
|
||||
|
||||
# 保留最近 7 天的备份
|
||||
find $BACKUP_DIR -name "vnpy_backup_*.tar.gz" -mtime +7 -delete
|
||||
|
||||
# 创建备份
|
||||
tar czf $BACKUP_FILE $DATA_DIR
|
||||
|
||||
# 记录日志
|
||||
echo "Backup created: $BACKUP_FILE" >> $BACKUP_DIR/backup.log
|
||||
|
||||
echo "Backup completed: $BACKUP_FILE"
|
||||
```
|
||||
|
||||
设置定时任务:
|
||||
|
||||
```bash
|
||||
# 给脚本执行权限
|
||||
sudo chmod +x /volume1/docker/stock/backup_vnpy.sh
|
||||
|
||||
# 添加到 crontab(每天凌晨 2 点执行)
|
||||
sudo crontab -e
|
||||
|
||||
# 添加以下行
|
||||
0 2 * * * /volume1/docker/stock/backup_vnpy.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### 1. 容器无法启动
|
||||
|
||||
**检查日志**:
|
||||
|
||||
```bash
|
||||
sudo docker-compose logs vnpy
|
||||
```
|
||||
|
||||
**常见原因**:
|
||||
|
||||
- 端口被占用:修改 `.env` 中的端口配置
|
||||
- 数据目录不存在:创建所需目录
|
||||
- 权限问题:检查目录权限
|
||||
|
||||
#### 2. 数据目录权限问题
|
||||
|
||||
```bash
|
||||
# 修复权限
|
||||
sudo chown -R $(id -u):$(id -g) /volume1/docker/stock/sanguo_vnpy
|
||||
sudo chmod -R 755 /volume1/docker/stock/sanguo_vnpy
|
||||
```
|
||||
|
||||
#### 3. 端口冲突
|
||||
|
||||
```bash
|
||||
# 检查端口占用
|
||||
sudo netstat -tulpn | grep :8000
|
||||
|
||||
# 或使用 lsof
|
||||
sudo lsof -i :8000
|
||||
```
|
||||
|
||||
#### 4. Redis 连接失败
|
||||
|
||||
```bash
|
||||
# 检查 Redis 容器
|
||||
sudo docker-compose logs redis
|
||||
|
||||
# 重启 Redis
|
||||
sudo docker-compose restart redis
|
||||
|
||||
# 跳过 Redis 检查(开发环境)
|
||||
# 在 .env 中设置
|
||||
SKIP_REDIS_CHECK=1
|
||||
```
|
||||
|
||||
#### 5. 日志文件过大
|
||||
|
||||
```bash
|
||||
# 清理旧日志
|
||||
sudo find /volume1/docker/stock/sanguo_vnpy/logs -name "*.log" -mtime +30 -delete
|
||||
|
||||
# 或配置日志轮转
|
||||
sudo vi /etc/logrotate.d/vnpy
|
||||
```
|
||||
|
||||
### 重置部署
|
||||
|
||||
如果需要完全重置:
|
||||
|
||||
```bash
|
||||
# 停止并删除容器
|
||||
sudo docker-compose down
|
||||
|
||||
# 备份数据
|
||||
sudo cp -r /volume1/docker/stock/sanguo_vnpy /volume1/Backup/
|
||||
|
||||
# 清理数据(谨慎操作)
|
||||
sudo rm -rf /volume1/docker/stock/sanguo_vnpy/data/*
|
||||
sudo rm -rf /volume1/docker/stock/sanguo_vnpy/logs/*
|
||||
|
||||
# 重新启动
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 升级指南
|
||||
|
||||
### 升级步骤
|
||||
|
||||
1. **备份当前版本**:
|
||||
|
||||
```bash
|
||||
# 备份数据
|
||||
sudo tar czf /volume1/Backup/vnpy_pre_upgrade_$(date +%Y%m%d).tar.gz \
|
||||
/volume1/docker/stock/sanguo_vnpy/
|
||||
```
|
||||
|
||||
2. **下载新版本**:
|
||||
|
||||
```bash
|
||||
# 停止服务
|
||||
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
|
||||
sudo docker-compose down
|
||||
```
|
||||
|
||||
3. **替换项目文件**:
|
||||
|
||||
```bash
|
||||
# 备份旧代码
|
||||
sudo mv /volume1/docker/containers/sanguo_vnpy_v2 \
|
||||
/volume1/docker/containers/sanguo_vnpy_v2_old
|
||||
|
||||
# 解压新版本
|
||||
sudo tar xzf /tmp/sanguo_vnpy_v2_new.tar.gz -C /volume1/docker/containers/
|
||||
```
|
||||
|
||||
4. **复制配置**:
|
||||
|
||||
```bash
|
||||
# 复制 .env 配置
|
||||
sudo cp /volume1/docker/containers/sanguo_vnpy_v2_old/docker/.env \
|
||||
/volume1/docker/containers/sanguo_vnpy_v2/docker/.env
|
||||
```
|
||||
|
||||
5. **启动新版本**:
|
||||
|
||||
```bash
|
||||
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
|
||||
sudo docker-compose up -d --build
|
||||
```
|
||||
|
||||
6. **验证升级**:
|
||||
|
||||
```bash
|
||||
# 检查状态
|
||||
sudo docker-compose ps
|
||||
sudo docker-compose logs -f
|
||||
```
|
||||
|
||||
### 回滚
|
||||
|
||||
如果升级失败:
|
||||
|
||||
```bash
|
||||
# 停止新版本
|
||||
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
|
||||
sudo docker-compose down
|
||||
|
||||
# 恢复旧版本
|
||||
sudo mv /volume1/docker/containers/sanguo_vnpy_v2 \
|
||||
/volume1/docker/containers/sanguo_vnpy_v2_new
|
||||
sudo mv /volume1/docker/containers/sanguo_vnpy_v2_old \
|
||||
/volume1/docker/containers/sanguo_vnpy_v2
|
||||
|
||||
# 启动旧版本
|
||||
cd /volume1/docker/containers/sanguo_vnpy_v2/docker
|
||||
sudo docker-compose up -d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 资源调整
|
||||
|
||||
根据 NAS 配置调整资源限制:
|
||||
|
||||
```env
|
||||
# .env 文件中
|
||||
VNPY_CPU_LIMIT=4.0 # 增加 CPU
|
||||
VNPY_MEMORY_LIMIT=4G # 增加内存
|
||||
WEB_WORKERS=4 # 增加 Worker 数量
|
||||
```
|
||||
|
||||
### 存储优化
|
||||
|
||||
- 将数据目录放在 SSD 缓存盘上(如果有)
|
||||
- 定期清理旧日志
|
||||
- 使用数据库的 VACUUM 功能优化 SQLite
|
||||
|
||||
### 网络优化
|
||||
|
||||
- 使用有线网络连接
|
||||
- 配置 QoS 优先级
|
||||
- 考虑使用本地网络而非远程访问
|
||||
|
||||
---
|
||||
|
||||
## 安全建议
|
||||
|
||||
1. **修改默认密码**:首次登录后立即修改
|
||||
2. **使用 HTTPS**:配置 SSL 证书
|
||||
3. **限制访问**:使用防火墙规则
|
||||
4. **定期备份**:设置自动备份任务
|
||||
5. **更新系统**:保持 DSM 和套件更新
|
||||
6. **监控日志**:定期检查访问日志
|
||||
|
||||
---
|
||||
|
||||
## 附录
|
||||
|
||||
### A. Docker Compose 常用命令
|
||||
|
||||
```bash
|
||||
# 启动服务
|
||||
sudo docker-compose up -d
|
||||
|
||||
# 停止服务
|
||||
sudo docker-compose down
|
||||
|
||||
# 重启服务
|
||||
sudo docker-compose restart
|
||||
|
||||
# 查看状态
|
||||
sudo docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
sudo docker-compose logs -f
|
||||
|
||||
# 进入容器
|
||||
sudo docker-compose exec vnpy bash
|
||||
|
||||
# 更新并重启
|
||||
sudo docker-compose up -d --build
|
||||
|
||||
# 删除容器和数据(危险)
|
||||
sudo docker-compose down -v
|
||||
```
|
||||
|
||||
### B. 目录结构参考
|
||||
|
||||
```
|
||||
/volume1/docker/
|
||||
├── stock/
|
||||
│ └── sanguo_vnpy/
|
||||
│ ├── data/ # 数据库
|
||||
│ ├── logs/ # 日志
|
||||
│ ├── config/ # 配置
|
||||
│ ├── temp/ # 临时文件
|
||||
│ ├── redis/ # Redis 数据
|
||||
│ └── nginx/ # Nginx 相关
|
||||
└── containers/
|
||||
└── sanguo_vnpy_v2/ # 项目文件
|
||||
└── docker/
|
||||
├── .env
|
||||
├── .env.example
|
||||
├── docker-compose.yml
|
||||
├── Dockerfile
|
||||
└── entrypoint.sh
|
||||
```
|
||||
|
||||
### C. 支持和反馈
|
||||
|
||||
如有问题,请通过以下方式获取支持:
|
||||
|
||||
- GitHub Issues
|
||||
- 项目文档
|
||||
- 社区论坛
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2026-07-01
|
||||
**文档版本**: 1.0.0
|
||||
@@ -0,0 +1,894 @@
|
||||
# Docker Web 版本部署设计
|
||||
|
||||
## 1. 架构概述
|
||||
|
||||
### 1.1 整体架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ NAS 系统 │
|
||||
│ │
|
||||
│ ┌────────────────────────────────────────────┐ │
|
||||
│ │ Docker 容器 │ │
|
||||
│ │ │ │
|
||||
│ │ ┌───────────────────────────────────────┐ │ │
|
||||
│ │ │ Nginx (反向代理) │ │ │
|
||||
│ │ │ - HTTPS │ │ │
|
||||
│ │ │ - 静态文件服务 │ │ │
|
||||
│ │ └───────────────────────────────────────┘ │ │
|
||||
│ │ ↑ │ │
|
||||
│ │ ┌───────────────────────────────────────┐ │ │
|
||||
│ │ │ FastAPI Web 服务 │ │ │
|
||||
│ │ │ - REST API │ │ │
|
||||
│ │ │ - WebSocket (实时行情) │ │ │
|
||||
│ │ │ - 认证授权 │ │ │
|
||||
│ │ └───────────────────────────────────────┘ │ │
|
||||
│ │ ↑ │ │
|
||||
│ │ ┌───────────────────────────────────────┐ │ │
|
||||
│ │ │ VeighNa 核心引擎 │ │ │
|
||||
│ │ │ - 交易接口 │ │ │
|
||||
│ │ │ - 策略引擎 │ │ │
|
||||
│ │ │ - 事件引擎 │ │ │
|
||||
│ │ └───────────────────────────────────────┘ │ │
|
||||
│ │ │ │
|
||||
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
|
||||
│ │ │ SQLite │ │ 数据文件 │ │ 日志文件 │ │ │
|
||||
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
|
||||
│ │ ↓ ↓ ↓ │ │
|
||||
│ │ 持久化卷 (Docker Volume) │ │
|
||||
│ └────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ NAS 存储 (数据持久化) │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 1.2 组件说明
|
||||
|
||||
| 组件 | 技术 | 说明 |
|
||||
|-----|------|------|
|
||||
| Web 框架 | FastAPI | 高性能异步 Web 框架 |
|
||||
| 前端 | Vue.js 3 | 现代化响应式界面 |
|
||||
| 反向代理 | Nginx | HTTPS + 静态文件 |
|
||||
| 数据库 | SQLite | 轻量级,可选 PostgreSQL |
|
||||
| 实时通信 | WebSocket | 行情推送 |
|
||||
| 容器编排 | Docker Compose | 多容器管理 |
|
||||
|
||||
## 2. 技术方案
|
||||
|
||||
### 2.1 目录结构
|
||||
|
||||
```
|
||||
sanguo_vnpy_v2/
|
||||
├── docker/
|
||||
│ ├── Dockerfile # 主容器镜像
|
||||
│ ├── docker-compose.yml # 编排配置
|
||||
│ ├── nginx/
|
||||
│ │ ├── Dockerfile # Nginx 镜像
|
||||
│ │ ├── nginx.conf # Nginx 配置
|
||||
│ │ └── ssl/ # SSL 证书
|
||||
│ ├── entrypoint.sh # 启动脚本
|
||||
│ └── requirements-docker.txt # Docker 依赖
|
||||
├── sanguo_web/ # Web 服务
|
||||
│ ├── api/ # FastAPI 接口
|
||||
│ │ ├── trading.py # 交易接口
|
||||
│ │ ├── strategy.py # 策略接口
|
||||
│ │ ├── data.py # 数据接口
|
||||
│ │ └── auth.py # 认证接口
|
||||
│ ├── websocket/ # WebSocket 处理
|
||||
│ │ └── handler.py # 行情推送
|
||||
│ ├── static/ # 前端静态文件
|
||||
│ └── templates/ # HTML 模板
|
||||
└── config/
|
||||
├── docker_config.json # Docker 配置
|
||||
└── users.json # 用户配置
|
||||
```
|
||||
|
||||
### 2.2 Dockerfile 设计
|
||||
|
||||
```dockerfile
|
||||
# 多阶段构建
|
||||
FROM python:3.11-slim as builder
|
||||
|
||||
# 安装编译依赖
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc g++ make \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# 安装 TA-Lib
|
||||
ENV TA_LIBRARY_PATH=/usr/local/lib
|
||||
RUN wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz && \
|
||||
tar -xzf ta-lib-0.4.0-src.tar.gz && \
|
||||
cd ta-lib && \
|
||||
./configure --prefix=/usr && \
|
||||
make && make install
|
||||
|
||||
# 复制依赖文件
|
||||
COPY requirements-docker.txt .
|
||||
RUN pip install --no-cache-dir -r requirements-docker.txt
|
||||
|
||||
# 运行阶段
|
||||
FROM python:3.11-slim
|
||||
|
||||
# 复译 TA-Lib
|
||||
COPY --from=builder /usr/lib/libta*.* /usr/local/lib/
|
||||
COPY --from=builder /usr/include/ta-lib/ /usr/include/
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /app
|
||||
|
||||
# 复制应用代码
|
||||
COPY sanguo_trader/ ./sanguo_trader/
|
||||
COPY sanguo_research/ ./sanguo_research/
|
||||
COPY sanguo_data/ ./sanguo_data/
|
||||
COPY sanguo_common/ ./sanguo_common/
|
||||
COPY sanguo_web/ ./sanguo_web/
|
||||
COPY vnpy_v4.4.0/vnpy/ ./vnpy/
|
||||
COPY config/ ./config/
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 8000 8080
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:8000/health || exit 1
|
||||
|
||||
# 启动命令
|
||||
COPY docker/entrypoint.sh .
|
||||
RUN chmod +x entrypoint.sh
|
||||
ENTRYPOINT ["./entrypoint.sh"]
|
||||
```
|
||||
|
||||
### 2.3 Docker Compose 配置
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
vnpy:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
container_name: sanguo-vnpy
|
||||
restart: unless-stopped
|
||||
|
||||
# 环境变量
|
||||
environment:
|
||||
- PYTHONUNBUFFERED=1
|
||||
- TZ=Asia/Shanghai
|
||||
- VNPY_LOG_LEVEL=INFO
|
||||
|
||||
# 端口映射
|
||||
ports:
|
||||
- "8000:8000" # FastAPI
|
||||
- "8080:8080" # WebSocket
|
||||
|
||||
# 数据卷
|
||||
volumes:
|
||||
- vnpy_data:/app/data
|
||||
- vnpy_logs:/app/logs
|
||||
- vnpy_config:/app/config
|
||||
- ./config:/app/config:ro
|
||||
|
||||
# 网络
|
||||
networks:
|
||||
- vnpy-network
|
||||
|
||||
nginx:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/nginx/Dockerfile
|
||||
container_name: sanguo-nginx
|
||||
restart: unless-stopped
|
||||
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
|
||||
volumes:
|
||||
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- ./docker/nginx/ssl:/etc/nginx/ssl:ro
|
||||
- nginx_cache:/var/cache/nginx
|
||||
|
||||
depends_on:
|
||||
- vnpy
|
||||
|
||||
networks:
|
||||
- vnpy-network
|
||||
|
||||
# 数据卷
|
||||
volumes:
|
||||
vnpy_data:
|
||||
driver: local
|
||||
vnpy_logs:
|
||||
driver: local
|
||||
vnpy_config:
|
||||
driver: local
|
||||
nginx_cache:
|
||||
driver: local
|
||||
|
||||
# 网络
|
||||
networks:
|
||||
vnpy-network:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
### 2.4 Web API 设计
|
||||
|
||||
#### REST API 端点
|
||||
|
||||
```python
|
||||
# sanguo_web/api/__init__.py
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
app = FastAPI(
|
||||
title="Sanguo VeighNa Web",
|
||||
description="量化交易平台 Web API",
|
||||
version="1.0.0"
|
||||
)
|
||||
|
||||
# CORS 配置
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# 挂载静态文件
|
||||
app.mount("/static", StaticFiles(directory="static"), name="static")
|
||||
|
||||
# API 路由
|
||||
from . import trading, strategy, data, auth
|
||||
|
||||
app.include_router(trading.router, prefix="/api/trading", tags=["交易"])
|
||||
app.include_router(strategy.router, prefix="/api/strategy", tags=["策略"])
|
||||
app.include_router(data.router, prefix="/api/data", tags=["数据"])
|
||||
app.include_router(auth.router, prefix="/api/auth", tags=["认证"])
|
||||
```
|
||||
|
||||
#### 交易接口示例
|
||||
|
||||
```python
|
||||
# sanguo_web/api/trading.py
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from pydantic import BaseModel
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
class OrderRequest(BaseModel):
|
||||
symbol: str
|
||||
exchange: str
|
||||
direction: str
|
||||
offset: str
|
||||
price: float
|
||||
volume: int
|
||||
price_type: str = "LIMIT"
|
||||
|
||||
@router.post("/orders")
|
||||
async def send_order(req: OrderRequest):
|
||||
"""发送订单"""
|
||||
# 调用 VeighNa 引擎
|
||||
order_id = engine.send_order(req)
|
||||
return {"status": "success", "order_id": order_id}
|
||||
|
||||
@router.delete("/orders/{order_id}")
|
||||
async def cancel_order(order_id: str):
|
||||
"""撤销订单"""
|
||||
engine.cancel_order(order_id)
|
||||
return {"status": "success"}
|
||||
|
||||
@router.get("/orders")
|
||||
async def get_orders():
|
||||
"""查询订单"""
|
||||
orders = engine.get_all_orders()
|
||||
return {"orders": orders}
|
||||
|
||||
@router.get("/positions")
|
||||
async def get_positions():
|
||||
"""查询持仓"""
|
||||
positions = engine.get_all_positions()
|
||||
return {"positions": positions}
|
||||
```
|
||||
|
||||
### 2.5 WebSocket 行情推送
|
||||
|
||||
```python
|
||||
# sanguo_web/websocket/handler.py
|
||||
|
||||
from fastapi import WebSocket
|
||||
from typing import Dict
|
||||
import json
|
||||
|
||||
active_connections: Dict[str, WebSocket] = {}
|
||||
|
||||
async def websocket_endpoint(websocket: WebSocket, client_id: str):
|
||||
await websocket.accept()
|
||||
active_connections[client_id] = websocket
|
||||
|
||||
try:
|
||||
while True:
|
||||
# 接收客户端消息
|
||||
data = await websocket.receive_text()
|
||||
msg = json.loads(data)
|
||||
|
||||
if msg["type"] == "subscribe":
|
||||
# 订阅行情
|
||||
subscribe_market_data(client_id, msg["symbol"])
|
||||
elif msg["type"] == "unsubscribe":
|
||||
# 取消订阅
|
||||
unsubscribe_market_data(client_id, msg["symbol"])
|
||||
|
||||
except Exception as e:
|
||||
print(f"Connection error: {e}")
|
||||
finally:
|
||||
del active_connections[client_id]
|
||||
|
||||
async def broadcast_tick(tick_data):
|
||||
"""广播行情数据"""
|
||||
tick_json = json.dumps({
|
||||
"type": "tick",
|
||||
"data": tick_data
|
||||
})
|
||||
|
||||
for connection in active_connections.values():
|
||||
await connection.send_text(tick_json)
|
||||
```
|
||||
|
||||
## 3. 部署方案
|
||||
|
||||
### 3.1 NAS 部署步骤
|
||||
|
||||
#### Synology NAS
|
||||
```bash
|
||||
# 1. 安装 Container Manager
|
||||
# 2. 导入镜像
|
||||
# 3. 创建项目
|
||||
# 4. 启动容器
|
||||
```
|
||||
|
||||
#### QNAP NAS
|
||||
```bash
|
||||
# 1. 安装 Container Station
|
||||
# 2. 导入镜像
|
||||
# 3. 创建容器
|
||||
# 4. 启动
|
||||
```
|
||||
|
||||
#### 通用 Linux NAS
|
||||
```bash
|
||||
# 1. 克隆项目
|
||||
git clone http://192.168.2.154:3000/sanguo/sanguo_vnpy_v2
|
||||
|
||||
# 2. 启动服务
|
||||
cd sanguo_vnpy_v2
|
||||
docker-compose up -d
|
||||
|
||||
# 3. 查看日志
|
||||
docker-compose logs -f
|
||||
|
||||
# 4. 停止服务
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
### 3.2 配置管理
|
||||
|
||||
```yaml
|
||||
# config/docker_config.json
|
||||
{
|
||||
"server": {
|
||||
"host": "0.0.0.0",
|
||||
"port": 8000,
|
||||
"workers": 4
|
||||
},
|
||||
"database": {
|
||||
"type": "sqlite",
|
||||
"path": "/app/data/vnpy.db"
|
||||
},
|
||||
"logging": {
|
||||
"level": "INFO",
|
||||
"path": "/app/logs"
|
||||
},
|
||||
"security": {
|
||||
"enable_auth": true,
|
||||
"jwt_secret": "your-secret-key",
|
||||
"session_timeout": 3600
|
||||
},
|
||||
"trading": {
|
||||
"gateway_name": "CTP",
|
||||
"md_address": "",
|
||||
"td_address": "",
|
||||
"userid": "",
|
||||
"password": "",
|
||||
"appid": "",
|
||||
"authcode": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 数据持久化
|
||||
|
||||
```bash
|
||||
# Docker 卷管理
|
||||
docker volume create vnpy_data
|
||||
docker volume create vnpy_logs
|
||||
docker volume create vnpy_config
|
||||
|
||||
# 查看卷
|
||||
docker volume ls
|
||||
|
||||
# 备份数据
|
||||
docker run --rm -v vnpy_data:/data -v $(pwd):/backup \
|
||||
alpine tar czf /backup/vnpy_data_backup.tar.gz /data
|
||||
```
|
||||
|
||||
## 4. 安全设计
|
||||
|
||||
### 4.1 认证方案
|
||||
|
||||
```python
|
||||
# sanguo_web/api/auth.py
|
||||
|
||||
from fastapi import APIRouter, HTTPException, Depends
|
||||
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||||
import jwt
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
router = APIRouter()
|
||||
security = HTTPBearer()
|
||||
SECRET_KEY = "your-secret-key"
|
||||
|
||||
@router.post("/login")
|
||||
async def login(username: str, password: str):
|
||||
"""用户登录"""
|
||||
# 验证用户名密码
|
||||
if verify_user(username, password):
|
||||
token = create_access_token(username)
|
||||
return {"access_token": token}
|
||||
raise HTTPException(401, "Invalid credentials")
|
||||
|
||||
@router.get("/verify")
|
||||
async def verify_token(
|
||||
credentials: HTTPAuthorizationCredentials = Depends(security)
|
||||
):
|
||||
"""验证 Token"""
|
||||
try:
|
||||
payload = jwt.decode(
|
||||
credentials.credentials,
|
||||
SECRET_KEY,
|
||||
algorithms=["HS256"]
|
||||
)
|
||||
return {"valid": True, "user": payload["sub"]}
|
||||
except:
|
||||
raise HTTPException(401, "Invalid token")
|
||||
```
|
||||
|
||||
### 4.2 HTTPS 配置
|
||||
|
||||
```nginx
|
||||
# docker/nginx/nginx.conf
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name localhost;
|
||||
|
||||
ssl_certificate /etc/nginx/ssl/cert.pem;
|
||||
ssl_certificate_key /etc/nginx/ssl/key.pem;
|
||||
|
||||
location / {
|
||||
proxy_pass http://vnpy:8000;
|
||||
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;
|
||||
|
||||
# WebSocket 支持
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
|
||||
location /static/ {
|
||||
alias /app/static/;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 监控与日志
|
||||
|
||||
### 5.1 健康检查
|
||||
|
||||
```python
|
||||
@app.get("/health")
|
||||
async def health_check():
|
||||
"""健康检查接口"""
|
||||
return {
|
||||
"status": "healthy",
|
||||
"services": {
|
||||
"database": check_database(),
|
||||
"gateway": check_gateway(),
|
||||
"strategy": check_strategy()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 日志配置
|
||||
|
||||
```python
|
||||
# sanguo_common/logger.py
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
def setup_logger():
|
||||
"""配置日志"""
|
||||
log_path = Path("/app/logs")
|
||||
log_path.mkdir(exist_ok=True)
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||
handlers=[
|
||||
logging.FileHandler(log_path / "vnpy.log"),
|
||||
logging.StreamHandler()
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
## 6. 扩展设计
|
||||
|
||||
### 6.1 多容器部署
|
||||
|
||||
```yaml
|
||||
# docker-compose.cluster.yml
|
||||
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
vnpy-api:
|
||||
<<: *vnpy-service
|
||||
container_name: sanguo-vnpy-api-1
|
||||
|
||||
vnpy-api-2:
|
||||
<<: *vnpy-service
|
||||
container_name: sanguo-vnpy-api-2
|
||||
|
||||
nginx:
|
||||
# 负载均衡配置
|
||||
# ...
|
||||
```
|
||||
|
||||
### 6.2 数据库升级
|
||||
|
||||
```yaml
|
||||
# 使用 PostgreSQL
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15
|
||||
container_name: sanguo-db
|
||||
environment:
|
||||
POSTGRES_DB: vnpy
|
||||
POSTGRES_USER: vnpy
|
||||
POSTGRES_PASSWORD: password
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
```
|
||||
|
||||
## 7. 实施计划
|
||||
|
||||
### 阶段 1: 基础框架
|
||||
- [ ] 创建 Dockerfile
|
||||
- [ ] 创建 docker-compose.yml
|
||||
- [ ] 实现基础 Web API
|
||||
- [ ] 实现认证授权
|
||||
|
||||
### 阶段 2: 核心功能
|
||||
- [ ] 实现交易接口
|
||||
- [ ] 实现策略接口
|
||||
- [ ] 实现 WebSocket 行情
|
||||
- [ ] 实现数据查询接口
|
||||
|
||||
### 阶段 3: 前端界面
|
||||
- [ ] 实现登录页面
|
||||
- [ ] 实现交易面板
|
||||
- [ ] 实现行情显示
|
||||
- [ ] 实现策略管理
|
||||
|
||||
### 阶段 4: 部署优化
|
||||
- [ ] Nginx 配置
|
||||
- [ ] HTTPS 配置
|
||||
- [ ] 数据持久化
|
||||
- [ ] 监控日志
|
||||
|
||||
### 阶段 5: 测试验证
|
||||
- [ ] 功能测试
|
||||
- [ ] 性能测试
|
||||
- [ ] 部署测试
|
||||
- [ ] 用户验收
|
||||
|
||||
## 8. 构建经验总结
|
||||
|
||||
### 8.1 已知问题与解决方案
|
||||
|
||||
#### 问题 1: polars CPU 兼容性
|
||||
|
||||
**错误现象**:
|
||||
```
|
||||
Missing required CPU features: avx, avx2, fma, bmi1, bmi2, lzcnt
|
||||
Container exit code: 132
|
||||
```
|
||||
|
||||
**原因分析**:
|
||||
- NAS CPU (Intel Celeron J4125) 不支持 AVX2 指令集
|
||||
- polars 默认版本依赖 AVX 指令优化性能
|
||||
- 在不支持的 CPU 上运行会直接崩溃
|
||||
|
||||
**解决方案**:
|
||||
1. 修改 `requirements-docker.txt`:
|
||||
```diff
|
||||
- polars>=1.26.0
|
||||
+ polars[rtcompat]>=1.26.0
|
||||
```
|
||||
|
||||
2. 修改 `docker/entrypoint.sh`:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -e
|
||||
export POLARS_SKIP_CPU_CHECK=1 # 添加此行
|
||||
# ... 其余内容
|
||||
```
|
||||
|
||||
#### 问题 2: 依赖冲突
|
||||
|
||||
**错误现象**:
|
||||
```
|
||||
ERROR: Cannot install -r requirements-docker.txt (line 59)
|
||||
```
|
||||
|
||||
**原因分析**:
|
||||
- statsmodels 与其他包版本冲突
|
||||
- 部分科学计算包版本不兼容
|
||||
|
||||
**解决方案**:
|
||||
- 使用经过测试的固定版本组合
|
||||
- 参考成功的 `rebuild2.log` 中的版本
|
||||
|
||||
#### 问题 3: 网络超时
|
||||
|
||||
**错误现象**:
|
||||
```
|
||||
ERROR: Could not find a version that satisfies the requirement...
|
||||
Connection timeout
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
使用清华镜像加速:
|
||||
```dockerfile
|
||||
ARG PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
ARG PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn
|
||||
```
|
||||
|
||||
### 8.2 成功构建配置
|
||||
|
||||
#### 最终 requirements-docker.txt 关键配置
|
||||
```txt
|
||||
# CPU 兼容性配置
|
||||
polars[rtcompat]>=1.26.0
|
||||
|
||||
# 科学计算包(已验证版本)
|
||||
numpy>=1.24.0,<2.0.0
|
||||
pandas>=2.0.0
|
||||
scipy>=1.10.0
|
||||
statsmodels>=0.14.0
|
||||
```
|
||||
|
||||
#### entrypoint.sh 配置
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# CPU 兼容性跳过
|
||||
export POLARS_SKIP_CPU_CHECK=1
|
||||
|
||||
# 服务启动
|
||||
cd /app
|
||||
exec python -m uvicorn sanguo_web.main:app \
|
||||
--host 0.0.0.0 \
|
||||
--port 8000 \
|
||||
--log-level info
|
||||
```
|
||||
|
||||
## 9. 分层构建设计
|
||||
|
||||
### 9.1 设计目标
|
||||
|
||||
1. **分离依赖与应用**:固定的 Python 依赖包与变化的应用代码分离
|
||||
2. **减少重建时间**:依赖包层只需构建一次,后续只重建应用层
|
||||
3. **降低风险**:基础层冗余设计,包含所有可能需要的依赖
|
||||
|
||||
### 9.2 分层架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ 应用层 (Dockerfile.nas) │
|
||||
│ - sanguo_*/ 源代码 │
|
||||
│ - config/ 配置文件 │
|
||||
│ - 只在代码变更时重建 │
|
||||
└─────────────────────────────────────────────┘
|
||||
↓ FROM
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ 基础层 (Dockerfile.base) │
|
||||
│ - Python 3.11 │
|
||||
│ - 所有依赖包 (~7GB) │
|
||||
│ - TA-Lib │
|
||||
│ - 只在依赖变更时重建 │
|
||||
└─────────────────────────────────────────────┘
|
||||
↓ FROM
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ python:3.11-slim │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 9.3 Dockerfile.base
|
||||
|
||||
```dockerfile
|
||||
# sanguo_vnpy_v2/docker/Dockerfile.base
|
||||
FROM python:3.11-slim
|
||||
|
||||
LABEL maintainer="sanguo"
|
||||
LABEL description="Sanguo VeighNa Base Image with all dependencies"
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /build
|
||||
|
||||
# 安装系统依赖
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gcc g++ make wget \
|
||||
build-essential \
|
||||
libssl-dev libffi-dev \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# 安装 TA-Lib
|
||||
ENV TA_LIBRARY_PATH=/usr/local/lib
|
||||
ENV TA_HEADER_PATH=/usr/include
|
||||
RUN wget -q http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz && \
|
||||
tar -xzf ta-lib-0.4.0-src.tar.gz && \
|
||||
cd ta-lib && \
|
||||
./configure --prefix=/usr && \
|
||||
make && make install && \
|
||||
cd .. && \
|
||||
rm -rf ta-lib ta-lib-0.4.0-src.tar.gz
|
||||
|
||||
# 使用清华镜像加速
|
||||
ARG PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
ARG PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn
|
||||
ENV PIP_INDEX_URL=${PIP_INDEX_URL}
|
||||
ENV PIP_TRUSTED_HOST=${PIP_TRUSTED_HOST}
|
||||
|
||||
# CPU 兼容性配置
|
||||
ENV POLARS_SKIP_CPU_CHECK=1
|
||||
|
||||
# 复制依赖文件
|
||||
COPY requirements-docker.txt .
|
||||
|
||||
# 安装所有 Python 依赖
|
||||
RUN pip install --no-cache-dir --root-user-action=ignore -r requirements-docker.txt
|
||||
|
||||
# 清理
|
||||
RUN apt-get purge -y gcc g++ make wget && \
|
||||
apt-get autoremove -y && \
|
||||
rm -rf /var/lib/apt/lists/* /tmp/*
|
||||
|
||||
# 设置最终工作目录
|
||||
WORKDIR /app
|
||||
|
||||
# 健康检查基础
|
||||
RUN pip install --no-cache-dir uvicorn
|
||||
|
||||
# 元数据标签
|
||||
LABEL build_date="2025-07-02"
|
||||
LABEL python_version="3.11"
|
||||
LABEL description="Sanguo VeighNa Base - Ready for application layer"
|
||||
```
|
||||
|
||||
### 9.4 Dockerfile.nas (应用层)
|
||||
|
||||
```dockerfile
|
||||
# sanguo_vnpy_v2/docker/Dockerfile.nas
|
||||
FROM sanguo_vnpy:base
|
||||
|
||||
LABEL maintainer="sanguo"
|
||||
LABEL description="Sanguo VeighNa Application Layer"
|
||||
|
||||
# 复制应用代码
|
||||
COPY sanguo_trader/ ./sanguo_trader/
|
||||
COPY sanguo_research/ ./sanguo_research/
|
||||
COPY sanguo_data/ ./sanguo_data/
|
||||
COPY sanguo_common/ ./sanguo_common/
|
||||
COPY sanguo_web/ ./sanguo_web/
|
||||
COPY vnpy_v4.4.0/vnpy/ ./vnpy/
|
||||
COPY config/ ./config/
|
||||
|
||||
# 复制启动脚本
|
||||
COPY docker/entrypoint.sh .
|
||||
RUN chmod +x entrypoint.sh
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 8000 8080
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
||||
CMD curl -f http://localhost:8000/health || exit 1
|
||||
|
||||
# 启动
|
||||
ENTRYPOINT ["./entrypoint.sh"]
|
||||
```
|
||||
|
||||
### 9.5 构建流程
|
||||
|
||||
#### 首次构建(全量)
|
||||
|
||||
```bash
|
||||
# 1. 构建基础镜像(约 30 分钟)
|
||||
cd /volume1/stock/sanguo_vnpy_v2
|
||||
docker build -f docker/Dockerfile.base -t sanguo_vnpy:base .
|
||||
|
||||
# 2. 构建应用镜像(约 5 分钟)
|
||||
docker build -f docker/Dockerfile.nas -t sanguo_vnpy:latest .
|
||||
|
||||
# 3. 启动容器
|
||||
docker run -d \
|
||||
--name sanguo_vnpy_v2 \
|
||||
-p 8000:8000 -p 8080:8080 \
|
||||
-v /volume1/stock/sanguo_data:/app/data \
|
||||
sanguo_vnpy:latest
|
||||
```
|
||||
|
||||
#### 代码更新后(仅重建应用层)
|
||||
|
||||
```bash
|
||||
# 只需重建应用镜像(约 5 分钟)
|
||||
docker build -f docker/Dockerfile.nas -t sanguo_vnpy:latest .
|
||||
|
||||
# 重启容器
|
||||
docker restart sanguo_vnpy_v2
|
||||
```
|
||||
|
||||
### 9.6 依赖更新后(重建基础层)
|
||||
|
||||
```bash
|
||||
# 当 requirements-docker.txt 变更时
|
||||
docker build -f docker/Dockerfile.base -t sanguo_vnpy:base .
|
||||
docker build -f docker/Dockerfile.nas -t sanguo_vnpy:latest .
|
||||
```
|
||||
|
||||
### 9.7 文件结构
|
||||
|
||||
```
|
||||
sanguo_vnpy_v2/
|
||||
├── docker/
|
||||
│ ├── Dockerfile.base # 基础镜像(依赖层)
|
||||
│ ├── Dockerfile.nas # 应用镜像
|
||||
│ ├── entrypoint.sh # 启动脚本
|
||||
│ └── requirements-docker.txt # 依赖清单
|
||||
├── sanguo_trader/ # 交易模块
|
||||
├── sanguo_web/ # Web 服务
|
||||
├── vnpy_v4.4.0/ # VeighNa 上游
|
||||
└── config/ # 配置文件
|
||||
```
|
||||
|
||||
## 10. 相关文档
|
||||
|
||||
- 需求文档: ../requirements/functional/feature-001-docker-web-deployment.md
|
||||
- VeighNa 文档: ../../vnpy_v4.4.0/docs/
|
||||
- 构建日志: ~/build.log, ~/rebuild2.log, ~/build4.log
|
||||
@@ -0,0 +1,114 @@
|
||||
# Docker Web 版本部署需求
|
||||
|
||||
## 1. 需求概述
|
||||
|
||||
将 VeighNa 4.4.0 量化交易平台部署到 NAS 的 Docker 容器中,通过 Web 浏览器远程访问所有功能。
|
||||
|
||||
## 2. 业务背景
|
||||
|
||||
### 2.1 场景描述
|
||||
- 用户需要在 NAS 上部署量化交易平台
|
||||
- 通过 Web 浏览器远程访问和管理
|
||||
- 支持 24 小时运行策略交易
|
||||
|
||||
### 2.2 目标用户
|
||||
- 量化交易员
|
||||
- 策略开发者
|
||||
- 系统管理员
|
||||
|
||||
## 3. 功能需求
|
||||
|
||||
### 3.1 核心功能
|
||||
| 功能 | 描述 | 优先级 |
|
||||
|-----|------|-------|
|
||||
| Web UI | 完整的 VeighNa Trader 界面 | P0 |
|
||||
| 策略管理 | CTA策略配置和运行 | P0 |
|
||||
| 行情显示 | K线图和实时行情 | P0 |
|
||||
| 交易功能 | 下单、撤单、查询 | P0 |
|
||||
| 账户管理 | 多账户支持 | P1 |
|
||||
| 数据管理 | 历史数据查询和管理 | P1 |
|
||||
| 回测功能 | 策略回测 | P2 |
|
||||
| RPC 服务 | 远程调用接口 | P1 |
|
||||
|
||||
### 3.2 Web 访问
|
||||
- HTTPS 支持
|
||||
- 基本认证(用户名/密码)
|
||||
- 会话管理
|
||||
- 响应式设计(支持移动端)
|
||||
|
||||
### 3.3 部署要求
|
||||
- Docker 容器化部署
|
||||
- 支持常见 NAS(Synology/QNAP/群晖)
|
||||
- 数据持久化
|
||||
- 配置外部化
|
||||
- 日志可访问
|
||||
|
||||
## 4. 非功能需求
|
||||
|
||||
### 4.1 性能
|
||||
| 指标 | 要求 |
|
||||
|-----|------|
|
||||
| Web 响应时间 | <2 秒 |
|
||||
| 行情延迟 | <500ms |
|
||||
| 并发用户 | ≥5 |
|
||||
| 内存占用 | <2GB |
|
||||
|
||||
### 4.2 可靠性
|
||||
- 容器自动重启
|
||||
- 数据定期备份
|
||||
- 异常日志记录
|
||||
- 崩溃恢复
|
||||
|
||||
### 4.3 安全性
|
||||
- 访问认证
|
||||
- 数据加密(HTTPS)
|
||||
- API 密钥管理
|
||||
- 网络隔离
|
||||
|
||||
### 4.4 可维护性
|
||||
- 一键部署
|
||||
- 配置简单
|
||||
- 日志集中
|
||||
- 监控接口
|
||||
|
||||
## 5. 技术约束
|
||||
|
||||
### 5.1 环境约束
|
||||
- NAS 系统:Synology DSM / QNAP QTS
|
||||
- Docker 版本:≥20.10
|
||||
- 架构:x86_64 / ARM64
|
||||
|
||||
### 5.2 技术栈
|
||||
- 基础镜像:Python 3.11+
|
||||
- Web 框架:FastAPI + Vue.js
|
||||
- 数据库:SQLite(可选升级到 PostgreSQL)
|
||||
- 反向代理:Nginx / Traefik
|
||||
|
||||
## 6. 验收标准
|
||||
|
||||
### 6.1 功能验收
|
||||
- [ ] Docker 镜像可成功构建
|
||||
- [ ] 容器可正常启动
|
||||
- [ ] Web 界面可访问
|
||||
- [ ] 用户登录认证正常
|
||||
- [ ] 策略可加载和运行
|
||||
- [ ] 行情数据正常显示
|
||||
- [ ] 交易功能正常工作
|
||||
|
||||
### 6.2 部署验收
|
||||
- [ ] 在 NAS Docker 上成功部署
|
||||
- [ ] 重启后自动恢复
|
||||
- [ ] 数据持久化正常
|
||||
- [ ] 日志可查看
|
||||
|
||||
## 7. 相关链接
|
||||
|
||||
- Issue: TBD
|
||||
- 设计文档: ../design/deployment/docker-web-deployment.md
|
||||
- 原始需求: 用户提出
|
||||
|
||||
## 8. 优先级说明
|
||||
|
||||
**P0** - 必须实现,否则无法使用
|
||||
**P1** - 重要功能,第一迭代完成
|
||||
**P2** - 增强功能,后续迭代优化
|
||||
Reference in New Issue
Block a user