|
|
|
|
|
# 统一行情数据服务 - 部署文档
|
|
|
|
|
|
|
|
|
|
|
|
本文档详细说明行情数据服务的部署方式,支持 **Go** 和 **Python** 两种实现。
|
|
|
|
|
|
|
|
|
|
|
|
## 实现方式选择
|
|
|
|
|
|
|
|
|
|
|
|
| 特性 | Go实现 | Python实现 |
|
|
|
|
|
|
|------|--------|------------|
|
|
|
|
|
|
| 性能 | ⭐⭐⭐ 高性能 | ⭐⭐ 良好 |
|
|
|
|
|
|
| 开发效率 | ⭐⭐ 中等 | ⭐⭐⭐ 高 |
|
|
|
|
|
|
| 数据源对接 | ⭐⭐ 需自行封装 | ⭐⭐⭐ Tushare原生支持 |
|
|
|
|
|
|
| 生态丰富度 | ⭐⭐ 中等 | ⭐⭐⭐ 丰富 |
|
|
|
|
|
|
| 部署复杂度 | ⭐⭐⭐ 单二进制 | ⭐⭐ 依赖较多 |
|
|
|
|
|
|
|
|
|
|
|
|
**推荐**:
|
|
|
|
|
|
- 生产环境高并发场景选择 **Go实现**
|
|
|
|
|
|
- 快速原型、数据源对接优先选择 **Python实现**
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 一、Go 实现部署
|
|
|
|
|
|
|
|
|
|
|
|
## 1.1 部署架构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
|
|
|
│ 负载均衡器 (可选) │
|
|
|
|
|
|
│ Nginx/HAProxy │
|
|
|
|
|
|
└─────────────────────┬───────────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─────────────┼─────────────┐
|
|
|
|
|
|
│ │ │
|
|
|
|
|
|
┌───────▼──────┐ ┌────▼─────┐ ┌────▼─────┐
|
|
|
|
|
|
│ 服务实例1 │ │ 服务实例2 │ │ 服务实例3 │
|
|
|
|
|
|
│ :8080 │ │ :8080 │ │ :8080 │
|
|
|
|
|
|
└───────┬──────┘ └────┬─────┘ └────┬─────┘
|
|
|
|
|
|
│ │ │
|
|
|
|
|
|
└─────────────┼────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─────────────▼──────────────┐
|
|
|
|
|
|
│ PostgreSQL 主从 │
|
|
|
|
|
|
│ (分区表 + 读写分离) │
|
|
|
|
|
|
└────────────────────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 1.2 环境要求
|
|
|
|
|
|
|
|
|
|
|
|
### 服务器配置
|
|
|
|
|
|
|
|
|
|
|
|
| 组件 | 最低配置 | 推荐配置 |
|
|
|
|
|
|
|------|---------|---------|
|
|
|
|
|
|
| 应用服务 | 2核4G | 4核8G |
|
|
|
|
|
|
| PostgreSQL | 4核8G | 8核16G |
|
|
|
|
|
|
| 存储 | 200GB SSD | 500GB SSD |
|
|
|
|
|
|
| 网络 | 10Mbps | 100Mbps |
|
|
|
|
|
|
|
|
|
|
|
|
### 软件依赖
|
|
|
|
|
|
|
|
|
|
|
|
- **操作系统**: Ubuntu 20.04+ / CentOS 8+ / Debian 11+
|
|
|
|
|
|
- **Go**: 1.21+
|
|
|
|
|
|
- **PostgreSQL**: 15+ (支持分区表)
|
|
|
|
|
|
- **Nginx**: 1.18+ (可选,用于负载均衡)
|
|
|
|
|
|
|
|
|
|
|
|
## 1.3 部署步骤
|
|
|
|
|
|
|
|
|
|
|
|
### 安装依赖
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Ubuntu/Debian
|
|
|
|
|
|
sudo apt update
|
|
|
|
|
|
sudo apt install -y postgresql-15 postgresql-contrib-15 nginx
|
|
|
|
|
|
|
|
|
|
|
|
# 安装Go 1.21
|
|
|
|
|
|
wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz
|
|
|
|
|
|
sudo tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
|
|
|
|
|
|
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
|
|
|
|
|
|
source ~/.bashrc
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 配置PostgreSQL
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 启动PostgreSQL
|
|
|
|
|
|
sudo systemctl start postgresql
|
|
|
|
|
|
sudo systemctl enable postgresql
|
|
|
|
|
|
|
|
|
|
|
|
# 创建数据库和用户
|
|
|
|
|
|
sudo -u postgres psql -c "CREATE USER marketdata WITH PASSWORD 'your_password';"
|
|
|
|
|
|
sudo -u postgres psql -c "CREATE DATABASE marketdata OWNER marketdata;"
|
|
|
|
|
|
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE marketdata TO marketdata;"
|
|
|
|
|
|
|
|
|
|
|
|
# 启用分区表支持
|
|
|
|
|
|
sudo -u postgres psql -d marketdata -c "CREATE EXTENSION IF NOT EXISTS pg_partman;"
|
|
|
|
|
|
|
|
|
|
|
|
# 配置允许远程连接 (可选)
|
|
|
|
|
|
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /etc/postgresql/15/main/postgresql.conf
|
|
|
|
|
|
echo "host all all 0.0.0.0/0 scram-sha-256" | sudo tee -a /etc/postgresql/15/main/pg_hba.conf
|
|
|
|
|
|
sudo systemctl restart postgresql
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 部署应用
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 创建应用目录
|
|
|
|
|
|
sudo mkdir -p /opt/market-data-service
|
|
|
|
|
|
sudo chown $USER:$USER /opt/market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 解压项目
|
|
|
|
|
|
tar -xzf market-data-service.tar.gz -C /opt/
|
|
|
|
|
|
cd /opt/market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 下载依赖
|
|
|
|
|
|
go mod download
|
|
|
|
|
|
|
|
|
|
|
|
# 构建
|
|
|
|
|
|
make build-all
|
|
|
|
|
|
|
|
|
|
|
|
# 创建配置文件目录
|
|
|
|
|
|
mkdir -p /opt/market-data-service/config
|
|
|
|
|
|
mkdir -p /opt/market-data-service/logs
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 配置环境变量
|
|
|
|
|
|
|
|
|
|
|
|
创建 `/opt/market-data-service/.env`:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 应用配置
|
|
|
|
|
|
export PORT=8080
|
|
|
|
|
|
export GIN_MODE=release
|
|
|
|
|
|
export API_KEY=your_secure_api_key_here
|
|
|
|
|
|
|
|
|
|
|
|
# 数据库配置
|
|
|
|
|
|
export DATABASE_URL="postgres://marketdata:your_password@localhost:5432/marketdata?sslmode=disable"
|
|
|
|
|
|
|
|
|
|
|
|
# Tushare配置
|
|
|
|
|
|
export TUSHARE_TOKEN=your_tushare_token_here
|
|
|
|
|
|
|
|
|
|
|
|
# 日志配置
|
|
|
|
|
|
export LOG_LEVEL=info
|
|
|
|
|
|
export LOG_FILE=/opt/market-data-service/logs/app.log
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 初始化数据库
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd /opt/market-data-service
|
|
|
|
|
|
source .env
|
|
|
|
|
|
|
|
|
|
|
|
# 执行数据库初始化脚本
|
|
|
|
|
|
psql $DATABASE_URL -f memory/2026-03-07-database-schema.sql
|
|
|
|
|
|
|
|
|
|
|
|
# 同步基础数据
|
|
|
|
|
|
cd /opt/market-data-service
|
|
|
|
|
|
./bin/market-data-sync -type stocks
|
|
|
|
|
|
./bin/market-data-sync -type futures
|
|
|
|
|
|
./bin/market-data-sync -type calendar -start 20240101 -end 20241231
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 创建Systemd服务
|
|
|
|
|
|
|
|
|
|
|
|
创建 `/etc/systemd/system/market-data-service.service`:
|
|
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
|
[Unit]
|
|
|
|
|
|
Description=Market Data Service
|
|
|
|
|
|
After=network.target postgresql.service
|
|
|
|
|
|
|
|
|
|
|
|
[Service]
|
|
|
|
|
|
Type=simple
|
|
|
|
|
|
User=marketdata
|
|
|
|
|
|
Group=marketdata
|
|
|
|
|
|
WorkingDirectory=/opt/market-data-service
|
|
|
|
|
|
EnvironmentFile=/opt/market-data-service/.env
|
|
|
|
|
|
ExecStart=/opt/market-data-service/bin/market-data-service
|
|
|
|
|
|
Restart=always
|
|
|
|
|
|
RestartSec=5
|
|
|
|
|
|
StandardOutput=append:/opt/market-data-service/logs/service.log
|
|
|
|
|
|
StandardError=append:/opt/market-data-service/logs/error.log
|
|
|
|
|
|
|
|
|
|
|
|
[Install]
|
|
|
|
|
|
WantedBy=multi-user.target
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 创建用户
|
|
|
|
|
|
sudo useradd -r -s /bin/false marketdata
|
|
|
|
|
|
sudo chown -R marketdata:marketdata /opt/market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 启动服务
|
|
|
|
|
|
sudo systemctl daemon-reload
|
|
|
|
|
|
sudo systemctl enable market-data-service
|
|
|
|
|
|
sudo systemctl start market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 查看状态
|
|
|
|
|
|
sudo systemctl status market-data-service
|
|
|
|
|
|
sudo journalctl -u market-data-service -f
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Docker部署 (Go)
|
|
|
|
|
|
|
|
|
|
|
|
```dockerfile
|
|
|
|
|
|
# Dockerfile
|
|
|
|
|
|
FROM golang:1.21-alpine AS builder
|
|
|
|
|
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
COPY go.mod go.sum ./
|
|
|
|
|
|
RUN go mod download
|
|
|
|
|
|
|
|
|
|
|
|
COPY . .
|
|
|
|
|
|
RUN CGO_ENABLED=0 GOOS=linux go build -o bin/market-data-service ./cmd/server
|
|
|
|
|
|
|
|
|
|
|
|
FROM alpine:latest
|
|
|
|
|
|
RUN apk --no-cache add ca-certificates tzdata
|
|
|
|
|
|
WORKDIR /root/
|
|
|
|
|
|
|
|
|
|
|
|
COPY --from=builder /app/bin/market-data-service .
|
|
|
|
|
|
COPY --from=builder /app/config ./config
|
|
|
|
|
|
|
|
|
|
|
|
EXPOSE 8080
|
|
|
|
|
|
|
|
|
|
|
|
CMD ["./market-data-service"]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 二、Python 实现部署
|
|
|
|
|
|
|
|
|
|
|
|
## 2.1 部署架构
|
|
|
|
|
|
|
|
|
|
|
|
Python实现的部署架构与Go相同,但运行环境需要Python解释器和依赖库。
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
|
|
|
|
│ Nginx (反向代理) │
|
|
|
|
|
|
└─────────────────────┬───────────────────────────────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─────────────┼─────────────┐
|
|
|
|
|
|
│ │ │
|
|
|
|
|
|
┌───────▼──────┐ ┌────▼─────┐ ┌────▼─────┐
|
|
|
|
|
|
│ Python服务1 │ │ Python │ │ Python │
|
|
|
|
|
|
│ Uvicorn │ │ 服务2 │ │ 服务3 │
|
|
|
|
|
|
│ :8080 │ │ :8081 │ │ :8082 │
|
|
|
|
|
|
└───────┬──────┘ └────┬─────┘ └────┬─────┘
|
|
|
|
|
|
│ │ │
|
|
|
|
|
|
└─────────────┼────────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─────────────▼──────────────┐
|
|
|
|
|
|
│ PostgreSQL │
|
|
|
|
|
|
└────────────────────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 2.2 环境要求
|
|
|
|
|
|
|
|
|
|
|
|
- **操作系统**: Ubuntu 20.04+ / CentOS 8+ / Windows 10+
|
|
|
|
|
|
- **Python**: 3.10+
|
|
|
|
|
|
- **PostgreSQL**: 15+
|
|
|
|
|
|
- **Nginx**: 1.18+ (可选)
|
|
|
|
|
|
|
|
|
|
|
|
## 2.3 部署步骤
|
|
|
|
|
|
|
|
|
|
|
|
### 安装Python环境
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Ubuntu/Debian
|
|
|
|
|
|
sudo apt update
|
|
|
|
|
|
sudo apt install -y python3.10 python3.10-venv python3-pip postgresql-15 nginx
|
|
|
|
|
|
|
|
|
|
|
|
# CentOS/RHEL
|
|
|
|
|
|
sudo yum install -y python310 python310-pip postgresql15-server nginx
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 创建虚拟环境
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 创建应用目录
|
|
|
|
|
|
sudo mkdir -p /opt/python-market-data-service
|
|
|
|
|
|
sudo chown $USER:$USER /opt/python-market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
cd /opt/python-market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 创建虚拟环境
|
|
|
|
|
|
python3.10 -m venv venv
|
|
|
|
|
|
|
|
|
|
|
|
# 激活虚拟环境
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 升级pip
|
|
|
|
|
|
pip install --upgrade pip
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 安装依赖
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 复制项目文件
|
|
|
|
|
|
cp -r /path/to/python_market_data_service/* /opt/python-market-data-service/
|
|
|
|
|
|
|
|
|
|
|
|
# 安装依赖
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
|
|
|
|
|
|
# 安装Tushare(需单独安装)
|
|
|
|
|
|
pip install tushare
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 配置环境变量
|
|
|
|
|
|
|
|
|
|
|
|
创建 `/opt/python-market-data-service/.env`:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 应用配置
|
|
|
|
|
|
export PORT=8080
|
|
|
|
|
|
export DATABASE_URL="postgresql://marketdata:your_password@localhost:5432/marketdata"
|
|
|
|
|
|
export TUSHARE_TOKEN="your_tushare_token"
|
|
|
|
|
|
export API_KEY="your_api_key"
|
|
|
|
|
|
|
|
|
|
|
|
# Python路径
|
|
|
|
|
|
export PYTHONPATH=/opt/python-market-data-service
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 初始化数据库
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
source .env
|
|
|
|
|
|
|
|
|
|
|
|
# 使用Python初始化数据库(SQLAlchemy会自动创建表)
|
|
|
|
|
|
python -c "from app.repositories.database import init_db; init_db()"
|
|
|
|
|
|
|
|
|
|
|
|
# 或使用SQL脚本
|
|
|
|
|
|
psql $DATABASE_URL -f memory/2026-03-07-database-schema.sql
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 同步基础数据
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
source .env
|
|
|
|
|
|
|
|
|
|
|
|
# 同步股票列表
|
|
|
|
|
|
python scripts/sync_data.py --type stocks
|
|
|
|
|
|
|
|
|
|
|
|
# 同步期货列表
|
|
|
|
|
|
python scripts/sync_data.py --type futures
|
|
|
|
|
|
|
|
|
|
|
|
# 同步交易日历
|
|
|
|
|
|
python scripts/sync_data.py --type calendar --start 20240101 --end 20241231
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 启动服务
|
|
|
|
|
|
|
|
|
|
|
|
**方式1: 直接启动(开发模式)**
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
python -m app.main
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**方式2: 使用Uvicorn(生产模式)**
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 单进程
|
|
|
|
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8080
|
|
|
|
|
|
|
|
|
|
|
|
# 多进程(推荐)
|
|
|
|
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8080 --workers 4
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**方式3: 使用Gunicorn(更高性能)**
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
|
|
|
|
|
|
|
# 4个worker
|
|
|
|
|
|
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8080
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 创建Systemd服务 (Python)
|
|
|
|
|
|
|
|
|
|
|
|
创建 `/etc/systemd/system/python-market-data-service.service`:
|
|
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
|
[Unit]
|
|
|
|
|
|
Description=Python Market Data Service
|
|
|
|
|
|
After=network.target postgresql.service
|
|
|
|
|
|
|
|
|
|
|
|
[Service]
|
|
|
|
|
|
Type=simple
|
|
|
|
|
|
User=marketdata
|
|
|
|
|
|
Group=marketdata
|
|
|
|
|
|
WorkingDirectory=/opt/python-market-data-service
|
|
|
|
|
|
Environment=PATH=/opt/python-market-data-service/venv/bin
|
|
|
|
|
|
EnvironmentFile=/opt/python-market-data-service/.env
|
|
|
|
|
|
ExecStart=/opt/python-market-data-service/venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8080
|
|
|
|
|
|
Restart=always
|
|
|
|
|
|
RestartSec=5
|
|
|
|
|
|
StandardOutput=append:/opt/python-market-data-service/logs/service.log
|
|
|
|
|
|
StandardError=append:/opt/python-market-data-service/logs/error.log
|
|
|
|
|
|
|
|
|
|
|
|
[Install]
|
|
|
|
|
|
WantedBy=multi-user.target
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 创建用户和日志目录
|
|
|
|
|
|
sudo useradd -r -s /bin/false marketdata
|
|
|
|
|
|
sudo mkdir -p /opt/python-market-data-service/logs
|
|
|
|
|
|
sudo chown -R marketdata:marketdata /opt/python-market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 启动服务
|
|
|
|
|
|
sudo systemctl daemon-reload
|
|
|
|
|
|
sudo systemctl enable python-market-data-service
|
|
|
|
|
|
sudo systemctl start python-market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 查看状态
|
|
|
|
|
|
sudo systemctl status python-market-data-service
|
|
|
|
|
|
sudo journalctl -u python-market-data-service -f
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Docker部署 (Python)
|
|
|
|
|
|
|
|
|
|
|
|
创建 `Dockerfile`:
|
|
|
|
|
|
|
|
|
|
|
|
```dockerfile
|
|
|
|
|
|
# Dockerfile for Python
|
|
|
|
|
|
FROM python:3.10-slim
|
|
|
|
|
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
|
|
|
|
# 安装系统依赖
|
|
|
|
|
|
RUN apt-get update && apt-get install -y \
|
|
|
|
|
|
gcc \
|
|
|
|
|
|
postgresql-client \
|
|
|
|
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
|
|
|
|
|
|
|
|
# 复制依赖文件
|
|
|
|
|
|
COPY requirements.txt .
|
|
|
|
|
|
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
|
|
RUN pip install tushare
|
|
|
|
|
|
|
|
|
|
|
|
# 复制应用代码
|
|
|
|
|
|
COPY . .
|
|
|
|
|
|
|
|
|
|
|
|
# 暴露端口
|
|
|
|
|
|
EXPOSE 8080
|
|
|
|
|
|
|
|
|
|
|
|
# 启动命令
|
|
|
|
|
|
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
创建 `docker-compose.yml`:
|
|
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
version: '3.8'
|
|
|
|
|
|
|
|
|
|
|
|
services:
|
|
|
|
|
|
app:
|
|
|
|
|
|
build: .
|
|
|
|
|
|
ports:
|
|
|
|
|
|
- "8080:8080"
|
|
|
|
|
|
environment:
|
|
|
|
|
|
- PORT=8080
|
|
|
|
|
|
- DATABASE_URL=postgresql://marketdata:password@postgres:5432/marketdata
|
|
|
|
|
|
- TUSHARE_TOKEN=${TUSHARE_TOKEN}
|
|
|
|
|
|
- API_KEY=${API_KEY}
|
|
|
|
|
|
depends_on:
|
|
|
|
|
|
- postgres
|
|
|
|
|
|
restart: always
|
|
|
|
|
|
volumes:
|
|
|
|
|
|
- ./logs:/app/logs
|
|
|
|
|
|
|
|
|
|
|
|
postgres:
|
|
|
|
|
|
image: postgres:15-alpine
|
|
|
|
|
|
environment:
|
|
|
|
|
|
- POSTGRES_USER=marketdata
|
|
|
|
|
|
- POSTGRES_PASSWORD=password
|
|
|
|
|
|
- POSTGRES_DB=marketdata
|
|
|
|
|
|
volumes:
|
|
|
|
|
|
- postgres_data:/var/lib/postgresql/data
|
|
|
|
|
|
ports:
|
|
|
|
|
|
- "5432:5432"
|
|
|
|
|
|
restart: always
|
|
|
|
|
|
|
|
|
|
|
|
volumes:
|
|
|
|
|
|
postgres_data:
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 构建并启动
|
|
|
|
|
|
docker-compose up -d
|
|
|
|
|
|
|
|
|
|
|
|
# 查看日志
|
|
|
|
|
|
docker-compose logs -f app
|
|
|
|
|
|
|
|
|
|
|
|
# 同步数据
|
|
|
|
|
|
docker-compose exec app python scripts/sync_data.py --type stocks
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 三、Nginx配置(通用)
|
|
|
|
|
|
|
|
|
|
|
|
## 3.1 配置Nginx
|
|
|
|
|
|
|
|
|
|
|
|
创建 `/etc/nginx/sites-available/market-data-service`:
|
|
|
|
|
|
|
|
|
|
|
|
```nginx
|
|
|
|
|
|
upstream market_data_backend {
|
|
|
|
|
|
server 127.0.0.1:8080;
|
|
|
|
|
|
# 多实例时添加
|
|
|
|
|
|
# server 127.0.0.1:8081;
|
|
|
|
|
|
# server 127.0.0.1:8082;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
server {
|
|
|
|
|
|
listen 80;
|
|
|
|
|
|
server_name api.marketdata.example.com;
|
|
|
|
|
|
|
|
|
|
|
|
# WebSocket支持
|
|
|
|
|
|
location /v1/stream {
|
|
|
|
|
|
proxy_pass http://market_data_backend;
|
|
|
|
|
|
proxy_http_version 1.1;
|
|
|
|
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
|
|
|
|
proxy_set_header Connection "upgrade";
|
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
|
proxy_set_header X-API-Key $http_x_api_key;
|
|
|
|
|
|
proxy_read_timeout 86400;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# REST API
|
|
|
|
|
|
location /v1/ {
|
|
|
|
|
|
proxy_pass http://market_data_backend;
|
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
|
proxy_set_header X-API-Key $http_x_api_key;
|
|
|
|
|
|
|
|
|
|
|
|
# 限流
|
|
|
|
|
|
limit_req zone=api_limit burst=20 nodelay;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 管理后台
|
|
|
|
|
|
location /admin {
|
|
|
|
|
|
proxy_pass http://market_data_backend;
|
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 健康检查
|
|
|
|
|
|
location /health {
|
|
|
|
|
|
proxy_pass http://market_data_backend/v1/admin/health;
|
|
|
|
|
|
access_log off;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 限流配置
|
|
|
|
|
|
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
sudo ln -s /etc/nginx/sites-available/market-data-service /etc/nginx/sites-enabled/
|
|
|
|
|
|
sudo nginx -t
|
|
|
|
|
|
sudo systemctl restart nginx
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 四、监控与维护(通用)
|
|
|
|
|
|
|
|
|
|
|
|
## 4.1 查看服务状态
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Go服务
|
|
|
|
|
|
sudo systemctl status market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# Python服务
|
|
|
|
|
|
sudo systemctl status python-market-data-service
|
|
|
|
|
|
|
|
|
|
|
|
# 实时日志
|
|
|
|
|
|
sudo tail -f /opt/market-data-service/logs/service.log
|
|
|
|
|
|
# 或
|
|
|
|
|
|
sudo tail -f /opt/python-market-data-service/logs/service.log
|
|
|
|
|
|
|
|
|
|
|
|
# 数据库连接数
|
|
|
|
|
|
psql $DATABASE_URL -c "SELECT count(*) FROM pg_stat_activity;"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 4.2 备份策略
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
# 数据库备份脚本
|
|
|
|
|
|
BACKUP_DIR=/opt/backups
|
|
|
|
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|
|
|
|
|
|
|
|
|
|
|
pg_dump $DATABASE_URL | gzip > $BACKUP_DIR/marketdata_$DATE.sql.gz
|
|
|
|
|
|
|
|
|
|
|
|
# 保留最近7天备份
|
|
|
|
|
|
find $BACKUP_DIR -name "marketdata_*.sql.gz" -mtime +7 -delete
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 4.3 水平扩展
|
|
|
|
|
|
|
|
|
|
|
|
**Go:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
PORT=8081 ./bin/market-data-service &
|
|
|
|
|
|
PORT=8082 ./bin/market-data-service &
|
|
|
|
|
|
PORT=8083 ./bin/market-data-service &
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Python:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 使用不同端口启动多个实例
|
|
|
|
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8081 &
|
|
|
|
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8082 &
|
|
|
|
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8083 &
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 五、故障排查
|
|
|
|
|
|
|
|
|
|
|
|
## 5.1 常见问题
|
|
|
|
|
|
|
|
|
|
|
|
**问题1**: 服务无法启动,提示数据库连接失败
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查PostgreSQL状态
|
|
|
|
|
|
sudo systemctl status postgresql
|
|
|
|
|
|
|
|
|
|
|
|
# 测试连接
|
|
|
|
|
|
psql $DATABASE_URL -c "SELECT 1;"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**问题2**: Python服务依赖安装失败
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查Python版本
|
|
|
|
|
|
python3 --version # 需 >= 3.10
|
|
|
|
|
|
|
|
|
|
|
|
# 安装系统依赖(Ubuntu)
|
|
|
|
|
|
sudo apt install -y python3-dev libpq-dev gcc
|
|
|
|
|
|
|
|
|
|
|
|
# 重新安装
|
|
|
|
|
|
pip install -r requirements.txt --force-reinstall
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**问题3**: WebSocket连接断开
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 检查连接数
|
|
|
|
|
|
netstat -an | grep :8080 | wc -l
|
|
|
|
|
|
|
|
|
|
|
|
# 查看错误日志
|
|
|
|
|
|
sudo tail -f /opt/market-data-service/logs/error.log
|
|
|
|
|
|
# 或
|
|
|
|
|
|
sudo tail -f /opt/python-market-data-service/logs/service.log
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**问题4**: 数据同步失败
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Go
|
|
|
|
|
|
./bin/market-data-sync -type stocks 2>&1 | head -20
|
|
|
|
|
|
|
|
|
|
|
|
# Python
|
|
|
|
|
|
python scripts/sync_data.py --type stocks 2>&1 | head -20
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 六、性能优化
|
|
|
|
|
|
|
|
|
|
|
|
## 6.1 数据库优化
|
|
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
|
-- 添加额外索引
|
|
|
|
|
|
CREATE INDEX CONCURRENTLY idx_klines_symbol_ts ON stock.klines_1m(symbol_id, ts DESC);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 6.2 连接池配置
|
|
|
|
|
|
|
|
|
|
|
|
**Go:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
export DB_MAX_OPEN_CONNS=100
|
|
|
|
|
|
export DB_MAX_IDLE_CONNS=10
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Python:**
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 在 app/repositories/database.py 中修改
|
|
|
|
|
|
engine = create_engine(
|
|
|
|
|
|
config.database.database_url,
|
|
|
|
|
|
pool_size=10,
|
|
|
|
|
|
max_overflow=20,
|
|
|
|
|
|
pool_pre_ping=True,
|
|
|
|
|
|
)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 6.3 查询缓存
|
|
|
|
|
|
|
|
|
|
|
|
高频查询结果可缓存到Redis,Python实现已预留Redis配置。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# 七、安全建议
|
|
|
|
|
|
|
|
|
|
|
|
1. **API Key管理**: 定期更换API Key,使用环境变量存储
|
|
|
|
|
|
2. **数据库安全**: 使用强密码,限制远程访问,启用SSL
|
|
|
|
|
|
3. **网络安全**: 配置防火墙,仅开放必要端口
|
|
|
|
|
|
4. **日志脱敏**: 日志中避免输出敏感信息
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**文档结束**
|