# ── Stage 1: compilar frontend ─────────────────────────────────────────────── FROM node:20-slim AS frontend-builder WORKDIR /frontend COPY frontend/package*.json ./ RUN npm install --prefer-offline COPY frontend/ ./ # VITE_API_BASE_URL vacío → el frontend usa URLs relativas (mismo origen) RUN npm run build # ── Stage 2: backend + frontend compilado ───────────────────────────────────── FROM python:3.12-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PORT=7860 WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends \ git libglib2.0-0 libsm6 libxrender1 libxext6 libx11-6 libxcb1 libgl1 libgl1-mesa-dri \ && rm -rf /var/lib/apt/lists/* COPY backend/requirements.txt ./ RUN pip install --upgrade pip && pip install -r requirements.txt COPY backend/ ./ # El frontend compilado va a /frontend/dist — exactamente la ruta que espera main.py # (BASE_DIR.parent / "frontend" / "dist" = /app/../frontend/dist = /frontend/dist) COPY --from=frontend-builder /frontend/dist /frontend/dist RUN chmod +x entrypoint.sh # /app/models se puede montar como volumen para cachear el modelo SAM2 VOLUME ["/app/models"] EXPOSE 7860 ENTRYPOINT ["./entrypoint.sh"]