# ml-service: gRPC-хост ML (план Task 3; Ruling 12 — запись в deploy/compose.dev.yml).
#
# КОНТЕКСТ СБОРКИ — корень репозитория: Deal.Ml.csproj ссылается на src/contracts/Deal.Proto.csproj
# (общий проект кодогенерации, Task 1) вне каталога сервиса, поэтому нельзя собирать из
# src/ml-service. Запуск из корня:  docker build -f src/ml-service/Deal.Ml/Dockerfile .
# Порт — env GRPC_PORT (Program.cs), в compose.dev.yml задан 5103.

# --- Этап сборки: restore + publish ---
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /repo

# Restore-слой: только csproj/props (кэш слоёв Docker — restore не повторяется при правке исходников).
COPY src/contracts/Deal.Proto.csproj src/contracts/
COPY src/grpc-hosting/Deal.Grpc.Hosting/Deal.Grpc.Hosting.csproj src/grpc-hosting/Deal.Grpc.Hosting/
COPY src/core/Deal.SharedKernel/Deal.SharedKernel.csproj src/core/Deal.SharedKernel/
COPY src/ml-service/Directory.Build.props src/ml-service/
COPY src/ml-service/Deal.Ml/Deal.Ml.csproj src/ml-service/Deal.Ml/
RUN dotnet restore src/ml-service/Deal.Ml/Deal.Ml.csproj

# Исходники: контракты (.proto) + общая gRPC-обвязка + проект сервиса.
COPY src/contracts/ src/contracts/
COPY src/grpc-hosting/ src/grpc-hosting/
COPY src/core/Deal.SharedKernel/ src/core/Deal.SharedKernel/
COPY src/ml-service/Deal.Ml/ src/ml-service/Deal.Ml/
RUN dotnet publish src/ml-service/Deal.Ml/Deal.Ml.csproj -c Release -o /app/publish

# --- Runtime-этап ---
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final
WORKDIR /app
EXPOSE 5103
COPY --from=build /app/publish .

# grpc_health_probe — healthcheck контейнера (Ruling 12): gRPC-health освобождён от service-token
# (см. ServiceTokenInterceptor), поэтому проба идёт без metadata.
COPY --from=ghcr.io/grpc-ecosystem/grpc-health-probe:v0.4.35 /ko-app/grpc-health-probe /bin/grpc_health_probe

# Файлы моделей тенантов — data/ml/<tenantId>.sqlite (Ruling 4): каталог монтируется volume-ом
# deal_ml_data из compose.dev.yml; каталог и файлы создаёт движок модели (задачи 5–6).

# Non-root: процесс работает пользователем deal (UID 10001); /data/ml — каталог моделей (volume).
RUN useradd --uid 10001 --shell /usr/sbin/nologin --no-create-home deal \
    && mkdir -p /data/ml \
    && chown -R deal:deal /data/ml
ENV HOME=/tmp
USER deal

ENTRYPOINT ["dotnet", "Deal.Ml.dll"]
