# syntax=docker/dockerfile:1
# Сборка из корня репозитория:
#   docker build -f services/api/Dockerfile --target api           --build-arg VERSION=1.2.3 .
#   docker build -f services/api/Dockerfile --target storage-agent --build-arg VERSION=1.2.3 .

FROM golang:1.24-alpine AS build
WORKDIR /src
COPY services/api/go.mod services/api/go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod go mod download
COPY services/api/ ./
ARG VERSION=0.0.0-dev
ENV CGO_ENABLED=0
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build \
    go build -trimpath -ldflags "-s -w -X pipu/api/internal/buildinfo.Version=${VERSION}" -o /out/api ./cmd/api && \
    go build -trimpath -ldflags "-s -w -X pipu/api/internal/buildinfo.Version=${VERSION}" -o /out/storage-agent ./cmd/storage-agent

# api вызывает ffprobe (сканер), ffmpeg (транскодинг, M3) и fpcalc (отпечатки, M5.5) — нужен не distroless, а alpine.
FROM alpine:3.22 AS api
RUN apk add --no-cache ffmpeg chromaprint ca-certificates tzdata
COPY --from=build /out/api /usr/local/bin/api
USER 65532:65532
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/api"]

# Агенту нужны nfs-utils для mount -t nfs и root внутри контейнера (CAP_SYS_ADMIN задаётся в compose).
FROM alpine:3.22 AS storage-agent
RUN apk add --no-cache nfs-utils ca-certificates
COPY --from=build /out/storage-agent /usr/local/bin/storage-agent
EXPOSE 8090
ENTRYPOINT ["/usr/local/bin/storage-agent"]
