# Global variable declaration: # Build to serve under Subdirectory BASE_URL if provided, eg: "ARG BASE_URL=/pdf/", otherwise leave blank: "ARG BASE_URL=" ARG BASE_URL= # Build stage for frontend FROM public.ecr.aws/docker/library/node:20-alpine AS builder WORKDIR /app COPY package*.json ./ COPY vendor ./vendor ENV HUSKY=0 RUN npm ci COPY . . # Build configuration arguments ARG SIMPLE_MODE=false ENV SIMPLE_MODE=$SIMPLE_MODE ARG COMPRESSION_MODE=all ENV COMPRESSION_MODE=$COMPRESSION_MODE # global arg to local arg - BASE_URL is read from env by vite.config.ts ARG BASE_URL ENV BASE_URL=$BASE_URL # WASM module URLs (pre-configured defaults) ARG VITE_WASM_PYMUPDF_URL ARG VITE_WASM_GS_URL ARG VITE_WASM_CPDF_URL ENV VITE_WASM_PYMUPDF_URL=$VITE_WASM_PYMUPDF_URL ENV VITE_WASM_GS_URL=$VITE_WASM_GS_URL ENV VITE_WASM_CPDF_URL=$VITE_WASM_CPDF_URL # Default UI language (e.g. en, fr, de, es, zh, ar) ARG VITE_DEFAULT_LANGUAGE ENV VITE_DEFAULT_LANGUAGE=$VITE_DEFAULT_LANGUAGE # Custom branding (e.g. VITE_BRAND_NAME=MyCompany VITE_BRAND_LOGO=my-logo.svg) ARG VITE_BRAND_NAME ARG VITE_BRAND_LOGO ARG VITE_FOOTER_TEXT ENV VITE_BRAND_NAME=$VITE_BRAND_NAME ENV VITE_BRAND_LOGO=$VITE_BRAND_LOGO ENV VITE_FOOTER_TEXT=$VITE_FOOTER_TEXT # Increase memory limit for Vite/Node.js build to avoid OOM ENV NODE_OPTIONS="--max-old-space-size=4096" RUN npm run build:with-docs # Final stage with Python and FastAPI FROM python:3.11-slim LABEL org.opencontainers.image.source="https://github.com/alam00000/bentopdf" LABEL org.opencontainers.image.url="https://github.com/alam00000/bentopdf" WORKDIR /app # Install uv for fast package management (as root) RUN pip install --no-cache-dir uv # Copy only the necessary files for the backend COPY requirements.txt . COPY app.py . # Install Python dependencies using uv (as root) RUN uv pip install --system --no-cache-dir -r requirements.txt # Create a non-root user for security (UID 1000 is preferred by Hugging Face) RUN useradd -m -u 1000 user ENV PATH="/home/user/.local/bin:$PATH" # Copy the built frontend from the builder stage COPY --chown=user:user --from=builder /app/dist ./dist RUN chown -R user:user /app USER user # Expose the Hugging Face Space port EXPOSE 7860 # Start the application using uvicorn CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]