| # ============================================ | |
| # Stage 1: Build the React Frontend | |
| # ============================================ | |
| FROM node:18-slim AS frontend-build | |
| WORKDIR /app | |
| # Copy package files first for better caching | |
| COPY package*.json ./ | |
| RUN npm install | |
| # Copy the rest of the frontend source | |
| COPY . . | |
| # Build the React app (outputs to backend/dist) | |
| RUN npm run build | |
| # ============================================ | |
| # Stage 2: Set up the Python Backend | |
| # ============================================ | |
| FROM python:3.10-slim | |
| WORKDIR /app | |
| # Install system dependencies for OpenCV, PyTorch, and fonts | |
| RUN apt-get update && apt-get install -y \ | |
| libgl1 \ | |
| libglib2.0-0 \ | |
| libsm6 \ | |
| libxext6 \ | |
| libxrender-dev \ | |
| libgomp1 \ | |
| fonts-dejavu-core \ | |
| fonts-dejavu-extra \ | |
| fonts-freefont-ttf \ | |
| fonts-stix \ | |
| wget \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # Copy the backend folder | |
| COPY backend/ ./backend/ | |
| # Copy the built frontend from Stage 1 | |
| COPY --from=frontend-build /app/backend/dist ./backend/dist | |
| # Install Python dependencies | |
| COPY backend/requirements.txt ./ | |
| RUN pip install --no-cache-dir -r requirements.txt | |
| # Create necessary directories | |
| RUN mkdir -p backend/test_img \ | |
| && mkdir -p backend/Real-ESRGAN/inputs \ | |
| && mkdir -p backend/Real-ESRGAN/results \ | |
| && mkdir -p "backend/Divided Regions" | |
| # Set working directory to backend | |
| WORKDIR /app/backend | |
| # Cache busting - forces fresh build on HF (2026-01-24 v2) | |
| RUN echo "Build cache: $(date)" | |
| # Hugging Face Spaces uses port 7860 | |
| EXPOSE 7860 | |
| # Run the FastAPI server | |
| CMD ["python", "-m", "uvicorn", "server:app", "--host", "0.0.0.0", "--port", "7860"] | |