# ============================================================= # SecureShield Backend — Production Dockerfile # Multi-stage build with security hardening for hackathon deploy # ============================================================= # Build: docker build -t secureshield-backend . # Run: docker run -p 8000:8000 --env-file .env secureshield-backend # ============================================================= # ---- Stage 1: Builder (install deps with build tools) ---- FROM python:3.11-slim AS builder ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 WORKDIR /build # Install build dependencies needed for native extensions # (asyncpg, pymupdf, etc.) — these stay in builder only RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ gcc \ libmagic1 \ ca-certificates \ && rm -rf /var/lib/apt/lists/* # Copy requirements first for Docker layer caching # If requirements.txt hasn't changed, this layer is cached COPY requirements.txt . RUN pip install --no-cache-dir --upgrade pip setuptools wheel \ && pip install --no-cache-dir -r requirements.txt # ---- Stage 2: Runtime (lean, non-root, hardened) ---- FROM python:3.11-slim AS runtime # Metadata labels (OCI standard) LABEL org.opencontainers.image.title="SecureShield Backend" \ org.opencontainers.image.description="GenAI-powered health insurance claim eligibility engine" \ org.opencontainers.image.version="1.0.0" \ org.opencontainers.image.authors="sharma-sugurthi" \ org.opencontainers.image.source="https://github.com/sharma-sugurthi/SecureShield" ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ # Default port for uvicorn (7860 required for Hugging Face Spaces) PORT=7860 \ # Production settings ENVIRONMENT=production \ # Uvicorn workers (overridable at runtime) WEB_CONCURRENCY=2 WORKDIR /app # Install minimal runtime dependencies only # (libmagic for file type detection, ca-certs for HTTPS to Supabase) RUN apt-get update \ && apt-get install -y --no-install-recommends \ libmagic1 \ ca-certificates \ curl \ && rm -rf /var/lib/apt/lists/* \ && apt-get purge -y --auto-remove # ---- Security: Create non-root user ---- # CIS Docker Benchmark 4.1: Run container as non-root RUN groupadd --gid 1001 secureshield \ && useradd --uid 1001 --gid 1001 --shell /bin/false --create-home secureshield # Copy installed Python packages from builder stage COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --from=builder /usr/local/bin /usr/local/bin # Copy application code COPY --chown=secureshield:secureshield . . # Create directories the app needs at runtime RUN mkdir -p /app/reports /app/db \ && chown -R secureshield:secureshield /app # Drop privileges — run everything below as non-root USER secureshield # Expose the API port EXPOSE ${PORT} # Health check: hit the public /api/health endpoint # Retries 3 times with 30s interval, 5s timeout, starts after 10s HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl -f http://localhost:${PORT}/api/health || exit 1 # Start uvicorn with production settings # - --workers: controlled by WEB_CONCURRENCY env var # - --access-log: enabled for observability # - --proxy-headers: trust X-Forwarded-For from Render/load-balancer CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port ${PORT} --workers ${WEB_CONCURRENCY} --proxy-headers --access-log"]