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.
11 KiB
11 KiB
智能期货期权分析系统 - 部署文档
前端部署
静态部署(当前方式)
适用场景: 纯前端演示、无后端API依赖
步骤:
- 构建生产版本
cd /mnt/okcomputer/output/app
npm run build
- 部署到静态服务器
# 部署到任意静态服务器
# 例如: Nginx, Apache, Vercel, Netlify, GitHub Pages
- 使用Kimi部署
# 已自动部署到
# https://ow45rp4dokfss.ok.kimi.link
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
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配置
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. 启动服务
docker-compose up -d
数据库设计
PostgreSQL表结构
-- 品种表
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条)
环境变量配置
前端环境变量
# .env.production
VITE_API_BASE_URL=https://api.futures.example.com
VITE_WS_URL=wss://ws.futures.example.com
VITE_APP_NAME=期货智析
后端环境变量
# .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
# .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、内存、磁盘、网络
日志收集
# 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"
安全建议
- HTTPS: 强制使用HTTPS
- CORS: 配置跨域白名单
- Rate Limiting: 接口限流
- Input Validation: 输入验证
- SQL Injection: 使用参数化查询
- XSS: 输出转义
- CSRF: 令牌验证