# 部署架构
> **文档版本**:v1.0
> **最后更新**:2025-01-27
---
## 目录
1. [Docker 容器化](#docker-容器化)
2. [Docker Compose 配置](#docker-compose-配置)
3. [生产环境部署](#生产环境部署)
4. [环境配置](#环境配置)
---
## Docker 容器化
### Dockerfile
```dockerfile
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
ffmpeg \
libpq-dev \
gcc \
&& rm -rf /var/lib/apt/lists/*
# 安装 Python 依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 创建非 root 用户
RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
USER appuser
# 暴露端口
EXPOSE 8000
# 运行应用
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
```
### .dockerignore
```
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env/
venv/
.venv
pip-log.txt
pip-delete-this-directory.txt
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.log
.git
.gitignore
.mypy_cache
.pytest_cache
.hypothesis
*.db
*.sqlite3
.env
.env.local
.DS_Store
```
---
## Docker Compose 配置
### docker-compose.yml
```yaml
version: "3.8"
services:
# API 服务
api:
build: .
container_name: jointo-api
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/jointo
- REDIS_URL=redis://redis:6379/0
- CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672//
- CELERY_RESULT_BACKEND=redis://redis:6379/0
- MINIO_ENDPOINT=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
depends_on:
- db
- redis
- rabbitmq
- minio
volumes:
- ./app:/app/app
networks:
- jointo-network
# Celery Worker - AI 任务
celery-worker-ai:
build: .
container_name: jointo-celery-ai
command: celery -A app.tasks.celery_app worker -Q ai --loglevel=info
environment:
- DATABASE_URL=postgresql://user:password@db:5432/jointo
- REDIS_URL=redis://redis:6379/0
- CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672//
- CELERY_RESULT_BACKEND=redis://redis:6379/0
depends_on:
- db
- redis
- rabbitmq
networks:
- jointo-network
# Celery Worker - 导出任务
celery-worker-export:
build: .
container_name: jointo-celery-export
command: celery -A app.tasks.celery_app worker -Q export --loglevel=info
environment:
- DATABASE_URL=postgresql://user:password@db:5432/jointo
- REDIS_URL=redis://redis:6379/0
- CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672//
- CELERY_RESULT_BACKEND=redis://redis:6379/0
depends_on:
- db
- redis
- rabbitmq
networks:
- jointo-network
# Celery Beat(定时任务)
celery-beat:
build: .
container_name: jointo-celery-beat
command: celery -A app.tasks.celery_app beat --loglevel=info
environment:
- DATABASE_URL=postgresql://user:password@db:5432/jointo
- REDIS_URL=redis://redis:6379/0
- CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672//
depends_on:
- db
- redis
- rabbitmq
networks:
- jointo-network
# PostgreSQL
db:
image: postgres:14
container_name: jointo-db
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=jointo
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- jointo-network
# Redis
redis:
image: redis:7-alpine
container_name: jointo-redis
volumes:
- redis_data:/data
ports:
- "6379:6379"
networks:
- jointo-network
# RabbitMQ
rabbitmq:
image: rabbitmq:3.12-management
container_name: jointo-rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
volumes:
- rabbitmq_data:/var/lib/rabbitmq
ports:
- "5672:5672"
- "15672:15672" # 管理界面
networks:
- jointo-network
# MinIO(对象存储)
minio:
image: minio/minio
container_name: jointo-minio
command: server /data --console-address ":9001"
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
volumes:
- minio_data:/data
ports:
- "9000:9000"
- "9001:9001" # 管理界面
networks:
- jointo-network
# Nginx(可选)
nginx:
image: nginx:alpine
container_name: jointo-nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
- "443:443"
depends_on:
- api
networks:
- jointo-network
volumes:
postgres_data:
redis_data:
rabbitmq_data:
minio_data:
networks:
jointo-network:
driver: bridge
```
### 启动服务
```bash
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
# 重启服务
docker-compose restart
# 查看服务状态
docker-compose ps
```
---
## 生产环境部署
### 推荐架构
```
┌─────────────────────────────────────────────────────────────┐
│ 负载均衡器 │
│ (Nginx / AWS ALB) │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌───────▼────────┐ ┌───────▼────────┐ ┌───────▼────────┐
│ API 服务 1 │ │ API 服务 2 │ │ API 服务 3 │
│ (容器) │ │ (容器) │ │ (容器) │
└────────────────┘ └────────────────┘ └────────────────┘
│ │ │
└───────────────────┼───────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌───────▼────────┐ ┌───────▼────────┐ ┌───────▼────────┐
│ PostgreSQL │ │ Redis │ │ RabbitMQ │
│ (主从复制) │ │ (Cluster) │ │ (Cluster) │
└────────────────┘ └────────────────┘ └────────────────┘
│
┌───────▼────────┐
│ AWS S3 / │
│ 阿里云 OSS │
└────────────────┘
```
### 部署步骤
#### 1. 准备服务器
```bash
# 安装 Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```
#### 2. 配置环境变量
```bash
# 创建 .env 文件
cp .env.example .env
# 编辑环境变量
vim .env
```
#### 3. 初始化数据库
```bash
# 运行数据库迁移
docker-compose exec api alembic upgrade head
# 创建初始数据
docker-compose exec api python scripts/seed_data.py
```
#### 4. 配置 Nginx
```nginx
# nginx.conf
upstream api_backend {
server api:8000;
}
server {
listen 80;
server_name api.jointo.ai;
location / {
proxy_pass http://api_backend;
proxy_set_header Host $host;
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;
}
# WebSocket 支持
location /ws {
proxy_pass http://api_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
```
#### 5. 配置 SSL(使用 Let's Encrypt)
```bash
# 安装 Certbot
sudo apt-get install certbot python3-certbot-nginx
# 获取证书
sudo certbot --nginx -d api.jointo.ai
# 自动续期
sudo certbot renew --dry-run
```
---
## 环境配置
### .env.example
```bash
# 应用配置
APP_NAME=Jointo
APP_ENV=production
DEBUG=false
SECRET_KEY=your-secret-key-here
# 数据库配置
DATABASE_URL=postgresql://user:password@localhost:5432/jointo
# Redis 配置
REDIS_URL=redis://localhost:6379/0
# Celery 配置
CELERY_BROKER_URL=amqp://guest:guest@localhost:5672//
CELERY_RESULT_BACKEND=redis://localhost:6379/0
# MinIO / S3 配置
MINIO_ENDPOINT=localhost:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_BUCKET_NAME=jointo
MINIO_SECURE=false
# 或使用 AWS S3
# AWS_ACCESS_KEY_ID=your-access-key
# AWS_SECRET_ACCESS_KEY=your-secret-key
# AWS_S3_BUCKET=jointo
# AWS_REGION=us-east-1
# AI 服务配置
OPENAI_API_KEY=your-openai-api-key
STABLE_DIFFUSION_API_KEY=your-sd-api-key
RUNWAY_API_KEY=your-runway-api-key
# JWT 配置
JWT_SECRET_KEY=your-jwt-secret-key
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
REFRESH_TOKEN_EXPIRE_DAYS=7
# CORS 配置
CORS_ORIGINS=http://localhost:3000,https://www.jointo.ai
# 日志配置
LOG_LEVEL=INFO
LOG_FILE=logs/app.log
```
---
## 监控和日志
### 日志收集
```python
# app/core/logging.py
from loguru import logger
import sys
# 配置日志
logger.remove()
logger.add(
sys.stdout,
format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
level="INFO"
)
logger.add(
"logs/app.log",
rotation="500 MB",
retention="10 days",
compression="zip",
level="INFO"
)
```
### 健康检查
```python
# app/api/v1/health.py
from fastapi import APIRouter
from app.core.database import engine
from app.core.cache import redis_client
router = APIRouter()
@router.get("/health")
async def health_check():
"""健康检查"""
# 检查数据库
try:
engine.connect()
db_status = "ok"
except Exception:
db_status = "error"
# 检查 Redis
try:
redis_client.ping()
redis_status = "ok"
except Exception:
redis_status = "error"
return {
"status": "ok" if db_status == "ok" and redis_status == "ok" else "error",
"database": db_status,
"redis": redis_status
}
```
---
## 相关文档
- [系统架构设计](./03-system-design.md)
- [异步任务处理](./07-async-tasks.md)
- [性能优化](./11-performance.md)
---
**文档版本**:v1.0
**最后更新**:2025-01-27