579 lines
11 KiB
Markdown
579 lines
11 KiB
Markdown
# AIEC-RAG 部署指南
|
||
|
||
## 目录
|
||
|
||
1. [部署架构](#部署架构)
|
||
2. [单机部署](#单机部署)
|
||
3. [Docker部署](#docker部署)
|
||
4. [生产环境部署](#生产环境部署)
|
||
5. [性能调优](#性能调优)
|
||
6. [监控配置](#监控配置)
|
||
7. [备份恢复](#备份恢复)
|
||
|
||
## 部署架构
|
||
|
||
### 推荐架构
|
||
|
||
```
|
||
[负载均衡器]
|
||
|
|
||
┌────────────┼────────────┐
|
||
↓ ↓ ↓
|
||
[AIEC-RAG-1] [AIEC-RAG-2] [AIEC-RAG-3]
|
||
↓ ↓ ↓
|
||
└────────────┼────────────┘
|
||
↓
|
||
[Elasticsearch集群]
|
||
↓
|
||
[向量数据库]
|
||
```
|
||
|
||
### 最小配置要求
|
||
|
||
| 组件 | CPU | 内存 | 存储 | 说明 |
|
||
|-----|-----|------|------|------|
|
||
| API服务 | 4核 | 8GB | 50GB | 单实例最小配置 |
|
||
| Elasticsearch | 4核 | 16GB | 200GB | 推荐使用SSD |
|
||
| 整体系统 | 8核 | 32GB | 500GB | 生产环境推荐 |
|
||
|
||
## 单机部署
|
||
|
||
### 1. 系统准备
|
||
|
||
```bash
|
||
# Ubuntu/Debian
|
||
sudo apt update
|
||
sudo apt install -y python3.8 python3-pip git curl wget
|
||
|
||
# CentOS/RHEL
|
||
sudo yum update -y
|
||
sudo yum install -y python38 python38-pip git curl wget
|
||
```
|
||
|
||
### 2. 安装Elasticsearch
|
||
|
||
```bash
|
||
# 下载并安装Elasticsearch 8.x
|
||
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.0-linux-x86_64.tar.gz
|
||
tar -xzf elasticsearch-8.11.0-linux-x86_64.tar.gz
|
||
cd elasticsearch-8.11.0
|
||
|
||
# 配置Elasticsearch
|
||
cat >> config/elasticsearch.yml << EOF
|
||
network.host: 0.0.0.0
|
||
discovery.type: single-node
|
||
xpack.security.enabled: true
|
||
xpack.security.authc.api_key.enabled: true
|
||
EOF
|
||
|
||
# 启动Elasticsearch
|
||
./bin/elasticsearch -d
|
||
```
|
||
|
||
### 3. 部署AIEC-RAG
|
||
|
||
```bash
|
||
# 克隆项目
|
||
git clone <repository_url>
|
||
cd AIEC-RAG
|
||
|
||
# 创建虚拟环境
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
|
||
# 安装依赖
|
||
pip install -r requirements.txt
|
||
|
||
# 配置环境变量
|
||
cp .env.example .env
|
||
# 编辑.env文件,填入实际配置
|
||
|
||
# 启动服务
|
||
python rag_api_server_production.py
|
||
```
|
||
|
||
### 4. 设置系统服务
|
||
|
||
创建 `/etc/systemd/system/aiec-rag.service`:
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=AIEC-RAG Service
|
||
After=network.target elasticsearch.service
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=aiec
|
||
WorkingDirectory=/opt/AIEC-RAG
|
||
Environment="PATH=/opt/AIEC-RAG/venv/bin"
|
||
ExecStart=/opt/AIEC-RAG/venv/bin/python /opt/AIEC-RAG/rag_api_server_production.py
|
||
Restart=always
|
||
RestartSec=10
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
启用服务:
|
||
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable aiec-rag
|
||
sudo systemctl start aiec-rag
|
||
sudo systemctl status aiec-rag
|
||
```
|
||
|
||
## Docker部署
|
||
|
||
### 1. 使用预构建镜像
|
||
|
||
```bash
|
||
# 拉取镜像(如果有私有仓库)
|
||
docker pull your-registry/aiec-rag:latest
|
||
|
||
# 或构建本地镜像
|
||
docker build -t aiec-rag:latest .
|
||
```
|
||
|
||
### 2. Docker Compose部署
|
||
|
||
创建 `docker-compose.yml`:
|
||
|
||
```yaml
|
||
version: '3.8'
|
||
|
||
services:
|
||
elasticsearch:
|
||
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
|
||
container_name: aiec-elasticsearch
|
||
environment:
|
||
- discovery.type=single-node
|
||
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
|
||
- xpack.security.enabled=true
|
||
- ELASTIC_PASSWORD=your_password
|
||
volumes:
|
||
- es_data:/usr/share/elasticsearch/data
|
||
ports:
|
||
- "9200:9200"
|
||
networks:
|
||
- aiec_network
|
||
healthcheck:
|
||
test: ["CMD", "curl", "-f", "http://localhost:9200"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 5
|
||
|
||
aiec-rag:
|
||
build: .
|
||
container_name: aiec-rag
|
||
depends_on:
|
||
elasticsearch:
|
||
condition: service_healthy
|
||
environment:
|
||
- ELASTICSEARCH_HOST=http://elasticsearch:9200
|
||
- ELASTICSEARCH_USERNAME=elastic
|
||
- ELASTICSEARCH_PASSWORD=your_password
|
||
env_file:
|
||
- .env
|
||
ports:
|
||
- "8100:8100"
|
||
volumes:
|
||
- ./rag_config_production.yaml:/app/rag_config_production.yaml
|
||
- ./api_outputs:/app/api_outputs
|
||
networks:
|
||
- aiec_network
|
||
restart: unless-stopped
|
||
|
||
volumes:
|
||
es_data:
|
||
driver: local
|
||
|
||
networks:
|
||
aiec_network:
|
||
driver: bridge
|
||
```
|
||
|
||
启动服务:
|
||
|
||
```bash
|
||
docker-compose up -d
|
||
docker-compose logs -f
|
||
```
|
||
|
||
### 3. Kubernetes部署
|
||
|
||
创建 `k8s-deployment.yaml`:
|
||
|
||
```yaml
|
||
apiVersion: apps/v1
|
||
kind: Deployment
|
||
metadata:
|
||
name: aiec-rag
|
||
labels:
|
||
app: aiec-rag
|
||
spec:
|
||
replicas: 3
|
||
selector:
|
||
matchLabels:
|
||
app: aiec-rag
|
||
template:
|
||
metadata:
|
||
labels:
|
||
app: aiec-rag
|
||
spec:
|
||
containers:
|
||
- name: aiec-rag
|
||
image: your-registry/aiec-rag:latest
|
||
ports:
|
||
- containerPort: 8100
|
||
env:
|
||
- name: ELASTICSEARCH_HOST
|
||
value: "http://elasticsearch-service:9200"
|
||
envFrom:
|
||
- secretRef:
|
||
name: aiec-secrets
|
||
resources:
|
||
requests:
|
||
memory: "4Gi"
|
||
cpu: "2"
|
||
limits:
|
||
memory: "8Gi"
|
||
cpu: "4"
|
||
livenessProbe:
|
||
httpGet:
|
||
path: /health
|
||
port: 8100
|
||
initialDelaySeconds: 30
|
||
periodSeconds: 10
|
||
readinessProbe:
|
||
httpGet:
|
||
path: /health
|
||
port: 8100
|
||
initialDelaySeconds: 5
|
||
periodSeconds: 5
|
||
---
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: aiec-rag-service
|
||
spec:
|
||
selector:
|
||
app: aiec-rag
|
||
ports:
|
||
- protocol: TCP
|
||
port: 80
|
||
targetPort: 8100
|
||
type: LoadBalancer
|
||
```
|
||
|
||
部署到Kubernetes:
|
||
|
||
```bash
|
||
# 创建密钥
|
||
kubectl create secret generic aiec-secrets --from-env-file=.env
|
||
|
||
# 部署应用
|
||
kubectl apply -f k8s-deployment.yaml
|
||
|
||
# 查看状态
|
||
kubectl get pods
|
||
kubectl get services
|
||
```
|
||
|
||
## 生产环境部署
|
||
|
||
### 1. 负载均衡配置
|
||
|
||
使用Nginx作为负载均衡器:
|
||
|
||
```nginx
|
||
upstream aiec_backend {
|
||
least_conn;
|
||
server 10.0.1.10:8100 weight=1 max_fails=3 fail_timeout=30s;
|
||
server 10.0.1.11:8100 weight=1 max_fails=3 fail_timeout=30s;
|
||
server 10.0.1.12:8100 weight=1 max_fails=3 fail_timeout=30s;
|
||
}
|
||
|
||
server {
|
||
listen 80;
|
||
server_name api.aiec-rag.com;
|
||
|
||
location / {
|
||
proxy_pass http://aiec_backend;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Upgrade $http_upgrade;
|
||
proxy_set_header Connection 'upgrade';
|
||
proxy_set_header Host $host;
|
||
proxy_cache_bypass $http_upgrade;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
|
||
# 超时设置
|
||
proxy_connect_timeout 60s;
|
||
proxy_send_timeout 120s;
|
||
proxy_read_timeout 120s;
|
||
}
|
||
|
||
# 健康检查端点
|
||
location /health {
|
||
proxy_pass http://aiec_backend/health;
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. SSL/TLS配置
|
||
|
||
```nginx
|
||
server {
|
||
listen 443 ssl http2;
|
||
server_name api.aiec-rag.com;
|
||
|
||
ssl_certificate /etc/nginx/ssl/aiec-rag.crt;
|
||
ssl_certificate_key /etc/nginx/ssl/aiec-rag.key;
|
||
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
|
||
# ... 其他配置同上
|
||
}
|
||
```
|
||
|
||
### 3. 数据库优化
|
||
|
||
Elasticsearch优化配置:
|
||
|
||
```yaml
|
||
# elasticsearch.yml
|
||
cluster.name: aiec-rag-cluster
|
||
node.name: node-1
|
||
|
||
# 内存设置
|
||
bootstrap.memory_lock: true
|
||
|
||
# 线程池
|
||
thread_pool:
|
||
write:
|
||
size: 8
|
||
queue_size: 1000
|
||
search:
|
||
size: 16
|
||
queue_size: 1000
|
||
|
||
# 索引设置
|
||
index:
|
||
number_of_shards: 3
|
||
number_of_replicas: 1
|
||
refresh_interval: 30s
|
||
```
|
||
|
||
## 性能调优
|
||
|
||
### 1. Python应用优化
|
||
|
||
```python
|
||
# 使用Gunicorn作为WSGI服务器(Linux)
|
||
gunicorn -w 4 -k uvicorn.workers.UvicornWorker \
|
||
--bind 0.0.0.0:8100 \
|
||
--timeout 120 \
|
||
--keep-alive 5 \
|
||
--max-requests 1000 \
|
||
--max-requests-jitter 50 \
|
||
rag_api_server_production:app
|
||
```
|
||
|
||
### 2. 系统参数优化
|
||
|
||
```bash
|
||
# /etc/sysctl.conf
|
||
net.ipv4.tcp_fin_timeout = 30
|
||
net.ipv4.tcp_tw_reuse = 1
|
||
net.ipv4.tcp_tw_recycle = 1
|
||
net.ipv4.tcp_max_syn_backlog = 8192
|
||
net.ipv4.tcp_max_tw_buckets = 10000
|
||
net.core.somaxconn = 65535
|
||
net.core.netdev_max_backlog = 65535
|
||
|
||
# 应用配置
|
||
sudo sysctl -p
|
||
```
|
||
|
||
### 3. 缓存策略
|
||
|
||
配置Redis缓存:
|
||
|
||
```python
|
||
# 在代码中添加缓存支持
|
||
import redis
|
||
from functools import lru_cache
|
||
|
||
redis_client = redis.Redis(
|
||
host='localhost',
|
||
port=6379,
|
||
decode_responses=True,
|
||
max_connections=50
|
||
)
|
||
|
||
@lru_cache(maxsize=128)
|
||
def get_cached_embedding(text: str):
|
||
# 缓存嵌入向量
|
||
pass
|
||
```
|
||
|
||
## 监控配置
|
||
|
||
### 1. Prometheus监控
|
||
|
||
```yaml
|
||
# prometheus.yml
|
||
scrape_configs:
|
||
- job_name: 'aiec-rag'
|
||
static_configs:
|
||
- targets: ['localhost:8100']
|
||
metrics_path: '/metrics'
|
||
scrape_interval: 15s
|
||
```
|
||
|
||
### 2. 日志管理
|
||
|
||
配置日志轮转:
|
||
|
||
```bash
|
||
# /etc/logrotate.d/aiec-rag
|
||
/opt/AIEC-RAG/logs/*.log {
|
||
daily
|
||
rotate 30
|
||
compress
|
||
delaycompress
|
||
missingok
|
||
notifempty
|
||
create 644 aiec aiec
|
||
sharedscripts
|
||
postrotate
|
||
systemctl reload aiec-rag
|
||
endscript
|
||
}
|
||
```
|
||
|
||
### 3. 告警配置
|
||
|
||
```yaml
|
||
# alerting_rules.yml
|
||
groups:
|
||
- name: aiec_alerts
|
||
rules:
|
||
- alert: HighResponseTime
|
||
expr: http_request_duration_seconds{quantile="0.99"} > 5
|
||
for: 5m
|
||
labels:
|
||
severity: warning
|
||
annotations:
|
||
summary: "High response time on {{ $labels.instance }}"
|
||
|
||
- alert: ServiceDown
|
||
expr: up{job="aiec-rag"} == 0
|
||
for: 1m
|
||
labels:
|
||
severity: critical
|
||
annotations:
|
||
summary: "AIEC-RAG service is down"
|
||
```
|
||
|
||
## 备份恢复
|
||
|
||
### 1. 数据备份
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# backup.sh
|
||
DATE=$(date +%Y%m%d_%H%M%S)
|
||
BACKUP_DIR="/backup/aiec-rag"
|
||
|
||
# 备份Elasticsearch数据
|
||
curl -X PUT "localhost:9200/_snapshot/backup_repo" -H 'Content-Type: application/json' -d'
|
||
{
|
||
"type": "fs",
|
||
"settings": {
|
||
"location": "'$BACKUP_DIR'/elasticsearch"
|
||
}
|
||
}'
|
||
|
||
curl -X PUT "localhost:9200/_snapshot/backup_repo/snapshot_$DATE?wait_for_completion=true"
|
||
|
||
# 备份配置文件
|
||
tar -czf $BACKUP_DIR/config_$DATE.tar.gz \
|
||
/opt/AIEC-RAG/.env \
|
||
/opt/AIEC-RAG/rag_config_production.yaml
|
||
|
||
echo "Backup completed: $DATE"
|
||
```
|
||
|
||
### 2. 恢复流程
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# restore.sh
|
||
SNAPSHOT_NAME=$1
|
||
|
||
# 恢复Elasticsearch数据
|
||
curl -X POST "localhost:9200/_snapshot/backup_repo/$SNAPSHOT_NAME/_restore"
|
||
|
||
# 恢复配置文件
|
||
tar -xzf /backup/aiec-rag/config_latest.tar.gz -C /
|
||
|
||
# 重启服务
|
||
systemctl restart aiec-rag
|
||
|
||
echo "Restore completed from: $SNAPSHOT_NAME"
|
||
```
|
||
|
||
## 故障处理
|
||
|
||
### 常见问题处理
|
||
|
||
1. **服务无响应**
|
||
```bash
|
||
# 检查服务状态
|
||
systemctl status aiec-rag
|
||
# 查看日志
|
||
journalctl -u aiec-rag -n 100
|
||
# 重启服务
|
||
systemctl restart aiec-rag
|
||
```
|
||
|
||
2. **Elasticsearch连接失败**
|
||
```bash
|
||
# 检查ES状态
|
||
curl -X GET "localhost:9200/_cluster/health?pretty"
|
||
# 检查网络连接
|
||
telnet localhost 9200
|
||
```
|
||
|
||
3. **内存溢出**
|
||
```bash
|
||
# 增加内存限制
|
||
export PYTHONUNBUFFERED=1
|
||
export OMP_NUM_THREADS=4
|
||
```
|
||
|
||
## 安全建议
|
||
|
||
1. **API密钥管理**
|
||
- 使用密钥管理服务(如HashiCorp Vault)
|
||
- 定期轮换API密钥
|
||
- 不要在代码中硬编码密钥
|
||
|
||
2. **网络安全**
|
||
- 使用防火墙限制访问
|
||
- 配置SSL/TLS加密
|
||
- 实施速率限制
|
||
|
||
3. **数据安全**
|
||
- 加密敏感数据
|
||
- 定期备份
|
||
- 实施访问控制
|
||
|
||
---
|
||
|
||
*更多部署问题,请参考项目Wiki或联系技术支持。* |