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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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