# ============================================================ # MuMuAINovel - 单 Dockerfile 部署 # 通过 git clone 拉取完整项目,前端构建 + 后端运行 # 只暴露 7860 端口 # ============================================================ # ---------- 阶段1: 克隆源码 + 构建前端 ---------- FROM node:22-alpine AS builder # 安装 git RUN apk add --no-cache git WORKDIR /src # 克隆项目(浅克隆,加速构建) RUN git clone --depth 1 https://github.com/q8625332/ljq-MuMuAINovel.git . # ---- 构建前端 ---- WORKDIR /src/frontend # 使用国内 npm 镜像加速 RUN npm config set registry https://registry.npmmirror.com # 安装依赖 RUN npm install # 临时修改 vite 配置,输出到 dist 目录 RUN sed -i "s|outDir: '../backend/static'|outDir: 'dist'|g" vite.config.ts # 构建前端 RUN npm run build # ---------- 阶段2: 构建最终镜像 ---------- FROM python:3.11-slim WORKDIR /app # 使用国内镜像源加速 RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources \ && sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources # 安装系统依赖(gcc 用于编译部分 Python 包) RUN apt-get update && apt-get install -y \ gcc \ && rm -rf /var/lib/apt/lists/* # 复制后端依赖文件并安装 COPY --from=builder /src/backend/requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 复制后端代码到工作目录 COPY --from=builder /src/backend/ ./ # 从构建阶段复制前端静态文件 COPY --from=builder /src/frontend/dist ./static # 复制环境变量示例文件 COPY --from=builder /src/backend/.env.example ./.env.example # 创建必要的目录 RUN mkdir -p /app/data /app/logs /app/config # 暴露端口 EXPOSE 7860 # 设置环境变量 ENV PYTHONUNBUFFERED=1 ENV APP_HOST=0.0.0.0 ENV APP_PORT=7860 ENV TZ=Asia/Shanghai # 健康检查(使用 Python 内置模块,无需额外安装 curl) HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:7860/health')" || exit 1 # 启动脚本 COPY <<'EOF' /app/entrypoint.sh #!/bin/bash set -e echo "========================================" echo " MuMuAINovel - AI 小说创作工具" echo "========================================" # 如果用户挂载了自定义配置文件,则使用它 if [ -f /app/config/.env ]; then echo "[INFO] 检测到自定义配置文件,正在应用..." cp /app/config/.env /app/.env elif [ -f /app/.env.example ]; then echo "[INFO] 使用默认配置模板..." cp /app/.env.example /app/.env fi # 确保数据目录存在 mkdir -p /app/data /app/logs echo "[INFO] 启动服务 - 端口: ${APP_PORT:-7860}" echo "========================================" cd /app exec python -m uvicorn app.main:app \ --host ${APP_HOST:-0.0.0.0} \ --port ${APP_PORT:-7860} EOF RUN chmod +x /app/entrypoint.sh ENTRYPOINT ["/app/entrypoint.sh"]