diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 1f019498..b249622d 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -97,7 +97,7 @@ jobs:
cd x-ui/bin
# Download dependencies
- Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.5.16/"
+ Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.6.8/"
if [ "${{ matrix.platform }}" == "amd64" ]; then
wget -q ${Xray_URL}Xray-linux-64.zip
unzip Xray-linux-64.zip
diff --git a/DockerInit.sh b/DockerInit.sh
index b22c6059..ca1b4b3f 100755
--- a/DockerInit.sh
+++ b/DockerInit.sh
@@ -1,12 +1,21 @@
#!/bin/sh
# POSIX-compatible script to download Xray binary and GeoIP/GeoSite databases
+<<<<<<< HEAD
set -eu
XRAY_VERSION="v25.6.8"
BASE_URL="https://github.com/XTLS/Xray-core/releases/download/${XRAY_VERSION}"
DAT_DIR="build/bin"
ARCH="${1:-amd64}" # Default to amd64 if not provided
+=======
+# ------------------------------------------------------------------------------
+# DockerInit.sh � download and prepare Xray binaries and geolocation databases
+# ------------------------------------------------------------------------------
+
+# Xray version
+readonly XRAY_VERSION="v25.6.8"
+>>>>>>> f7a3ebf2f3c28d40c1ae126f73ac6a8c9e22c2c6
# Map architecture
case "$ARCH" in
@@ -51,5 +60,129 @@ download_variant() {
download_variant "IR" "https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download"
download_variant "RU" "https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download"
+<<<<<<< HEAD
echo "All files downloaded successfully."
cd ../../
+=======
+Supported architectures:
+ amd64 ? 64-bit x86
+ i386 ? 32-bit x86
+ armv8 ? ARM64-v8a (also accepts arm64, aarch64)
+ armv7 ? ARM32-v7a (also accepts arm, arm32)
+ armv6 ? ARM32-v6
+
+If no argument is provided or the argument is not recognized, 'amd64' will be used by default.
+
+Example:
+ $0 armv7
+EOF
+ exit 1
+}
+
+# Determine ARCH and FNAME based on input argument
+detect_arch() {
+ local input="$1"
+
+ case "$input" in
+ amd64)
+ ARCH="64"
+ FNAME="amd64"
+ ;;
+ i386)
+ ARCH="32"
+ FNAME="i386"
+ ;;
+ armv8 | arm64 | aarch64)
+ ARCH="arm64-v8a"
+ FNAME="arm64"
+ ;;
+ armv7 | arm | arm32)
+ ARCH="arm32-v7a"
+ FNAME="arm32"
+ ;;
+ armv6)
+ ARCH="arm32-v6"
+ FNAME="armv6"
+ ;;
+ "")
+ # If argument is empty, default to amd64
+ ARCH="64"
+ FNAME="amd64"
+ ;;
+ *)
+ echo "Warning: Architecture '$input' not recognized. Defaulting to 'amd64'." >&2
+ ARCH="64"
+ FNAME="amd64"
+ ;;
+ esac
+}
+
+# Generic function to download a file by URL (with error handling)
+download_file() {
+ local url="$1"
+ local output="$2"
+
+ echo "Downloading: $url"
+ if ! wget -q -O "$output" "$url"; then
+ echo "Error: Failed to download '$url'" >&2
+ exit 1
+ fi
+}
+
+# Main function: create directory, download and unpack Xray, then geolocation databases
+main() {
+ # Check dependencies
+ check_dependencies
+
+ # Get architecture from argument
+ local ARCH_ARG="${1-}"
+ detect_arch "$ARCH_ARG"
+
+ # Construct URL for Xray download
+ local xray_url
+ printf -v xray_url "$XRAY_URL_TEMPLATE" "$ARCH"
+
+ # Create build directory
+ echo "Creating directory: $BUILD_DIR"
+ mkdir -p "$BUILD_DIR"
+ cd "$BUILD_DIR" || exit 1
+
+ # Download and unpack Xray
+ local xray_zip="Xray-linux-${ARCH}.zip"
+ download_file "$xray_url" "$xray_zip"
+ echo "Unpacking $xray_zip"
+ unzip -q "$xray_zip"
+ rm -f "$xray_zip" geoip.dat geosite.dat
+
+ # Rename binary according to target architecture
+ mv xray "xray-linux-${FNAME}"
+ chmod +x "xray-linux-${FNAME}"
+
+ # Return to project root
+ cd "$ROOT_DIR" || exit 1
+
+ # Download standard GeoIP and GeoSite databases
+ echo "Downloading default GeoIP and GeoSite databases"
+ download_file "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat" "geoip.dat"
+ download_file "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat" "geosite.dat"
+
+ # Download alternative GeoIP/GeoSite for Iran (IR) and Russia (RU)
+ echo "Downloading alternative GeoIP/GeoSite for Iran"
+ download_file "https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geoip.dat" "geoip_IR.dat"
+ download_file "https://github.com/chocolate4u/Iran-v2ray-rules/releases/latest/download/geosite.dat" "geosite_IR.dat"
+
+ echo "Downloading alternative GeoIP/GeoSite for Russia"
+ download_file "https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geoip.dat" "geoip_RU.dat"
+ download_file "https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geosite.dat" "geosite_RU.dat"
+
+ echo "Done."
+}
+
+# If -h or --help is passed, show usage
+if [[ "${1-}" == "-h" || "${1-}" == "--help" ]]; then
+ usage
+fi
+
+# Run main with the provided argument (if any)
+main "${1-}"
+>>>>>>> f7a3ebf2f3c28d40c1ae126f73ac6a8c9e22c2c6
diff --git a/README.ar_EG.md b/README.ar_EG.md
index 99354e55..d2f6dcc3 100644
--- a/README.ar_EG.md
+++ b/README.ar_EG.md
@@ -23,7 +23,7 @@
## البدء السريع
```
-$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
للحصول على الوثائق الكاملة، يرجى زيارة [ويكي المشروع](https://github.com/MHSanaei/3x-ui/wiki).
@@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
## النجوم عبر الزمن
-[](https://starchart.cc/MHSanaei/3x-ui)
\ No newline at end of file
+[](https://starchart.cc/MHSanaei/3x-ui)
diff --git a/README.es_ES.md b/README.es_ES.md
index 915cc4c4..52625664 100644
--- a/README.es_ES.md
+++ b/README.es_ES.md
@@ -23,7 +23,7 @@ Como una versión mejorada del proyecto X-UI original, 3X-UI proporciona mayor e
## Inicio Rápido
```
-$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
Para documentación completa, visita la [Wiki del proyecto](https://github.com/MHSanaei/3x-ui/wiki).
@@ -53,4 +53,4 @@ Para documentación completa, visita la [Wiki del proyecto](https://github.com/M
## Estrellas a lo Largo del Tiempo
-[](https://starchart.cc/MHSanaei/3x-ui)
\ No newline at end of file
+[](https://starchart.cc/MHSanaei/3x-ui)
diff --git a/README.fa_IR.md b/README.fa_IR.md
index e194b663..2b2dc5ec 100644
--- a/README.fa_IR.md
+++ b/README.fa_IR.md
@@ -23,7 +23,7 @@
## شروع سریع
```
-$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
برای مستندات کامل، لطفاً به [ویکی پروژه](https://github.com/MHSanaei/3x-ui/wiki) مراجعه کنید.
@@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
## ستارهها در طول زمان
-[](https://starchart.cc/MHSanaei/3x-ui)
\ No newline at end of file
+[](https://starchart.cc/MHSanaei/3x-ui)
diff --git a/README.md b/README.md
index a63a0fb3..7cda8370 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,7 @@ As an enhanced fork of the original X-UI project, 3X-UI provides improved stabil
## Quick Start
```bash
-$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
For full documentation, please visit the [project Wiki](https://github.com/MHSanaei/3x-ui/wiki).
@@ -53,4 +53,4 @@ For full documentation, please visit the [project Wiki](https://github.com/MHSan
## Stargazers over Time
-[](https://starchart.cc/MHSanaei/3x-ui)
\ No newline at end of file
+[](https://starchart.cc/MHSanaei/3x-ui)
diff --git a/README.ru_RU.md b/README.ru_RU.md
index 1bb8d611..d971f403 100644
--- a/README.ru_RU.md
+++ b/README.ru_RU.md
@@ -23,7 +23,7 @@
## Быстрый старт
```
-$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
Полную документацию смотрите в [вики проекта](https://github.com/MHSanaei/3x-ui/wiki).
@@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
## Звезды с течением времени
-[](https://starchart.cc/MHSanaei/3x-ui)
\ No newline at end of file
+[](https://starchart.cc/MHSanaei/3x-ui)
diff --git a/README.zh_CN.md b/README.zh_CN.md
index 133ffe0c..75e75603 100644
--- a/README.zh_CN.md
+++ b/README.zh_CN.md
@@ -23,7 +23,7 @@
## 快速开始
```
-$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
完整文档请参阅 [项目Wiki](https://github.com/MHSanaei/3x-ui/wiki)。
@@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
## 随时间变化的星标数
-[](https://starchart.cc/MHSanaei/3x-ui)
\ No newline at end of file
+[](https://starchart.cc/MHSanaei/3x-ui)
diff --git a/docker-compose.yml b/docker-compose.yml
index e27a735e..198df198 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,8 +1,10 @@
services:
- 3x-ui:
- image: ghcr.io/mhsanaei/3x-ui:latest
- container_name: 3x-ui
- hostname: yourhostname
+ 3xui:
+ build:
+ context: .
+ dockerfile: ./Dockerfile
+ container_name: 3xui_app
+ # hostname: yourhostname <- optional
volumes:
- $PWD/db/:/etc/x-ui/
- $PWD/cert/:/root/cert/
diff --git a/install.sh b/install.sh
index 0398285d..8fb23f3b 100644
--- a/install.sh
+++ b/install.sh
@@ -57,7 +57,7 @@ install_base() {
ubuntu | debian | armbian)
apt-get update && apt-get install -y -q wget curl tar tzdata
;;
- centos | almalinux | rocky | ol)
+ centos | rhel | almalinux | rocky | ol)
yum -y update && yum install -y -q wget curl tar tzdata
;;
fedora | amzn | virtuozzo)
diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js
index 2a5fb6d6..5228001c 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -2150,7 +2150,7 @@ Inbound.TrojanSettings.Fallback = class extends XrayCommonClass {
Inbound.ShadowsocksSettings = class extends Inbound.Settings {
constructor(protocol,
method = SSMethods.BLAKE3_AES_256_GCM,
- password = RandomUtil.randomShadowsocksPassword(),
+ password = '',
network = 'tcp,udp',
shadowsockses = [new Inbound.ShadowsocksSettings.Shadowsocks()],
ivCheck = false,
@@ -2188,7 +2188,7 @@ Inbound.ShadowsocksSettings = class extends Inbound.Settings {
Inbound.ShadowsocksSettings.Shadowsocks = class extends XrayCommonClass {
constructor(
method = '',
- password = RandomUtil.randomShadowsocksPassword(),
+ password = '',
email = RandomUtil.randomLowerAndNum(8),
limitIp = 0,
totalGB = 0,
diff --git a/web/assets/js/util/index.js b/web/assets/js/util/index.js
index 0d869af6..4bf760d7 100644
--- a/web/assets/js/util/index.js
+++ b/web/assets/js/util/index.js
@@ -138,8 +138,14 @@ class RandomUtil {
}
}
- static randomShadowsocksPassword() {
- const array = new Uint8Array(32);
+ static randomShadowsocksPassword(method = SSMethods.BLAKE3_AES_256_GCM) {
+ let length = 32;
+
+ if ([SSMethods.BLAKE3_AES_128_GCM].includes(method)) {
+ length = 16;
+ }
+
+ const array = new Uint8Array(length);
window.crypto.getRandomValues(array);
@@ -789,6 +795,25 @@ class LanguageManager {
if (window.navigator) {
lang = window.navigator.language || window.navigator.userLanguage;
+ const simularLangs = [
+ ["ar", this.supportedLanguages[0].value],
+ ["fa", this.supportedLanguages[2].value],
+ ["ja", this.supportedLanguages[5].value],
+ ["ru", this.supportedLanguages[6].value],
+ ["vi", this.supportedLanguages[7].value],
+ ["es", this.supportedLanguages[8].value],
+ ["id", this.supportedLanguages[9].value],
+ ["uk", this.supportedLanguages[10].value],
+ ["tr", this.supportedLanguages[11].value],
+ ["pt", this.supportedLanguages[12].value],
+ ]
+
+ simularLangs.forEach((pair) => {
+ if (lang === pair[0]) {
+ lang = pair[1];
+ }
+ });
+
if (LanguageManager.isSupportLanguage(lang)) {
CookieManager.setCookie("lang", lang, 150);
} else {
diff --git a/web/entity/entity.go b/web/entity/entity.go
index 543b80e0..889c9024 100644
--- a/web/entity/entity.go
+++ b/web/entity/entity.go
@@ -5,6 +5,7 @@ import (
"net"
"strings"
"time"
+ "math"
"x-ui/util/common"
)
@@ -78,11 +79,11 @@ func (s *AllSetting) CheckValid() error {
}
}
- if s.WebPort <= 0 || s.WebPort > 65535 {
+ if s.WebPort <= 0 || s.WebPort > math.MaxUint16 {
return common.NewError("web port is not a valid port:", s.WebPort)
}
- if s.SubPort <= 0 || s.SubPort > 65535 {
+ if s.SubPort <= 0 || s.SubPort > math.MaxUint16 {
return common.NewError("Sub port is not a valid port:", s.SubPort)
}
diff --git a/web/html/common/head.html b/web/html/common/head.html
deleted file mode 100644
index 35901769..00000000
--- a/web/html/common/head.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{{define "head"}}
-
-
-
-
-
-
-
-
- {{ .host }} – {{ i18n .title}}
-
-
-{{end}}
\ No newline at end of file
diff --git a/web/html/common/js.html b/web/html/common/js.html
deleted file mode 100644
index 1c2d64b3..00000000
--- a/web/html/common/js.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{{define "js"}}
-
-
-
-
-
-
-
-
-
-{{end}}
\ No newline at end of file
diff --git a/web/html/common/page.html b/web/html/common/page.html
new file mode 100644
index 00000000..f1c58fe1
--- /dev/null
+++ b/web/html/common/page.html
@@ -0,0 +1,58 @@
+{{ define "page/head_start" }}
+
+
+
+
+
+
+
+
+
+
+ {{ .host }} – {{ i18n .title}}
+{{ end }}
+
+{{ define "page/head_end" }}
+
+{{ end }}
+
+{{ define "page/body_start" }}
+
+
+{{ end }}
+
+{{ define "page/body_scripts" }}
+
+
+
+
+
+
+
+
+
+{{ end }}
+
+{{ define "page/body_end" }}
+
+
+{{ end }}
\ No newline at end of file
diff --git a/web/html/component/aClientTable.html b/web/html/component/aClientTable.html
index 868112d9..96bd502f 100644
--- a/web/html/component/aClientTable.html
+++ b/web/html/component/aClientTable.html
@@ -41,14 +41,28 @@
-
-
- {{ i18n "depleted" }}
- {{ i18n "disabled" }}
- {{ i18n "online" }}
-
-
- [[ client.email ]]
+
+
+
+ {{ i18n "depleted" }}
+ {{ i18n "disabled" }}
+ {{ i18n "online" }}
+
+
+
+
+ [[ client.email ]]
+
+
+
+ [[ client.comment ]]
+
+
+
+
+
+
+
diff --git a/web/html/form/client.html b/web/html/form/client.html
index c67f1470..846bbd13 100644
--- a/web/html/form/client.html
+++ b/web/html/form/client.html
@@ -22,7 +22,7 @@
{{ i18n "reset" }}
{{ i18n "password" }}
-
+
diff --git a/web/html/form/protocol/shadowsocks.html b/web/html/form/protocol/shadowsocks.html
index b9813afb..06e12075 100644
--- a/web/html/form/protocol/shadowsocks.html
+++ b/web/html/form/protocol/shadowsocks.html
@@ -31,7 +31,7 @@
{{ i18n "reset" }}
- Password
+ Password
diff --git a/web/html/inbounds.html b/web/html/inbounds.html
index 29e6b00f..e1267190 100644
--- a/web/html/inbounds.html
+++ b/web/html/inbounds.html
@@ -1,6 +1,4 @@
-
-
-{{template "head" .}}
+{{ template "page/head_start" .}}
+{{ template "page/head_end" .}}
-
+{{ template "page/body_start" .}}
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
[[ total.clients ]]
-
-
- [[ clientEmail ]]
-
- [[ total.deactive.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ total.depleted.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ total.expiring.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ onlineClients.length ]]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.inbounds.addInbound" }}
-
-
-
- {{ i18n "pages.inbounds.generalActions" }}
-
- generalActions(a)" :theme="themeSwitcher.currentTheme">
-
-
- {{ i18n "pages.inbounds.importInbound" }}
-
-
-
- {{ i18n "pages.inbounds.export" }}
-
-
-
- {{ i18n "pages.inbounds.export" }} - {{ i18n "pages.settings.subSettings" }}
-
-
-
- {{ i18n "pages.inbounds.resetAllTraffic" }}
-
-
-
- {{ i18n "pages.inbounds.resetAllClientTraffics" }}
-
-
-
- {{ i18n "pages.inbounds.delDepletedClients" }}
-
-
-
-
-
-
-
-
-
-
-
-
-
{{ i18n "pages.inbounds.autoRefresh" }}
-
-
-
-
- {{ i18n "pages.inbounds.autoRefreshInterval" }}
-
- [[ key ]]s
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "none" }}
- {{ i18n "disabled" }}
- {{ i18n "depleted" }}
- {{ i18n "depletingSoon" }}
- {{ i18n "online" }}
-
-
-
-
-
- e.preventDefault()" type="more" :style="{ fontSize: '20px', textDecoration: 'solid' }">
- clickAction(a, dbInbound)" :theme="themeSwitcher.currentTheme">
-
-
- {{ i18n "edit" }}
-
-
-
- {{ i18n "qrCode" }}
-
-
-
-
- {{ i18n "pages.client.add"}}
-
-
-
- {{ i18n "pages.client.bulk"}}
-
-
-
- {{ i18n "pages.inbounds.resetInboundClientTraffics"}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
[[ total.clients ]]
+
+
+ [[ clientEmail ]]
+
+ [[ total.deactive.length ]]
+
+
+
+ [[ clientEmail ]]
+
+ [[ total.depleted.length ]]
+
+
+
+ [[ clientEmail ]]
+
+ [[ total.expiring.length ]]
+
+
+
+ [[ clientEmail ]]
+
+ [[ onlineClients.length ]]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.inbounds.addInbound" }}
+
+
+
+ {{ i18n "pages.inbounds.generalActions" }}
+
+ generalActions(a)" :theme="themeSwitcher.currentTheme">
+
+
+ {{ i18n "pages.inbounds.importInbound" }}
- {{ i18n "pages.inbounds.export"}}
+ {{ i18n "pages.inbounds.export" }}
- {{ i18n "pages.inbounds.export"}} - {{ i18n "pages.settings.subSettings" }}
+ {{ i18n "pages.inbounds.export" }} - {{ i18n "pages.settings.subSettings" }}
+
+
+
+ {{ i18n "pages.inbounds.resetAllTraffic" }}
+
+
+
+ {{ i18n "pages.inbounds.resetAllClientTraffics" }}
{{ i18n "pages.inbounds.delDepletedClients" }}
-
-
-
-
- {{ i18n "info"}}
-
-
-
-
- {{ i18n "pages.inbounds.exportInbound" }}
-
-
- {{ i18n "pages.inbounds.resetTraffic" }}
-
-
- {{ i18n "pages.inbounds.clone"}}
-
-
-
- {{ i18n "delete"}}
-
-
-
-
- {{ i18n "pages.inbounds.enable" }}
-
-
-
+
+
+
-
- [[ dbInbound.protocol ]]
-
- [[ dbInbound.toInbound().stream.network ]]
- TLS
- Reality
-
+
+
+
+
+
+
+
+
{{ i18n "pages.inbounds.autoRefresh" }}
+
+
+
+
+ {{ i18n "pages.inbounds.autoRefreshInterval" }}
+
+ [[ key ]]s
+
+
+
+
+
+
-
-
- [[ clientCount[dbInbound.id].clients ]]
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].deactive.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].depleted.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].expiring.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].online.length ]]
-
-
-
-
-
-
-
-
- ↑[[ SizeFormatter.sizeFormat(dbInbound.up) ]] |
- ↓[[ SizeFormatter.sizeFormat(dbInbound.down) ]] |
-
-
- {{ i18n "remained" }} |
- [[ SizeFormatter.sizeFormat(dbInbound.total - dbInbound.up - dbInbound.down) ]] |
-
-
+
+
+
+
+
+
+
+
+ {{ i18n "none" }}
+ {{ i18n "disabled" }}
+ {{ i18n "depleted" }}
+ {{ i18n "depletingSoon" }}
+ {{ i18n "online" }}
+
+
+
+
+
+ e.preventDefault()" type="more" :style="{ fontSize: '20px', textDecoration: 'solid' }">
+ clickAction(a, dbInbound)" :theme="themeSwitcher.currentTheme">
+
+
+ {{ i18n "edit" }}
+
+
+
+ {{ i18n "qrCode" }}
+
+
+
+
+ {{ i18n "pages.client.add"}}
+
+
+
+ {{ i18n "pages.client.bulk"}}
+
+
+
+ {{ i18n "pages.inbounds.resetInboundClientTraffics"}}
+
+
+
+ {{ i18n "pages.inbounds.export"}}
+
+
+
+ {{ i18n "pages.inbounds.export"}} - {{ i18n "pages.settings.subSettings" }}
+
+
+
+ {{ i18n "pages.inbounds.delDepletedClients" }}
+
+
+
+
+
+ {{ i18n "info"}}
+
+
+
+
+ {{ i18n "pages.inbounds.exportInbound" }}
+
+
+ {{ i18n "pages.inbounds.resetTraffic" }}
+
+
+ {{ i18n "pages.inbounds.clone"}}
+
+
+
+ {{ i18n "delete"}}
+
+
+
+
+ {{ i18n "pages.inbounds.enable" }}
+
+
+
-
- [[ SizeFormatter.sizeFormat(dbInbound.up + dbInbound.down) ]] /
-
- [[ SizeFormatter.sizeFormat(dbInbound.total) ]]
+
+ [[ dbInbound.protocol ]]
+
+ [[ dbInbound.toInbound().stream.network ]]
+ TLS
+ Reality
-
+
+
+
+ [[ clientCount[dbInbound.id].clients ]]
+
+
+
+
+ [[ clientCount[dbInbound.id].deactive.length ]]
+
+
+
+
+
+ [[ clientCount[dbInbound.id].depleted.length ]]
+
+
+
+
+
+ [[ clientCount[dbInbound.id].expiring.length ]]
+
+
+
+
+
+ [[ clientCount[dbInbound.id].online.length ]]
+
+
+
+
+
+
+
+
+ ↑[[ SizeFormatter.sizeFormat(dbInbound.up) ]] |
+ ↓[[ SizeFormatter.sizeFormat(dbInbound.down) ]] |
+
+
+ {{ i18n "remained" }} |
+ [[ SizeFormatter.sizeFormat(dbInbound.total - dbInbound.up - dbInbound.down) ]] |
+
+
+
+
+ [[ SizeFormatter.sizeFormat(dbInbound.up + dbInbound.down) ]] /
+
+ [[ SizeFormatter.sizeFormat(dbInbound.total) ]]
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [[ DateUtil.formatMillis(dbInbound.expiryTime) ]]
+
+
+ [[ DateUtil.convertToJalalian(moment(dbInbound.expiryTime)) ]]
+
+
+ [[ remainedDays(dbInbound._expiryTime) ]]
+
+
+
-
-
-
-
-
-
-
-
-
-
- [[ DateUtil.formatMillis(dbInbound.expiryTime) ]]
+
-
- [[ DateUtil.convertToJalalian(moment(dbInbound.expiryTime)) ]]
-
-
- [[ remainedDays(dbInbound._expiryTime) ]]
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.inbounds.protocol" }} |
-
- [[ dbInbound.protocol ]]
-
- [[ dbInbound.toInbound().stream.network ]]
- tls
- reality
-
- |
-
-
- {{ i18n "pages.inbounds.port" }} |
- [[ dbInbound.port ]] |
-
-
- {{ i18n "clients" }} |
-
- [[ clientCount[dbInbound.id].clients ]]
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].deactive.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].depleted.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].expiring.length ]]
-
-
-
- [[ clientEmail ]]
-
- [[ clientCount[dbInbound.id].online.length ]]
-
- |
-
-
- {{ i18n "pages.inbounds.traffic" }} |
-
-
-
-
-
- ↑[[ SizeFormatter.sizeFormat(dbInbound.up) ]] |
- ↓[[ SizeFormatter.sizeFormat(dbInbound.down) ]] |
-
-
- {{ i18n "remained" }} |
- [[ SizeFormatter.sizeFormat(dbInbound.total - dbInbound.up - dbInbound.down) ]] |
-
-
-
-
- [[ SizeFormatter.sizeFormat(dbInbound.up + dbInbound.down) ]] /
-
- [[ SizeFormatter.sizeFormat(dbInbound.total) ]]
+
+
+
+
+
+ {{ i18n "pages.inbounds.protocol" }} |
+
+ [[ dbInbound.protocol ]]
+
+ [[ dbInbound.toInbound().stream.network ]]
+ tls
+ reality
+
+ |
+
+
+ {{ i18n "pages.inbounds.port" }} |
+ [[ dbInbound.port ]] |
+
+
+ {{ i18n "clients" }} |
+
+ [[ clientCount[dbInbound.id].clients ]]
+
+
+
-
+ [[ clientCount[dbInbound.id].deactive.length ]]
+
+
+
+
+
+ [[ clientCount[dbInbound.id].depleted.length ]]
+
+
+
+
+
+ [[ clientCount[dbInbound.id].expiring.length ]]
+
+
+
+
+
+ [[ clientCount[dbInbound.id].online.length ]]
+
+ |
+
+
+ {{ i18n "pages.inbounds.traffic" }} |
+
+
+
+
+
+ ↑[[ SizeFormatter.sizeFormat(dbInbound.up) ]] |
+ ↓[[ SizeFormatter.sizeFormat(dbInbound.down) ]] |
+
+
+ {{ i18n "remained" }} |
+ [[ SizeFormatter.sizeFormat(dbInbound.total - dbInbound.up - dbInbound.down) ]] |
+
+
+
+
+ [[ SizeFormatter.sizeFormat(dbInbound.up + dbInbound.down) ]] /
+
+ [[ SizeFormatter.sizeFormat(dbInbound.total) ]]
+
+
+
+
+
+
+ |
+
+
+ {{ i18n "pages.inbounds.expireDate" }} |
+
+
+
+ [[ DateUtil.formatMillis(dbInbound.expiryTime) ]]
+
+
+ [[ DateUtil.convertToJalalian(moment(dbInbound.expiryTime)) ]]
+
+
+
-
-
-
- |
-
-
- {{ i18n "pages.inbounds.expireDate" }} |
-
-
-
- [[ DateUtil.formatMillis(dbInbound.expiryTime) ]]
-
-
- [[ DateUtil.convertToJalalian(moment(dbInbound.expiryTime)) ]]
-
-
-
-
-
- |
-
-
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{template "component/aClientTable"}}
+
-
-
-
-
-
-
-
-
-
-
- {{template "component/aClientTable"}}
-
-
-
-
+
+
+
+
-{{template "js" .}}
+{{template "page/body_scripts" .}}
@@ -589,6 +674,13 @@
{{template "component/aThemeSwitch" .}}
{{template "component/aCustomStatistic" .}}
{{template "component/aPersianDatepicker" .}}
+{{template "modals/inboundModal"}}
+{{template "modals/promptModal"}}
+{{template "modals/qrcodeModal"}}
+{{template "modals/textModal"}}
+{{template "modals/inboundInfoModal"}}
+{{template "modals/clientsModal"}}
+{{template "modals/clientsBulkModal"}}
-
-{{template "modals/inboundModal"}}
-{{template "modals/promptModal"}}
-{{template "modals/qrcodeModal"}}
-{{template "modals/textModal"}}
-{{template "modals/inboundInfoModal"}}
-{{template "modals/clientsModal"}}
-{{template "modals/clientsBulkModal"}}
-
-
+{{ template "page/body_end" .}}
\ No newline at end of file
diff --git a/web/html/index.html b/web/html/index.html
index 2a6fb0ad..db678cd6 100644
--- a/web/html/index.html
+++ b/web/html/index.html
@@ -1,20 +1,9 @@
-
-
-{{template "head" .}}
+{{ template "page/head_start" .}}
+{{ template "page/head_end" .}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+{{ template "page/body_start" .}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ i18n "pages.index.cpu" }}: [[ CPUFormatter.cpuCoreFormat(status.cpuCores) ]]
+
+
+
+ {{ i18n "pages.index.logicalProcessors" }}: [[ (status.logicalPro) ]]
+ {{ i18n "pages.index.frequency" }}: [[ CPUFormatter.cpuSpeedFormat(status.cpuSpeedMhz) ]]
+
+
+
+
+
+
+
+ {{ i18n "pages.index.memory"}}: [[ SizeFormatter.sizeFormat(status.mem.current) ]] / [[ SizeFormatter.sizeFormat(status.mem.total) ]]
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.index.swap" }}: [[ SizeFormatter.sizeFormat(status.swap.current) ]] / [[ SizeFormatter.sizeFormat(status.swap.total) ]]
+
+
+
+
+
+ {{ i18n "pages.index.storage"}}: [[ SizeFormatter.sizeFormat(status.disk.current) ]] / [[ SizeFormatter.sizeFormat(status.disk.total) ]]
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
{{ i18n "pages.index.cpu" }}: [[ CPUFormatter.cpuCoreFormat(status.cpuCores) ]]
-
-
-
- {{ i18n "pages.index.logicalProcessors" }}: [[ (status.logicalPro) ]]
- {{ i18n "pages.index.frequency" }}: [[ CPUFormatter.cpuSpeedFormat(status.cpuSpeedMhz) ]]
-
-
-
-
-
-
-
- {{ i18n "pages.index.memory"}}: [[ SizeFormatter.sizeFormat(status.mem.current) ]] / [[ SizeFormatter.sizeFormat(status.mem.total) ]]
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.index.swap" }}: [[ SizeFormatter.sizeFormat(status.swap.current) ]] / [[ SizeFormatter.sizeFormat(status.swap.total) ]]
-
-
-
-
-
- {{ i18n "pages.index.storage"}}: [[ SizeFormatter.sizeFormat(status.disk.current) ]] / [[ SizeFormatter.sizeFormat(status.disk.total) ]]
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.index.xrayStatus" }}
-
- v[[ status.xray.version ]]
-
-
+
+
+
+
+
+ {{ i18n "pages.index.xrayStatus" }}
+
+ v[[ status.xray.version ]]
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.index.xrayErrorPopoverTitle" }}
-
-
-
-
-
-
-
- [[ line ]]
-
-
-
-
-
-
-
-
- {{ i18n "pages.index.stopXray" }}
-
-
-
- {{ i18n "pages.index.restartXray" }}
-
-
-
-
- [[ status.xray.version != 'Unknown' ? `v${status.xray.version}` : '{{ i18n "pages.index.xraySwitch" }}' ]]
+
+
+
+
+
+ {{ i18n "pages.index.xrayErrorPopoverTitle" }}
+
+
+
+
+
-
+
+ [[ line ]]
+
+
+
-
-
-
-
-
-
-
- {{ i18n "pages.index.logs" }}
-
-
-
- {{ i18n "pages.index.config" }}
-
-
-
- {{ i18n "pages.index.backup" }}
-
-
-
-
-
-
-
-
- v{{ .cur_ver }}
-
-
-
-
- @XrayUI
-
-
-
-
- {{ i18n "pages.index.documentation" }}
-
-
-
-
-
-
- Xray: [[ TimeFormatter.formatSecond(status.appStats.uptime) ]]
- OS: [[ TimeFormatter.formatSecond(status.uptime) ]]
-
-
-
-
+
+
+
+
+ {{ i18n "pages.index.stopXray" }}
+
+
+
+ {{ i18n "pages.index.restartXray" }}
+
+
+
+
+ [[ status.xray.version != 'Unknown' ? `v${status.xray.version}` : '{{ i18n "pages.index.xraySwitch" }}' ]]
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.index.logs" }}
+
+
+
+ {{ i18n "pages.index.config" }}
+
+
+
+ {{ i18n "pages.index.backup" }}
+
+
+
+
+
+
+
-
- [[ status.loads[0] ]] | [[ status.loads[1] ]] | [[ status.loads[2] ]]
-
- {{ i18n "pages.index.systemLoadDesc" }}
-
-
+ v{{ .cur_ver }}
-
-
-
-
- {{ i18n "pages.index.memory" }}: [[ SizeFormatter.sizeFormat(status.appStats.mem) ]]
- {{ i18n "pages.index.threads" }}: [[ status.appStats.threads ]]
-
-
-
-
-
-
-
-
-
-
-
- /s
-
-
-
-
-
-
-
-
-
- /s
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.index.toggleIpVisibility" }}
+
+
+
+ @XrayUI
+
+
+
+
+ {{ i18n "pages.index.documentation" }}
+
+
+
+
+
+
+ Xray: [[ TimeFormatter.formatSecond(status.appStats.uptime) ]]
+ OS: [[ TimeFormatter.formatSecond(status.uptime) ]]
+
+
+
+
+
+
+ [[ status.loads[0] ]] | [[ status.loads[1] ]] | [[ status.loads[2] ]]
+
+ {{ i18n "pages.index.systemLoadDesc" }}
+
+
+
+
+
+
+
+ {{ i18n "pages.index.memory" }}: [[ SizeFormatter.sizeFormat(status.appStats.mem) ]]
+ {{ i18n "pages.index.threads" }}: [[ status.appStats.threads ]]
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- versionModal.visible = false" :class="themeSwitcher.currentTheme" footer="">
-
-
-
-
-
- [[ version ]]
-
-
-
-
-
-
-
- [[ file ]]
-
-
-
-
-
-
- logModal.visible = false"
- :class="themeSwitcher.currentTheme"
- width="800px" footer="">
-
- {{ i18n "pages.index.logs" }}
-
-
-
-
-
-
-
- 10
- 20
- 50
- 100
- 500
-
-
- Debug
- Info
- Notice
- Warning
- Error
-
-
-
-
- SysLog
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.index.exportDatabase" }}
- {{ i18n "pages.index.exportDatabaseDesc" }}
-
-
-
-
-
- {{ i18n "pages.index.importDatabase" }}
- {{ i18n "pages.index.importDatabaseDesc" }}
-
-
-
-
-
+
+ /s
+
+
+
+
+
+
+
+
+
+ /s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.index.toggleIpVisibility" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-{{template "js" .}}
+ versionModal.visible = false" :class="themeSwitcher.currentTheme" footer="">
+
+
+
+
+
+ [[ version ]]
+
+
+
+
+
+
+
+ [[ file ]]
+
+
+
+
+
+
+ logModal.visible = false"
+ :class="themeSwitcher.currentTheme"
+ width="800px" footer="">
+
+ {{ i18n "pages.index.logs" }}
+
+
+
+
+
+
+
+ 10
+ 20
+ 50
+ 100
+ 500
+
+
+ Debug
+ Info
+ Notice
+ Warning
+ Error
+
+
+
+
+ SysLog
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.index.exportDatabase" }}
+ {{ i18n "pages.index.exportDatabaseDesc" }}
+
+
+
+
+
+ {{ i18n "pages.index.importDatabase" }}
+ {{ i18n "pages.index.importDatabaseDesc" }}
+
+
+
+
+
+
+{{template "page/body_scripts" .}}
{{template "component/aSidebar" .}}
{{template "component/aThemeSwitch" .}}
{{template "component/aCustomStatistic" .}}
@@ -489,7 +479,7 @@
}
class Status {
- constructor(data, isLoaded = false) {
+ constructor(data) {
this.cpu = new CurTotal(0, 0);
this.cpuCores = 0;
this.logicalPro = 0;
@@ -513,7 +503,6 @@
return;
}
- this.isLoaded = isLoaded;
this.cpu = new CurTotal(data.cpu, 100);
this.cpuCores = data.cpuCores;
this.logicalPro = data.logicalPro;
@@ -633,32 +622,39 @@
mixins: [MediaQueryMixin],
data: {
themeSwitcher,
+ loadingStates: {
+ fetched: false,
+ spinning: false
+ },
status: new Status(),
versionModal,
logModal,
backupModal,
- spinning: false,
loadingTip: '{{ i18n "loading"}}',
showAlert: false,
showIp: false
},
methods: {
loading(spinning, tip = '{{ i18n "loading"}}') {
- this.spinning = spinning;
+ this.loadingStates.spinning = spinning;
this.loadingTip = tip;
},
async getStatus() {
try {
const msg = await HttpUtil.post('/server/status');
if (msg.success) {
+ if (!this.loadingStates.fetched) {
+ this.loadingStates.fetched = true;
+ }
+
this.setStatus(msg.obj, true);
}
} catch (e) {
console.error("Failed to get status:", e);
}
},
- setStatus(data, isLoaded = false) {
- this.status = new Status(data, isLoaded);
+ setStatus(data) {
+ this.status = new Status(data);
},
async openSelectV2rayVersion() {
this.loading(true);
@@ -788,5 +784,4 @@
},
});
-
-
+{{ template "page/body_end" .}}
\ No newline at end of file
diff --git a/web/html/login.html b/web/html/login.html
index 515ea2b3..be6b9585 100644
--- a/web/html/login.html
+++ b/web/html/login.html
@@ -1,6 +1,4 @@
-
-
-{{template "head" .}}
+{{ template "page/head_start" .}}
+{{ template "page/head_end" .}}
-
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.settings.language" }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.login.hello" }}
- {{ i18n "pages.login.title" }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [[ loading ? '' : '{{ i18n "login" }}' ]]
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{template "js" .}}
- {{template "component/aThemeSwitch" .}}
-
-
-
\ No newline at end of file
+ function takeNext(word) {
+ return word.nextElementSibling ? word.nextElementSibling : word.parentElement.firstElementChild;
+ }
+
+ function switchWord(oldWord, newWord) {
+ oldWord.classList.remove('is-visible');
+ oldWord.classList.add('is-hidden');
+ newWord.classList.remove('is-hidden');
+ newWord.classList.add('is-visible');
+ }
+ });
+
+{{ template "page/body_end" .}}
\ No newline at end of file
diff --git a/web/html/modals/dns_presets_modal.html b/web/html/modals/dns_presets_modal.html
new file mode 100644
index 00000000..010b973a
--- /dev/null
+++ b/web/html/modals/dns_presets_modal.html
@@ -0,0 +1,110 @@
+{{define "modals/dnsPresetsModal"}}
+
+
+
+
+
+
+ [[ dns.name ]]
+ [[ dns.family ? '{{ i18n "pages.xray.dns.dnsPresetFamily" }}' : 'DNS' ]]
+
+
+
+ {{ i18n "install" }}
+
+
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/web/html/modals/fakedns_modal.html b/web/html/modals/fakedns_modal.html
deleted file mode 100644
index 8e554ac0..00000000
--- a/web/html/modals/fakedns_modal.html
+++ /dev/null
@@ -1,57 +0,0 @@
-{{define "modals/fakednsModal"}}
-
-
-
-
-
-
-
-
-
-
-
-{{end}}
diff --git a/web/html/modals/inbound_info_modal.html b/web/html/modals/inbound_info_modal.html
index 9da3fc86..c9c36398 100644
--- a/web/html/modals/inbound_info_modal.html
+++ b/web/html/modals/inbound_info_modal.html
@@ -433,6 +433,9 @@
+
+
+
diff --git a/web/html/modals/dns_modal.html b/web/html/modals/xray_dns_modal.html
similarity index 55%
rename from web/html/modals/dns_modal.html
rename to web/html/modals/xray_dns_modal.html
index e6266c06..484bd2f8 100644
--- a/web/html/modals/dns_modal.html
+++ b/web/html/modals/xray_dns_modal.html
@@ -6,6 +6,16 @@
+
+
+
+
+
+ [[ l ]]
+
+
+
@@ -15,15 +25,6 @@
-
-
- [[ l ]]
-
-
-
-
-
@@ -33,31 +34,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/html/modals/xray_fakedns_modal.html b/web/html/modals/xray_fakedns_modal.html
new file mode 100644
index 00000000..f1f4429c
--- /dev/null
+++ b/web/html/modals/xray_fakedns_modal.html
@@ -0,0 +1,56 @@
+{{define "modals/fakednsModal"}}
+
+
+
+
+
+
+
+
+
+
+
+{{end}}
\ No newline at end of file
diff --git a/web/html/settings.html b/web/html/settings.html
index dec40de7..1c55ea81 100644
--- a/web/html/settings.html
+++ b/web/html/settings.html
@@ -1,6 +1,4 @@
-
-
-{{template "head" .}}
+{{ template "page/head_start" .}}
-
-
-
-
-
-
-
-
-
- {{ i18n "secAlertConf" }}
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.settings.save" }}
- {{ i18n "pages.settings.restartPanel" }}
-
-
-
-
-
-
-
-
-
-
-
- {{ template "settings/panel/general" . }}
-
-
- {{ template "settings/panel/security" . }}
-
-
- {{ template "settings/panel/telegram" . }}
-
-
- {{ template "settings/panel/subscription/general" . }}
-
-
- {{ template "settings/panel/subscription/json" . }}
-
-
-
-
-
-
+{{ template "page/head_end" .}}
+
+{{ template "page/body_start" .}}
+
+
+
+
+
+
+
+
+ {{ i18n "secAlertConf" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.settings.save" }}
+ {{ i18n "pages.settings.restartPanel" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.settings.panelSettings" }}
+
+ {{ template "settings/panel/general" . }}
+
+
+
+
+ {{ i18n "pages.settings.securitySettings" }}
+
+ {{ template "settings/panel/security" . }}
+
+
+
+
+ {{ i18n "pages.settings.TGBotSettings" }}
+
+ {{ template "settings/panel/telegram" . }}
+
+
+
+
+ {{ i18n "pages.settings.subSettings" }}
+
+ {{ template "settings/panel/subscription/general" . }}
+
+
+
+
+ {{ i18n "pages.settings.subSettings" }} (JSON)
+
+ {{ template "settings/panel/subscription/json" . }}
+
+
+
+
+
+
+
+
-{{template "js" .}}
+
+{{template "page/body_scripts" .}}
@@ -132,10 +165,14 @@
-
-
\ No newline at end of file
+{{ template "page/body_end" .}}
\ No newline at end of file
diff --git a/web/html/settings/xray/advanced.html b/web/html/settings/xray/advanced.html
index b5f61b34..28e31871 100644
--- a/web/html/settings/xray/advanced.html
+++ b/web/html/settings/xray/advanced.html
@@ -1,5 +1,5 @@
{{define "settings/xray/advanced"}}
-
+
-
+
@@ -144,22 +144,12 @@
-
+
{{ i18n "pages.xray.Torrent"}}
- {{ i18n "pages.xray.TorrentDesc"}}
-
- {{ i18n "pages.xray.Family"}}
- {{ i18n "pages.xray.FamilyDesc"}}
-
-
-
-
-
-
diff --git a/web/html/settings/xray/dns.html b/web/html/settings/xray/dns.html
index 11558536..ba768cb8 100644
--- a/web/html/settings/xray/dns.html
+++ b/web/html/settings/xray/dns.html
@@ -29,7 +29,7 @@
-
+
[[ l ]]
@@ -56,6 +56,14 @@
+
+
+ {{ i18n "pages.xray.dns.useSystemHosts" }}
+ {{ i18n "pages.xray.dns.useSystemHostsDesc" }}
+
+
+
+
@@ -102,9 +110,12 @@
-
- {{ i18n "pages.xray.dns.add" }}
-
+
+
+ {{ i18n "pages.xray.dns.add" }}
+
+
+
diff --git a/web/html/xray.html b/web/html/xray.html
index fc94c31a..b6e40858 100644
--- a/web/html/xray.html
+++ b/web/html/xray.html
@@ -1,11 +1,158 @@
-
-
-{{template "head" .}}
+{{ template "page/head_start" .}}
+
+{{ template "page/head_end" .}}
+
+{{ template "page/body_start" .}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.xray.save" }}
+
+
+ {{ i18n "pages.xray.restart" }}
+
+
+ {{ i18n "pages.index.xrayErrorPopoverTitle" }}
+
+ [[ line ]]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { this.changePage(activeKey); }"
+ :class="themeSwitcher.currentTheme">
+
+
+
+ {{ i18n "pages.xray.basicTemplate"}}
+
+ {{ template "settings/xray/basics" . }}
+
+
+
+
+ {{ i18n "pages.xray.Routings"}}
+
+ {{ template "settings/xray/routing" . }}
+
+
+
+
+ {{ i18n "pages.xray.Outbounds"}}
+
+ {{ template "settings/xray/outbounds" . }}
+
+
+
+
+ {{ i18n "pages.xray.outbound.reverse"}}
+
+ {{ template "settings/xray/reverse" . }}
+
+
+
+
+ {{ i18n "pages.xray.Balancers"}}
+
+ {{ template "settings/xray/balancers" . }}
+
+
+
+
+ DNS
+
+ {{ template "settings/xray/dns" . }}
+
+
+
+
+ {{ i18n "pages.xray.advancedTemplate"}}
+
+ {{ template "settings/xray/advanced" . }}
+
+
+
+
+
+
+
+
+
+{{template "page/body_scripts" .}}
@@ -17,108 +164,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.xray.save" }}
- {{ i18n "pages.xray.restart" }}
-
- {{ i18n "pages.index.xrayErrorPopoverTitle" }}
-
- [[ line ]]
-
-
-
-
-
-
-
-
-
-
-
-
- { this.changePage(activeKey); }"
- :class="themeSwitcher.currentTheme">
-
- {{ template "settings/xray/basics" . }}
-
-
- {{ template "settings/xray/routing" . }}
-
-
- {{ template "settings/xray/outbounds" . }}
-
-
- {{ template "settings/xray/reverse" . }}
-
-
- {{ template "settings/xray/balancers" . }}
-
-
- {{ template "settings/xray/dns" . }}
-
-
- {{ template "settings/xray/advanced" . }}
-
-
-
-
-
-
-
-{{template "js" .}}
{{template "component/aSidebar" .}}
{{template "component/aThemeSwitch" .}}
{{template "component/aTableSortable" .}}
@@ -128,1286 +173,1300 @@
{{template "modals/reverseModal"}}
{{template "modals/balancerModal"}}
{{template "modals/dnsModal"}}
+{{template "modals/dnsPresetsModal"}}
{{template "modals/fakednsModal"}}
{{template "modals/warpModal"}}
-
-
+{{ template "page/body_end" .}}
\ No newline at end of file
diff --git a/web/service/config.json b/web/service/config.json
index e7425ac0..764d2b2e 100644
--- a/web/service/config.json
+++ b/web/service/config.json
@@ -81,5 +81,9 @@
}
]
},
- "stats": {}
-}
\ No newline at end of file
+ "stats": {},
+ "metrics": {
+ "tag": "metrics_out",
+ "listen": "127.0.0.1:11111"
+ }
+}
diff --git a/web/service/server.go b/web/service/server.go
index bbdc8989..1e29990f 100644
--- a/web/service/server.go
+++ b/web/service/server.go
@@ -295,7 +295,7 @@ func (s *ServerService) GetXrayVersions() ([]string, error) {
continue
}
- if major > 25 || (major == 25 && minor > 3) || (major == 25 && minor == 3 && patch >= 3) {
+ if major > 25 || (major == 25 && minor > 6) || (major == 25 && minor == 6 && patch >= 8) {
versions = append(versions, release.TagName)
}
}
diff --git a/web/translation/translate.ar_EG.toml b/web/translation/translate.ar_EG.toml
index efb84b69..50e1680f 100644
--- a/web/translation/translate.ar_EG.toml
+++ b/web/translation/translate.ar_EG.toml
@@ -400,7 +400,6 @@
"generalConfigsDesc" = "الخيارات دي هتحدد التعديلات العامة."
"logConfigs" = "السجلات"
"logConfigsDesc" = "السجلات ممكن تأثر على كفاءة السيرفر. ننصح بتفعيلها بحكمة لما تكون محتاجها."
-"blockConfigs" = "درع الحماية"
"blockConfigsDesc" = "الخيارات دي هتحجب الترافيك بناءً على بروتوكولات ومواقع محددة."
"basicRouting" = "توجيه أساسي"
"blockConnectionsConfigsDesc" = "الخيارات دي هتحجب الترافيك بناءً على الدولة المطلوبة."
@@ -420,9 +419,6 @@
"RoutingStrategy" = "استراتيجية التوجيه العامة"
"RoutingStrategyDesc" = "حدد استراتيجية التوجيه الإجمالية لحل كل الطلبات."
"Torrent" = "حظر بروتوكول التورنت"
-"TorrentDesc" = "بيحجب بروتوكول التورنت."
-"Family" = "حماية العيلة"
-"FamilyDesc" = "بيحجب المحتويات الكبار وعناوين المواقع الضارة."
"Inbounds" = "الإدخالات"
"InboundsDesc" = "قبول العملاء المعينين."
"Outbounds" = "المخرجات"
@@ -522,6 +518,12 @@
"edit" = "عدل السيرفر"
"domains" = "الدومينات"
"expectIPs" = "العناوين المتوقعة"
+"unexpectIPs" = "عناوين IP غير متوقعة"
+"useSystemHosts" = "استخدام ملف Hosts الخاص بالنظام"
+"useSystemHostsDesc" = "استخدام ملف hosts من نظام مثبت"
+"usePreset" = "استخدام النموذج"
+"dnsPresetTitle" = "قوالب DNS"
+"dnsPresetFamily" = "العائلي"
[pages.xray.fakedns]
"add" = "أضف Fake DNS"
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index bb407b5f..33339fa7 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -399,7 +399,6 @@
"generalConfigsDesc" = "These options will determine general adjustments."
"logConfigs" = "Log"
"logConfigsDesc" = "Logs may affect your server's efficiency. It is recommended to enable it wisely only in case of your needs"
-"blockConfigs" = "Protection Shield"
"blockConfigsDesc" = "These options will block traffic based on specific requested protocols and websites."
"basicRouting" = "Basic Routing"
"blockConnectionsConfigsDesc" = "These options will block traffic based on the specific requested country."
@@ -419,9 +418,6 @@
"RoutingStrategy" = "Overall Routing Strategy"
"RoutingStrategyDesc" = "Set the overall traffic routing strategy for resolving all requests."
"Torrent" = "Block BitTorrent Protocol"
-"TorrentDesc" = "Blocks BitTorrent protocol."
-"Family" = "Family Protection"
-"FamilyDesc" = "Blocks adult content, and malware websites."
"Inbounds" = "Inbounds"
"InboundsDesc" = "Accepting the specific clients."
"Outbounds" = "Outbounds"
@@ -521,6 +517,12 @@
"edit" = "Edit Server"
"domains" = "Domains"
"expectIPs" = "Expect IPs"
+"unexpectIPs" = "Unexpect IPs"
+"useSystemHosts" = "Use System Hosts"
+"useSystemHostsDesc" = "Use the hosts file from an installed system"
+"usePreset" = "Use Preset"
+"dnsPresetTitle" = "DNS Presets"
+"dnsPresetFamily" = "Family"
[pages.xray.fakedns]
"add" = "Add Fake DNS"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index 7d4d8cee..0b8d009c 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Estas opciones proporcionarán ajustes generales."
"logConfigs" = "Registro"
"logConfigsDesc" = "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades."
-"blockConfigs" = "Configuraciones de Bloqueo"
"blockConfigsDesc" = "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos."
"basicRouting" = "Enrutamiento Básico"
"blockConnectionsConfigsDesc" = "Estas opciones bloquearán el tráfico según el país solicitado específico."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "Configurar Estrategia de Enrutamiento de Dominios"
"RoutingStrategyDesc" = "Establece la estrategia general de enrutamiento para la resolución de DNS."
"Torrent" = "Prohibir Uso de BitTorrent"
-"TorrentDesc" = "Cambia la plantilla de configuración para evitar el uso de BitTorrent por parte de los usuarios."
-"Family" = "Bloquee malware y contenido para adultos"
-"FamilyDesc" = "Resolutores de DNS de Cloudflare para bloquear malware y contenido para adultos para protección familiar."
"Inbounds" = "Entrante"
"InboundsDesc" = "Cambia la plantilla de configuración para aceptar clientes específicos."
"Outbounds" = "Salidas"
@@ -524,6 +520,12 @@
"edit" = "Editar Servidor"
"domains" = "Dominios"
"expectIPs" = "IPs esperadas"
+"unexpectIPs" = "IPs inesperadas"
+"useSystemHosts" = "Usar Hosts del sistema"
+"useSystemHostsDesc" = "Usar el archivo hosts de un sistema instalado"
+"usePreset" = "Usar plantilla"
+"dnsPresetTitle" = "Plantillas DNS"
+"dnsPresetFamily" = "Familiar"
[pages.xray.fakedns]
"add" = "Agregar DNS Falso"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index 475abcf8..9d53f47d 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "این گزینهها استراتژی کلی ترافیک را تعیین میکنند"
"logConfigs" = "گزارش"
"logConfigsDesc" = "گزارشها ممکن است بر کارایی سرور شما تأثیر بگذارد. توصیه می شود فقط در صورت نیاز آن را عاقلانه فعال کنید"
-"blockConfigs" = "سپر محافظ"
"blockConfigsDesc" = "این گزینهها ترافیک را بر اساس پروتکلهای درخواستی خاص، و وب سایتها مسدود میکند"
"basicRouting" = "مسیریابی پایه"
"blockConnectionsConfigsDesc" = "این گزینهها ترافیک را بر اساس کشور درخواستشده خاص مسدود میکنند."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "استراتژی کلی مسیریابی"
"RoutingStrategyDesc" = "استراتژی کلی مسیریابی برای حل تمام درخواستها را تعیین میکند"
"Torrent" = "مسدودسازی پروتکل بیتتورنت"
-"TorrentDesc" = "پروتکل بیت تورنت را مسدود میکند"
-"Family" = "محافظت خانواده"
-"FamilyDesc" = "محتوای مخصوص بزرگسالان، و وبسایتهای ناامن را مسدود میکند"
"Inbounds" = "ورودیها"
"InboundsDesc" = "پذیرش کلاینت خاص"
"Outbounds" = "خروجیها"
@@ -524,6 +520,12 @@
"edit" = "ویرایش سرور"
"domains" = "دامنهها"
"expectIPs" = "آیپیهای مورد انتظار"
+"unexpectIPs" = "آیپیهای غیرمنتظره"
+"useSystemHosts" = "استفاده از Hosts سیستم"
+"useSystemHostsDesc" = "استفاده از فایل hosts یک سیستم نصبشده"
+"usePreset" = "استفاده از پیشتنظیم"
+"dnsPresetTitle" = "پیشتنظیمهای DNS"
+"dnsPresetFamily" = "خانوادگی"
[pages.xray.fakedns]
"add" = "افزودن دیاناس جعلی"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index 29422d6e..f6a45b92 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Opsi ini akan menentukan penyesuaian strategi umum."
"logConfigs" = "Catatan"
"logConfigsDesc" = "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan"
-"blockConfigs" = "Pelindung"
"blockConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta."
"basicRouting" = "Perutean Dasar"
"blockConnectionsConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta."
@@ -423,8 +422,6 @@
"RoutingStrategyDesc" = "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan."
"Torrent" = "Blokir Protokol BitTorrent"
"TorrentDesc" = "Memblokir protokol BitTorrent."
-"Family" = "Proteksi Keluarga"
-"FamilyDesc" = "Memblokir konten dewasa dan situs web berbahaya."
"Inbounds" = "Masuk"
"InboundsDesc" = "Menerima klien tertentu."
"Outbounds" = "Keluar"
@@ -524,6 +521,12 @@
"edit" = "Sunting Server"
"domains" = "Domains"
"expectIPs" = "IP yang Diharapkan"
+"unexpectIPs" = "IP tak terduga"
+"useSystemHosts" = "Gunakan Hosts Sistem"
+"useSystemHostsDesc" = "Gunakan file hosts dari sistem yang terinstal"
+"usePreset" = "Gunakan templat"
+"dnsPresetTitle" = "Templat DNS"
+"dnsPresetFamily" = "Keluarga"
[pages.xray.fakedns]
"add" = "Tambahkan DNS Palsu"
diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml
index d02b99c4..fa5ed69a 100644
--- a/web/translation/translate.ja_JP.toml
+++ b/web/translation/translate.ja_JP.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "これらのオプションは一般設定を決定します"
"logConfigs" = "ログ"
"logConfigsDesc" = "ログはサーバーのパフォーマンスに影響を与える可能性があるため、必要な場合にのみ有効にすることをお勧めします"
-"blockConfigs" = "防御フィルター"
"blockConfigsDesc" = "これらのオプションは、特定のプロトコルやウェブサイトへのユーザー接続をブロックします"
"basicRouting" = "基本ルーティング"
"blockConnectionsConfigsDesc" = "これらのオプションにより、特定のリクエスト元の国に基づいてトラフィックをブロックします。"
@@ -422,9 +421,6 @@
"RoutingStrategy" = "ルーティングドメイン戦略設定"
"RoutingStrategyDesc" = "DNS解決の全体的なルーティング戦略を設定する"
"Torrent" = "BitTorrent プロトコルをブロック"
-"TorrentDesc" = "BitTorrentの使用を禁止する"
-"Family" = "ファミリー保護"
-"FamilyDesc" = "アダルトコンテンツや悪意のあるサイトをブロックする"
"Inbounds" = "インバウンドルール"
"InboundsDesc" = "特定のクライアントからのトラフィックを受け入れる"
"Outbounds" = "アウトバウンドルール"
@@ -524,6 +520,12 @@
"edit" = "サーバー編集"
"domains" = "ドメイン"
"expectIPs" = "期待されるIP"
+"unexpectIPs" = "予期しないIP"
+"useSystemHosts" = "システムのHostsを使用"
+"useSystemHostsDesc" = "インストール済みシステムのhostsファイルを使用する"
+"usePreset" = "テンプレートを使用"
+"dnsPresetTitle" = "DNSテンプレート"
+"dnsPresetFamily" = "ファミリー"
[pages.xray.fakedns]
"add" = "フェイクDNS追加"
diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml
index 9e1760f2..1c6cadb0 100644
--- a/web/translation/translate.pt_BR.toml
+++ b/web/translation/translate.pt_BR.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Essas opções determinam ajustes gerais."
"logConfigs" = "Log"
"logConfigsDesc" = "Os logs podem afetar a eficiência do servidor. É recomendável habilitá-los com sabedoria apenas se necessário."
-"blockConfigs" = "Escudo de Proteção"
"blockConfigsDesc" = "Essas opções bloqueiam tráfego com base em protocolos e sites específicos solicitados."
"basicRouting" = "Roteamento Básico"
"blockConnectionsConfigsDesc" = "Essas opções bloquearão o tráfego com base no país solicitado."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "Estratégia Geral de Roteamento"
"RoutingStrategyDesc" = "Definir a estratégia geral de roteamento de tráfego para resolver todas as solicitações."
"Torrent" = "Bloquear Protocolo BitTorrent"
-"TorrentDesc" = "Bloqueia o protocolo BitTorrent."
-"Family" = "Proteção Familiar"
-"FamilyDesc" = "Bloqueia conteúdo adulto e sites maliciosos."
"Inbounds" = "Inbounds"
"InboundsDesc" = "Aceitar clientes específicos."
"Outbounds" = "Outbounds"
@@ -524,6 +520,12 @@
"edit" = "Editar Servidor"
"domains" = "Domínios"
"expectIPs" = "IPs Esperadas"
+"unexpectIPs" = "IPs inesperados"
+"useSystemHosts" = "Usar Hosts do sistema"
+"useSystemHostsDesc" = "Usar o arquivo hosts de um sistema instalado"
+"usePreset" = "Usar modelo"
+"dnsPresetTitle" = "Modelos DNS"
+"dnsPresetFamily" = "Familiar"
[pages.xray.fakedns]
"add" = "Adicionar Fake DNS"
diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml
index 9791764a..bf3fb43a 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -33,7 +33,7 @@
"sure" = "Да"
"encryption" = "Шифрование"
"useIPv4ForHost" = "Использовать IPv4 для хоста"
-"transmission" = "Протокол"
+"transmission" = "Транспорт"
"host" = "Хост"
"path" = "Путь"
"camouflage" = "Маскировка"
@@ -59,24 +59,24 @@
"security" = "Безопасность"
"secAlertTitle" = "Предупреждение системы безопасности"
"secAlertSsl" = "Это соединение не защищено. Пожалуйста, не вводите конфиденциальную информацию, пока не установите SSL сертификат для защиты соединения"
-"secAlertConf" = "Некоторые настройки уязвимы для атак. Рекомендуем усилить протоколы безопасности, чтобы предотвратить проблемы в будущем."
-"secAlertSSL" = "Ваше подключение к панели небезопасно. Пожалуйста, установите SSL сертификат для защиты данных."
-"secAlertPanelPort" = "Порт, на котором работает панель небезопасен. Пожалуйста, установите случайный или просто другой порт."
-"secAlertPanelURI" = "URI-адрес панели по умолчанию небезопасен. Пожалуйста, настройте сложный URI-адрес."
+"secAlertConf" = "Некоторые настройки уязвимы для атак. Чтобы в будущем не было проблем, нужно усилить защиту."
+"secAlertSSL" = "Ваше подключение к панели не защищено. Установите SSL сертификат для защиты данных."
+"secAlertPanelPort" = "Порт панели по умолчанию небезопасен. Установите случайный или просто другой порт."
+"secAlertPanelURI" = "Адрес панели по умолчанию небезопасен. Сделайте адрес сложным."
"secAlertSubURI" = "URI-адрес подписки по умолчанию небезопасен. Пожалуйста, настройте сложный URI-адрес."
"secAlertSubJsonURI" = "URI-адрес по умолчанию для JSON подписки небезопасен. Пожалуйста, настройте сложный URI-адрес."
"emptyDnsDesc" = "Нет добавленных DNS-серверов."
"emptyFakeDnsDesc" = "Нет добавленных Fake DNS-серверов."
"emptyBalancersDesc" = "Нет добавленных балансировщиков."
-"emptyReverseDesc" = "Нет добавленных обратных прокси."
+"emptyReverseDesc" = "Нет добавленных реверс-прокси."
"somethingWentWrong" = "Что-то пошло не так"
[menu]
"theme" = "Тема"
"dark" = "Темная"
"ultraDark" = "Очень темная"
-"dashboard" = "Статус системы"
-"inbounds" = "Входящие подключения"
+"dashboard" = "Дашборд"
+"inbounds" = "Инбаунды"
"settings" = "Настройки"
"xray" = "Настройки Xray"
"logout" = "Выход"
@@ -91,15 +91,15 @@
"invalidFormData" = "Недопустимый формат данных"
"emptyUsername" = "Введите имя пользователя"
"emptyPassword" = "Введите пароль"
-"wrongUsernameOrPassword" = "Неверное имя пользователя, пароль или код двухфакторной аутентификации."
-"successLogin" = "Успешный вход"
+"wrongUsernameOrPassword" = "Неверные данные учетной записи."
+"successLogin" = "Вы успешно вошли в аккаунт"
[pages.index]
-"title" = "Статус системы"
+"title" = "Дашборд"
"cpu" = "ЦП"
"logicalProcessors" = "Логические процессоры"
"frequency" = "Частота"
-"swap" = "Swap"
+"swap" = "Файл подкачки"
"storage" = "Диск"
"memory" = "ОЗУ"
"threads" = "Потоки"
@@ -136,7 +136,7 @@
"geofileUpdateDialogDesc" = "Это обновит файл #filename#."
"geofileUpdatePopover" = "Геофайл успешно обновлён"
"dontRefresh" = "Установка в процессе. Не обновляйте страницу"
-"logs" = "Логи"
+"logs" = "Журнал"
"config" = "Конфигурация"
"backup" = "Резервная копия"
"backupTitle" = "Резервная копия базы данных"
@@ -151,10 +151,10 @@
"getConfigError" = "Произошла ошибка при получении конфигурационного файла"
[pages.inbounds]
-"title" = "Входящие подключения"
+"title" = "Инбаунды"
"totalDownUp" = "Объем отправленного/полученного трафика"
"totalUsage" = "Всего трафика"
-"inboundCount" = "Всего подключений"
+"inboundCount" = "Всего инбаундов"
"operate" = "Меню"
"enable" = "Включить"
"remark" = "Примечание"
@@ -165,18 +165,18 @@
"transportConfig" = "Транспорт"
"expireDate" = "Дата окончания"
"resetTraffic" = "Сброс трафика"
-"addInbound" = "Создать новое подключение"
+"addInbound" = "Создать инбаунд"
"generalActions" = "Общие действия"
"autoRefresh" = "Автообновление"
"autoRefreshInterval" = "Интервал"
-"modifyInbound" = "Изменить входящее подключение"
-"deleteInbound" = "Удалить входящее подключение"
-"deleteInboundContent" = "Вы уверены, что хотите удалить входящее подключение?"
+"modifyInbound" = "Изменить инбаунд"
+"deleteInbound" = "Удалить инбаунд"
+"deleteInboundContent" = "Вы уверены, что хотите удалить инбаунд?"
"deleteClient" = "Удалить клиента"
"deleteClientContent" = "Вы уверены, что хотите удалить клиента?"
"resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?"
-"inboundUpdateSuccess" = "Входящее подключение успешно обновлено."
-"inboundCreateSuccess" = "Входящее подключение успешно создано."
+"inboundUpdateSuccess" = "Инбаунд успешно обновлен."
+"inboundCreateSuccess" = "Инбаунд успешно создан."
"copyLink" = "Копировать ссылку"
"address" = "Адрес"
"network" = "Сеть"
@@ -196,11 +196,11 @@
"export" = "Экспорт ссылок"
"clone" = "Клонировать"
"cloneInbound" = "Клонировать"
-"cloneInboundContent" = "Будут клонированы все настройки входящих подключений, кроме списка клиентов, порта и IP-адреса прослушивания"
+"cloneInboundContent" = "Будут клонированы все настройки инбаундов, кроме списка клиентов, порта и IP-адреса прослушивания"
"cloneInboundOk" = "Клонировано"
-"resetAllTraffic" = "Сброс трафика всех подключений"
-"resetAllTrafficTitle" = "Сброс трафика всех подключений"
-"resetAllTrafficContent" = "Вы уверены, что хотите сбросить трафик всех подключений?"
+"resetAllTraffic" = "Сброс трафика всех инбаундов"
+"resetAllTrafficTitle" = "Сброс трафика всех инбаундов"
+"resetAllTrafficContent" = "Вы уверены, что хотите сбросить трафик всех инбаундов?"
"resetInboundClientTraffics" = "Сброс трафика клиента"
"resetInboundClientTrafficTitle" = "Сброс трафика клиентов"
"resetInboundClientTrafficContent" = "Вы уверены, что хотите сбросить трафик для этих клиентов?"
@@ -222,10 +222,10 @@
"subscriptionDesc" = "Вы можете найти свою ссылку подписки в разделе 'Подробнее'"
"info" = "Информация"
"same" = "Тот же"
-"inboundData" = "Данные подключений"
-"exportInbound" = "Экспорт входящих подключений"
+"inboundData" = "Данные инбаундов"
+"exportInbound" = "Экспорт инбаундов"
"import" = "Импортировать"
-"importInbound" = "Импорт входящих подключений"
+"importInbound" = "Импорт инбаундов"
[pages.client]
"add" = "Создать клиента"
@@ -249,13 +249,13 @@
"obtain" = "Получить"
"updateSuccess" = "Обновление прошло успешно"
"logCleanSuccess" = "Лог был очищен"
-"inboundsUpdateSuccess" = "Входящие подключения успешно обновлены"
-"inboundUpdateSuccess" = "Входящее подключение успешно обновлено"
-"inboundCreateSuccess" = "Входящее подключение успешно создано"
-"inboundDeleteSuccess" = "Входящее подключение успешно удалено"
-"inboundClientAddSuccess" = "Клиент(ы) входящего подключения добавлен(ы)"
-"inboundClientDeleteSuccess" = "Клиент входящего подключения удалён"
-"inboundClientUpdateSuccess" = "Клиент входящего подключения обновлён"
+"inboundsUpdateSuccess" = "Инбаунды успешно обновлены"
+"inboundUpdateSuccess" = "Инбаунд успешно обновлено"
+"inboundCreateSuccess" = "Инбаунд успешно создано"
+"inboundDeleteSuccess" = "Инбаунд успешно удалено"
+"inboundClientAddSuccess" = "Клиент(ы) инбаунда добавлен(ы)"
+"inboundClientDeleteSuccess" = "Клиент инбаунда удалён"
+"inboundClientUpdateSuccess" = "Клиент инбаунда обновлён"
"delDepletedClientsSuccess" = "Все исчерпанные клиенты удалены"
"resetAllClientTrafficSuccess" = "Весь трафик клиента сброшен"
"resetAllTrafficSuccess" = "Весь трафик сброшен"
@@ -281,15 +281,15 @@
[pages.settings]
"title" = "Настройки"
"save" = "Сохранить"
-"infoDesc" = "Каждое выполненное изменение необходимо сохранить. Пожалуйста, перезапустите панель, чтобы изменения вступили в силу"
+"infoDesc" = "Каждое внесённое изменение должно быть сохранено. Пожалуйста, перезапустите панель, чтобы изменения вступили в силу."
"restartPanel" = "Перезапуск панели"
"restartPanelDesc" = "Вы уверены, что хотите перезапустить панель? Подтвердите, и перезапуск произойдёт через 3 секунды. Если панель будет недоступна, проверьте лог сервера"
"restartPanelSuccess" = "Панель успешно перезапущена"
"actions" = "Действия"
"resetDefaultConfig" = "Восстановить настройки по умолчанию"
-"panelSettings" = "Настройки панели"
-"securitySettings" = "Настройки безопасности"
-"TGBotSettings" = "Настройки Telegram бота"
+"panelSettings" = "Панель"
+"securitySettings" = "Учетная запись"
+"TGBotSettings" = "Telegram"
"panelListeningIP" = "IP-адрес для управления панелью"
"panelListeningIPDesc" = "Оставьте пустым для подключения с любого IP"
"panelListeningDomain" = "Домен панели"
@@ -303,7 +303,7 @@
"panelUrlPath" = "Корневой путь URL адреса панели"
"panelUrlPathDesc" = "Должен начинаться с '/' и заканчиваться '/'"
"pageSize" = "Размер нумерации страниц"
-"pageSizeDesc" = "Определить размер страницы для таблицы входящих подключений. Установите 0, чтобы отключить"
+"pageSizeDesc" = "Определить размер страницы для таблицы инбаундов. Установите 0, чтобы отключить"
"remarkModel" = "Модель примечания и символ разделения"
"datepicker" = "Выбор даты"
"datepickerPlaceholder" = "Выберите дату"
@@ -391,19 +391,18 @@
[pages.xray]
"title" = "Настройки Xray"
"save" = "Сохранить"
-"restart" = "Перезапустить Xray"
+"restart" = "Перезапуск Xray"
"restartSuccess" = "Xray успешно перезапущен"
"stopSuccess" = "Xray успешно остановлен"
"restartError" = "Произошла ошибка при перезапуске Xray."
"stopError" = "Произошла ошибка при остановке Xray."
-"basicTemplate" = "Базовый шаблон"
+"basicTemplate" = "Основное"
"advancedTemplate" = "Расширенный шаблон"
"generalConfigs" = "Основные настройки"
"generalConfigsDesc" = "Эти параметры описывают общие настройки"
"logConfigs" = "Логи"
"logConfigsDesc" = "Логи могут замедлять работу сервера. Включайте только нужные вам виды логов при необходимости!"
-"blockConfigs" = "Блокировка подключений"
-"blockConfigsDesc" = "Настройте, чтобы клиенты не имели доступа к определенным протоколам и веб-сайтами"
+"blockConfigsDesc" = "Настройте, чтобы клиенты не имели доступа к определенным протоколам"
"basicRouting" = "Базовые соединения"
"blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от страны назначения."
"directConnectionsConfigsDesc" = "Прямое соединение означает, что определенный трафик не будет перенаправлен через другой сервер."
@@ -414,22 +413,19 @@
"ipv4Routing" = "Правила IPv4"
"ipv4RoutingDesc" = "Эти параметры позволят клиентам маршрутизироваться к целевым доменам только через IPv4"
"warpRouting" = "Правила WARP"
-"warpRoutingDesc" = "Внимание: перед использованием этих параметров установите WARP в режиме прокси-сервера socks5 на свой сервер, следуя инструкциям на GitHub панели. WARP будет направлять трафик на веб-сайты через серверы Cloudflare"
+"warpRoutingDesc" = " Эти опции будут направлять трафик в зависимости от конкретного пункта назначения через WARP."
"Template" = "Шаблон конфигурации Xray"
-"TemplateDesc" = "Создание файла конфигурации Xray на основе этого шаблона"
+"TemplateDesc" = "На основе шаблона создаётся конфигурационный файл Xray."
"FreedomStrategy" = "Настройка стратегии протокола Freedom"
"FreedomStrategyDesc" = "Установка стратегии вывода сети в протоколе Freedom"
"RoutingStrategy" = "Настройка маршрутизации доменов"
"RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS"
"Torrent" = "Заблокировать BitTorrent"
-"TorrentDesc" = "Запретить входящий/исходящий трафик, в котором фигурирует протокол BitTorrent"
-"Family" = "Семейный режим"
-"FamilyDesc" = "Использовать DNS-сервера Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи."
-"Inbounds" = "Входящее соединение"
+"Inbounds" = "Инбаунды"
"InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных клиентов"
-"Outbounds" = "Исходящее соединение"
+"Outbounds" = "Аутбаунды"
"Balancers" = "Балансировщик"
-"OutboundsDesc" = "Изменение шаблона конфигурации, чтобы определить исходящие соединения для этого сервера"
+"OutboundsDesc" = "Изменение шаблона конфигурации, чтобы определить аутбаунды для этого сервера"
"Routings" = "Маршрутизация"
"RoutingsDesc" = "Важен приоритет каждого правила!"
"completeTemplate" = "Все"
@@ -460,8 +456,8 @@
"down" = "Опустить вниз"
"source" = "Источник"
"dest" = "Пункт назначения"
-"inbound" = "Входящее соединение"
-"outbound" = "Исходящее соединение"
+"inbound" = "Инбаунд"
+"outbound" = "Аутбаунд"
"balancer" = "Балансировщик"
"info" = "Информация"
"add" = "Создать правило"
@@ -469,14 +465,14 @@
"useComma" = "Элементы, разделённые запятыми"
[pages.xray.outbound]
-"addOutbound" = "Создать исходящее соединение"
-"addReverse" = "Создать обратный прокси"
-"editOutbound" = "Изменить исходящее соединение"
-"editReverse" = "Редактировать обратное прокси"
+"addOutbound" = "Создать аутбаунд"
+"addReverse" = "Создать реверс-прокси"
+"editOutbound" = "Изменить аутбаунд"
+"editReverse" = "Редактировать реверс-прокси"
"tag" = "Тег"
"tagDesc" = "Уникальный тег"
"address" = "Адрес"
-"reverse" = "Обратный"
+"reverse" = "Реверс-прокси"
"domain" = "Домен"
"type" = "Тип"
"bridge" = "Мост"
@@ -485,7 +481,7 @@
"intercon" = "Соединение"
"settings" = "Настройки"
"accountInfo" = "Информация об учетной записи"
-"outboundStatus" = "Исходящий статус"
+"outboundStatus" = "Статус аутбаунда"
"sendThrough" = "Отправить через"
[pages.xray.balancer]
@@ -498,7 +494,7 @@
"balancerDesc" = "Невозможно одновременно использовать balancerTag и outboundTag. При одновременном использовании будет работать только outboundTag."
[pages.xray.wireguard]
-"secretKey" = "Приватный ключ"
+"secretKey" = "Секретный ключ"
"publicKey" = "Публичный ключ"
"allowedIPs" = "Разрешенные IP-адреса"
"endpoint" = "Конечная точка"
@@ -524,6 +520,12 @@
"edit" = "Редактировать DNS"
"domains" = "Домены"
"expectIPs" = "Ожидаемые IP"
+"unexpectIPs" = "Неожидаемые IP"
+"useSystemHosts" = "Использовать системные Hosts"
+"useSystemHostsDesc" = "Использовать файл hosts из установленной системы"
+"usePreset" = "Использовать шаблон"
+"dnsPresetTitle" = "Шаблоны DNS"
+"dnsPresetFamily" = "Семейный"
[pages.xray.fakedns]
"add" = "Создать Fake DNS"
@@ -553,8 +555,8 @@
"modifyUser" = "Вы успешно изменили учетные данные администратора."
"originalUserPassIncorrect" = "Неверное имя пользователя или пароль"
"userPassMustBeNotEmpty" = "Новое имя пользователя и новый пароль должны быть заполнены"
-"getOutboundTrafficError" = "Ошибка получения исходящего трафика"
-"resetOutboundTrafficError" = "Ошибка сброса исходящего трафика"
+"getOutboundTrafficError" = "Ошибка получения трафика аутбаунда"
+"resetOutboundTrafficError" = "Ошибка сброса трафика аутбаунда"
[tgbot]
"keyboardClosed" = "❌ Клавиатура закрыта."
@@ -562,7 +564,7 @@
"noQuery" = "❌ Запрос не найден. Пожалуйста, повторите команду."
"wentWrong" = "❌ Что-то пошло не так..."
"noIpRecord" = "❗ Нет записей об IP-адресе."
-"noInbounds" = "❗ У вас не настроено ни одного подключения."
+"noInbounds" = "❗ У вас не настроено ни одного инбаунда."
"unlimited" = "♾ Безлимит"
"add" = "Добавить"
"month" = "Месяц"
@@ -571,7 +573,7 @@
"days" = "Дней"
"hours" = "Часов"
"unknown" = "Неизвестно"
-"inbounds" = "Подключения"
+"inbounds" = "Инбаунды"
"clients" = "Клиенты"
"offline" = "🔴 Офлайн"
"online" = "🟢 Онлайн"
@@ -585,7 +587,7 @@
"status" = "✅ Бот функционирует нормально."
"usage" = "❗ Пожалуйста, укажите email для поиска."
"getID" = "🆔 Ваш User ID: {{ .ID }}
"
-"helpAdminCommands" = "🔃 Для перезапуска Xray Core:\r\n/restart
\r\n\r\n🔎 Для поиска клиента по email:\r\n/usage [Email]
\r\n\r\n📊 Для поиска подключений (со статистикой клиентов):\r\n/inbound [имя подключения]
\r\n\r\n🆔 Ваш Telegram User ID:\r\n/id
"
+"helpAdminCommands" = "🔃 Для перезапуска Xray Core:\r\n/restart
\r\n\r\n🔎 Для поиска клиента по email:\r\n/usage [Email]
\r\n\r\n📊 Для поиска инбаундов (со статистикой клиентов):\r\n/inbound [имя подключения]
\r\n\r\n🆔 Ваш Telegram User ID:\r\n/id
"
"helpClientCommands" = "💲 Для просмотра информации о вашей подписке используйте команду:\r\n/usage [Email]
\r\n\r\n🆔 Ваш Telegram User ID:\r\n/id
"
"restartUsage" = "\r\n\r\n/restart
"
"restartSuccess" = "✅ Ядро Xray успешно перезапущено."
@@ -651,8 +653,8 @@
"pass_prompt" = "🔑 Стандартный пароль: {{ .ClientPassword }}\n\nВведите ваш пароль."
"email_prompt" = "📧 Стандартный email: {{ .ClientEmail }}\n\nВведите ваш email."
"comment_prompt" = "💬 Стандартный комментарий: {{ .ClientComment }}\n\nВведите ваш комментарий."
-"inbound_client_data_id" = "🔄 Подключения: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Трафик: {{ .ClientTraffic }}\n📅 Дата исчерпания: {{ .ClientExp }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в подключение!"
-"inbound_client_data_pass" = "🔄 Подключения: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n📊 Трафик: {{ .ClientTraffic }}\n📅 Дата исчерпания: {{ .ClientExp }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в подключение!"
+"inbound_client_data_id" = "🔄 Инбаунды: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n📊 Трафик: {{ .ClientTraffic }}\n📅 Дата исчерпания: {{ .ClientExp }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в инбаунд!"
+"inbound_client_data_pass" = "🔄 Инбаунды: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n📊 Трафик: {{ .ClientTraffic }}\n📅 Дата исчерпания: {{ .ClientExp }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента в инбаунд!"
"cancel" = "❌ Процесс отменён! \n\nВы можете снова начать с /start в любое время. 🔄"
"error_add_client" = "⚠️ Ошибка:\n\n {{ .error }}"
"using_default_value" = "Используется значение по умолчанию👌"
@@ -674,7 +676,7 @@
"confirmToggle" = "✅ Подтвердить вкл/выкл пользователя?"
"dbBackup" = "📂 Бэкап БД"
"serverUsage" = "💻 Состояние сервера"
-"getInbounds" = "🔌 Подключения"
+"getInbounds" = "🔌 Инбаунды"
"depleteSoon" = "⚠️ Скоро конец"
"clientUsage" = "Статистика клиента"
"onlines" = "🟢 Онлайн"
@@ -712,7 +714,7 @@
[tgbot.answers]
"successfulOperation" = "✅ Успешно!"
"errorOperation" = "❗ Ошибка в операции."
-"getInboundsFailed" = "❌ Не удалось получить подключения."
+"getInboundsFailed" = "❌ Не удалось получить инбаунды."
"getClientsFailed" = "❌ Не удалось получить клиентов."
"canceled" = "❌ {{ .Email }}: Операция отменена."
"clientRefreshSuccess" = "✅ {{ .Email }}: Клиент успешно обновлен."
@@ -729,5 +731,5 @@
"enableSuccess" = "✅ {{ .Email }}: Включено успешно."
"disableSuccess" = "✅ {{ .Email }}: Отключено успешно."
"askToAddUserId" = "❌ Ваша конфигурация не найдена!\r\n💭 Пожалуйста, попросите администратора использовать ваш Telegram User ID в конфигурации.\r\n\r\n🆔 Ваш User ID: {{ .TgUserID }}
"
-"chooseClient" = "Выберите клиента для подключения {{ .Inbound }}"
-"chooseInbound" = "Выберите подключение"
+"chooseClient" = "Выберите клиента для инбаунда {{ .Inbound }}"
+"chooseInbound" = "Выберите инбаунд"
diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml
index 6eb0aef3..4ace318a 100644
--- a/web/translation/translate.tr_TR.toml
+++ b/web/translation/translate.tr_TR.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Bu seçenekler genel ayarlamaları belirler."
"logConfigs" = "Günlük"
"logConfigsDesc" = "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir"
-"blockConfigs" = "Koruma Kalkanı"
"blockConfigsDesc" = "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller."
"basicRouting" = "Temel Yönlendirme"
"blockConnectionsConfigsDesc" = "Bu seçenekler belirli bir istenen ülkeye göre trafiği engelleyecektir."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "Genel Yönlendirme Stratejisi"
"RoutingStrategyDesc" = "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın."
"Torrent" = "BitTorrent Protokolünü Engelle"
-"TorrentDesc" = "BitTorrent protokolünü engeller."
-"Family" = "Aile Koruması"
-"FamilyDesc" = "Yetişkin içerikli ve kötü amaçlı yazılım web sitelerini engeller."
"Inbounds" = "Gelenler"
"InboundsDesc" = "Belirli müşterileri kabul eder."
"Outbounds" = "Gidenler"
@@ -524,6 +520,12 @@
"edit" = "Sunucuyu Düzenle"
"domains" = "Alan Adları"
"expectIPs" = "Beklenen IP'ler"
+"unexpectIPs" = "Beklenmeyen IP'ler"
+"useSystemHosts" = "Sistem Hosts'larını Kullan"
+"useSystemHostsDesc" = "Yüklü bir sistemden hosts dosyasını kullan"
+"usePreset" = "Şablon kullan"
+"dnsPresetTitle" = "DNS Şablonları"
+"dnsPresetFamily" = "Aile"
[pages.xray.fakedns]
"add" = "Sahte DNS Ekle"
diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml
index 107dbaeb..a8eb81e2 100644
--- a/web/translation/translate.uk_UA.toml
+++ b/web/translation/translate.uk_UA.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Ці параметри визначатимуть загальні налаштування."
"logConfigs" = "Журнал"
"logConfigsDesc" = "Журнали можуть вплинути на ефективність вашого сервера. Рекомендується вмикати його з розумом лише у випадку ваших потреб"
-"blockConfigs" = "Захисний екран"
"blockConfigsDesc" = "Ці параметри блокуватимуть трафік на основі конкретних запитуваних протоколів і веб-сайтів."
"basicRouting" = "Основна Маршрутизація"
"blockConnectionsConfigsDesc" = "Ці параметри блокуватимуть трафік на основі запитаних країн."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "Загальна стратегія маршрутизації"
"RoutingStrategyDesc" = "Установити загальну стратегію маршрутизації трафіку для вирішення всіх запитів."
"Torrent" = "Блокувати протокол BitTorrent"
-"TorrentDesc" = "Блокує протокол BitTorrent."
-"Family" = "Захист сім'ї"
-"FamilyDesc" = "Блокує вміст для дорослих і веб-сайти з шкідливими програмами."
"Inbounds" = "Вхідні"
"InboundsDesc" = "Прийняття певних клієнтів."
"Outbounds" = "Вихід"
@@ -524,6 +520,12 @@
"edit" = "Редагувати сервер"
"domains" = "Домени"
"expectIPs" = "Очікувані IP"
+"unexpectIPs" = "Неочікувані IP"
+"useSystemHosts" = "Використовувати системні Hosts"
+"useSystemHostsDesc" = "Використовувати файл hosts з встановленої системи"
+"usePreset" = "Використати шаблон"
+"dnsPresetTitle" = "Шаблони DNS"
+"dnsPresetFamily" = "Сімейний"
[pages.xray.fakedns]
"add" = "Додати підроблений DNS"
diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml
index cf197392..da5b09a5 100644
--- a/web/translation/translate.vi_VN.toml
+++ b/web/translation/translate.vi_VN.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "Những tùy chọn này sẽ cung cấp điều chỉnh tổng quát."
"logConfigs" = "Nhật ký"
"logConfigsDesc" = "Nhật ký có thể ảnh hưởng đến hiệu suất máy chủ của bạn. Bạn chỉ nên kích hoạt nó một cách khôn ngoan trong trường hợp bạn cần"
-"blockConfigs" = "Cấu hình Chặn"
"blockConfigsDesc" = "Những tùy chọn này sẽ ngăn người dùng kết nối đến các giao thức và trang web cụ thể."
"basicRouting" = "Định tuyến Cơ bản"
"blockConnectionsConfigsDesc" = "Các tùy chọn này sẽ chặn lưu lượng truy cập dựa trên quốc gia được yêu cầu cụ thể."
@@ -422,9 +421,6 @@
"RoutingStrategy" = "Cấu hình Chiến lược Định tuyến Tên miền"
"RoutingStrategyDesc" = "Đặt chiến lược định tuyến tổng thể cho việc giải quyết DNS."
"Torrent" = "Cấu hình sử dụng BitTorrent"
-"TorrentDesc" = "Thay đổi mẫu cấu hình để tránh việc người dùng sử dụng BitTorrent."
-"Family" = "Chặn phần mềm độc hại và nội dung người lớn"
-"FamilyDesc" = "Trình phân giải DNS của Cloudflare để chặn phần mềm độc hại và nội dung người lớn để bảo vệ gia đình."
"Inbounds" = "Đầu vào"
"InboundsDesc" = "Thay đổi mẫu cấu hình để chấp nhận các máy khách cụ thể."
"Outbounds" = "Đầu ra"
@@ -524,6 +520,12 @@
"edit" = "Chỉnh sửa máy chủ"
"domains" = "Tên miền"
"expectIPs" = "Các IP Dự Kiến"
+"unexpectIPs" = "IP không mong muốn"
+"useSystemHosts" = "Sử dụng Hosts hệ thống"
+"useSystemHostsDesc" = "Sử dụng file hosts từ hệ thống đã cài đặt"
+"usePreset" = "Dùng mẫu"
+"dnsPresetTitle" = "Mẫu DNS"
+"dnsPresetFamily" = "Gia đình"
[pages.xray.fakedns]
"add" = "Thêm DNS giả"
diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml
index 9bceec7c..7069c825 100644
--- a/web/translation/translate.zh_CN.toml
+++ b/web/translation/translate.zh_CN.toml
@@ -402,7 +402,6 @@
"generalConfigsDesc" = "这些选项将决定常规配置"
"logConfigs" = "日志"
"logConfigsDesc" = "日志可能会影响服务器的性能,建议仅在需要时启用"
-"blockConfigs" = "防护屏蔽"
"blockConfigsDesc" = "这些选项将阻止用户连接到特定协议和网站"
"basicRouting" = "基本路由"
"blockConnectionsConfigsDesc" = "这些选项将根据特定的请求国家阻止流量。"
@@ -422,9 +421,6 @@
"RoutingStrategy" = "配置路由域策略"
"RoutingStrategyDesc" = "设置 DNS 解析的整体路由策略"
"Torrent" = "屏蔽 BitTorrent 协议"
-"TorrentDesc" = "禁止使用 BitTorrent"
-"Family" = "家庭保护"
-"FamilyDesc" = "屏蔽成人内容和恶意网站"
"Inbounds" = "入站规则"
"InboundsDesc" = "接受来自特定客户端的流量"
"Outbounds" = "出站规则"
@@ -524,6 +520,12 @@
"edit" = "编辑服务器"
"domains" = "域"
"expectIPs" = "预期 IP"
+"unexpectIPs" = "意外IP"
+"useSystemHosts" = "使用系统Hosts"
+"useSystemHostsDesc" = "使用已安装系统的hosts文件"
+"usePreset" = "使用模板"
+"dnsPresetTitle" = "DNS模板"
+"dnsPresetFamily" = "家庭"
[pages.xray.fakedns]
"add" = "添加假 DNS"
diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml
index e706ec3b..e933f4ce 100644
--- a/web/translation/translate.zh_TW.toml
+++ b/web/translation/translate.zh_TW.toml
@@ -404,7 +404,6 @@
"generalConfigsDesc" = "這些選項將決定常規配置"
"logConfigs" = "日誌"
"logConfigsDesc" = "日誌可能會影響伺服器的效能,建議僅在需要時啟用"
-"blockConfigs" = "防護遮蔽"
"blockConfigsDesc" = "這些選項將阻止使用者連線到特定協議和網站"
"basicRouting" = "基本路由"
"blockConnectionsConfigsDesc" = "這些選項將根據特定的請求國家阻止流量。"
@@ -424,9 +423,6 @@
"RoutingStrategy" = "配置路由域策略"
"RoutingStrategyDesc" = "設定 DNS 解析的整體路由策略"
"Torrent" = "遮蔽 BitTorrent 協議"
-"TorrentDesc" = "禁止使用 BitTorrent"
-"Family" = "家庭保護"
-"FamilyDesc" = "遮蔽成人內容和惡意網站"
"Inbounds" = "入站規則"
"InboundsDesc" = "接受來自特定客戶端的流量"
"Outbounds" = "出站規則"
@@ -526,6 +522,12 @@
"edit" = "編輯伺服器"
"domains" = "域"
"expectIPs" = "預期 IP"
+"unexpectIPs" = "意外IP"
+"useSystemHosts" = "使用系統Hosts"
+"useSystemHostsDesc" = "使用已安裝系統的hosts檔案"
+"usePreset" = "使用範本"
+"dnsPresetTitle" = "DNS範本"
+"dnsPresetFamily" = "家庭"
[pages.xray.fakedns]
"add" = "新增假 DNS"
diff --git a/x-ui.sh b/x-ui.sh
index 88e5a7bb..aecba2ea 100644
--- a/x-ui.sh
+++ b/x-ui.sh
@@ -474,7 +474,7 @@ enable_bbr() {
ubuntu | debian | armbian)
apt-get update && apt-get install -yqq --no-install-recommends ca-certificates
;;
- centos | almalinux | rocky | ol)
+ centos | rhel | almalinux | rocky | ol)
yum -y update && yum -y install ca-certificates
;;
fedora | amzn | virtuozzo)
@@ -995,7 +995,7 @@ ssl_cert_issue() {
ubuntu | debian | armbian)
apt update && apt install socat -y
;;
- centos | almalinux | rocky | ol)
+ centos | rhel | almalinux | rocky | ol)
yum -y update && yum -y install socat
;;
fedora | amzn | virtuozzo)
@@ -1511,7 +1511,7 @@ install_iplimit() {
debian | armbian)
apt update && apt install fail2ban -y
;;
- centos | almalinux | rocky | ol)
+ centos | rhel | almalinux | rocky | ol)
yum update -y && yum install epel-release -y
yum -y install fail2ban
;;
@@ -1591,7 +1591,7 @@ remove_iplimit() {
apt-get purge -y fail2ban -y
apt-get autoremove -y
;;
- centos | almalinux | rocky | ol)
+ centos | rhel | almalinux | rocky | ol)
yum remove fail2ban -y
yum autoremove -y
;;
diff --git a/xray/api.go b/xray/api.go
index 3a2dddd6..d68b1f96 100644
--- a/xray/api.go
+++ b/xray/api.go
@@ -6,6 +6,7 @@ import (
"fmt"
"regexp"
"time"
+ "math"
"x-ui/logger"
"x-ui/util/common"
@@ -32,7 +33,7 @@ type XrayAPI struct {
}
func (x *XrayAPI) Init(apiPort int) error {
- if apiPort <= 0 {
+ if apiPort <= 0 || apiPort > math.MaxUint16 {
return fmt.Errorf("invalid Xray API port: %d", apiPort)
}
diff --git a/xray/config.go b/xray/config.go
index 67ff7d95..a246b845 100644
--- a/xray/config.go
+++ b/xray/config.go
@@ -20,6 +20,7 @@ type Config struct {
FakeDNS json_util.RawMessage `json:"fakedns"`
Observatory json_util.RawMessage `json:"observatory"`
BurstObservatory json_util.RawMessage `json:"burstObservatory"`
+ Metrics json_util.RawMessage `json:"metrics"`
}
func (c *Config) Equals(other *Config) bool {
@@ -61,5 +62,8 @@ func (c *Config) Equals(other *Config) bool {
if !bytes.Equal(c.FakeDNS, other.FakeDNS) {
return false
}
+ if !bytes.Equal(c.Metrics, other.Metrics) {
+ return false
+ }
return true
}