FROM python:3.11-slim-bookworm AS base
ARG COOLIFY_FQDN
ARG SITE_INDEXABLE
ARG RG_ALLOWED_ORIGINS
WORKDIR /app
ENV PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1 PYTHONPATH=/app
RUN groupadd -g 10001 rg && useradd -u 10001 -g rg -m rg

FROM base AS artifacts
ARG COOLIFY_FQDN
ARG SITE_INDEXABLE
ARG RG_ALLOWED_ORIGINS
COPY models/models.lock.json ./models/models.lock.json
COPY scripts/fetch_models.py ./scripts/fetch_models.py
RUN python scripts/fetch_models.py

FROM base AS api
ARG COOLIFY_FQDN
ARG SITE_INDEXABLE
ARG RG_ALLOWED_ORIGINS
COPY requirements/api.lock.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt
COPY rg ./rg
COPY config ./config
COPY models/models.lock.json models/faro-columns.json ./models/
USER rg
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=5 CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8130/api/rg/v1/capabilities', timeout=3)"
CMD ["python", "-m", "uvicorn", "rg.api:app", "--host", "0.0.0.0", "--port", "8130", "--no-access-log"]

FROM base AS faro
ARG COOLIFY_FQDN
ARG SITE_INDEXABLE
ARG RG_ALLOWED_ORIGINS
RUN apt-get update && apt-get install -y --no-install-recommends libgomp1 && rm -rf /var/lib/apt/lists/*
COPY requirements/faro.lock.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt
COPY rg ./rg
COPY --from=artifacts /app/models/faro.joblib /app/models/faro.json /app/models/FARO-LICENSE /app/models/FARO-README.md /app/models/models.lock.json /models/
ENV RG_MODELS_DIR=/models OMP_NUM_THREADS=2
USER rg
HEALTHCHECK --interval=30s --timeout=5s --start-period=90s --retries=5 CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8131/health', timeout=3)"
CMD ["python", "-m", "uvicorn", "rg.faro_runtime:app", "--host", "0.0.0.0", "--port", "8131", "--no-access-log"]

FROM base AS timesfm
ARG COOLIFY_FQDN
ARG SITE_INDEXABLE
ARG RG_ALLOWED_ORIGINS
RUN apt-get update && apt-get install -y --no-install-recommends git libgomp1 && rm -rf /var/lib/apt/lists/*
COPY requirements/timesfm25.linux.constraints.txt /tmp/requirements.txt
RUN pip install --no-cache-dir torch==2.14.0 --index-url https://download.pytorch.org/whl/cpu && \
    pip install --no-cache-dir -r /tmp/requirements.txt
COPY rg ./rg
COPY --from=artifacts /app/models/timesfm25 /models/timesfm25
COPY --from=artifacts /app/models/models.lock.json /app/models/TIMESFM-LICENSE /models/
USER rg
ENV HF_HUB_OFFLINE=1 RG_MODELS_DIR=/models RG_TIMESFM_PROFILE=timesfm25_standard
HEALTHCHECK --interval=30s --timeout=5s --start-period=180s --retries=6 CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8132/health', timeout=3)"
CMD ["python", "-m", "uvicorn", "rg.timesfm_runtime:app", "--host", "0.0.0.0", "--port", "8132", "--no-access-log"]