# BtToxin Pipeline - Production Dockerfile (No Nginx) # This version is designed to work with Traefik as the reverse proxy. # FastAPI serves both the API and the frontend static files. # =========================== # Stage 1: Install dependencies using pixi # =========================== FROM ghcr.io/prefix-dev/pixi:latest AS builder WORKDIR /app # Copy project files COPY pixi.toml . COPY pyproject.toml . COPY scripts/ scripts/ COPY bttoxin/ bttoxin/ COPY backend/ backend/ COPY Data/ Data/ # Install all pixi environments RUN pixi install # Create shell hook for webbackend environment RUN pixi shell-hook -e webbackend > /shell-hook.sh RUN echo 'exec "$@"' >> /shell-hook.sh # =========================== # Stage 2: Build frontend # =========================== FROM node:20 AS frontend-builder WORKDIR /app # Copy frontend source COPY frontend/ . RUN npm install -g pnpm && \ pnpm install && \ pnpm build # =========================== # Stage 3: Production (FastAPI only) # =========================== FROM ubuntu:24.04 AS production WORKDIR /app # Install runtime dependencies (only curl for healthcheck) RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ && rm -rf /var/lib/apt/lists/* # Copy pixi executable from builder COPY --from=builder /usr/local/bin/pixi /usr/local/bin/pixi RUN chmod +x /usr/local/bin/pixi # Copy backend environment from builder COPY --from=builder /app/.pixi /app/.pixi COPY --from=builder /shell-hook.sh /shell-hook.sh # Copy backend code COPY --from=builder /app/backend /app/backend COPY --from=builder /app/Data /app/Data COPY --from=builder /app/bttoxin /app/bttoxin COPY --from=builder /app/scripts /app/scripts COPY --from=builder /app/pixi.toml /app/pixi.toml # Copy built frontend COPY --from=frontend-builder /app/dist /app/frontend/dist # Create jobs directory RUN mkdir -p /app/jobs && chmod 777 /app/jobs # Expose port for FastAPI (will be used by Traefik) EXPOSE 8000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1 # Entrypoint ENTRYPOINT ["/bin/bash", "/shell-hook.sh"] # Command: Start FastAPI backend # FastAPI will serve both API and frontend static files # Note: Using backend.app.main_spa for SPA static file support CMD ["uvicorn", "backend.app.main_spa:app", "--host", "0.0.0.0", "--port", "8000"]