diff --git a/Dockerfile.full b/Dockerfile.full new file mode 100644 index 00000000..79e0ace9 --- /dev/null +++ b/Dockerfile.full @@ -0,0 +1,86 @@ +# Multi-stage build: compile frontend + backend, then package +# This is a full build Dockerfile for filebrowser from source + +############################################################################## +# Stage 1: Build frontend (Node.js / pnpm) +############################################################################## +FROM node:20-alpine AS frontend-builder + +RUN corepack enable && corepack prepare pnpm@latest --activate + +WORKDIR /app/frontend +COPY frontend/package.json frontend/pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +COPY frontend/ ./ +RUN pnpm run build + +############################################################################## +# Stage 2: Build backend (Go) +############################################################################## +FROM golang:1.25-alpine AS backend-builder + +RUN apk add --no-cache git + +WORKDIR /app +COPY . . +COPY --from=frontend-builder /app/frontend/dist ./frontend/dist + +RUN go mod tidy && go mod download + +ARG VERSION=dev +ARG GIT_COMMIT=unknown + +RUN CGO_ENABLED=0 go build \ + -ldflags="-s -w -X 'github.com/filebrowser/filebrowser/v2/version.Version=${VERSION}' -X 'github.com/filebrowser/filebrowser/v2/version.CommitSHA=${GIT_COMMIT}'" \ + -o filebrowser . + +############################################################################## +# Stage 3: Fetch runtime dependencies +############################################################################## +FROM alpine:3.23 AS fetcher + +RUN apk update && \ + apk --no-cache add ca-certificates mailcap tini-static && \ + wget -O /JSON.sh https://raw.githubusercontent.com/dominictarr/JSON.sh/0d5e5c77365f63809bf6e77ef44a1f34b0e05840/JSON.sh + +############################################################################## +# Stage 4: Final runtime image (Alpine with ffmpeg) +############################################################################## +FROM alpine:3.23 + +ENV UID=1000 +ENV GID=1000 + +RUN addgroup -g $GID user && \ + adduser -D -u $UID -G user user && \ + apk add --no-cache ffmpeg + +# Copy compiled binary from backend-builder +COPY --from=backend-builder --chown=user:user /app/filebrowser /bin/filebrowser + +# Copy scripts and configs from repo +COPY --chown=user:user docker/common/ / +COPY --chown=user:user docker/alpine/ / + +# Copy runtime deps from fetcher +COPY --chown=user:user --from=fetcher /sbin/tini-static /bin/tini +COPY --from=fetcher /JSON.sh /JSON.sh +COPY --from=fetcher /etc/ca-certificates.conf /etc/ca-certificates.conf +COPY --from=fetcher /etc/ca-certificates /etc/ca-certificates +COPY --from=fetcher /etc/mime.types /etc/mime.types +COPY --from=fetcher /etc/ssl /etc/ssl + +RUN mkdir -p /config /database /srv && \ + chown -R user:user /config /database /srv && \ + chmod +x /healthcheck.sh + +HEALTHCHECK --start-period=2s --interval=5s --timeout=3s CMD /healthcheck.sh + +USER user + +VOLUME /srv /config /database + +EXPOSE 80 + +ENTRYPOINT [ "tini", "--", "/init.sh" ] diff --git a/go.mod b/go.mod index 7e6a3486..d280193a 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dhowden/tag v0.0.0-20240417053706-3d75831295e8 // indirect - github.com/bogem/id3v2/v2 v2.0.9 + github.com/bogem/id3v2/v2 v2.1.4 github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect github.com/dsoprea/go-utility/v2 v2.0.0-20221003172846-a3e1774ef349 // indirect