添加了docker部署相关内容

This commit is contained in:
carry 2025-02-18 16:35:47 +08:00
parent b705bbfa7d
commit b5651448b4
5 changed files with 132 additions and 2 deletions

23
backend/Dockerfile Normal file
View File

@ -0,0 +1,23 @@
# 使用Python官方镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 8000
# 设置环境变量
ENV PYTHONUNBUFFERED=1
# 启动应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

View File

@ -1,6 +1,6 @@
from datetime import datetime from datetime import datetime
from enum import Enum from enum import Enum
from pydantic import BaseModel, Field, root_validator from pydantic import BaseModel, Field, model_validator
from typing import Optional from typing import Optional
# 用户角色枚举 # 用户角色枚举
@ -27,7 +27,7 @@ class UserUpdate(BaseModel):
description: Optional[str] = Field(None, max_length=255, description="用户描述") description: Optional[str] = Field(None, max_length=255, description="用户描述")
# 可选:确保至少更新一个字段 # 可选:确保至少更新一个字段
@root_validator @model_validator(mode='before')
def validate_at_least_one_field(cls, values): def validate_at_least_one_field(cls, values):
if not any(values.values()): if not any(values.values()):
raise ValueError("至少需要更新一个字段") raise ValueError("至少需要更新一个字段")

53
docker-compose.yml Normal file
View File

@ -0,0 +1,53 @@
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "3000:80"
depends_on:
- backend
networks:
- app-network
backend:
build: ./backend
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=root
- DB_PASSWORD=password
- DB_NAME=db
- JWT_SECRET_KEY=your-secret-key
depends_on:
- mysql
networks:
- app-network
nginx:
image: nginx:stable-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- frontend
- backend
networks:
- app-network
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: db
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:

29
frontend/Dockerfile Normal file
View File

@ -0,0 +1,29 @@
# 使用Node.js作为基础镜像
FROM node:18-alpine as build-stage
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制项目文件
COPY . .
# 构建项目
RUN npm run build
# 使用Nginx作为生产环境
FROM nginx:stable-alpine as production-stage
# 复制构建好的文件到Nginx目录
COPY --from=build-stage /app/dist /usr/share/nginx/html
# 暴露80端口
EXPOSE 80
# 启动Nginx
CMD ["nginx", "-g", "daemon off;"]

25
nginx.conf Normal file
View File

@ -0,0 +1,25 @@
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location /api/ {
proxy_pass http://backend:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_pass http://frontend:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}