# ── Stage 1: Build Svelte frontend ─────────────────────────────────────────── FROM node:20-alpine AS frontend-build WORKDIR /app/frontend COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ . RUN npm run build # ── Stage 2: Python / Flask ─────────────────────────────────────────────────── FROM python:3.12-slim # pdfplumber needs these system libs RUN apt-get update && apt-get install -y --no-install-recommends \ libpoppler-cpp-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY amex_parser.py amex_analyser.py app.py ./ # Copy the built frontend from Stage 1 COPY --from=frontend-build /app/frontend/dist ./frontend/dist EXPOSE 5000 # Gunicorn for production (threaded, no debug mode) CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "2", "--threads", "4", "--timeout", "120", "app:app"]