# ---- Stage 1: Build frontend ---- FROM node:22-alpine AS frontend-build WORKDIR /app/frontend COPY frontend/package.json frontend/package-lock.json* ./ RUN npm install COPY frontend/ ./ RUN npm run build # Output: /app/static/ # ---- Stage 2: Production runtime ---- FROM python:3.13-slim RUN apt-get update && apt-get install -y --no-install-recommends \ smartmontools \ sg3-utils \ lsscsi \ util-linux \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY main.py . COPY routers/ routers/ COPY services/ services/ COPY models/ models/ # Copy built frontend from stage 1 COPY --from=frontend-build /app/static/ static/ EXPOSE 8000 HEALTHCHECK --interval=30s --timeout=5s --retries=3 \ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')" || exit 1 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]