# syntax=docker/dockerfile:1.7

ARG NODE_IMAGE=node:22-bookworm
ARG RUST_IMAGE=rust:1-bookworm
ARG GO_IMAGE=golang:1-bookworm
ARG RUNTIME_IMAGE=debian:bookworm-slim

FROM ${NODE_IMAGE} AS node-toolchain

FROM ${GO_IMAGE} AS go-toolchain

FROM ${NODE_IMAGE} AS web-builder
WORKDIR /src
COPY . .
RUN --mount=type=cache,target=/root/.npm \
    --mount=type=cache,target=/root/.cache/yarn \
    chmod +x scripts/packaging/build-web.sh && \
    scripts/packaging/build-web.sh /out/web

FROM ${RUST_IMAGE} AS server-builder
COPY --from=node-toolchain /usr/local /usr/local
COPY --from=go-toolchain /usr/local/go /usr/local/go

ENV PATH="/usr/local/go/bin:/usr/local/cargo/bin:${PATH}" \
    CARGO_TARGET_DIR="/tmp/fablepool-cargo-target" \
    GOFLAGS="-mod=mod"

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      ca-certificates \
      curl \
      git \
      build-essential \
      pkg-config \
      libssl-dev \
      libsqlite3-dev \
      python3 && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /src
COPY . .

ARG SERVER_BUILD_MODE=auto
ARG SERVER_BIN_NAME=
ARG SERVER_BIN_PATH=
ARG SERVER_CRATE_DIR=
ARG SERVER_GO_DIR=
ARG SERVER_GO_PACKAGE=.
ARG SERVER_NODE_DIR=
ARG SERVER_NODE_START=

ENV SERVER_BUILD_MODE="${SERVER_BUILD_MODE}" \
    SERVER_BIN_NAME="${SERVER_BIN_NAME}" \
    SERVER_BIN_PATH="${SERVER_BIN_PATH}" \
    SERVER_CRATE_DIR="${SERVER_CRATE_DIR}" \
    SERVER_GO_DIR="${SERVER_GO_DIR}" \
    SERVER_GO_PACKAGE="${SERVER_GO_PACKAGE}" \
    SERVER_NODE_DIR="${SERVER_NODE_DIR}" \
    SERVER_NODE_START="${SERVER_NODE_START}"

RUN --mount=type=cache,target=/usr/local/cargo/registry \
    --mount=type=cache,target=/usr/local/cargo/git \
    --mount=type=cache,target=/tmp/fablepool-cargo-target \
    --mount=type=cache,target=/root/.npm \
    --mount=type=cache,target=/root/.cache/yarn \
    chmod +x scripts/packaging/build-server.sh && \
    scripts/packaging/build-server.sh /out/bin/fablepool-server

FROM ${RUNTIME_IMAGE} AS runtime

LABEL org.opencontainers.image.title="FablePool" \
      org.opencontainers.image.description="Self-hosted music server with S3/WebDAV mounts, Chromecast, Android, and AI autoplay recommendations" \
      org.opencontainers.image.source="https://github.com/fablepool/fablepool" \
      org.opencontainers.image.licenses="AGPL-3.0-or-later"

COPY --from=node-toolchain /usr/local /usr/local

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      ca-certificates \
      curl \
      ffmpeg \
      libssl3 \
      libsqlite3-0 \
      tini \
      tzdata && \
    groupadd --system --gid 10001 fablepool && \
    useradd --system --uid 10001 --gid 10001 --home-dir /app --shell /usr/sbin/nologin fablepool && \
    mkdir -p /app /data /cache /config && \
    chown -R fablepool:fablepool /app /data /cache /config && \
    rm -rf /var/lib/apt/lists/*

COPY --from=server-builder --chown=fablepool:fablepool /out /app
COPY --from=web-builder --chown=fablepool:fablepool /out/web /app/web
COPY --chown=root:root scripts/packaging/runtime-entrypoint.sh /usr/local/bin/fablepool-entrypoint
COPY --chown=root:root scripts/packaging/healthcheck.sh /usr/local/bin/fablepool-healthcheck

RUN chmod 0755 /usr/local/bin/fablepool-entrypoint /usr/local/bin/fablepool-healthcheck /app/bin/fablepool-server

USER 10001:10001
WORKDIR /app

ENV FABLEPOOL_HTTP_ADDR="0.0.0.0:4533" \
    FABLEPOOL_HTTP_PORT="4533" \
    FABLEPOOL_DATA_DIR="/data" \
    FABLEPOOL_CACHE_DIR="/cache" \
    FABLEPOOL_CONFIG="/config/fablepool.yml" \
    FABLEPOOL_WEB_ROOT="/app/web" \
    FABLEPOOL_TRANSCODER="ffmpeg"

EXPOSE 4533

HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=5 \
  CMD ["/usr/local/bin/fablepool-healthcheck"]

ENTRYPOINT ["tini", "--", "/usr/local/bin/fablepool-entrypoint"]
CMD ["/app/bin/fablepool-server"]
