# Multi-stage build for Hugging Face Spaces # Stage 1: Build Frontend FROM node:20-slim AS frontend-builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . # Build the frontend assets. This output should go to staticfiles or similar. # Assuming standard Vite build output to './dist' or similar, we need to ensure Django can find it. RUN npm run build # Stage 2: Python Backend FROM python:3.11-slim-bookworm WORKDIR /app # Install system dependencies RUN apt-get update && apt-get install -y \ curl \ && rm -rf /var/lib/apt/lists/* # Install uv for fast python dependency management COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/uv # Copy project files COPY . . # Install Python dependencies ENV VIRTUAL_ENV=/app/.venv ENV PATH="/app/.venv/bin:$PATH" RUN uv venv && uv pip install --system -r pyproject.toml || uv pip install --system . # Copy built frontend assets from Stage 1 # Assuming 'npm run build' outputs to a folder that Django's collectstatic can pick up # For Vite + Django, typically we might sync 'dist/assets' to 'assets' or 'static' # We will need to double check where 'npm run build' puts files vs where Django looks. # For this setup: # 1. We'll copy the source assets just in case or better yet, verify build output. # 2. But simpler: Just install Node in this image too? No, multi-stage is cleaner. # Let's assume we copy the 'assets/js/dist' or whatever Vite produces. # ACTUALLY: The current setup serves via Vite Dev Server. For Prod, we need 'npm run build'. # Vite config usually outputs to 'dist'. We need Django to serve 'dist' as static. COPY --from=frontend-builder /app/frontend_build /app/frontend_build # Set env vars for HF ENV DJANGO_SETTINGS_MODULE=config.settings.hf ENV PYTHONUNBUFFERED=1 # Collect static files RUN python manage.py collectstatic --noinput # Run migration and start server on port 7860 CMD ["sh", "-c", "python manage.py migrate && gunicorn config.wsgi:application --bind 0.0.0.0:7860"]