11. 交付与运维
11.1 一键部署
部署方案
智能金融解决方案采用容器化部署,支持一键部署到Kubernetes集群:
Docker化部署
Dockerfile示例:
# 基础镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml示例:
version: '3.8'
services:
api:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/finance_ai
- REDIS_URL=redis://redis:6379/0
depends_on:
- db
- redis
db:
image: postgres:14
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=finance_ai
volumes:
- db_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
volumes:
db_data:
redis_data:
Kubernetes部署
Deployment配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: finance-ai-api
spec:
replicas: 3
selector:
matchLabels:
app: finance-ai-api
template:
metadata:
labels:
app: finance-ai-api
spec:
containers:
- name: api
image: finance-ai:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: finance-ai-secrets
key: database-url
- name: REDIS_URL
valueFrom:
secretKeyRef:
name: finance-ai-secrets
key: redis-url
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 10
periodSeconds: 5
Service配置:
apiVersion: v1
kind: Service
metadata:
name: finance-ai-api
spec:
selector:
app: finance-ai-api
ports:
- port: 80
targetPort: 8000
type: LoadBalancer
Ingress配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: finance-ai-ingress
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: finance-ai-api
port:
number: 80
部署脚本
一键部署脚本
#!/bin/bash
# deploy.sh - 一键部署脚本
set -e
# 配置变量
NAMESPACE="finance-ai"
IMAGE_TAG="${1:-latest}"
ENVIRONMENT="${2:-staging}"
echo "开始部署智能金融解决方案..."
echo "命名空间: $NAMESPACE"
echo "镜像标签: $IMAGE_TAG"
echo "环境: $ENVIRONMENT"
# 创建命名空间
kubectl create namespace $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -
# 创建Secret
kubectl create secret generic finance-ai-secrets \
--from-literal=database-url="$DATABASE_URL" \
--from-literal=redis-url="$REDIS_URL" \
--from-literal=api-key="$API_KEY" \
--namespace=$NAMESPACE \
--dry-run=client -o yaml | kubectl apply -f -
# 部署应用
kubectl apply -f k8s/deployment.yaml -n $NAMESPACE
kubectl set image deployment/finance-ai-api \
api=finance-ai:$IMAGE_TAG \
-n $NAMESPACE
# 等待部署完成
kubectl rollout status deployment/finance-ai-api -n $NAMESPACE
# 部署Service
kubectl apply -f k8s/service.yaml -n $NAMESPACE
# 部署Ingress
kubectl apply -f k8s/ingress.yaml -n $NAMESPACE
echo "部署完成!"
Helm Chart部署
Chart.yaml:
apiVersion: v2
name: finance-ai
description: 智能金融解决方案
version: 1.0.0
appVersion: "1.0.0"
values.yaml:
replicaCount: 3
image:
repository: finance-ai
tag: latest
pullPolicy: IfNotPresent
service:
type: LoadBalancer
port: 80
ingress:
enabled: true
host: api.example.com
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
database:
url: postgresql://user:password@db:5432/finance_ai
redis:
url: redis://redis:6379/0
部署命令:
# 安装Chart
helm install finance-ai ./finance-ai-chart \
--namespace finance-ai \
--create-namespace \
--set image.tag=v1.0.0
# 升级Chart
helm upgrade finance-ai ./finance-ai-chart \
--namespace finance-ai \
--set image.tag=v1.1.0
# 卸载Chart
helm uninstall finance-ai --namespace finance-ai
环境配置
环境变量配置
# .env文件
# 数据库配置
DATABASE_URL=postgresql://user:password@db:5432/finance_ai
# Redis配置
REDIS_URL=redis://redis:6379/0
# API配置
API_KEY=your-api-key
API_SECRET=your-api-secret
# 模型配置
LLM_API_KEY=your-llm-api-key
LLM_API_URL=https://api.openai.com/v1
# 监控配置
PROMETHEUS_URL=http://prometheus:9090
GRAFANA_URL=http://grafana:3000
# 日志配置
LOG_LEVEL=INFO
LOG_FORMAT=json
ConfigMap配置
apiVersion: v1
kind: ConfigMap
metadata:
name: finance-ai-config
data:
database_url: "postgresql://user:password@db:5432/finance_ai"
redis_url: "redis://redis:6379/0"
log_level: "INFO"
log_format: "json"
11.2 灾备与回滚
灾备方案
多机房部署
-
主备机房:
- 主机房:承担主要业务流量
- 备机房:实时同步数据,主备切换时间<5分钟
-
异地容灾:
- 同城双活:两个机房同时提供服务,负载均衡
- 异地灾备:异地机房作为灾备,定期同步数据
数据备份策略
-
数据库备份:
- 全量备份:每日凌晨2点全量备份
- 增量备份:每6小时增量备份
- 备份保留:全量备份保留30天,增量备份保留7天
- 备份存储:备份存储到对象存储(S3/OSS)
-
文件备份:
- 配置文件备份:版本控制(Git)
- 日志文件备份:定期归档到对象存储
- 模型文件备份:定期备份到对象存储
灾备演练
- 演练频率:每季度一次
- 演练内容:
- 主备切换演练
- 数据恢复演练
- 服务恢复演练
- 演练记录:记录演练过程和问题,持续改进