# ============================================ # MiroFish - HuggingFace Spaces Production Build # Multi-stage: Vue frontend build + Python backend + nginx # ============================================ # --- Stage 1: Build Vue.js frontend --- FROM node:20-alpine AS frontend-build WORKDIR /build/frontend COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ # Set empty base URL so production build uses relative URLs (nginx proxies to Flask) ENV VITE_API_BASE_URL="" RUN npm run build # --- Stage 2: Production runtime --- FROM python:3.11-slim # Install nginx and required system packages RUN apt-get update \ && apt-get install -y --no-install-recommends nginx curl \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Install Python dependencies (CPU-only torch to save ~1.5GB) COPY backend/requirements.txt ./backend/requirements.txt RUN pip install --no-cache-dir \ --extra-index-url https://download.pytorch.org/whl/cpu \ -r backend/requirements.txt # Copy backend source COPY backend/ ./backend/ # Copy built Vue frontend to nginx serve directory COPY --from=frontend-build /build/frontend/dist /usr/share/nginx/html # Copy deployment configs COPY deploy/nginx.conf /etc/nginx/nginx.conf COPY deploy/start.sh /app/start.sh RUN chmod +x /app/start.sh # Create uploads directory for simulation data RUN mkdir -p /app/backend/uploads/projects \ /app/backend/uploads/simulations \ /app/backend/uploads/reports # HuggingFace Spaces requires user with uid 1000 RUN useradd -m -u 1000 appuser \ && chown -R appuser:appuser /app \ && chown -R appuser:appuser /usr/share/nginx/html \ && chown -R appuser:appuser /var/log/nginx \ && chown -R appuser:appuser /var/lib/nginx \ && chown -R appuser:appuser /etc/nginx \ && touch /run/nginx.pid && chown appuser:appuser /run/nginx.pid USER appuser EXPOSE 7860 CMD ["/app/start.sh"]