Spaces:
Sleeping
Sleeping
| # Stage 1: Builder | |
| FROM python:3.10-slim as builder | |
| WORKDIR /app | |
| COPY requirements.txt . | |
| RUN apt-get update && \ | |
| apt-get install -y --no-install-recommends gcc python3-dev && \ | |
| pip install --no-cache-dir gunicorn==21.2.0 uvicorn==0.23.2 && \ | |
| pip install --no-cache-dir -r requirements.txt && \ | |
| apt-get remove -y gcc python3-dev && \ | |
| apt-get autoremove -y | |
| # Stage 2: Runtime | |
| FROM python:3.10-slim | |
| WORKDIR /app | |
| # Install system dependencies AS ROOT (before switching user) | |
| RUN apt-get update && \ | |
| apt-get install -y --no-install-recommends \ | |
| ffmpeg \ | |
| tesseract-ocr \ | |
| libtesseract-dev \ | |
| tesseract-ocr-eng \ | |
| tesseract-ocr-fra \ | |
| tesseract-ocr-spa \ | |
| curl && \ | |
| rm -rf /var/lib/apt/lists/* | |
| # Copy Python dependencies from system locations | |
| COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages | |
| COPY --from=builder /usr/local/bin/gunicorn /usr/local/bin/ | |
| COPY --from=builder /usr/local/bin/uvicorn /usr/local/bin/ | |
| COPY . . | |
| # Create non-root user and set permissions | |
| RUN useradd -m appuser && \ | |
| chown -R appuser:appuser /app && \ | |
| mkdir -p /tmp/uploads && \ | |
| chown appuser:appuser /tmp/uploads | |
| # Switch to non-root user | |
| USER appuser | |
| # Health check with longer intervals and start period for model loading | |
| HEALTHCHECK --interval=60s --timeout=30s --start-period=300s --retries=5 \ | |
| CMD curl -f http://localhost:7860/health || exit 1 | |
| EXPOSE 7860 | |
| # Use port 7860 which is standard for Hugging Face Spaces | |
| CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:7860", "--timeout", "300", "--worker-connections", "10", "app.main:app"] |