| # 多阶段构建 - 前端构建阶段 | |
| FROM node:22-slim AS frontend-builder | |
| WORKDIR /app/frontend | |
| # 接收构建参数(从 Hugging Face Secrets 传入) | |
| ARG VITE_GOOGLE_MAPS_API_KEY | |
| ENV VITE_GOOGLE_MAPS_API_KEY=$VITE_GOOGLE_MAPS_API_KEY | |
| COPY MetaRec-ui/package*.json ./ | |
| RUN npm ci | |
| COPY MetaRec-ui/ ./ | |
| RUN npm run build | |
| # 验证构建产物是否存在 | |
| RUN ls -la dist/ || echo "Build failed - dist directory not found" | |
| RUN test -f dist/index.html || (echo "ERROR: index.html not found in dist" && exit 1) | |
| # Python后端运行环境 | |
| FROM python:3.10-slim | |
| WORKDIR /app | |
| # 复制后端代码 | |
| COPY MetaRec-backend/ ./backend/ | |
| # 安装Python依赖 | |
| RUN pip install --no-cache-dir -r backend/requirements.txt | |
| # 从前端构建阶段复制静态文件 | |
| COPY --from=frontend-builder /app/frontend/dist ./frontend-dist/ | |
| # 验证静态文件已复制 | |
| RUN ls -la frontend-dist/ || echo "Warning: frontend-dist directory not found" | |
| RUN test -f frontend-dist/index.html || (echo "ERROR: index.html not found in frontend-dist" && exit 1) | |
| # 设置环境变量 PORT (Hugging Face Spaces 要求使用 7860) | |
| ENV PORT=7860 | |
| # 暴露端口 7860 (Hugging Face Spaces 要求) | |
| EXPOSE 7860 | |
| # 设置工作目录到后端 | |
| WORKDIR /app/backend | |
| # 启动前先执行数据库迁移(alembic upgrade head),再启动 FastAPI 服务器。 | |
| # DATABASE_URL 由 HF Space Secrets 注入,指向外部托管 Postgres(如 Neon)。 | |
| # alembic 是幂等的:首次部署建表,后续冷启动为 no-op。 | |
| CMD ["sh", "-c", "alembic upgrade head && python main.py"] | |