# syntax=docker/dockerfile:1
#
# Сборка выполняется из calc/ (context: ./calc):
#   docker build -f calc/Dockerfile -t astro-calc calc/
#
# Файлы эфемерид (пакет libephemeris, зависимость kerykeion) устанавливаются
# на этапе `uv sync` и попадают в .venv — то есть уже лежат внутри образа
# и не скачиваются при запуске контейнера.

FROM python:3.13-slim AS build
ARG COOLIFY_FQDN
ARG POSTGRES_PASSWORD
ARG POSTGRES_DB
ARG BRAND_NAME
ARG YC_FOLDER_ID
ARG LLM_ENABLED
ARG LLM_MODEL
ARG POSTGRES_USER
ARG LLM_DAILY_TOKEN_LIMIT
ARG EXPERT_LOGIN
ARG YC_API_KEY
ARG EXPERT_PASSWORD
ARG METRIKA_COUNTER_ID
ARG BOT_USERNAME
ARG BOT_GATEWAY_SECRET
ARG LEGAL_OPERATOR_NAME
ARG LEGAL_INN
ARG LEGAL_OGRNIP
ARG LEGAL_CONTACT_EMAIL
ARG INDEXNOW_KEY
ARG SITE_BASE_URL
ARG TELEGRAM_BOT_TOKEN
ARG BOT_WEB_BASE_URL
ARG LEGAL_EFFECTIVE_DATE
ARG LEGAL_BOT_GATEWAY_COUNTRY
ARG LEGAL_POSTAL_ADDRESS
ARG LEGAL_REVIEWED
COPY --from=ghcr.io/astral-sh/uv:0.10.9 /uv /uvx /bin/

ENV UV_COMPILE_BYTECODE=1 \
    UV_LINK_MODE=copy \
    UV_PYTHON_DOWNLOADS=never

WORKDIR /app

# Зависимости отдельным слоем — кэшируются, пока не меняются pyproject.toml/uv.lock.
RUN --mount=type=cache,target=/root/.cache/uv \
    --mount=type=bind,source=uv.lock,target=uv.lock \
    --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
    uv sync --locked --no-install-project --no-dev

COPY . /app
RUN --mount=type=cache,target=/root/.cache/uv \
    uv sync --locked --no-dev

# Стадия places: собирает файл мест (SQLite) для GET /geo/suggest из
# GeoNames (cities500 + русские названия из alternateNamesV2, лицензия
# CC BY 4.0 — атрибуция в scripts/build_places.py). Единственная стадия,
# которой нужна сеть; исходники GeoNames (data/downloads/) остаются в её
# слое и не попадают в runtime-образ — только собранный .sqlite. Индекс
# читается calc-ом прямо из файла (mode=ro), не грузится в память процесса
# целиком — так RSS контейнера не растёт с размером базы GeoNames.
FROM build AS places
ARG COOLIFY_FQDN
ARG POSTGRES_PASSWORD
ARG POSTGRES_DB
ARG BRAND_NAME
ARG YC_FOLDER_ID
ARG LLM_ENABLED
ARG LLM_MODEL
ARG POSTGRES_USER
ARG LLM_DAILY_TOKEN_LIMIT
ARG EXPERT_LOGIN
ARG YC_API_KEY
ARG EXPERT_PASSWORD
ARG METRIKA_COUNTER_ID
ARG BOT_USERNAME
ARG BOT_GATEWAY_SECRET
ARG LEGAL_OPERATOR_NAME
ARG LEGAL_INN
ARG LEGAL_OGRNIP
ARG LEGAL_CONTACT_EMAIL
ARG INDEXNOW_KEY
ARG SITE_BASE_URL
ARG TELEGRAM_BOT_TOKEN
ARG BOT_WEB_BASE_URL
ARG LEGAL_EFFECTIVE_DATE
ARG LEGAL_BOT_GATEWAY_COUNTRY
ARG LEGAL_POSTAL_ADDRESS
ARG LEGAL_REVIEWED
RUN --mount=type=cache,target=/app/data/downloads \
    uv run python scripts/build_places.py --out /app/data/places.sqlite

FROM python:3.13-slim AS runtime
ARG COOLIFY_FQDN
ARG POSTGRES_PASSWORD
ARG POSTGRES_DB
ARG BRAND_NAME
ARG YC_FOLDER_ID
ARG LLM_ENABLED
ARG LLM_MODEL
ARG POSTGRES_USER
ARG LLM_DAILY_TOKEN_LIMIT
ARG EXPERT_LOGIN
ARG YC_API_KEY
ARG EXPERT_PASSWORD
ARG METRIKA_COUNTER_ID
ARG BOT_USERNAME
ARG BOT_GATEWAY_SECRET
ARG LEGAL_OPERATOR_NAME
ARG LEGAL_INN
ARG LEGAL_OGRNIP
ARG LEGAL_CONTACT_EMAIL
ARG INDEXNOW_KEY
ARG SITE_BASE_URL
ARG TELEGRAM_BOT_TOKEN
ARG BOT_WEB_BASE_URL
ARG LEGAL_EFFECTIVE_DATE
ARG LEGAL_BOT_GATEWAY_COUNTRY
ARG LEGAL_POSTAL_ADDRESS
ARG LEGAL_REVIEWED
WORKDIR /app

RUN useradd --uid 10001 --create-home --shell /usr/sbin/nologin astro
USER astro

COPY --from=build --chown=astro:astro /app /app
COPY --from=places --chown=astro:astro /app/data/places.sqlite /app/data/places.sqlite

# Без этого файла calc не запускается (app/geo.py::load_places_index_from_env
# требует его при импорте app.main, то есть при старте uvicorn) — путь
# задаётся переменной окружения, чтобы её можно было переопределить, не
# трогая образ.
ENV PATH="/app/.venv/bin:$PATH" \
    ASTRO_CALC_PLACES_FILE=/app/data/places.sqlite
EXPOSE 8000

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]