mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-03 19:09:36 +00:00
check_status() only recognized a systemd service or Alpine's /etc/init.d/x-ui, neither of which exists in a container where the panel runs as the foreground main process (PID 1 via "exec /app/x-ui"). Every CLI command therefore failed with "Please install the panel first", and restart/restart-xray relied on rc-service/systemctl that aren't present. Detect the container (/.dockerenv or XUI_IN_DOCKER) and, when inside one: - resolve the panel binary under /app instead of /usr/local/x-ui - derive status from the running process instead of a service file - restart via SIGHUP and restart-xray via SIGUSR1 to the panel process - show Docker-appropriate guidance for start/stop/enable/disable The Dockerfile sets XUI_IN_DOCKER/XUI_MAIN_FOLDER so detection is explicit even though /.dockerenv alone suffices. Closes #4817
75 lines
1.9 KiB
Docker
75 lines
1.9 KiB
Docker
# ========================================================
|
|
# Stage: Frontend (Vite)
|
|
# ========================================================
|
|
FROM --platform=$BUILDPLATFORM 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_IN_DOCKER="true"
|
|
ENV XUI_MAIN_FOLDER="/app"
|
|
ENV XUI_ENABLE_FAIL2BAN="true"
|
|
ENV XUI_DB_TYPE=""
|
|
ENV XUI_DB_DSN=""
|
|
EXPOSE 2053
|
|
VOLUME [ "/etc/x-ui" ]
|
|
CMD [ "./x-ui" ]
|
|
ENTRYPOINT [ "/app/DockerEntrypoint.sh" ]
|