2026-05-22 20:26:11 -04:00
|
|
|
# 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 ./
|
2026-06-10 08:18:35 -04:00
|
|
|
COPY web/vendor/foliate-js ./vendor/foliate-js
|
2026-05-22 20:26:11 -04:00
|
|
|
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 ./
|
2026-06-09 20:08:30 -04:00
|
|
|
COPY internal/compat/zishang520-webtransport-go/ internal/compat/zishang520-webtransport-go/
|
2026-05-22 20:26:11 -04:00
|
|
|
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/
|
2026-07-30 10:52:41 -04:00
|
|
|
# See Dockerfile: the settings contract is an embedded Go package outside
|
|
|
|
|
# internal/, so the build fails without it.
|
|
|
|
|
COPY contracts/ contracts/
|
2026-05-22 20:26:11 -04:00
|
|
|
|
|
|
|
|
# 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 && \
|
2026-06-15 06:34:08 -07:00
|
|
|
apt-get install -y --no-install-recommends jellyfin-ffmpeg7 git libvips42 fonts-noto-core fonts-noto-cjk && \
|
2026-05-22 20:26:11 -04:00
|
|
|
apt-get purge -y gnupg && apt-get autoremove -y && \
|
|
|
|
|
rm -rf /var/lib/apt/lists/*
|
2026-06-15 06:34:08 -07:00
|
|
|
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
|
2026-05-22 20:26:11 -04:00
|
|
|
COPY --from=build /silo /usr/local/bin/silo
|
2026-06-15 06:34:08 -07:00
|
|
|
EXPOSE 8080 8096 13378
|
2026-05-22 20:26:11 -04:00
|
|
|
HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
|
|
|
|
|
CMD curl -f http://localhost:${PORT:-8080}/api/v1/health || exit 1
|
|
|
|
|
ENTRYPOINT ["silo"]
|