| # Build Frontend | |
| FROM node:20-slim AS frontend-build | |
| WORKDIR /app/frontend | |
| COPY frontend/package*.json ./ | |
| RUN npm install | |
| COPY frontend/ ./ | |
| RUN npm run build | |
| # Backend and Final Image | |
| FROM python:3.10-slim | |
| WORKDIR /app | |
| # Install backend dependencies | |
| COPY backend/requirements.txt . | |
| RUN pip install --no-cache-dir -r requirements.txt | |
| # Copy backend code | |
| COPY backend/ /app/backend/ | |
| # Copy frontend build to a location where FastAPI can serve it (static files) | |
| COPY --from=frontend-build /app/frontend/dist /app/frontend/dist | |
| # Environment variables | |
| ENV PORT=7860 | |
| ENV DATABASE_URL=sqlite:///./sql_app.db | |
| # Create a simple main entry for deployment that serves both | |
| RUN echo 'from fastapi import FastAPI\n\ | |
| from fastapi.staticfiles import StaticFiles\n\ | |
| from backend.main import app as api_app\n\ | |
| \n\ | |
| app = FastAPI()\n\ | |
| \n\ | |
| app.mount("/api", api_app)\n\ | |
| app.mount("/", StaticFiles(directory="frontend/dist", html=True), name="static")\n\ | |
| \n\ | |
| if __name__ == "__main__":\n\ | |
| import uvicorn\n\ | |
| uvicorn.run(app, host="0.0.0.0", port=7860)\n\ | |
| ' > /app/deployment_main.py | |
| CMD ["python", "deployment_main.py"] | |