| FROM python:3.12-slim | |
| # ββ System deps βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| RUN apt-get update && apt-get install -y --no-install-recommends \ | |
| build-essential \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # ββ Non-root user βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| RUN useradd -m -u 1000 user | |
| WORKDIR /home/user/app | |
| # Create runtime directories and set ownership before switching user | |
| RUN mkdir -p ./data ./logs ./uploads && chown -R user:user /home/user/app | |
| # ββ Python dependencies βββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| COPY requirements.txt . | |
| RUN pip install --no-cache-dir -r requirements.txt | |
| # ββ Switch to non-root ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| USER user | |
| # ββ Pre-cache HuggingFace embedding model βββββββββββββββββββββββββββββββββββββ | |
| RUN python -c "from langchain_huggingface import HuggingFaceEmbeddings; HuggingFaceEmbeddings(model_name='all-MiniLM-L6-v2')" | |
| # ββ Copy application code + pre-built vector store ββββββββββββββββββββββββββββ | |
| COPY --chown=user app/ ./app/ | |
| COPY --chown=user vectorstore/ ./vectorstore/ | |
| # ββ Port & Start ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| EXPOSE 7860 | |
| ENV PORT=7860 | |
| HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ | |
| CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:${PORT}/health')" || exit 1 | |
| CMD ["sh", "-c", "uvicorn app.main:app --host 0.0.0.0 --port ${PORT} --workers 1"] | |