# syntax=docker/dockerfile:1
FROM rust:alpine AS builder
WORKDIR /app

# Ставим нужные зависимости для компиляции C++ (нужно для tokenizers)
RUN apk add --no-cache musl-dev g++ make

# Сначала копируем ТОЛЬКО файлы манифестов
COPY Cargo.toml Cargo.lock ./

# Создаем фейковый main.rs и компилируем ЗАВИСИМОСТИ.
# Кэшируем скачанные крейты и скомпилированные объектные файлы!
RUN --mount=type=cache,target=/usr/local/cargo/registry \
    --mount=type=cache,target=/app/target \
    mkdir src && echo "fn main() {}" > src/main.rs && \
    cargo build --release && \
    rm -R src

# Теперь копируем реальный код
COPY . .

# Компилируем ТВОЙ код.
# Докер снова подтянет папку target из кэша. Зависимости собираться НЕ БУДУТ.
RUN --mount=type=cache,target=/usr/local/cargo/registry \
    --mount=type=cache,target=/app/target \
    cargo build --release && \
    cp target/release/proxy-ws /tmp/proxy-ws

# Финальный легкий образ: только бинарник + модели, без Rust-тулчейна и
# компиляторов из стадии builder — итоговый образ занимает минимум места.
FROM alpine:latest
WORKDIR /app

RUN apk add --no-cache ca-certificates

# Копируем готовый бинарник и модели
COPY --from=builder /tmp/proxy-ws ./proxy-ws
COPY ./models ./models

EXPOSE 3001
CMD ["./proxy-ws"]