# syntax=docker/dockerfile:1.7 # Stage 1: Build frontend FROM node:22-slim AS frontend RUN corepack enable && corepack prepare pnpm@10.32.1 --activate WORKDIR /app/web COPY web/package.json web/pnpm-lock.yaml ./ COPY web/vendor/foliate-js ./vendor/foliate-js RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile COPY web/ . RUN pnpm run build # Stage 2: Prepare Go build workspace FROM golang:1.26 AS build-base ENV CGO_ENABLED=1 ENV GOPROXY=direct ENV GOPRIVATE=github.com/Silo-Server/* ENV GONOSUMDB=github.com/Silo-Server/* RUN apt-get update && apt-get install -y --no-install-recommends libvips-dev && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY go.mod go.sum ./ COPY internal/compat/zishang520-webtransport-go/ internal/compat/zishang520-webtransport-go/ RUN --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg/mod \ go mod download COPY web/embed.go web/embed.go COPY --from=frontend /app/web/dist web/dist COPY cmd/ cmd/ COPY internal/ internal/ COPY migrations/ migrations/ # See Dockerfile: the settings contract is an embedded Go package outside # internal/, so the build fails without it. COPY contracts/ contracts/ # Stage 3: Build Go binary for dev using a local plugin SDK checkout passed via # BuildKit named context `silo_plugin_sdk`. FROM build-base AS build ARG BUILD_REVISION ARG BUILD_DIRTY=false COPY --from=silo_plugin_sdk . /tmp/silo-plugin-sdk RUN test -f /tmp/silo-plugin-sdk/go.mod RUN --mount=type=cache,target=/root/.cache/go-build \ --mount=type=cache,target=/go/pkg/mod \ go mod edit -replace=github.com/Silo-Server/silo-plugin-sdk=/tmp/silo-plugin-sdk && \ go mod download && \ go build \ -ldflags "-X github.com/Silo-Server/silo-server/internal/buildinfo.revisionOverride=${BUILD_REVISION} -X github.com/Silo-Server/silo-server/internal/buildinfo.dirtyOverride=${BUILD_DIRTY}" \ -o /silo ./cmd/silo/ # Stage 4: Runtime FROM debian:bookworm-slim ARG TARGETARCH RUN apt-get update && \ apt-get install -y --no-install-recommends ca-certificates curl gnupg && \ curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key \ | gpg --dearmor -o /usr/share/keyrings/jellyfin.gpg && \ echo "deb [signed-by=/usr/share/keyrings/jellyfin.gpg arch=${TARGETARCH}] https://repo.jellyfin.org/debian bookworm main" \ > /etc/apt/sources.list.d/jellyfin.list && \ apt-get update && \ apt-get install -y --no-install-recommends jellyfin-ffmpeg7 git libvips42 fonts-noto-core fonts-noto-cjk && \ apt-get purge -y gnupg && apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/* RUN mkdir -p /tmp/silo-transcode /var/lib/silo/compat/jellyfin-web COPY --from=frontend /usr/local/bin/node /usr/local/bin/node COPY --from=frontend /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/npm RUN ln -sf ../lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && \ ln -sf ../lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx COPY --from=build /silo /usr/local/bin/silo EXPOSE 8080 8096 13378 HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \ CMD curl -f http://localhost:${PORT:-8080}/api/v1/health || exit 1 ENTRYPOINT ["silo"]