# Multi-stage build for Gatehouse Auth API # Build stage FROM python:3.11-slim as builder # Install build dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ libpq-dev \ curl \ && rm -rf /var/lib/apt/lists/* # Create virtual environment RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Copy requirements files WORKDIR /app COPY requirements/base.txt requirements/base.txt COPY requirements/production.txt requirements/production.txt # Install dependencies RUN pip install --no-cache-dir --upgrade pip wheel && \ pip install --no-cache-dir -r requirements/production.txt # Production stage FROM python:3.11-slim # Install runtime dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ libpq5 \ curl \ openssh-client \ && rm -rf /var/lib/apt/lists/* # Create non-root user RUN groupadd --gid 1000 appgroup && \ useradd --uid 1000 --gid appgroup --shell /bin/bash --create-home appuser # Copy virtual environment from builder COPY --from=builder /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Copy application code WORKDIR /app COPY --chown=appuser:appgroup . . # Create log and session directories RUN mkdir -p /app/logs /app/flask_session && chown -R appuser:appgroup /app/logs /app/flask_session # Switch to non-root user USER appuser # Expose port EXPOSE 5000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD curl -f http://localhost:5000/api/health || exit 1 # Run gunicorn with gevent workers CMD ["gunicorn", "--bind", "0.0.0.0:5000", \ "--workers", "4", \ "--worker-class", "gevent", \ "--worker-connections", "1000", \ "--timeout", "120", \ "--access-logfile", "-", \ "--error-logfile", "-", \ "--log-level", "info", \ "wsgi:application"]