diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d4fac5d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,60 @@ +# Git +.git +.gitignore + +# 环境文件(避免泄露敏感信息) +.env +.env.example + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# 虚拟环境 +venv/ +ENV/ +env/ + +# IDE相关 +.idea/ +.vscode/ +*.swp +*.swo +.DS_Store + +# Docker相关 +Dockerfile +docker-compose.yml +.dockerignore + +# 日志文件 +logs/ +*.log + +# 数据文件 +data/ +*.sqlite3 + +# 其他 +README.md +LICENSE +*.md \ No newline at end of file diff --git a/.env b/.env new file mode 100644 index 0000000..9b54728 --- /dev/null +++ b/.env @@ -0,0 +1,21 @@ +# DashScope API密钥 +DASHSCOPE_API_KEY=sk-caa199589f1c451aaac471fad2986e28 + +# 服务器配置 +HOST=127.0.0.1 +PORT=9001 +DEBUG=True + +# 腾讯云配置 +QCLOUD_SECRET_ID=AKIDxnbGj281iHtKallqqzvlV5YxBCrPltnS +QCLOUD_SECRET_KEY=ta6PXTMBsX7dzA7IN6uYUFn8F9uTovoU +QCLOUD_COS_REGION=ap-chengdu +QCLOUD_COS_BUCKET=aidress-1311994147 +QCLOUD_COS_DOMAIN=https://aidress-1311994147.cos.ap-chengdu.myqcloud.com + +# 数据库配置 +DB_HOST=gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com +DB_PORT=27469 +DB_USER=root +DB_PASSWORD=Aa#223388 +DB_NAME=aidress \ No newline at end of file diff --git a/.env.docker b/.env.docker new file mode 100644 index 0000000..94923a9 --- /dev/null +++ b/.env.docker @@ -0,0 +1,19 @@ +# 数据库配置 +DB_HOST=db +DB_PORT=3306 +DB_USER=ai_user +DB_PASSWORD=yourpassword +DB_NAME=ai_dressing + +# 阿里云百炼平台配置 +DASHSCOPE_API_KEY=your_dashscope_api_key + +# 腾讯云配置 +QCLOUD_SECRET_ID=your_qcloud_secret_id +QCLOUD_SECRET_KEY=your_qcloud_secret_key + +# 应用配置 +APP_NAME=AI-Dressing +APP_DESCRIPTION=基于阿里百炼平台的AI试衣服务 +APP_VERSION=0.1.0 +DEBUG=False \ No newline at end of file diff --git a/.gitignore b/.gitignore index ca721b8..bb1edf9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # 环境变量 -.env +# .env # Python __pycache__/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f70aede --- /dev/null +++ b/Dockerfile @@ -0,0 +1,35 @@ +FROM python:3.9-slim + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量 +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 + +# 安装系统依赖 +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + libssl-dev \ + libffi-dev \ + default-libmysqlclient-dev \ + pkg-config \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# 复制项目文件 +COPY . /app/ + +# 安装Python依赖 +RUN pip install --no-cache-dir -r requirements.txt + +# 创建非root用户运行应用 +RUN adduser --disabled-password --gecos '' appuser +RUN chown -R appuser:appuser /app +USER appuser + +# 暴露端口 +EXPOSE 9001 + +# 启动命令 +CMD ["uvicorn", "run:app", "--host", "0.0.0.0", "--port", "9001"] \ No newline at end of file diff --git a/README.md b/README.md index 65e60cc..3f74b00 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,76 @@ python run.py 服务将在 http://localhost:9001 启动,您可以访问 http://localhost:9001/docs 查看 API 文档。 +## Docker 部署 + +本项目支持使用 Docker 进行部署,提供了完整的 Docker 配置文件。 + +### 前提条件 + +- 安装 [Docker](https://docs.docker.com/get-docker/) +- 安装 [Docker Compose](https://docs.docker.com/compose/install/) + +### 使用 Docker 部署 + +1. **配置环境变量** + + 复制 `.env.docker` 文件为 `.env`,并填写您的 API 密钥: + + ```bash + cp .env.docker .env + ``` + + 编辑 `.env` 文件,填入您的 API 密钥和其他配置。 + +2. **构建并启动服务** + + ```bash + docker-compose up -d + ``` + + 这将启动两个容器: + - `ai-dressing-app`:运行 FastAPI 应用程序 + - `ai-dressing-db`:运行 MySQL 数据库 + +3. **初始化数据库** + + 应用启动后,执行迁移以创建数据库表: + + ```bash + docker-compose exec app python3 create_migration.py upgrade + ``` + +4. **访问服务** + + 服务将在 `http://localhost:9001` 启动,您可以访问 `http://localhost:9001/docs` 查看 API 文档。 + +### Docker 环境管理 + +- **查看日志** + + ```bash + docker-compose logs -f app # 查看应用日志 + docker-compose logs -f db # 查看数据库日志 + ``` + +- **重启服务** + + ```bash + docker-compose restart app + ``` + +- **停止服务** + + ```bash + docker-compose down # 停止所有服务 + ``` + +- **停止并删除数据卷** + + ```bash + docker-compose down -v # 谨慎使用,这将删除数据库中的所有数据 + ``` + ## API 文档 启动服务后,访问以下地址查看自动生成的 API 文档: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9819366 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +version: '3.8' + +services: + app: + build: . + container_name: ai-dressing-app + restart: always + ports: + - "9001:9001" + environment: + - DB_HOST=db + - DB_PORT=3306 + - DB_USER=ai_user + - DB_PASSWORD=yourpassword + - DB_NAME=ai_dressing + - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY} + - QCLOUD_SECRET_ID=${QCLOUD_SECRET_ID} + - QCLOUD_SECRET_KEY=${QCLOUD_SECRET_KEY} + depends_on: + - db + volumes: + - ./:/app + networks: + - ai-dressing-network + + db: + image: mysql:8.0 + container_name: ai-dressing-db + restart: always + ports: + - "3306:3306" + environment: + - MYSQL_ROOT_PASSWORD=rootpassword + - MYSQL_USER=ai_user + - MYSQL_PASSWORD=yourpassword + - MYSQL_DATABASE=ai_dressing + volumes: + - mysql-data:/var/lib/mysql + - ./mysql-init:/docker-entrypoint-initdb.d + command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci + networks: + - ai-dressing-network + +volumes: + mysql-data: + +networks: + ai-dressing-network: + driver: bridge \ No newline at end of file diff --git a/mysql-init/01-init.sql b/mysql-init/01-init.sql new file mode 100644 index 0000000..4597e1a --- /dev/null +++ b/mysql-init/01-init.sql @@ -0,0 +1,14 @@ +-- 创建数据库 +CREATE DATABASE IF NOT EXISTS ai_dressing CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- 创建用户并授权 +CREATE USER IF NOT EXISTS 'ai_user'@'%' IDENTIFIED BY 'yourpassword'; +GRANT ALL PRIVILEGES ON ai_dressing.* TO 'ai_user'@'%'; +FLUSH PRIVILEGES; + +-- 选择数据库 +USE ai_dressing; + +-- 初始化顺序保证表不会因外键约束而创建失败 +-- 注意:这里不需要创建表,因为应用会使用Alembic自动创建 +-- 这个文件主要用于确保数据库和用户设置正确 \ No newline at end of file