mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-05-03 13:48:49 +00:00
138 lines
3.5 KiB
Docker
138 lines
3.5 KiB
Docker
# ========================================================
|
|
# Stage: Builder
|
|
# ========================================================
|
|
FROM golang:1.23-alpine AS builder
|
|
WORKDIR /app
|
|
ARG TARGETARCH
|
|
ARG ANTIZAPRET
|
|
|
|
RUN apk --no-cache --update add \
|
|
build-base \
|
|
gcc \
|
|
wget \
|
|
unzip
|
|
|
|
COPY . .
|
|
|
|
ENV CGO_ENABLED=1
|
|
ENV CGO_CFLAGS="-D_LARGEFILE64_SOURCE"
|
|
RUN go build -o build/x-ui main.go
|
|
RUN ./DockerInit.sh "$TARGETARCH" "$ANTIZAPRET"
|
|
|
|
# ========================================================
|
|
# Stage: Final Image of 3x-ui
|
|
# ========================================================
|
|
FROM alpine
|
|
ENV TZ=Europe/Moscow
|
|
WORKDIR /app
|
|
|
|
RUN apk add --no-cache --update \
|
|
ca-certificates \
|
|
tzdata \
|
|
fail2ban \
|
|
ip6tables \
|
|
iptables \
|
|
bash \
|
|
nano \
|
|
unzip
|
|
|
|
COPY --from=builder /app/build/ /app/
|
|
COPY --from=builder /app/DockerEntrypoint.sh /app/
|
|
COPY --from=builder /app/x-ui.sh /usr/bin/x-ui
|
|
|
|
|
|
# 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 <<EOT
|
|
bantime="15"
|
|
log_folder="/var/log"
|
|
iplimit_log_path="${log_folder}/3xipl.log"
|
|
iplimit_banned_log_path="${log_folder}/3xipl-banned.log"
|
|
|
|
cat << EOF > /etc/fail2ban/jail.d/3x-ipl.conf
|
|
[3x-ipl]
|
|
enabled=true
|
|
backend=auto
|
|
filter=3x-ipl
|
|
action=3x-ipl
|
|
logpath=${iplimit_log_path}
|
|
maxretry=2
|
|
findtime=32
|
|
bantime=${bantime}m
|
|
EOF
|
|
|
|
cat << EOF > /etc/fail2ban/filter.d/3x-ipl.conf
|
|
[Definition]
|
|
datepattern = ^%%Y/%%m/%%d %%H:%%M:%%S
|
|
failregex = \[LIMIT_IP\]\s*Email\s*=\s*<F-USER>.+</F-USER>\s*\|\|\s*SRC\s*=\s*<ADDR>
|
|
ignoreregex =
|
|
EOF
|
|
|
|
cat << EOF > /etc/fail2ban/action.d/3x-ipl.conf
|
|
[INCLUDES]
|
|
before = iptables-common.conf
|
|
|
|
[Definition]
|
|
actionstart = <iptables> -N f2b-<name>
|
|
<iptables> -A f2b-<name> -j <returntype>
|
|
<iptables> -I <chain> -p <protocol> -j f2b-<name>
|
|
|
|
actionstop = <iptables> -D <chain> -p <protocol> -j f2b-<name>
|
|
<actionflush>
|
|
<iptables> -X f2b-<name>
|
|
|
|
actioncheck = <iptables> -n -L <chain> | grep -q 'f2b-<name>[ \t]'
|
|
|
|
actionban = <iptables> -I f2b-<name> 1 -s <ip> -j <blocktype>
|
|
echo "\$(date +"%%Y/%%m/%%d %%H:%%M:%%S") BAN [Email] = <F-USER> [IP] = <ip> banned for <bantime> seconds." >> ${iplimit_banned_log_path}
|
|
|
|
actionunban = <iptables> -D f2b-<name> -s <ip> -j <blocktype>
|
|
echo "\$(date +"%%Y/%%m/%%d %%H:%%M:%%S") UNBAN [Email] = <F-USER> [IP] = <ip> unbanned." >> ${iplimit_banned_log_path}
|
|
|
|
[Init]
|
|
name = default
|
|
protocol = tcp
|
|
chain = INPUT
|
|
EOF
|
|
|
|
cat << EOF > /etc/fail2ban/action.d/iptables-common.conf
|
|
[INCLUDES]
|
|
after = iptables-blocktype.local
|
|
iptables-common.local
|
|
|
|
[Definition]
|
|
actionflush = <iptables> -F f2b-<name>
|
|
|
|
[Init]
|
|
chain = INPUT
|
|
name = default
|
|
port = ssh
|
|
protocol = tcp
|
|
blocktype = REJECT --reject-with icmp-port-unreachable
|
|
returntype = RETURN
|
|
lockingopt = -w
|
|
iptables = iptables <lockingopt>
|
|
|
|
[Init?family=inet6]
|
|
blocktype = REJECT --reject-with icmp6-port-unreachable
|
|
iptables = ip6tables <lockingopt>
|
|
EOF
|
|
|
|
sed -i "1s/^/[INCLUDES]\n\nbefore = iptables-common.conf\n\n/" /etc/fail2ban/action.d/iptables.conf
|
|
EOT
|
|
|
|
RUN mkdir -p /etc/x-ui && touch /etc/x-ui/announce.txt
|
|
|
|
RUN chmod +x \
|
|
/app/DockerEntrypoint.sh \
|
|
/app/x-ui \
|
|
/usr/bin/x-ui
|
|
|
|
VOLUME [ "/etc/x-ui" ]
|
|
CMD [ "./x-ui" ]
|
|
ENTRYPOINT [ "/app/DockerEntrypoint.sh" ]
|