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

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. 构建生产版本
cd /mnt/okcomputer/output/app
npm run build
  1. 部署到静态服务器
# 部署到任意静态服务器
# 例如: Nginx, Apache, Vercel, Netlify, GitHub Pages
  1. 使用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"

安全建议

  1. HTTPS: 强制使用HTTPS
  2. CORS: 配置跨域白名单
  3. Rate Limiting: 接口限流
  4. Input Validation: 输入验证
  5. SQL Injection: 使用参数化查询
  6. XSS: 输出转义
  7. CSRF: 令牌验证