# syntax=docker/dockerfile:1

FROM oven/bun:1.3.14-debian AS web-builder

WORKDIR /build/src/web

COPY src/web/package.json src/web/bun.lock ./
RUN bun install --frozen-lockfile

COPY src/web/ ./
RUN bun run build


FROM rust:1.97.1-trixie AS rust-builder

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        clang \
        cmake \
        libclang-dev \
        pkg-config \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /build

COPY Cargo.toml Cargo.lock ./
COPY src/crawler ./src/crawler
COPY src/search ./src/search

RUN --mount=type=cache,id=dht-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \
    --mount=type=cache,id=dht-cargo-git,target=/usr/local/cargo/git,sharing=locked \
    --mount=type=cache,id=dht-cargo-target,target=/build/target,sharing=locked \
    cargo build --locked --release -p dht-search --bin dht-search \
    && install -Dm755 target/release/dht-search /out/dht-search


FROM rust-builder AS index-tools-builder

RUN --mount=type=cache,id=dht-cargo-registry,target=/usr/local/cargo/registry,sharing=locked \
    --mount=type=cache,id=dht-cargo-git,target=/usr/local/cargo/git,sharing=locked \
    --mount=type=cache,id=dht-cargo-target,target=/build/target,sharing=locked \
    cargo build --locked --release -p dht-search --bin dht-index-inspect \
    && install -Dm755 target/release/dht-index-inspect /out/dht-index-inspect


FROM scratch AS index-tools

COPY --from=index-tools-builder /out/dht-index-inspect /dht-index-inspect


FROM debian:trixie-slim AS runtime

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        libgcc-s1 \
        libstdc++6 \
    && rm -rf /var/lib/apt/lists/*

RUN groupadd --gid 10001 dht-search \
    && useradd \
        --uid 10001 \
        --gid 10001 \
        --no-create-home \
        --no-log-init \
        --shell /usr/sbin/nologin \
        dht-search \
    && install -d -o 10001 -g 10001 \
        /dht-search \
        /dht-search/collector \
        /dht-search/data \
        /dht-search/web

COPY --from=rust-builder /out/dht-search /dht-search/dht-search
COPY --from=web-builder /build/src/web/dist /dht-search/web
COPY --chmod=0644 --chown=10001:10001 config.toml /dht-search/config.toml

USER 10001:10001

EXPOSE 8080/tcp
EXPOSE 8081/tcp
EXPOSE 12313/udp

STOPSIGNAL SIGTERM

ENTRYPOINT ["/dht-search/dht-search"]
CMD ["--config", "/dht-search/config.toml", "--http-listen", "0.0.0.0:8080", "--web-dir", "/dht-search/web"]
