mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-05-13 13:58:22 +00:00
The Vite SPA reads locale JSON via a glob that resolves to <repo>/web/translation/*.json, but the frontend build stage only copied frontend/, so the production bundle shipped with no messages and the Docker panel rendered untranslated keys. Copy the directory into the frontend stage at the path the glob expects, and into the final image so the Go disk fallback in locale.loadTranslationsFromDisk also has somewhere to read from.
70 lines
1.8 KiB
Docker
70 lines
1.8 KiB
Docker
# ========================================================
|
|
# Stage: Frontend (Vite)
|
|
# ========================================================
|
|
FROM node:22-alpine AS frontend
|
|
WORKDIR /src/frontend
|
|
COPY frontend/package.json frontend/package-lock.json ./
|
|
RUN npm ci
|
|
COPY frontend/ ./
|
|
COPY web/translation /src/web/translation
|
|
RUN npm run build
|
|
|
|
# ========================================================
|
|
# Stage: Builder
|
|
# ========================================================
|
|
FROM golang:1.26-alpine AS builder
|
|
WORKDIR /app
|
|
ARG TARGETARCH
|
|
|
|
RUN apk --no-cache --update add \
|
|
build-base \
|
|
gcc \
|
|
curl \
|
|
unzip
|
|
|
|
COPY . .
|
|
COPY --from=frontend /src/web/dist ./web/dist
|
|
|
|
ENV CGO_ENABLED=1
|
|
ENV CGO_CFLAGS="-D_LARGEFILE64_SOURCE"
|
|
RUN go build -ldflags "-w -s" -o build/x-ui main.go
|
|
RUN ./DockerInit.sh "$TARGETARCH"
|
|
|
|
# ========================================================
|
|
# Stage: Final Image of 3x-ui
|
|
# ========================================================
|
|
FROM alpine
|
|
ENV TZ=Asia/Tehran
|
|
WORKDIR /app
|
|
|
|
RUN apk add --no-cache --update \
|
|
ca-certificates \
|
|
tzdata \
|
|
fail2ban \
|
|
bash \
|
|
curl \
|
|
openssl
|
|
|
|
COPY --from=builder /app/build/ /app/
|
|
COPY --from=builder /app/DockerEntrypoint.sh /app/
|
|
COPY --from=builder /app/x-ui.sh /usr/bin/x-ui
|
|
COPY --from=builder /app/web/translation /app/web/translation
|
|
|
|
|
|
# Configure fail2ban
|
|
RUN rm -f /etc/fail2ban/jail.d/alpine-ssh.conf \
|
|
&& cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local \
|
|
&& sed -i "s/^\[ssh\]$/&\nenabled = false/" /etc/fail2ban/jail.local \
|
|
&& sed -i "s/^\[sshd\]$/&\nenabled = false/" /etc/fail2ban/jail.local \
|
|
&& sed -i "s/#allowipv6 = auto/allowipv6 = auto/g" /etc/fail2ban/fail2ban.conf
|
|
|
|
RUN chmod +x \
|
|
/app/DockerEntrypoint.sh \
|
|
/app/x-ui \
|
|
/usr/bin/x-ui
|
|
|
|
ENV XUI_ENABLE_FAIL2BAN="true"
|
|
EXPOSE 2053
|
|
VOLUME [ "/etc/x-ui" ]
|
|
CMD [ "./x-ui" ]
|
|
ENTRYPOINT [ "/app/DockerEntrypoint.sh" ]
|