|
|
# 智能期货期权分析系统 - 部署文档
|
|
|
|
|
|
## 前端部署
|
|
|
|
|
|
### 静态部署(当前方式)
|
|
|
|
|
|
**适用场景**: 纯前端演示、无后端API依赖
|
|
|
|
|
|
**步骤**:
|
|
|
|
|
|
1. 构建生产版本
|
|
|
```bash
|
|
|
cd /mnt/okcomputer/output/app
|
|
|
npm run build
|
|
|
```
|
|
|
|
|
|
2. 部署到静态服务器
|
|
|
```bash
|
|
|
# 部署到任意静态服务器
|
|
|
# 例如: Nginx, Apache, Vercel, Netlify, GitHub Pages
|
|
|
```
|
|
|
|
|
|
3. 使用Kimi部署
|
|
|
```bash
|
|
|
# 已自动部署到
|
|
|
# https://ow45rp4dokfss.ok.kimi.link
|
|
|
```
|
|
|
|
|
|
### Nginx配置示例
|
|
|
|
|
|
```nginx
|
|
|
server {
|
|
|
listen 80;
|
|
|
server_name futures.example.com;
|
|
|
root /var/www/futures-analysis/dist;
|
|
|
index index.html;
|
|
|
|
|
|
location / {
|
|
|
try_files $uri $uri/ /index.html;
|
|
|
}
|
|
|
|
|
|
# 静态资源缓存
|
|
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
|
|
expires 1y;
|
|
|
add_header Cache-Control "public, immutable";
|
|
|
}
|
|
|
|
|
|
# Gzip压缩
|
|
|
gzip on;
|
|
|
gzip_types text/plain text/css application/json application/javascript text/xml;
|
|
|
}
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 后端部署(待实现)
|
|
|
|
|
|
### 技术栈建议
|
|
|
|
|
|
- **语言**: Node.js / Python / Go
|
|
|
- **框架**: NestJS / FastAPI / Gin
|
|
|
- **数据库**: PostgreSQL + Redis
|
|
|
- **消息队列**: Kafka / RabbitMQ
|
|
|
- **容器**: Docker + Kubernetes
|
|
|
|
|
|
### 服务架构
|
|
|
|
|
|
```
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
│ Load Balancer │
|
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
│
|
|
|
┌─────────────────────┼─────────────────────┐
|
|
|
│ │ │
|
|
|
┌───────▼──────┐ ┌────────▼────────┐ ┌───────▼──────┐
|
|
|
│ API Gateway │ │ API Gateway │ │ API Gateway │
|
|
|
└───────┬───────┘ └────────┬────────┘ └───────┬───────┘
|
|
|
│ │ │
|
|
|
└─────────────────────┼─────────────────────┘
|
|
|
│
|
|
|
┌─────────────────────┼─────────────────────┐
|
|
|
│ │ │
|
|
|
┌───────▼──────┐ ┌────────▼────────┐ ┌───────▼──────┐
|
|
|
│ User Service │ │ Market Service │ │ AI Service │
|
|
|
└───────┬───────┘ └────────┬────────┘ └───────┬───────┘
|
|
|
│ │ │
|
|
|
└─────────────────────┼─────────────────────┘
|
|
|
│
|
|
|
┌─────────────────────┼─────────────────────┐
|
|
|
│ │ │
|
|
|
┌───────▼──────┐ ┌────────▼────────┐ ┌───────▼──────┐
|
|
|
│ PostgreSQL │ │ Redis │ │ Kafka │
|
|
|
└───────────────┘ └─────────────────┘ └───────────────┘
|
|
|
```
|
|
|
|
|
|
### Docker部署
|
|
|
|
|
|
#### 1. 创建Dockerfile
|
|
|
|
|
|
```dockerfile
|
|
|
# 前端Dockerfile
|
|
|
FROM node:20-alpine AS builder
|
|
|
WORKDIR /app
|
|
|
COPY package*.json ./
|
|
|
RUN npm ci
|
|
|
COPY . .
|
|
|
RUN npm run build
|
|
|
|
|
|
FROM nginx:alpine
|
|
|
COPY --from=builder /app/dist /usr/share/nginx/html
|
|
|
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
|
EXPOSE 80
|
|
|
```
|
|
|
|
|
|
#### 2. Docker Compose配置
|
|
|
|
|
|
```yaml
|
|
|
version: '3.8'
|
|
|
|
|
|
services:
|
|
|
frontend:
|
|
|
build: ./frontend
|
|
|
ports:
|
|
|
- "80:80"
|
|
|
depends_on:
|
|
|
- backend
|
|
|
|
|
|
backend:
|
|
|
build: ./backend
|
|
|
ports:
|
|
|
- "3000:3000"
|
|
|
environment:
|
|
|
- NODE_ENV=production
|
|
|
- DATABASE_URL=postgresql://user:pass@postgres:5432/futures
|
|
|
- REDIS_URL=redis://redis:6379
|
|
|
depends_on:
|
|
|
- postgres
|
|
|
- redis
|
|
|
|
|
|
postgres:
|
|
|
image: postgres:15-alpine
|
|
|
environment:
|
|
|
- POSTGRES_USER=user
|
|
|
- POSTGRES_PASSWORD=pass
|
|
|
- POSTGRES_DB=futures
|
|
|
volumes:
|
|
|
- postgres_data:/var/lib/postgresql/data
|
|
|
|
|
|
redis:
|
|
|
image: redis:7-alpine
|
|
|
volumes:
|
|
|
- redis_data:/data
|
|
|
|
|
|
kafka:
|
|
|
image: confluentinc/cp-kafka:latest
|
|
|
environment:
|
|
|
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
|
|
|
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
|
|
|
|
|
|
zookeeper:
|
|
|
image: confluentinc/cp-zookeeper:latest
|
|
|
environment:
|
|
|
ZOOKEEPER_CLIENT_PORT: 2181
|
|
|
|
|
|
volumes:
|
|
|
postgres_data:
|
|
|
redis_data:
|
|
|
```
|
|
|
|
|
|
#### 3. 启动服务
|
|
|
|
|
|
```bash
|
|
|
docker-compose up -d
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 数据库设计
|
|
|
|
|
|
### PostgreSQL表结构
|
|
|
|
|
|
```sql
|
|
|
-- 品种表
|
|
|
CREATE TABLE products (
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
symbol VARCHAR(20) UNIQUE NOT NULL,
|
|
|
name VARCHAR(100) NOT NULL,
|
|
|
category VARCHAR(50) NOT NULL,
|
|
|
exchange VARCHAR(50),
|
|
|
unit VARCHAR(20),
|
|
|
min_change DECIMAL(10, 4),
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
|
|
|
|
-- K线数据表(按品种和周期分表)
|
|
|
CREATE TABLE kline_sc_15m (
|
|
|
time TIMESTAMP NOT NULL,
|
|
|
open DECIMAL(10, 2) NOT NULL,
|
|
|
high DECIMAL(10, 2) NOT NULL,
|
|
|
low DECIMAL(10, 2) NOT NULL,
|
|
|
close DECIMAL(10, 2) NOT NULL,
|
|
|
volume BIGINT NOT NULL,
|
|
|
open_interest BIGINT,
|
|
|
PRIMARY KEY (time)
|
|
|
);
|
|
|
|
|
|
-- 用户表
|
|
|
CREATE TABLE users (
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|
|
email VARCHAR(100) UNIQUE NOT NULL,
|
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
|
phone VARCHAR(20),
|
|
|
avatar_url VARCHAR(255),
|
|
|
membership_level INTEGER DEFAULT 0,
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
|
|
|
|
-- 自选股表
|
|
|
CREATE TABLE watchlist (
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
|
symbol VARCHAR(20) NOT NULL,
|
|
|
alert_price DECIMAL(10, 2),
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
UNIQUE(user_id, symbol)
|
|
|
);
|
|
|
|
|
|
-- 价格预警表
|
|
|
CREATE TABLE price_alerts (
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
|
symbol VARCHAR(20) NOT NULL,
|
|
|
alert_type VARCHAR(20) NOT NULL, -- above, below
|
|
|
alert_price DECIMAL(10, 2) NOT NULL,
|
|
|
is_active BOOLEAN DEFAULT true,
|
|
|
triggered_at TIMESTAMP,
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
|
|
|
|
-- 热点事件表
|
|
|
CREATE TABLE hot_events (
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
title VARCHAR(255) NOT NULL,
|
|
|
content TEXT,
|
|
|
summary TEXT,
|
|
|
impact VARCHAR(20) NOT NULL, -- bullish, bearish, neutral
|
|
|
impact_level INTEGER NOT NULL,
|
|
|
source VARCHAR(100),
|
|
|
event_time TIMESTAMP,
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
|
|
|
|
-- 事件影响品种关联表
|
|
|
CREATE TABLE event_products (
|
|
|
event_id INTEGER REFERENCES hot_events(id) ON DELETE CASCADE,
|
|
|
symbol VARCHAR(20) NOT NULL,
|
|
|
impact_confidence DECIMAL(3, 2),
|
|
|
PRIMARY KEY (event_id, symbol)
|
|
|
);
|
|
|
|
|
|
-- 交易信号表
|
|
|
CREATE TABLE trading_signals (
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
symbol VARCHAR(20) NOT NULL,
|
|
|
timeframe VARCHAR(10) NOT NULL,
|
|
|
signal_type VARCHAR(20) NOT NULL, -- buy, sell, neutral
|
|
|
strength INTEGER NOT NULL,
|
|
|
indicators JSONB,
|
|
|
description TEXT,
|
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
|
);
|
|
|
|
|
|
-- 模拟交易记录表
|
|
|
CREATE TABLE paper_trades (
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
|
symbol VARCHAR(20) NOT NULL,
|
|
|
direction VARCHAR(10) NOT NULL, -- long, short
|
|
|
entry_price DECIMAL(10, 2) NOT NULL,
|
|
|
exit_price DECIMAL(10, 2),
|
|
|
quantity INTEGER NOT NULL,
|
|
|
entry_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
|
exit_time TIMESTAMP,
|
|
|
pnl DECIMAL(10, 2),
|
|
|
status VARCHAR(20) DEFAULT 'open' -- open, closed
|
|
|
);
|
|
|
|
|
|
-- 创建索引
|
|
|
CREATE INDEX idx_kline_time ON kline_sc_15m(time);
|
|
|
CREATE INDEX idx_watchlist_user ON watchlist(user_id);
|
|
|
CREATE INDEX idx_alerts_user ON price_alerts(user_id);
|
|
|
CREATE INDEX idx_signals_symbol ON trading_signals(symbol, created_at);
|
|
|
```
|
|
|
|
|
|
### Redis数据结构
|
|
|
|
|
|
```
|
|
|
# 实时行情
|
|
|
market:tick:{symbol} -> Hash
|
|
|
- price
|
|
|
- change
|
|
|
- volume
|
|
|
- timestamp
|
|
|
|
|
|
# K线数据(最近100条)
|
|
|
market:kline:{symbol}:{period} -> Sorted Set
|
|
|
|
|
|
# 用户会话
|
|
|
session:{token} -> Hash
|
|
|
- user_id
|
|
|
- expires_at
|
|
|
|
|
|
# 价格预警
|
|
|
alert:{symbol} -> Sorted Set (score: alert_price)
|
|
|
|
|
|
# 热点事件缓存
|
|
|
events:hot -> List (最近20条)
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 环境变量配置
|
|
|
|
|
|
### 前端环境变量
|
|
|
|
|
|
```bash
|
|
|
# .env.production
|
|
|
VITE_API_BASE_URL=https://api.futures.example.com
|
|
|
VITE_WS_URL=wss://ws.futures.example.com
|
|
|
VITE_APP_NAME=期货智析
|
|
|
```
|
|
|
|
|
|
### 后端环境变量
|
|
|
|
|
|
```bash
|
|
|
# .env
|
|
|
NODE_ENV=production
|
|
|
PORT=3000
|
|
|
|
|
|
# Database
|
|
|
DATABASE_URL=postgresql://user:pass@localhost:5432/futures
|
|
|
REDIS_URL=redis://localhost:6379
|
|
|
|
|
|
# JWT
|
|
|
JWT_SECRET=your-secret-key
|
|
|
JWT_EXPIRES_IN=1h
|
|
|
JWT_REFRESH_EXPIRES_IN=7d
|
|
|
|
|
|
# Market Data
|
|
|
MARKET_DATA_API_KEY=your-api-key
|
|
|
MARKET_DATA_WS_URL=wss://market-data.example.com
|
|
|
|
|
|
# External APIs
|
|
|
OPENAI_API_KEY=your-openai-key
|
|
|
SENDGRID_API_KEY=your-sendgrid-key
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## CI/CD配置
|
|
|
|
|
|
### GitHub Actions
|
|
|
|
|
|
```yaml
|
|
|
# .github/workflows/deploy.yml
|
|
|
name: Deploy
|
|
|
|
|
|
on:
|
|
|
push:
|
|
|
branches: [main]
|
|
|
|
|
|
jobs:
|
|
|
build:
|
|
|
runs-on: ubuntu-latest
|
|
|
steps:
|
|
|
- uses: actions/checkout@v3
|
|
|
|
|
|
- name: Setup Node.js
|
|
|
uses: actions/setup-node@v3
|
|
|
with:
|
|
|
node-version: '20'
|
|
|
|
|
|
- name: Install dependencies
|
|
|
run: npm ci
|
|
|
|
|
|
- name: Run tests
|
|
|
run: npm test
|
|
|
|
|
|
- name: Build
|
|
|
run: npm run build
|
|
|
|
|
|
- name: Deploy to server
|
|
|
uses: appleboy/scp-action@master
|
|
|
with:
|
|
|
host: ${{ secrets.HOST }}
|
|
|
username: ${{ secrets.USERNAME }}
|
|
|
password: ${{ secrets.PASSWORD }}
|
|
|
source: "dist/"
|
|
|
target: "/var/www/futures-analysis"
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 监控与日志
|
|
|
|
|
|
### 监控指标
|
|
|
|
|
|
- **应用指标**: QPS、响应时间、错误率
|
|
|
- **业务指标**: 活跃用户数、交易信号准确率
|
|
|
- **系统指标**: CPU、内存、磁盘、网络
|
|
|
|
|
|
### 日志收集
|
|
|
|
|
|
```yaml
|
|
|
# docker-compose.logging.yml
|
|
|
version: '3.8'
|
|
|
|
|
|
services:
|
|
|
elasticsearch:
|
|
|
image: elasticsearch:8.0.0
|
|
|
environment:
|
|
|
- discovery.type=single-node
|
|
|
ports:
|
|
|
- "9200:9200"
|
|
|
|
|
|
logstash:
|
|
|
image: logstash:8.0.0
|
|
|
volumes:
|
|
|
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
|
|
|
|
|
|
kibana:
|
|
|
image: kibana:8.0.0
|
|
|
ports:
|
|
|
- "5601:5601"
|
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
## 安全建议
|
|
|
|
|
|
1. **HTTPS**: 强制使用HTTPS
|
|
|
2. **CORS**: 配置跨域白名单
|
|
|
3. **Rate Limiting**: 接口限流
|
|
|
4. **Input Validation**: 输入验证
|
|
|
5. **SQL Injection**: 使用参数化查询
|
|
|
6. **XSS**: 输出转义
|
|
|
7. **CSRF**: 令牌验证
|