# QModel 7 - Islamic RAG API # ============================= # Dockerfile for QModel API # Supports both Ollama and HuggingFace backends via .env configuration # # Build: docker build -t qmodel . # Run: docker run -p 8000:8000 --env-file .env qmodel # ── Builder stage: compile deps, keep toolchain out of the final image ── FROM python:3.11-slim AS builder ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 # - build-essential/cmake: for compiling llama-cpp-python and other native deps # - libopenblas-dev: for numerical operations (FAISS, numpy) # - libomp-dev: for OpenMP (FAISS parallelization) RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ cmake \ libopenblas-dev \ libomp-dev \ && rm -rf /var/lib/apt/lists/* RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" COPY requirements.txt . # faiss-cpu means this deployment doesn't use GPU acceleration — install the # CPU-only torch wheel first so requirements.txt doesn't pull the default # CUDA-enabled build (several GB of unused NVIDIA libraries). RUN pip install --default-timeout=1000 --retries 10 --no-cache-dir \ --extra-index-url https://download.pytorch.org/whl/cpu torch \ && pip install --default-timeout=1000 --retries 10 --no-cache-dir -r requirements.txt # ── Final stage: slim runtime image ───────────────────────────────────── FROM python:3.11-slim LABEL author="Abdullah Elgendy" LABEL maintainer="Abdullah Elgendy" LABEL description="QModel v7 - Quran & Hadith RAG API" LABEL version="7.0.0" ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PATH="/opt/venv/bin:$PATH" WORKDIR /app # Runtime-only system deps (no compiler toolchain here) RUN apt-get update && apt-get install -y --no-install-recommends \ libopenblas0-pthread \ libomp5 \ curl \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /opt/venv /opt/venv # Copy application code COPY . . # Run as non-root RUN useradd --create-home --uid 1000 appuser \ && chown -R appuser:appuser /app USER appuser # Expose port for API EXPOSE 8000 # Health check — /health returns 503 until the RAG pipeline finishes loading HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1 # Start application # Configure via .env: LLM_BACKEND=ollama or LLM_BACKEND=hf CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]