You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

450 lines
11 KiB

# 智能期货期权分析系统 - 部署文档
## 前端部署
### 静态部署(当前方式)
**适用场景**: 纯前端演示、无后端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**: 令牌验证