# ---------- UI build stage ---------- FROM node:20-alpine AS ui-builder WORKDIR /app/ui # install deps COPY ui/package*.json ./ RUN npm ci # build COPY ui/ ./ RUN npm run build # normalize to /app/ui/out regardless of framework (Vite=dist, CRA=build) RUN if [ -d dist ]; then mv dist out; \ elif [ -d build ]; then mv build out; \ else echo "No UI build output found" && ls -la && exit 1; fi # ---------- Python runtime ---------- FROM python:3.11-slim ENV PIP_NO_CACHE_DIR=1 PYTHONUNBUFFERED=1 PORT=7860 WORKDIR /app COPY requirements.txt ./ RUN python -m pip install --upgrade pip && \ pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements.txt COPY backend/ ./backend/ # copy built UI from the builder stage COPY --from=ui-builder /app/ui/out ./ui/dist ENV TRANSFORMERS_CACHE=/data/hf_cache \ HF_HOME=/data/hf_home \ HUGGINGFACE_HUB_CACHE=/data/hf_cache \ SENTENCE_TRANSFORMERS_HOME=/data/st_cache \ XDG_CACHE_HOME=/data/.cache RUN mkdir -p /data/hf_cache /data/hf_home /data/st_cache /data/.cache && \ chmod -R 777 /data EXPOSE 7860 CMD ["uvicorn", "backend.api:api", "--host", "0.0.0.0", "--port", "7860"]