Files
2026-09-12 17:39:13 +08:00

477 lines
9.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署指南
本文档介绍 DjangoAdmin FastAPI + EleVue 版本的多种部署方式,包括本地开发、Docker 容器化部署以及生产环境部署。
## 📋 环境要求
### 后端
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Python | 3.10+ | 推荐 3.11 或 3.12 |
| MySQL | 5.7+ | 默认数据库,推荐 8.0+ |
| PostgreSQL | 12+ | 可选,设置 `DB_DRIVER=postgresql` |
| SQL Server | 2017+ | 可选,设置 `DB_DRIVER=mssql` |
| Oracle | 19c+ | 可选,设置 `DB_DRIVER=oracle` |
| Redis | 6.0+ | 必需,用于缓存/会话/限流 |
### 前端
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Node.js | 18+ | 推荐 20 LTS |
| npm | 8+ | 或使用 pnpm / yarn |
## 🚀 方式一:本地开发环境
### 1. 克隆项目
```bash
git clone https://gitee.com/djangoadmin/DjangoAdmin_Fastapi_EleVue.git
cd DjangoAdmin_Fastapi_EleVue
```
### 2. 配置环境变量
```bash
cp .env.example .env
```
编辑 `.env` 文件,配置以下关键变量:
```env
# ============ 数据库配置 ============
DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=djangoadmin
DB_PREFIX=fastapi_
# ============ Redis 配置 ============
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
# ============ JWT 配置 ============
JWT_SALT=your-secret-key-change-in-production
JWT_EXPIRE_MINUTES=120
# ============ 应用配置 ============
APP_HOST=127.0.0.1
APP_PORT=8031
FASTAPI_DEMO=False
```
### 3. 安装依赖
```bash
# 运行 + 开发依赖
pip install -r requirements.txt -r requirements-dev.txt
# 或使用 Makefile
make install
```
### 4. 初始化数据库
```bash
# 自动建库 + 导入 SQL + 创建表 + Alembic stamp
python scripts/init_db.py
# 或使用 Makefile
make db-init
```
### 5. 初始化字典数据(可选)
```bash
python scripts/seed_dict.py
make seed-dict
```
### 6. 启动后端服务
```bash
python src/main.py
# 或使用 Makefile
make dev
# 默认监听 http://127.0.0.1:8031
# API 文档:http://127.0.0.1:8031/docs
```
### 7. 启动前端服务
```bash
cd ui
npm install
npm run dev
# 默认监听 http://localhost:3000
```
## 🐳 方式二:Docker Compose 部署
### 1. 配置环境变量
```bash
cp .env.example .env
# 编辑 .env,将 DB_HOST 和 REDIS_HOST 改为容器名或宿主机 IP
```
> ⚠️ Docker `host` 网络模式下,`DB_HOST` 和 `REDIS_HOST` 可直接使用 `127.0.0.1`。
> 若使用 `bridge` 网络模式,需改为 `host.docker.internal` 或宿主机实际 IP。
### 2. 构建并启动
```bash
docker-compose up --build -d
```
### 3. 查看日志
```bash
docker-compose logs -f fastapi_elevue
```
### 4. 停止服务
```bash
docker-compose down
```
### Docker Compose 配置说明
```yaml
services:
fastapi_elevue:
image: fastapi_elevue
container_name: fastapi_elevue
build:
context: ./
dockerfile: Dockerfile
restart: always
network_mode: host # host 模式,直接连通宿主机网络
ports:
- 8031:8031 # bridge 模式下的端口映射
volumes:
- ./uploads:/data/apps/uploads # 上传文件持久化
env_file:
- .env # 注入环境变量
command: python src/main.py
logging:
driver: "json-file"
options:
max-size: "500m" # 单个日志文件最大 500MB
max-file: "10" # 最多保留 10 个日志文件
```
## 🏭 方式三:生产环境部署
### 使用 Gunicorn + Uvicorn Worker
生产环境推荐使用 Gunicorn 管理 Uvicorn Worker:
```bash
pip install gunicorn
gunicorn main:app \
--app-dir src \
--workers 4 \
--worker-class uvicorn.workers.UvicornWorker \
--bind 0.0.0.0:8031 \
--timeout 120 \
--access-logfile - \
--error-logfile -
```
**Worker 数量建议**:
- CPU 密集型:`workers = CPU 核心数 + 1`
- IO 密集型:`workers = CPU 核心数 * 2 + 1`
- 一般推荐:4 ~ 8 个 Worker
### 使用 Supervisor 进程管理
项目已提供 `deploy/supervisor.conf` 配置文件:
```ini
[program:fastapi_elevue]
command=/path/to/venv/bin/gunicorn main:app
--app-dir /path/to/project/src
--workers 4
--worker-class uvicorn.workers.UvicornWorker
--bind 0.0.0.0:8031
directory=/path/to/project
user=www
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/fastapi_elevue/stdout.log
stderr_logfile=/var/log/fastapi_elevue/stderr.log
```
```bash
# 启动
sudo supervisorctl start fastapi_elevue
# 查看状态
sudo supervisorctl status fastapi_elevue
# 重启
sudo supervisorctl restart fastapi_elevue
```
### Nginx 反向代理
```nginx
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /path/to/ui/dist;
try_files $uri $uri/ /index.html;
}
# 后端 API 代理
location /api/ {
proxy_pass http://127.0.0.1:8031;
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;
proxy_read_timeout 120s;
}
# 上传文件访问
location /uploads/ {
alias /path/to/project/uploads/;
expires 7d;
}
}
```
### 前端构建
```bash
cd ui
# 安装依赖
npm install
# 生产构建
npm run build
# 构建产物在 ui/dist/ 目录
```
## 🗄️ 数据库配置
### MySQL(默认)
```env
DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=djangoadmin
```
### PostgreSQL
```env
DB_DRIVER=postgresql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=your_password
DB_NAME=djangoadmin
```
安装驱动:
```bash
pip install "psycopg[binary]"
```
### SQL Server
```env
DB_DRIVER=mssql
DB_HOST=127.0.0.1
DB_PORT=1433
DB_USER=sa
DB_PASSWORD=your_password
DB_NAME=djangoadmin
```
安装驱动:
```bash
pip install pymssql
```
### Oracle
```env
DB_DRIVER=oracle
DB_HOST=127.0.0.1
DB_PORT=1521
DB_USER=system
DB_PASSWORD=your_password
DB_NAME=ORCL
```
安装驱动:
```bash
pip install oracledb
```
### SQLite
```env
DB_DRIVER=sqlite
DB_NAME=djangoadmin.db
```
> 💡 SQLite 无需额外驱动,Python 内置支持。适合开发/测试环境。
## 🔄 跨库数据迁移
将现有 MySQL 数据迁移到其他数据库:
```bash
# 1. 干跑 — 只连接源库,逐表数行数,打印迁移计划
make db-migrate-dry-run ARGS="--src-driver=mysql --src-host=127.0.0.1 --src-db=djangoadmin --src-user=root --src-password=xxx --dst-driver=postgresql --dst-host=127.0.0.1 --dst-db=djangoadmin --dst-user=postgres --dst-password=xxx"
# 2. 正式迁移
make db-migrate ARGS="--src-driver=mysql --src-host=127.0.0.1 --src-db=djangoadmin --src-user=root --src-password=xxx --dst-driver=postgresql --dst-host=127.0.0.1 --dst-db=djangoadmin --dst-user=postgres --dst-password=xxx"
# 3. 幂等重跑(加 --drop-target-first)
make db-migrate ARGS="... --drop-target-first"
```
详细操作手册参阅 [数据库迁移 Runbook](../document/数据库迁移_runbook.md)。
## 🧪 测试
```bash
# 运行全部测试(默认跳过集成测试)
pytest
# 单元测试
pytest tests/unit
# 契约快照测试(守护路由/权限/表名)
pytest tests/contract -m contract
# 集成测试(需真实 MySQL/Redis)
pytest tests/integration -m integration
# 查看覆盖率
pytest --cov=src --cov-report=html
```
## 🔍 健康检查
### API 健康检查端点
```bash
# 检查后端服务是否正常
curl http://127.0.0.1:8031/api/v1/auth/captcha
# 检查 Redis 连接
redis-cli ping
# 检查 MySQL 连接
mysql -u root -p -e "SELECT 1"
```
### 日志查看
```bash
# 应用日志
tail -f logs/app.log
# 错误日志
tail -f logs/error.log
# Docker 日志
docker-compose logs -f --tail=100
```
## ⚙️ 性能调优
### 数据库连接池
在 `.env` 中配置:
```env
# 连接池大小
DB_POOL_SIZE=10
# 最大溢出连接数
DB_MAX_OVERFLOW=20
# 连接超时(秒)
DB_POOL_TIMEOUT=30
# 连接回收时间(秒)
DB_POOL_RECYCLE=1800
```
### Redis 连接池
```env
REDIS_MAX_CONNECTIONS=20
```
### Uvicorn Worker
根据服务器配置调整 Worker 数量:
```bash
# 4 核 8G 内存服务器
gunicorn main:app --app-dir src --workers 4 --worker-class uvicorn.workers.UvicornWorker
# 8 核 16G 内存服务器
gunicorn main:app --app-dir src --workers 8 --worker-class uvicorn.workers.UvicornWorker
```
## ❓ 常见问题
### Q: 数据库连接失败?
1. 检查数据库服务是否启动
2. 检查 `.env` 中的连接参数是否正确
3. 检查防火墙是否开放对应端口
4. 检查数据库用户是否有远程访问权限
### Q: Redis 连接失败?
1. 检查 Redis 服务是否启动:`redis-cli ping`
2. 检查 `.env` 中的 Redis 配置
3. 如设置了密码,确认 `REDIS_PASSWORD` 正确
### Q: 前端请求 404?
1. 确认后端服务已启动
2. 检查前端代理配置(`vite.config.ts` 中的 `proxy`)
3. 确认 API 前缀为 `/api/v1`
### Q: Token 过期后无法刷新?
1. 检查 Redis 是否正常运行(Token 黑名单存储在 Redis 中)
2. 确认 `JWT_EXPIRE_MINUTES` 配置合理
3. 前端应在收到 401 时自动调用刷新接口