# سرویس چت‌بات — پایتون + مدل‌های بازیابی (CPU)
FROM python:3.11-slim

WORKDIR /srv

# همهٔ وابستگی‌های سنگین (numpy/scikit-learn/torch/psycopg) ویل prebuilt دارند —
# بدون کامپایلر؛ دسترسی apt در شبکهٔ بیلد قابل‌اعتماد نیست
COPY requirements.txt /srv/chatbot/requirements.txt
# torch روی PyPI پیش‌فرض لینوکس نسخهٔ CUDA است و کل استک nvidia را می‌آورد
# (ایمیج ~۹.۷GB روی سرور بدون GPU). نسخهٔ CPU حدود ۲۰۰MB است — همین اول نصب
# می‌شود تا pip در گام بعد آن را برآورده‌شده ببیند.
# روی ماشینی با GPU می‌توان این خط را حذف کرد.
# دو مرحله‌ای (PyPI از این سرور فیلتر است): (۱) خودِ torch فقط از ایندکس CPU
# پی‌تورچ با --no-deps — چون وابستگی‌های torch در آن ایندکس به
# files.pythonhosted.org لینک می‌خورند؛ (۲) وابستگی‌های torch از میرور در
# دسترس — torch از قبل نصب است و pip فقط وابستگی‌های missing را می‌گیرد.
ARG PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install --no-cache-dir --index-url https://download.pytorch.org/whl/cpu --no-deps "torch>=2.2" \
 && pip install --no-cache-dir --index-url "${PIP_INDEX_URL}" "torch>=2.2"
RUN pip install --no-cache-dir --index-url "${PIP_INDEX_URL}" -r /srv/chatbot/requirements.txt

COPY . /srv/chatbot/

# مدل امبدینگ/ری‌رنکر در /data کش می‌شود (والیوم داکر) — بردارها در pgvector می‌روند و فایل ایندکس جدا وجود ندارد
ENV HF_HOME=/data/hf \
    HF_CACHE_DIR=/data/hf
VOLUME /data

# کاربر بدون دسترسی root — فقط /data باید نوشتنی باشد (کش مدل‌ها)
RUN useradd --system --create-home appuser \
    && mkdir -p /data \
    && chown -R appuser:appuser /srv/chatbot /data
USER appuser

EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=5s --start-period=180s --retries=5 \
    CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/chat/healthz')" || exit 1

CMD ["uvicorn", "chatbot.app:api", "--host", "0.0.0.0", "--port", "8000", "--proxy-headers", "--forwarded-allow-ips=*"]
