mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-03-04 15:13:06 +00:00
Compare commits
9 commits
ae41782ab9
...
3ab566c725
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ab566c725 | ||
|
|
e8c509c720 | ||
|
|
e9757350f3 | ||
|
|
fcf86063f3 | ||
|
|
20ca19233a | ||
|
|
ba07e15695 | ||
|
|
83a1c721c7 | ||
|
|
7ccc0877a1 | ||
|
|
ad659e48cf |
20 changed files with 400 additions and 329 deletions
|
|
@ -2,11 +2,22 @@
|
||||||
|
|
||||||
FINISH_FILE="$GEODATA_DIR/cron-job-finished.txt"
|
FINISH_FILE="$GEODATA_DIR/cron-job-finished.txt"
|
||||||
|
|
||||||
while [ ! -f "$FINISH_FILE" ]; do
|
MAX_WAIT=300 # 5 minutes
|
||||||
echo "Still waiting... (looking for $FINISH_FILE)"
|
ELAPSED=0
|
||||||
sleep 10
|
INTERVAL=10
|
||||||
|
|
||||||
|
while [ ! -f "$FINISH_FILE" ] && [ $ELAPSED -lt $MAX_WAIT ]; do
|
||||||
|
echo "Still waiting for geodata initialization... ($ELAPSED/$MAX_WAIT seconds)"
|
||||||
|
sleep $INTERVAL
|
||||||
|
ELAPSED=$((ELAPSED + INTERVAL))
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ ! -f "$FINISH_FILE" ]; then
|
||||||
|
echo "ERROR: Geodata initialization timed out after $MAX_WAIT seconds"
|
||||||
|
echo "Container startup aborted."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Start fail2ban
|
# Start fail2ban
|
||||||
[ "$XUI_ENABLE_FAIL2BAN" = "true" ] && fail2ban-client -x start
|
[ "$XUI_ENABLE_FAIL2BAN" = "true" ] && fail2ban-client -x start
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ services:
|
||||||
build:
|
build:
|
||||||
context: docker-cron-runner
|
context: docker-cron-runner
|
||||||
args:
|
args:
|
||||||
XRAY_VERSION: "v25.10.15"
|
XRAY_VERSION: "${XRAY_VERSION:-v25.10.15}"
|
||||||
XRAY_BUILD_DIR: "/app/xray"
|
XRAY_BUILD_DIR: "/app/xray"
|
||||||
container_name: geodata_cron
|
container_name: geodata_cron
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,25 @@ install_xray_core() {
|
||||||
cd "$XRAYDIR"
|
cd "$XRAYDIR"
|
||||||
|
|
||||||
wget -q "https://github.com/XTLS/Xray-core/releases/download/${XRAY_VERSION}/Xray-linux-${ARCH}.zip"
|
wget -q "https://github.com/XTLS/Xray-core/releases/download/${XRAY_VERSION}/Xray-linux-${ARCH}.zip"
|
||||||
unzip "Xray-linux-${ARCH}.zip" -d ./xray-unzip
|
|
||||||
|
# Validate the downloaded zip file
|
||||||
|
if [ ! -f "Xray-linux-${ARCH}.zip" ] || [ ! -s "Xray-linux-${ARCH}.zip" ]; then
|
||||||
|
echo "[ERR] Failed to download Xray-core zip or file is empty"
|
||||||
|
cd "$OLD_DIR"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
unzip -q "Xray-linux-${ARCH}.zip" -d ./xray-unzip
|
||||||
|
|
||||||
|
# Validate the extracted xray binary
|
||||||
|
if [ ! -f "./xray-unzip/xray" ] || [ ! -s "./xray-unzip/xray" ]; then
|
||||||
|
echo "[ERR] Failed to extract xray binary"
|
||||||
|
rm -rf ./xray-unzip
|
||||||
|
rm -f "Xray-linux-${ARCH}.zip"
|
||||||
|
cd "$OLD_DIR"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
cp ./xray-unzip/xray ./"xray-linux-${FNAME}"
|
cp ./xray-unzip/xray ./"xray-linux-${FNAME}"
|
||||||
rm -r xray-unzip
|
rm -r xray-unzip
|
||||||
rm "Xray-linux-${ARCH}.zip"
|
rm "Xray-linux-${ARCH}.zip"
|
||||||
|
|
|
||||||
12
install.sh
12
install.sh
|
|
@ -44,12 +44,16 @@ install_base() {
|
||||||
ubuntu | debian | armbian)
|
ubuntu | debian | armbian)
|
||||||
apt-get update && apt-get install -y -q wget curl tar tzdata
|
apt-get update && apt-get install -y -q wget curl tar tzdata
|
||||||
;;
|
;;
|
||||||
centos | rhel | almalinux | rocky | ol)
|
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
||||||
yum -y update && yum install -y -q wget curl tar tzdata
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo)
|
|
||||||
dnf -y update && dnf install -y -q wget curl tar tzdata
|
dnf -y update && dnf install -y -q wget curl tar tzdata
|
||||||
;;
|
;;
|
||||||
|
centos)
|
||||||
|
if [[ "${VERSION_ID}" =~ ^7 ]]; then
|
||||||
|
yum -y update && yum install -y wget curl tar tzdata
|
||||||
|
else
|
||||||
|
dnf -y update && dnf install -y -q wget curl tar tzdata
|
||||||
|
fi
|
||||||
|
;;
|
||||||
arch | manjaro | parch)
|
arch | manjaro | parch)
|
||||||
pacman -Syu && pacman -Syu --noconfirm wget curl tar tzdata
|
pacman -Syu && pacman -Syu --noconfirm wget curl tar tzdata
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
12
update.sh
12
update.sh
|
|
@ -76,12 +76,16 @@ install_base() {
|
||||||
ubuntu | debian | armbian)
|
ubuntu | debian | armbian)
|
||||||
apt-get update >/dev/null 2>&1 && apt-get install -y -q wget curl tar tzdata >/dev/null 2>&1
|
apt-get update >/dev/null 2>&1 && apt-get install -y -q wget curl tar tzdata >/dev/null 2>&1
|
||||||
;;
|
;;
|
||||||
centos | rhel | almalinux | rocky | ol)
|
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
||||||
yum -y update >/dev/null 2>&1 && yum install -y -q wget curl tar tzdata >/dev/null 2>&1
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo)
|
|
||||||
dnf -y update >/dev/null 2>&1 && dnf install -y -q wget curl tar tzdata >/dev/null 2>&1
|
dnf -y update >/dev/null 2>&1 && dnf install -y -q wget curl tar tzdata >/dev/null 2>&1
|
||||||
;;
|
;;
|
||||||
|
centos)
|
||||||
|
if [[ "${VERSION_ID}" =~ ^7 ]]; then
|
||||||
|
yum -y update >/dev/null 2>&1 && yum install -y -q wget curl tar tzdata >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
dnf -y update >/dev/null 2>&1 && dnf install -y -q wget curl tar tzdata >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
arch | manjaro | parch)
|
arch | manjaro | parch)
|
||||||
pacman -Syu >/dev/null 2>&1 && pacman -Syu --noconfirm wget curl tar tzdata >/dev/null 2>&1
|
pacman -Syu >/dev/null 2>&1 && pacman -Syu --noconfirm wget curl tar tzdata >/dev/null 2>&1
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,7 @@ func (t *Tgbot) Start(i18nFS embed.FS) error {
|
||||||
// Parse admin IDs from comma-separated string
|
// Parse admin IDs from comma-separated string
|
||||||
if tgBotID != "" {
|
if tgBotID != "" {
|
||||||
for _, adminID := range strings.Split(tgBotID, ",") {
|
for _, adminID := range strings.Split(tgBotID, ",") {
|
||||||
id, err := strconv.Atoi(adminID)
|
id, err := strconv.ParseInt(adminID, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warning("Failed to parse admin ID from Telegram bot chat ID:", err)
|
logger.Warning("Failed to parse admin ID from Telegram bot chat ID:", err)
|
||||||
return err
|
return err
|
||||||
|
|
@ -905,8 +905,8 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
|
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.errorOperation"))
|
||||||
t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
|
t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
|
||||||
case "add_client_limit_traffic_c":
|
case "add_client_limit_traffic_c":
|
||||||
limitTraffic, _ := strconv.Atoi(dataArray[1])
|
limitTraffic, _ := strconv.ParseInt(dataArray[1], 10, 64)
|
||||||
client_TotalGB = int64(limitTraffic) * 1024 * 1024 * 1024
|
client_TotalGB = limitTraffic * 1024 * 1024 * 1024
|
||||||
messageId := callbackQuery.Message.GetMessageID()
|
messageId := callbackQuery.Message.GetMessageID()
|
||||||
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
|
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -1010,7 +1010,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||||
t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
|
t.editMessageCallbackTgBot(chatId, callbackQuery.Message.GetMessageID(), inlineKeyboard)
|
||||||
case "reset_exp_c":
|
case "reset_exp_c":
|
||||||
if len(dataArray) == 3 {
|
if len(dataArray) == 3 {
|
||||||
days, err := strconv.Atoi(dataArray[2])
|
days, err := strconv.ParseInt(dataArray[2], 10, 64)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
var date int64
|
var date int64
|
||||||
if days > 0 {
|
if days > 0 {
|
||||||
|
|
@ -1115,7 +1115,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||||
t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
|
t.searchClient(chatId, email, callbackQuery.Message.GetMessageID())
|
||||||
case "add_client_reset_exp_c":
|
case "add_client_reset_exp_c":
|
||||||
client_ExpiryTime = 0
|
client_ExpiryTime = 0
|
||||||
days, _ := strconv.Atoi(dataArray[1])
|
days, _ := strconv.ParseInt(dataArray[1], 10, 64)
|
||||||
var date int64
|
var date int64
|
||||||
if client_ExpiryTime > 0 {
|
if client_ExpiryTime > 0 {
|
||||||
if client_ExpiryTime-time.Now().Unix()*1000 < 0 {
|
if client_ExpiryTime-time.Now().Unix()*1000 < 0 {
|
||||||
|
|
@ -2952,10 +2952,12 @@ func (t *Tgbot) clientInfoMsg(
|
||||||
}
|
}
|
||||||
|
|
||||||
status := t.I18nBot("tgbot.offline")
|
status := t.I18nBot("tgbot.offline")
|
||||||
|
isOnline := false
|
||||||
if p.IsRunning() {
|
if p.IsRunning() {
|
||||||
for _, online := range p.GetOnlineClients() {
|
for _, online := range p.GetOnlineClients() {
|
||||||
if online == traffic.Email {
|
if online == traffic.Email {
|
||||||
status = t.I18nBot("tgbot.online")
|
status = t.I18nBot("tgbot.online")
|
||||||
|
isOnline = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2968,6 +2970,9 @@ func (t *Tgbot) clientInfoMsg(
|
||||||
}
|
}
|
||||||
if printOnline {
|
if printOnline {
|
||||||
output += t.I18nBot("tgbot.messages.online", "Status=="+status)
|
output += t.I18nBot("tgbot.messages.online", "Status=="+status)
|
||||||
|
if !isOnline && traffic.LastOnline > 0 {
|
||||||
|
output += t.I18nBot("tgbot.messages.lastOnline", "Time=="+time.UnixMilli(traffic.LastOnline).Format("2006-01-02 15:04:05"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if printActive {
|
if printActive {
|
||||||
output += t.I18nBot("tgbot.messages.active", "Enable=="+active)
|
output += t.I18nBot("tgbot.messages.active", "Enable=="+active)
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 مفعل: {{ .Enable }}\r\n"
|
"active" = "💡 مفعل: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 مفعل: {{ .Enable }}\r\n"
|
"enabled" = "🚨 مفعل: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 حالة الاتصال: {{ .Status }}\r\n"
|
"online" = "🌐 حالة الاتصال: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 آخر متصل: {{ .Time }}\r\n"
|
||||||
"email" = "📧 الإيميل: {{ .Email }}\r\n"
|
"email" = "📧 الإيميل: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 رفع: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 رفع: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 تنزيل: ↓{{ .Download }}\r\n"
|
"download" = "🔽 تنزيل: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Active: {{ .Enable }}\r\n"
|
"active" = "💡 Active: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Enabled: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Enabled: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Connection status: {{ .Status }}\r\n"
|
"online" = "🌐 Connection status: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Last online: {{ .Time }}\r\n"
|
||||||
"email" = "📧 Email: {{ .Email }}\r\n"
|
"email" = "📧 Email: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Upload: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Upload: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 Download: ↓{{ .Download }}\r\n"
|
"download" = "🔽 Download: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Activo: {{ .Enable }}\r\n"
|
"active" = "💡 Activo: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Habilitado: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Habilitado: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Estado de conexión: {{ .Status }}\r\n"
|
"online" = "🌐 Estado de conexión: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Última conexión: {{ .Time }}\r\n"
|
||||||
"email" = "📧 Email: {{ .Email }}\r\n"
|
"email" = "📧 Email: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Subida: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Subida: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 Bajada: ↓{{ .Download }}\r\n"
|
"download" = "🔽 Bajada: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 فعال: {{ .Enable }}\r\n"
|
"active" = "💡 فعال: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 وضعیت: {{ .Enable }}\r\n"
|
"enabled" = "🚨 وضعیت: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 وضعیت اتصال: {{ .Status }}\r\n"
|
"online" = "🌐 وضعیت اتصال: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 آخرین فعالیت: {{ .Time }}\r\n"
|
||||||
"email" = "📧 ایمیل: {{ .Email }}\r\n"
|
"email" = "📧 ایمیل: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 آپلود↑: {{ .Upload }}\r\n"
|
"upload" = "🔼 آپلود↑: {{ .Upload }}\r\n"
|
||||||
"download" = "🔽 دانلود↓: {{ .Download }}\r\n"
|
"download" = "🔽 دانلود↓: {{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Aktif: {{ .Enable }}\r\n"
|
"active" = "💡 Aktif: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Diaktifkan: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Diaktifkan: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Status Koneksi: {{ .Status }}\r\n"
|
"online" = "🌐 Status Koneksi: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Terakhir online: {{ .Time }}\r\n"
|
||||||
"email" = "📧 Email: {{ .Email }}\r\n"
|
"email" = "📧 Email: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Unggah: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Unggah: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 Unduh: ↓{{ .Download }}\r\n"
|
"download" = "🔽 Unduh: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 有効:{{ .Enable }}\r\n"
|
"active" = "💡 有効:{{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 有効化済み:{{ .Enable }}\r\n"
|
"enabled" = "🚨 有効化済み:{{ .Enable }}\r\n"
|
||||||
"online" = "🌐 接続ステータス:{{ .Status }}\r\n"
|
"online" = "🌐 接続ステータス:{{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 最終オンライン: {{ .Time }}\r\n"
|
||||||
"email" = "📧 メール:{{ .Email }}\r\n"
|
"email" = "📧 メール:{{ .Email }}\r\n"
|
||||||
"upload" = "🔼 アップロード↑:{{ .Upload }}\r\n"
|
"upload" = "🔼 アップロード↑:{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 ダウンロード↓:{{ .Download }}\r\n"
|
"download" = "🔽 ダウンロード↓:{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Ativo: {{ .Enable }}\r\n"
|
"active" = "💡 Ativo: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Ativado: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Ativado: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Status da conexão: {{ .Status }}\r\n"
|
"online" = "🌐 Status da conexão: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Última vez online: {{ .Time }}\r\n"
|
||||||
"email" = "📧 Email: {{ .Email }}\r\n"
|
"email" = "📧 Email: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Upload: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Upload: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 Download: ↓{{ .Download }}\r\n"
|
"download" = "🔽 Download: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Активен: {{ .Enable }}\r\n"
|
"active" = "💡 Активен: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Активен: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Активен: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Статус соединения: {{ .Status }}\r\n"
|
"online" = "🌐 Статус соединения: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Был(а) в сети: {{ .Time }}\r\n"
|
||||||
"email" = "📧 Email: {{ .Email }}\r\n"
|
"email" = "📧 Email: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Исходящий трафик: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Исходящий трафик: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 Входящий трафик: ↓{{ .Download }}\r\n"
|
"download" = "🔽 Входящий трафик: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Aktif: {{ .Enable }}\r\n"
|
"active" = "💡 Aktif: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Etkin: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Etkin: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Bağlantı durumu: {{ .Status }}\r\n"
|
"online" = "🌐 Bağlantı durumu: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Son çevrimiçi: {{ .Time }}\r\n"
|
||||||
"email" = "📧 E-posta: {{ .Email }}\r\n"
|
"email" = "📧 E-posta: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Yükleme: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Yükleme: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 İndirme: ↓{{ .Download }}\r\n"
|
"download" = "🔽 İndirme: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Активний: {{ .Enable }}\r\n"
|
"active" = "💡 Активний: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Увімкнено: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Увімкнено: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Стан підключення: {{ .Status }}\r\n"
|
"online" = "🌐 Стан підключення: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Був(ла) онлайн: {{ .Time }}\r\n"
|
||||||
"email" = "📧 Електронна пошта: {{ .Email }}\r\n"
|
"email" = "📧 Електронна пошта: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Upload: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Upload: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 Download: ↓{{ .Download }}\r\n"
|
"download" = "🔽 Download: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 Đang hoạt động: {{ .Enable }}\r\n"
|
"active" = "💡 Đang hoạt động: {{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 Đã bật: {{ .Enable }}\r\n"
|
"enabled" = "🚨 Đã bật: {{ .Enable }}\r\n"
|
||||||
"online" = "🌐 Trạng thái kết nối: {{ .Status }}\r\n"
|
"online" = "🌐 Trạng thái kết nối: {{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 Lần online gần nhất: {{ .Time }}\r\n"
|
||||||
"email" = "📧 Email: {{ .Email }}\r\n"
|
"email" = "📧 Email: {{ .Email }}\r\n"
|
||||||
"upload" = "🔼 Tải lên: ↑{{ .Upload }}\r\n"
|
"upload" = "🔼 Tải lên: ↑{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 Tải xuống: ↓{{ .Download }}\r\n"
|
"download" = "🔽 Tải xuống: ↓{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 激活:{{ .Enable }}\r\n"
|
"active" = "💡 激活:{{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 已启用:{{ .Enable }}\r\n"
|
"enabled" = "🚨 已启用:{{ .Enable }}\r\n"
|
||||||
"online" = "🌐 连接状态:{{ .Status }}\r\n"
|
"online" = "🌐 连接状态:{{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 上次在线: {{ .Time }}\r\n"
|
||||||
"email" = "📧 邮箱:{{ .Email }}\r\n"
|
"email" = "📧 邮箱:{{ .Email }}\r\n"
|
||||||
"upload" = "🔼 上传↑:{{ .Upload }}\r\n"
|
"upload" = "🔼 上传↑:{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 下载↓:{{ .Download }}\r\n"
|
"download" = "🔽 下载↓:{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
|
|
@ -663,6 +663,7 @@
|
||||||
"active" = "💡 啟用:{{ .Enable }}\r\n"
|
"active" = "💡 啟用:{{ .Enable }}\r\n"
|
||||||
"enabled" = "🚨 已啟用:{{ .Enable }}\r\n"
|
"enabled" = "🚨 已啟用:{{ .Enable }}\r\n"
|
||||||
"online" = "🌐 連線狀態:{{ .Status }}\r\n"
|
"online" = "🌐 連線狀態:{{ .Status }}\r\n"
|
||||||
|
"lastOnline" = "🔙 上次上線: {{ .Time }}\r\n"
|
||||||
"email" = "📧 郵箱:{{ .Email }}\r\n"
|
"email" = "📧 郵箱:{{ .Email }}\r\n"
|
||||||
"upload" = "🔼 上傳↑:{{ .Upload }}\r\n"
|
"upload" = "🔼 上傳↑:{{ .Upload }}\r\n"
|
||||||
"download" = "🔽 下載↓:{{ .Download }}\r\n"
|
"download" = "🔽 下載↓:{{ .Download }}\r\n"
|
||||||
|
|
|
||||||
50
x-ui.sh
50
x-ui.sh
|
|
@ -511,12 +511,16 @@ enable_bbr() {
|
||||||
ubuntu | debian | armbian)
|
ubuntu | debian | armbian)
|
||||||
apt-get update && apt-get install -yqq --no-install-recommends ca-certificates
|
apt-get update && apt-get install -yqq --no-install-recommends ca-certificates
|
||||||
;;
|
;;
|
||||||
centos | rhel | almalinux | rocky | ol)
|
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
||||||
yum -y update && yum -y install ca-certificates
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo)
|
|
||||||
dnf -y update && dnf -y install ca-certificates
|
dnf -y update && dnf -y install ca-certificates
|
||||||
;;
|
;;
|
||||||
|
centos)
|
||||||
|
if [[ "${VERSION_ID}" =~ ^7 ]]; then
|
||||||
|
yum -y update && yum -y install ca-certificates
|
||||||
|
else
|
||||||
|
dnf -y update && dnf -y install ca-certificates
|
||||||
|
fi
|
||||||
|
;;
|
||||||
arch | manjaro | parch)
|
arch | manjaro | parch)
|
||||||
pacman -Sy --noconfirm ca-certificates
|
pacman -Sy --noconfirm ca-certificates
|
||||||
;;
|
;;
|
||||||
|
|
@ -1054,12 +1058,15 @@ ssl_cert_issue() {
|
||||||
ubuntu | debian | armbian)
|
ubuntu | debian | armbian)
|
||||||
apt-get update && apt-get install socat -y
|
apt-get update && apt-get install socat -y
|
||||||
;;
|
;;
|
||||||
centos | rhel | almalinux | rocky | ol)
|
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
||||||
yum -y update && yum -y install socat
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo)
|
|
||||||
dnf -y update && dnf -y install socat
|
dnf -y update && dnf -y install socat
|
||||||
;;
|
;;
|
||||||
|
centos)
|
||||||
|
if [[ "${VERSION_ID}" =~ ^7 ]]; then
|
||||||
|
yum -y update && yum -y install socat
|
||||||
|
else
|
||||||
|
dnf -y update && dnf -y install socat
|
||||||
|
fi
|
||||||
arch | manjaro | parch)
|
arch | manjaro | parch)
|
||||||
pacman -Sy --noconfirm socat
|
pacman -Sy --noconfirm socat
|
||||||
;;
|
;;
|
||||||
|
|
@ -1067,7 +1074,7 @@ ssl_cert_issue() {
|
||||||
zypper refresh && zypper -q install -y socat
|
zypper refresh && zypper -q install -y socat
|
||||||
;;
|
;;
|
||||||
alpine)
|
alpine)
|
||||||
apk add socat
|
apk add socat curl openssl
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
|
echo -e "${red}Unsupported operating system. Please check the script and install the necessary packages manually.${plain}\n"
|
||||||
|
|
@ -1518,12 +1525,16 @@ install_iplimit() {
|
||||||
armbian)
|
armbian)
|
||||||
apt-get update && apt-get install fail2ban -y
|
apt-get update && apt-get install fail2ban -y
|
||||||
;;
|
;;
|
||||||
centos | rhel | almalinux | rocky | ol)
|
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
||||||
|
dnf -y update && dnf -y install fail2ban
|
||||||
|
;;
|
||||||
|
centos)
|
||||||
|
if [[ "${VERSION_ID}" =~ ^7 ]]; then
|
||||||
yum update -y && yum install epel-release -y
|
yum update -y && yum install epel-release -y
|
||||||
yum -y install fail2ban
|
yum -y install fail2ban
|
||||||
;;
|
else
|
||||||
fedora | amzn | virtuozzo)
|
|
||||||
dnf -y update && dnf -y install fail2ban
|
dnf -y update && dnf -y install fail2ban
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
arch | manjaro | parch)
|
arch | manjaro | parch)
|
||||||
pacman -Syu --noconfirm fail2ban
|
pacman -Syu --noconfirm fail2ban
|
||||||
|
|
@ -1618,14 +1629,19 @@ remove_iplimit() {
|
||||||
apt-get purge -y fail2ban -y
|
apt-get purge -y fail2ban -y
|
||||||
apt-get autoremove -y
|
apt-get autoremove -y
|
||||||
;;
|
;;
|
||||||
centos | rhel | almalinux | rocky | ol)
|
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
||||||
yum remove fail2ban -y
|
|
||||||
yum autoremove -y
|
|
||||||
;;
|
|
||||||
fedora | amzn | virtuozzo)
|
|
||||||
dnf remove fail2ban -y
|
dnf remove fail2ban -y
|
||||||
dnf autoremove -y
|
dnf autoremove -y
|
||||||
;;
|
;;
|
||||||
|
centos)
|
||||||
|
if [[ "${VERSION_ID}" =~ ^7 ]]; then
|
||||||
|
yum remove fail2ban -y
|
||||||
|
yum autoremove -y
|
||||||
|
else
|
||||||
|
dnf remove fail2ban -y
|
||||||
|
dnf autoremove -y
|
||||||
|
fi
|
||||||
|
;;
|
||||||
arch | manjaro | parch)
|
arch | manjaro | parch)
|
||||||
pacman -Rns --noconfirm fail2ban
|
pacman -Rns --noconfirm fail2ban
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue