Skip to content

Commit 0599285

Browse files
mprycoadp-maintainers
authored andcommitted
UPSTREAM: <carry> Fix broken rebase of branding options
Fix downstream changes to match upstream refactored functions. Signed-off-by: Michal Pryc <mpryc@redhat.com>
1 parent 54f2bab commit 0599285

4 files changed

Lines changed: 77 additions & 235 deletions

File tree

Containerfile

Lines changed: 71 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,46 @@
1-
## Multi-stage build for File Browser - Kubernetes-optimized
2-
## Simplified runtime container for use with init containers and K8s ConfigMaps/Secrets
1+
## Multi-stage build for File Browser
32

4-
# Build stage
5-
FROM --platform=$BUILDPLATFORM registry.access.redhat.com/ubi9/nodejs-20:latest AS frontend-builder
3+
# =============================================================================
4+
# Stage 1: Install frontend dependencies only when needed
5+
# =============================================================================
6+
FROM registry.access.redhat.com/ubi9/nodejs-24:latest AS frontend-deps
67

7-
USER root
8+
USER 0
9+
WORKDIR /app
810

9-
# Build-time arguments
10-
ARG BUILDPLATFORM
11-
ARG TARGETOS
12-
ARG TARGETARCH
11+
# Install pnpm globally
12+
RUN npm install -g pnpm@10.29.2
1313

14-
# Install pnpm
15-
RUN npm install -g pnpm@9.15.4
16-
17-
# Copy frontend source
18-
WORKDIR /src/frontend
14+
# Copy only dependency files for better layer caching
1915
COPY frontend/package.json frontend/pnpm-lock.yaml ./
16+
17+
# Install dependencies
2018
RUN pnpm install --frozen-lockfile
2119

20+
# =============================================================================
21+
# Stage 2: Build frontend
22+
# =============================================================================
23+
FROM registry.access.redhat.com/ubi9/nodejs-24:latest AS frontend-builder
24+
25+
USER 0
26+
WORKDIR /app
27+
28+
# Install pnpm (needed for build scripts)
29+
RUN npm install -g pnpm@10.29.2
30+
31+
# Copy node_modules from deps stage
32+
COPY --from=frontend-deps /app/node_modules ./node_modules
33+
34+
# Copy frontend source
2235
COPY frontend/ ./
36+
37+
# Build the frontend
2338
RUN pnpm run build
2439

25-
# Backend builder stage
26-
FROM --platform=$BUILDPLATFORM registry.access.redhat.com/ubi9/go-toolset:1.22 AS backend-builder
40+
# =============================================================================
41+
# Stage 3: Build Go backend
42+
# =============================================================================
43+
FROM --platform=$BUILDPLATFORM quay.io/konveyor/builder:ubi9-latest AS backend-builder
2744

2845
USER root
2946

@@ -40,62 +57,72 @@ ENV GOARCH=${TARGETARCH}
4057
ENV CGO_ENABLED=0
4158
ENV GOTOOLCHAIN=auto
4259

43-
# Install build dependencies for cross-compilation
44-
RUN dnf install -y gcc gcc-c++ && dnf clean all
45-
4660
WORKDIR /src
4761

48-
# Copy go module files
62+
# Copy go module files first for better layer caching
4963
COPY go.mod go.sum ./
5064
RUN go mod download
5165

5266
# Copy source code
5367
COPY . .
5468

5569
# Copy built frontend from previous stage
56-
COPY --from=frontend-builder /src/frontend/dist ./frontend/dist
70+
COPY --from=frontend-builder /app/dist ./frontend/dist
5771

5872
# Build the backend with embedded frontend
59-
RUN GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} \
60-
go build -ldflags "-X 'github.com/filebrowser/filebrowser/v2/version.Version=${VERSION:-dev}' \
61-
-X 'github.com/filebrowser/filebrowser/v2/version.CommitSHA=${VERSION_HASH:-unknown}'" \
73+
RUN go build -ldflags "-s -w \
74+
-X 'github.com/filebrowser/filebrowser/v2/version.Version=${VERSION:-dev}' \
75+
-X 'github.com/filebrowser/filebrowser/v2/version.CommitSHA=${VERSION_HASH:-unknown}'" \
6276
-o filebrowser .
6377

64-
# Final runtime stage - minimal, for use with init containers
78+
# =============================================================================
79+
# Stage 4: Final runtime image - minimal footprint
80+
# =============================================================================
6581
FROM registry.access.redhat.com/ubi9-minimal:latest
6682

67-
# Install runtime dependencies (curl-minimal is already in ubi9-minimal)
68-
RUN microdnf install -y ca-certificates tzdata shadow-utils && \
69-
microdnf clean all
70-
71-
# Create non-root user and directories
72-
RUN groupadd -g 1000 filebrowser && \
73-
useradd -u 1000 -g filebrowser -s /sbin/nologin -M filebrowser && \
83+
# Labels for container metadata
84+
LABEL name="filebrowser" \
85+
summary="File Browser - Web-based file manager" \
86+
description="A web-based file manager with support for multiple users and permissions" \
87+
io.k8s.display-name="File Browser" \
88+
io.k8s.description="A web-based file manager with support for multiple users and permissions" \
89+
io.openshift.tags="filebrowser,filemanager,web"
90+
91+
# Install runtime dependencies and clean up in single layer
92+
RUN microdnf install -y --nodocs \
93+
ca-certificates \
94+
tzdata \
95+
shadow-utils \
96+
curl-minimal && \
97+
microdnf clean all && \
98+
rm -rf /var/cache/yum
99+
100+
# Create non-root user and required directories
101+
RUN groupadd -g 1001 filebrowser && \
102+
useradd -u 1001 -g filebrowser -s /sbin/nologin -M filebrowser && \
74103
mkdir -p /srv /config /database && \
75-
chown -R filebrowser:filebrowser /srv /config /database
104+
chown -R 1001:1001 /srv /config /database
76105

77106
# Copy binary from builder
78-
COPY --from=backend-builder --chown=filebrowser:filebrowser /src/filebrowser /usr/local/bin/filebrowser
107+
COPY --from=backend-builder --chown=1001:1001 /src/filebrowser /usr/local/bin/filebrowser
79108

80-
# Healthcheck script
81-
COPY --chown=filebrowser:filebrowser docker/ubi/healthcheck.sh /usr/local/bin/healthcheck.sh
109+
# Copy healthcheck script
110+
COPY --chown=1001:1001 docker/ubi/healthcheck.sh /usr/local/bin/healthcheck.sh
82111
RUN chmod +x /usr/local/bin/healthcheck.sh
83112

84-
# Switch to non-root user
85-
USER filebrowser
113+
# Switch to non-root user (using numeric ID for OpenShift compatibility)
114+
USER 1001
86115

87-
# Define volumes
116+
# Define volumes for persistent data
88117
VOLUME ["/srv", "/config", "/database"]
89118

90119
# Expose default port
91120
EXPOSE 8080
92121

93-
# Healthcheck
94-
HEALTHCHECK --start-period=5s --interval=10s --timeout=3s --retries=3 \
122+
# Healthcheck using the script
123+
HEALTHCHECK --start-period=5s --interval=30s --timeout=3s --retries=3 \
95124
CMD ["/usr/local/bin/healthcheck.sh"]
96125

97-
# Direct entrypoint - all configuration via environment variables
126+
# Direct entrypoint - configuration via FB_* environment variables
98127
ENTRYPOINT ["/usr/local/bin/filebrowser"]
99-
100-
# No default args - filebrowser reads from FB_* environment variables
101128
CMD []

cmd/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,10 @@ func getSettings(flags *pflag.FlagSet, set *settings.Settings, ser *settings.Ser
354354
set.Branding.DisableExternal, err = flags.GetBool(flag.Name)
355355
case "branding.disableUsedPercentage":
356356
set.Branding.DisableUsedPercentage, err = flags.GetBool(flag.Name)
357+
case "branding.disableUserProfile":
358+
set.Branding.DisableUserProfile, err = flags.GetBool(flag.Name)
359+
case "branding.defaultLoginUser":
360+
set.Branding.DefaultLoginUser, err = flags.GetString(flag.Name)
357361
case "tus.chunkSize":
358362
set.Tus.ChunkSize, err = flags.GetUint64(flag.Name)
359363
case "tus.retryCount":

cmd/config_init.go

Lines changed: 1 addition & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -46,140 +46,7 @@ override the options.`,
4646
return err
4747
}
4848

49-
minLength, err := getUint(flags, "minimum-password-length")
50-
if err != nil {
51-
return err
52-
}
53-
54-
shell, err := getString(flags, "shell")
55-
if err != nil {
56-
return err
57-
}
58-
59-
brandingName, err := getString(flags, "branding.name")
60-
if err != nil {
61-
return err
62-
}
63-
64-
brandingDisableExternal, err := getBool(flags, "branding.disableExternal")
65-
if err != nil {
66-
return err
67-
}
68-
69-
brandingDisableUsedPercentage, err := getBool(flags, "branding.disableUsedPercentage")
70-
if err != nil {
71-
return err
72-
}
73-
74-
brandingDisableUserProfile, err := getBool(flags, "branding.disableUserProfile")
75-
if err != nil {
76-
return err
77-
}
78-
79-
brandingTheme, err := getString(flags, "branding.theme")
80-
if err != nil {
81-
return err
82-
}
83-
84-
brandingFiles, err := getString(flags, "branding.files")
85-
if err != nil {
86-
return err
87-
}
88-
89-
brandingDefaultLoginUser, err := getString(flags, "branding.defaultLoginUser")
90-
if err != nil {
91-
return err
92-
}
93-
94-
s := &settings.Settings{
95-
Key: key,
96-
Signup: signup,
97-
CreateUserDir: createUserDir,
98-
MinimumPasswordLength: minLength,
99-
Shell: convertCmdStrToCmdArray(shell),
100-
AuthMethod: authMethod,
101-
Defaults: defaults,
102-
Branding: settings.Branding{
103-
Name: brandingName,
104-
DisableExternal: brandingDisableExternal,
105-
DisableUsedPercentage: brandingDisableUsedPercentage,
106-
DisableUserProfile: brandingDisableUserProfile,
107-
DefaultLoginUser: brandingDefaultLoginUser,
108-
Theme: brandingTheme,
109-
Files: brandingFiles,
110-
},
111-
}
112-
113-
s.FileMode, err = getMode(flags, "file-mode")
114-
if err != nil {
115-
return err
116-
}
117-
118-
s.DirMode, err = getMode(flags, "dir-mode")
119-
if err != nil {
120-
return err
121-
}
122-
123-
address, err := getString(flags, "address")
124-
if err != nil {
125-
return err
126-
}
127-
128-
socket, err := getString(flags, "socket")
129-
if err != nil {
130-
return err
131-
}
132-
133-
root, err := getString(flags, "root")
134-
if err != nil {
135-
return err
136-
}
137-
138-
baseURL, err := getString(flags, "baseurl")
139-
if err != nil {
140-
return err
141-
}
142-
143-
tlsKey, err := getString(flags, "key")
144-
if err != nil {
145-
return err
146-
}
147-
148-
cert, err := getString(flags, "cert")
149-
if err != nil {
150-
return err
151-
}
152-
153-
port, err := getString(flags, "port")
154-
if err != nil {
155-
return err
156-
}
157-
158-
log, err := getString(flags, "log")
159-
if err != nil {
160-
return err
161-
}
162-
163-
ser := &settings.Server{
164-
Address: address,
165-
Socket: socket,
166-
Root: root,
167-
BaseURL: baseURL,
168-
TLSKey: tlsKey,
169-
TLSCert: cert,
170-
Port: port,
171-
Log: log,
172-
}
173-
174-
err = d.store.Settings.Save(s)
175-
if err != nil {
176-
return err
177-
}
178-
err = d.store.Settings.SaveServer(ser)
179-
if err != nil {
180-
return err
181-
}
182-
err = d.store.Auth.Save(auther)
49+
err = st.Auth.Save(auther)
18350
if err != nil {
18451
return err
18552
}

cmd/config_set.go

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -29,63 +29,7 @@ you want to change. Other options will remain unchanged.`,
2929
return err
3030
}
3131

32-
hasAuth := false
33-
flags.Visit(func(flag *pflag.Flag) {
34-
if err != nil {
35-
return
36-
}
37-
switch flag.Name {
38-
case "baseurl":
39-
ser.BaseURL, err = getString(flags, flag.Name)
40-
case "root":
41-
ser.Root, err = getString(flags, flag.Name)
42-
case "socket":
43-
ser.Socket, err = getString(flags, flag.Name)
44-
case "cert":
45-
ser.TLSCert, err = getString(flags, flag.Name)
46-
case "key":
47-
ser.TLSKey, err = getString(flags, flag.Name)
48-
case "address":
49-
ser.Address, err = getString(flags, flag.Name)
50-
case "port":
51-
ser.Port, err = getString(flags, flag.Name)
52-
case "log":
53-
ser.Log, err = getString(flags, flag.Name)
54-
case "signup":
55-
set.Signup, err = getBool(flags, flag.Name)
56-
case "auth.method":
57-
hasAuth = true
58-
case "shell":
59-
var shell string
60-
shell, err = getString(flags, flag.Name)
61-
set.Shell = convertCmdStrToCmdArray(shell)
62-
case "create-user-dir":
63-
set.CreateUserDir, err = getBool(flags, flag.Name)
64-
case "minimum-password-length":
65-
set.MinimumPasswordLength, err = getUint(flags, flag.Name)
66-
case "branding.name":
67-
set.Branding.Name, err = getString(flags, flag.Name)
68-
case "branding.color":
69-
set.Branding.Color, err = getString(flags, flag.Name)
70-
case "branding.theme":
71-
set.Branding.Theme, err = getString(flags, flag.Name)
72-
case "branding.disableExternal":
73-
set.Branding.DisableExternal, err = getBool(flags, flag.Name)
74-
case "branding.disableUsedPercentage":
75-
set.Branding.DisableUsedPercentage, err = getBool(flags, flag.Name)
76-
case "branding.disableUserProfile":
77-
set.Branding.DisableUserProfile, err = getBool(flags, flag.Name)
78-
case "branding.defaultLoginUser":
79-
set.Branding.DefaultLoginUser, err = getString(flags, flag.Name)
80-
case "branding.files":
81-
set.Branding.Files, err = getString(flags, flag.Name)
82-
case "file-mode":
83-
set.FileMode, err = getMode(flags, flag.Name)
84-
case "dir-mode":
85-
set.DirMode, err = getMode(flags, flag.Name)
86-
}
87-
})
88-
32+
auther, err := st.Auth.Get(set.AuthMethod)
8933
if err != nil {
9034
return err
9135
}

0 commit comments

Comments
 (0)