ARG VERSION=dev ARG COMMIT="" ARG SOURCE_REPOSITORY=Kirari04/p2pstream ARG RELEASE_CHANNEL=development ARG VITE_RELEASE_REPOSITORY="" ARG VITE_RELEASE_REF="" FROM oven/bun:1.4.4@sha256:1d22548f177f4ff38e0c15baa3c2c46c6c2060ba2d1bc573bb4720b407548f1d AS bun FROM bun AS frontend WORKDIR /app/web/management ARG VITE_RELEASE_REF ARG VITE_RELEASE_REPOSITORY="" ARG RELEASE_CHANNEL ENV VITE_RELEASE_REPOSITORY=$VITE_RELEASE_REPOSITORY ENV VITE_RELEASE_REF=$VITE_RELEASE_REF ENV VITE_RELEASE_CHANNEL=$RELEASE_CHANNEL COPY web/management/package.json web/management/bun.lock ./ RUN bun install --frozen-lockfile COPY web/management/ ./ RUN bun run build FROM golang:1.27.3-bookworm@sha256:d9b6a1beb9474adc2a1ce842573639b44b2a0dd49b6669f51d3821baf9ec37c9 AS backend WORKDIR /src ARG VERSION ARG COMMIT ARG SOURCE_REPOSITORY ARG RELEASE_CHANNEL COPY go.mod go.sum ./ COPY third_party/yamux ./third_party/yamux RUN go mod download COPY . . RUN go build -trimpath -ldflags "-s -w -X p2pstream/internal/buildinfo.Version=${VERSION} -X p2pstream/internal/buildinfo.Commit=${COMMIT} -X p2pstream/internal/buildinfo.Repository=${SOURCE_REPOSITORY} -X p2pstream/internal/buildinfo.Channel=${RELEASE_CHANNEL}" -o /out/p2pstream main.go FROM scratch AS binary COPY --from=backend /out/p2pstream /p2pstream FROM golang:1.27.3-bookworm@sha256:d9b6a1beb9474adc2a1ce842573639b44b2a0dd49b6669f51d3821baf9ec37c9 AS test-base RUN apt-get update \ && apt-get install -y --no-install-recommends \ bash \ ca-certificates \ curl \ git \ make \ sqlite3 \ unzip \ && rm -rf /var/lib/apt/lists/* # Reuse the verified Bun image rather than executing a network installer. COPY --from=bun /usr/local/bin/bun /usr/local/bin/bun RUN ln -s bun /usr/local/bin/bunx WORKDIR /src COPY go.mod go.sum ./ COPY third_party/yamux ./third_party/yamux RUN go mod download COPY web/management/package.json web/management/bun.lock ./web/management/ RUN cd web/management && bun install --frozen-lockfile COPY . . FROM test-base AS test RUN make generate RUN go test ./... RUN cd third_party/yamux && go test ./... RUN cd web/management && bun run typecheck RUN make build FROM test-base AS race-test RUN make generate RUN go test -race ./... RUN cd third_party/yamux && go test ./... && go test -race -short ./... FROM test-base AS smoke FROM golang:1.27.3-bookworm@sha256:d9b6a1beb9474adc2a1ce842573639b44b2a0dd49b6669f51d3821baf9ec37c9 AS smoke-upstream-build WORKDIR /src COPY go.mod go.sum ./ COPY third_party/yamux ./third_party/yamux RUN go mod download COPY internal/smoketest/upstream ./internal/smoketest/upstream RUN CGO_ENABLED=0 go build -trimpath -o /out/smoke-upstream ./internal/smoketest/upstream FROM scratch AS smoke-upstream COPY --from=smoke-upstream-build /out/smoke-upstream /smoke-upstream EXPOSE 9000 CMD ["/smoke-upstream"] FROM test-base AS legal RUN make legal-notices FROM debian:bookworm-slim@sha256:7ff6ba31527b9e336162fa061746c366c4b2032f4d2cff2078bea43f78efe3f8 AS runtime WORKDIR /app ARG VERSION ARG COMMIT ARG SOURCE_REPOSITORY LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later" \ org.opencontainers.image.source="https://github.com/${SOURCE_REPOSITORY}" \ org.opencontainers.image.revision="${COMMIT}" \ org.opencontainers.image.version="${VERSION}" RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates libcap2-bin \ && rm -rf /var/lib/apt/lists/* COPY --from=backend /out/p2pstream /app/p2pstream COPY --from=frontend /app/web/management/dist /app/web/management/dist COPY --from=legal /src/dist/legal /app/legal RUN groupadd --system p2pstream \ && useradd --system --gid p2pstream --home-dir /nonexistent --no-create-home --shell /usr/sbin/nologin p2pstream \ && mkdir -p /data \ && chown -R p2pstream:p2pstream /app /data \ && setcap 'cap_net_bind_service=+ep' /app/p2pstream USER p2pstream:p2pstream ENV ENV=production ENV MANAGEMENT_UI_DIST_DIR=/app/web/management/dist ENV MANAGEMENT_PORT=8081 ENV CONFIG_DIR=/data VOLUME /data EXPOSE 80 443 8081 CMD ["/app/p2pstream", "server"]