Dockerfile
Rama dev · réplica de lectura del repositorio original.
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"]