diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 5a61e6bf..1cb45102 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -83,7 +83,7 @@ jobs:
cd x-ui/bin
# Download dependencies
- Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v1.8.23/"
+ Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v1.8.24/"
if [ "${{ matrix.platform }}" == "amd64" ]; then
wget ${Xray_URL}Xray-linux-64.zip
unzip Xray-linux-64.zip
diff --git a/DockerInit.sh b/DockerInit.sh
index 40468bf8..160719f3 100755
--- a/DockerInit.sh
+++ b/DockerInit.sh
@@ -27,7 +27,7 @@ case $1 in
esac
mkdir -p build/bin
cd build/bin
-wget "https://github.com/XTLS/Xray-core/releases/download/v1.8.23/Xray-linux-${ARCH}.zip"
+wget "https://github.com/XTLS/Xray-core/releases/download/v1.8.24/Xray-linux-${ARCH}.zip"
unzip "Xray-linux-${ARCH}.zip"
rm -f "Xray-linux-${ARCH}.zip" geoip.dat geosite.dat
mv xray "xray-linux-${FNAME}"
diff --git a/README.es_ES.md b/README.es_ES.md
index 339d872b..ded7d9f9 100644
--- a/README.es_ES.md
+++ b/README.es_ES.md
@@ -1,4 +1,4 @@
-[English](/README.md) | [汉语](/README.zh_Hans.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)
+[English](/README.md) | [中文](/README.zh_CN.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)

@@ -32,10 +32,10 @@ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.
## Instalar una Versión Personalizada
-Para instalar la versión deseada, agrega la versión al final del comando de instalación. Por ejemplo, ver `v2.3.13`:
+Para instalar la versión deseada, agrega la versión al final del comando de instalación. Por ejemplo, ver `v2.3.14`:
```
-bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.13
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.14
```
## Certificado SSL
@@ -177,6 +177,41 @@ eliminar 3x-ui de docker
+## Configuración de Nginx
+
+ Haga clic aquí para configurar el proxy inverso
+
+#### Proxy inverso Nginx
+```nginx
+location / {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
+#### Nginx sub-path
+- EAsegúrese de que la "Ruta Raíz de la URL del Panel" en la configuración del panel `/sub` es la misma.
+- El `url` en la configuración del panel debe terminar con `/`.
+
+```nginx
+location /sub {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
## SO Recomendados
@@ -259,7 +294,7 @@ Nuestra plataforma ofrece compatibilidad con una amplia gama de arquitecturas y
- http://domain:2053/panel
- **Ruta del Panel Web con Implementación de SSL:**
- https://domain:2053/panel
-
+
## Configuración WARP
@@ -313,9 +348,9 @@ Si deseas usar enrutamiento a WARP antes de la versión v2.1.0, sigue los pasos
1. Usa el comando `x-ui` dentro de la terminal.
2. Selecciona `Gestión de Límite de IP`.
3. Elige las opciones apropiadas según tus necesidades.
-
+
- asegúrate de tener ./access.log en tu Configuración de Xray después de la v2.1.3 tenemos una opción para ello
-
+
```sh
"log": {
"access": "./access.log",
@@ -373,7 +408,7 @@ El panel web admite tráfico diario, inicio de sesión en el panel, copia de seg
- Inicia [Botfather](https://t.me/BotFather) en tu cuenta de Telegram:

-
+
- Crea un nuevo bot usando el comando /newbot: Te hará 2 preguntas, Un nombre y un nombre de usuario para tu bot. Ten en cuenta que el nombre de usuario debe terminar con la palabra "bot".

diff --git a/README.md b/README.md
index 6d6a19c8..0bb94698 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-[English](/README.md) | [汉语](/README.zh_Hans.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)
+[English](/README.md) | [中文](/README.zh_CN.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)

@@ -32,10 +32,10 @@ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.
## Install Custom Version
-To install your desired version, add the version to the end of the installation command. e.g., ver `v2.3.13`:
+To install your desired version, add the version to the end of the installation command. e.g., ver `v2.3.14`:
```
-bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.13
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.14
```
## SSL Certificate
@@ -202,6 +202,41 @@ systemctl restart x-ui
+## Nginx Settings
+
+ Click for Reverse Proxy Configuration
+
+#### Nginx Reverse Proxy
+```nginx
+location / {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
+#### Nginx sub-path
+- Ensure that the "URI Path" in the `/sub` panel settings is the same.
+- The `url` in the panel settings needs to end with `/`.
+
+```nginx
+location /sub {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
## Recommended OS
@@ -248,7 +283,7 @@ Our platform offers compatibility with a diverse range of architectures and devi
- Russian
- Vietnamese
- Spanish
-- Indonesian
+- Indonesian
- Ukrainian
- Turkish
@@ -363,7 +398,7 @@ To enable the IP Limit functionality, you need to install `fail2ban` and its req
- **Uninstall Fail2ban:** Uninstall Fail2ban with configuration.
3. Add a path for the access log on the panel by setting `Xray Configs/log/Access log` to `./access.log` then save and restart xray.
-
+
- **For versions before `v2.1.3`:**
- You need to set the access log path manually in your Xray configuration:
@@ -415,19 +450,19 @@ The web panel supports daily traffic, panel login, database backup, system statu
- Threshold for Expiration time and Traffic to report in advance
- Support client report menu if client's telegram username added to the user's configurations
- Support telegram traffic report searched with UUID (VMESS/VLESS) or Password (TROJAN) - anonymously
-- Menu based bot
-- Search client by email ( only admin )
+- Menu-based bot
+- Search client by email (only admin)
- Check all inbounds
- Check server status
- Check depleted users
- Receive backup by request and in periodic reports
-- Multi language bot
+- Multi-language bot
### Setting up Telegram bot
- Start [Botfather](https://t.me/BotFather) in your Telegram account:

-
+
- Create a new Bot using /newbot command: It will ask you 2 questions, A name and a username for your bot. Note that the username has to end with the word "bot".

diff --git a/README.ru_RU.md b/README.ru_RU.md
index 60c4a2a9..8f83be03 100644
--- a/README.ru_RU.md
+++ b/README.ru_RU.md
@@ -1,4 +1,4 @@
-[English](/README.md) | [汉语](/README.zh_Hans.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)
+[English](/README.md) | [中文](/README.zh_CN.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)

@@ -12,7 +12,7 @@
> **Отказ от ответственности:** Этот проект предназначен только для личного обучения и общения. Пожалуйста, не используйте его в незаконных целях и не применяйте в производственной среде.
-**Если этот проект оказался полезным для вас, вы можете оценить его:** :star2:
+**Если этот проект оказался полезным для вас, вы можете оценить его, постативив звёздочку** :star2:
@@ -30,30 +30,30 @@
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
```
-## Установка пользовательской версии
+## Установка определённой версии
-Чтобы установить нужную вам версию, добавьте номер версии в конец команды установки, например, версия `v2.3.13`:
+Чтобы установить нужную вам версию, добавьте номер версии в конец команды установки. Например, `v2.3.14`:
```
-bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.13
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.14
```
## SSL Сертификат
- Нажмите для получения информации о SSL сертификате
+ Нажмите для получения информации об SSL сертификате
### ACME
Для управления SSL сертификатами с помощью ACME:
1. Убедитесь, что ваш домен правильно настроен и указывает на сервер.
-2. Выполните команду `x-ui` в терминале, затем выберите «Управление SSL сертификатами».
+2. Выполните команду `x-ui` в терминале, затем выберите `SSL Certificate Management`.
3. Вам будут предложены следующие опции:
- - **Получить SSL:** Получить SSL сертификаты.
- - **Отозвать:** Отозвать существующие SSL сертификаты.
- - **Принудительное обновление:** Принудительно обновить SSL сертификаты.
+ - **Get SSL:** Получить SSL сертификаты.
+ - **Revoke:** Отозвать существующие SSL сертификаты.
+ - **Force Renew:** Принудительно превыпустить SSL сертификаты.
### Certbot
@@ -61,7 +61,7 @@ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.
```sh
apt-get install certbot -y
-certbot certonly --standalone --agree-tos --register-unsafely-without-email -d yourdomain.com
+certbot certonly --standalone --agree-tos --register-unsafely-without-email -d вашдомен.com
certbot renew --dry-run
```
@@ -69,20 +69,20 @@ certbot renew --dry-run
Скрипт управления включает встроенное приложение для получения SSL сертификата через Cloudflare. Чтобы использовать этот скрипт для запроса сертификата, вам потребуется следующее:
-- Электронная почта, зарегистрированная в Cloudflare
+- Email, зарегистрированный в Cloudflare
- Глобальный API-ключ Cloudflare
-- Доменное имя должно быть разрешено на текущий сервер через Cloudflare
+- Доменное имя должно указывать на текущий сервер через Cloudflare
**Как получить глобальный API-ключ Cloudflare:**
-1. Выполните команду `x-ui` в терминале, затем выберите «Cloudflare SSL Certificate».
+1. Выполните команду `x-ui` в терминале, затем выберите `Cloudflare SSL Certificate`.
2. Посетите ссылку: [Cloudflare API Tokens](https://dash.cloudflare.com/profile/api-tokens).
3. Нажмите на "View Global API Key" (см. скриншот ниже):

-4. Возможно, вам потребуется повторно пройти аутентификацию. После этого ключ API будет отображен (см. скриншот ниже):
+4. Возможно, вам потребуется повторно пройти аутентификацию. После этого ключ API будет отображён (см. скриншот ниже):

-При использовании просто введите ваше `доменное имя`, `электронную почту` и `API KEY`. Схема приведена ниже:
+При использовании просто введите ваше `доменное имя`, `email` и `API-ключ`. Схема приведена ниже:

@@ -94,7 +94,7 @@ certbot renew --dry-run
#### Использование
-1. Чтобы скачать последнюю версию сжатого пакета напрямую на ваш сервер, выполните следующую команду:
+1. Чтобы скачать последнюю версию архива напрямую на ваш сервер, выполните следующую команду:
```sh
ARCH=$(uname -m)
@@ -113,7 +113,7 @@ esac
wget https://github.com/MHSanaei/3x-ui/releases/latest/download/x-ui-linux-${XUI_ARCH}.tar.gz
```
-2. После загрузки сжатого пакета выполните следующие команды для установки или обновления x-ui:
+2. После загрузки архива выполните следующие команды для установки или обновления x-ui:
```sh
ARCH=$(uname -m)
@@ -155,7 +155,7 @@ systemctl restart x-ui
bash <(curl -sSL https://get.docker.com)
```
-2. **Клонируйте репозиторий проекта:**
+2. **Склонируйте репозиторий проекта:**
```sh
git clone https://github.com/MHSanaei/3x-ui.git
@@ -168,7 +168,7 @@ systemctl restart x-ui
docker compose up -d
```
- **OR**
+ **ИЛИ**
```sh
docker run -itd \
@@ -181,7 +181,7 @@ systemctl restart x-ui
ghcr.io/mhsanaei/3x-ui:latest
```
-4. **Обновите до последней версии:**
+4. **Обновление до последней версии:**
```sh
cd 3x-ui
@@ -190,7 +190,7 @@ systemctl restart x-ui
docker compose up -d
```
-5. **Удалите 3x-ui из Docker:**
+5. **Удаление 3x-ui из Docker:**
```sh
docker stop 3x-ui
@@ -201,8 +201,43 @@ systemctl restart x-ui
+## Настройки Nginx
+
+ Нажмите чтобы просмотреть конфигурацию обратного прокси-сервера
-## Рекомендуемая ОС
+#### Обратный прокси-сервер Nginx
+```nginx
+location / {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
+#### Nginx sub-path
+- Убедитесь, что "корневой путь URL адреса панели" в настройках панели и `/sub` совпадают.
+- В настройках панели `url` должен заканчиваться на `/`.
+
+```nginx
+location /sub {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
+
+## Рекомендуемые ОС
- Ubuntu 20.04+
- Debian 11+
@@ -232,9 +267,9 @@ systemctl restart x-ui
- **armv7 / arm / arm32**: Служит архитектурой для старых мобильных и встроенных устройств, оставаясь широко используемой в таких устройствах, как Orange Pi Zero LTS, Orange Pi PC Plus, Raspberry Pi 2 и других.
-- **armv6 / arm / arm32**: Ориентирована на очень старые встроенные устройства, эта архитектура, хотя и менее распространенная, все еще используется. Например, такие устройства, как Raspberry Pi 1, Raspberry Pi Zero/Zero W, полагаются на эту архитектуру.
+- **armv6 / arm / arm32**: Ориентирована на очень старые встроенные устройства, эта архитектура, хотя и менее распространенная, всё ещё используется. Например, такие устройства, как Raspberry Pi 1, Raspberry Pi Zero/Zero W, полагаются на эту архитектуру.
-- **armv5 / arm / arm32**: Более старая архитектура, ассоциируемая с ранними встроенными системами, сегодня менее распространена, но все еще может быть найдена в устаревших устройствах, таких как ранние версии Raspberry Pi и некоторые старые смартфоны.
+- **armv5 / arm / arm32**: Более старая архитектура, ассоциируемая с ранними встроенными системами, сегодня менее распространена, но всё ещё может быть найдена в устаревших устройствах, таких как ранние версии Raspberry Pi и некоторые старые смартфоны.
- **s390x**: Эта архитектура обычно используется в мейнфреймах IBM и обеспечивает высокую производительность и надежность для корпоративных рабочих нагрузок.
@@ -247,24 +282,24 @@ systemctl restart x-ui
- Русский
- Вьетнамский
- Испанский
-- Индонезийский
+- Индонезийский
- Украинский
- Турецкий
-## Функции
+## Возможности
- Мониторинг состояния системы
- Поиск по всем входящим подключениям и клиентам
-- Темная/светлая тема
+- Тёмная/светлая тема
- Поддержка нескольких пользователей и протоколов
- Поддержка протоколов, включая VMESS, VLESS, Trojan, Shadowsocks, Dokodemo-door, Socks, HTTP, WireGuard
- Поддержка протоколов XTLS, включая RPRX-Direct, Vision, REALITY
- Статистика трафика, ограничение трафика, ограничение по времени истечения
- Настраиваемые шаблоны конфигурации Xray
-- Поддержка панели доступа через HTTPS (самостоятельно предоставленное доменное имя + SSL сертификат)
-- Поддержка установки SSL-сертификата в один клик и автоматического обновления
-- Для получения более продвинутых настроек обратитесь к панели
-- Исправлены маршруты API (настройка пользователя будет создана с API)
+- Поддержка HTTPS доступа к панели (ваше доменное имя + SSL сертификат)
+- Поддержка установки SSL-сертификата в один клик и автоматического перевыпуска
+- Для получения более продвинутых настроек обращайтесь к панели
+- Исправляет маршруты API (настройка пользователя будет создана через API)
- Поддержка изменения конфигураций по различным элементам, предоставленным в панели
- Поддержка экспорта/импорта базы данных из панели
@@ -286,12 +321,12 @@ systemctl restart x-ui
- **Путь к базе данных:**
- `/etc/x-ui/x-ui.db`
-### Веб-базовый путь
+### Webbasepath
-1. **Сбросить веб-базовый путь:**
+1. **Сбросить webbasepath:**
- Откройте терминал.
- Выполните команду `x-ui`.
- - Выберите опцию `Сбросить веб-базовый путь`.
+ - Выберите опцию `Reset Web Base Path`.
2. **Генерация или настройка пути:**
- Путь будет случайным образом сгенерирован, или вы можете ввести пользовательский путь.
@@ -303,8 +338,8 @@ systemctl restart x-ui
- Для повышения безопасности используйте длинное случайное слово в структуре вашего URL.
**Примеры:**
-- `http://ip:port/*webbasepath*/panel`
-- `http://domain:port/*webbasepath*/panel`
+- `http://ip_адрес:порт/*webbasepath*/panel`
+- `http://домен:порт/*webbasepath*/panel`
@@ -321,12 +356,12 @@ WARP встроен, и дополнительная установка не т
**Для версий до `v2.1.0`:**
-1. Выполните команду `x-ui` в терминале, затем выберите «Управление WARP».
+1. Выполните команду `x-ui` в терминале, затем выберите `WARP Management`.
2. Вам будут предложены следующие опции:
- - **Тип учетной записи (free, plus, team):** Выберите соответствующий тип учетной записи.
- - **Включить/Выключить WireProxy:** Включите или отключите WireProxy.
- - **Удалить WARP:** Удалите приложение WARP.
+ - **Account Type (free, plus, team):** Выбрать соответствующий тип учетной записи.
+ - **Enable/Disable WireProxy:** Включить или отключить WireProxy.
+ - **Uninstall WARP:** Удалить приложение WARP.
3. Настройте параметры по мере необходимости в панели.
@@ -348,15 +383,15 @@ WARP встроен, и дополнительная установка не т
Чтобы включить функциональность ограничения IP, вам нужно установить `fail2ban` и его необходимые файлы, выполнив следующие шаги:
-1. Выполните команду `x-ui` в терминале, затем выберите «Управление ограничением IP».
+1. Выполните команду `x-ui` в терминале, затем выберите `IP Limit Management`.
2. Вам будут предложены следующие опции:
- - **Изменить длительность блокировки:** Отрегулируйте длительность блокировок.
- - **Разблокировать всех:** Снять все текущие блокировки.
- - **Проверить логи:** Просмотреть логи.
- - **Статус Fail2ban:** Проверьте статус `fail2ban`.
- - **Перезапустить Fail2ban:** Перезапустите службу `fail2ban`.
- - **Удалить Fail2ban:** Удалите Fail2ban с конфигурацией.
+ - **Change Ban Duration:** Отрегулировать длительность блокировок.
+ - **Unban Everyone:** Снять все текущие блокировки.
+ - **Check Logs:** Просмотреть логи.
+ - **Fail2ban Status:** Проверить статус `fail2ban`.
+ - **Restart Fail2ban:** Перезапустить службу `fail2ban`.
+ - **Uninstall Fail2ban:** Удалить Fail2ban с его конфигурацией.
3. Добавьте путь к логам доступа в панели, установив `Xray Configs/log/Access log` в `./access.log`, затем сохраните и перезапустите xray.
@@ -379,11 +414,11 @@ WARP встроен, и дополнительная установка не т
## Телеграм-бот
- Нажмите для получения информации о Телеграм-боте
+ Нажмите для получения информации о телеграм-боте
#### Использование
-Веб-панель поддерживает уведомления и функции, такие как ежедневный трафик, вход в панель, резервное копирование базы данных, состояние системы, информация о клиентах и другие, через Телеграм-бота. Чтобы использовать бота, вам нужно настроить параметры, связанные с ботом, в панели, включая:
+Веб-панель поддерживает уведомления и функции, такие как ежедневный трафик, вход в панель, резервное копирование базы данных, состояние системы, информация о клиентах и другие, через телеграм-бота. Чтобы использовать бота, вам нужно настроить параметры, связанные с ботом, в панели, включая:
- Токен Telegram
- ID чата админа(-ов)
@@ -391,85 +426,85 @@ WARP встроен, и дополнительная установка не т
- Уведомления о дате истечения
- Уведомления о лимите трафика
- Резервное копирование базы данных
-- Уведомления о загрузке ЦП
+- Уведомления о загрузке CPU
-**Синтаксис примеров:**
+**Примеры синтаксиса:**
-- `30 * * * * *` - Уведомление на 30-й секунде каждого часа
-- `0 */10 * * * *` - Уведомление на первой секунде каждых 10 минут
+- `30 * * * * *` - Уведомлять на 30-й секунде каждого часа
+- `0 */10 * * * *` - Уведомлять на первой секунде каждых 10 минут
- `@hourly` - Ежечасное уведомление
-- `@daily` - Ежедневное уведомление (00:00 утра)
+- `@daily` - Ежедневное уведомление (в 00:00)
- `@weekly` - Еженедельное уведомление
-- `@every 8h` - Уведомление каждые 8 часов
+- `@every 8h` - Уведомлять каждые 8 часов
-### Возможности Телеграм-бота
+### Возможности телеграм-бота
- Периодические отчеты
- Уведомления о входе
-- Уведомления о пороге ЦП
+- Уведомления о пороге CPU
- Уведомления о времени истечения и трафике заранее
-- Поддержка меню отчета о клиентах, если имя пользователя клиента добавлено в конфигурацию пользователя
+- Поддерживает меню отчетов клиента, если имя пользователя телеграм клиента добавлено в конфигурации пользователя
- Поддержка отчета о трафике через Telegram, поиск по UUID (VMESS/VLESS) или паролю (TROJAN) - анонимно
-- Меню-бот
-- Поиск клиента по электронной почте (только администратор)
+- Бот, основанный на меню
+- Поиск клиента по email (только администратор)
- Проверка всех входящих соединений
- Проверка состояния сервера
- Проверка истекших пользователей
-- Получение резервных копий по запросу и в периодических отчетах
+- Получение резервных копий по запросу и в периодических отчётах
- Многоязычный бот
-### Настройка Телеграм-бота
+### Настройка телеграм-бота
-- Начните [Botfather](https://t.me/BotFather) в вашем аккаунте Telegram:
+- Запустить [Botfather](https://t.me/BotFather) в вашем аккаунте Telegram:

-
-- Создайте новый бот с помощью команды /newbot: Вас попросят ввести 2 вопроса, имя и имя пользователя для вашего бота. Обратите внимание, что имя пользователя должно заканчиваться на слово "bot".
+
+- Создайте нового бота с помощью команды /newbot: у вас спросят 2 вопроса: отображаемое имя и имя пользователя для вашего бота. Обратите внимание, что имя пользователя должно заканчиваться на слово "bot".

- Запустите созданного бота. Ссылку на вашего бота можно найти здесь.

-- Перейдите в панель и настройте параметры Телеграм-бота следующим образом:
+- Перейдите в панель и настройте параметры телеграм-бота следующим образом:

Введите токен вашего бота в поле ввода номер 3.
Введите ID пользователя в поле ввода номер 4. Telegram-аккаунты с этим ID будут администраторами бота. (Вы можете ввести несколько ID, разделяя их запятой)
-- Как получить ID пользователя Telegram? Используйте этот [бот](https://t.me/useridinfobot), начните бота, и он предоставит вам ID пользователя Telegram.
+- Как получить ID пользователя Telegram? Используйте этого [бота](https://t.me/useridinfobot). Запустите бота, и он предоставит вам ваше ID пользователя Telegram.

-## API маршруты
+## Маршруты API
Нажмите для получения информации о маршрутах API
#### Использование
-- `/login` с `POST` данными пользователя: `{username: '', password: ''}` для входа
-- `/panel/api/inbounds` базовый маршрут для следующих действий:
+- `/login` с `POST`-данными: `{username: '', password: ''}` для входа
+- `/panel/api/inbounds` это базовый путь для следующих действий:
-| Метод | Путь | Действие
-| :---: | -----------------------------------| -------------------------------------------
+| Метод | Путь | Действие
+| :----: | -----------------------------------| -------------------------------------------
| `GET` | `"/list"` | Получить все входящие соединения
| `GET` | `"/get/:id"` | Получить входящее соединение с inbound.id
-| `GET` | `"/getClientTraffics/:email"` | Получить трафик клиента по электронной почте
+| `GET` | `"/getClientTraffics/:email"` | Получить трафик клиента по email
| `GET` | `"/getClientTrafficsById/:id"` | Получить трафик клиента по ID
-| `GET` | `"/createbackup"` | Бот Telegram отправляет резервную копию администраторам
+| `GET` | `"/createbackup"` | Telegram-бот отправит резервную копию администраторам
| `POST` | `"/add"` | Добавить входящее соединение
| `POST` | `"/del/:id"` | Удалить входящее соединение
| `POST` | `"/update/:id"` | Обновить входящее соединение
| `POST` | `"/clientIps/:email"` | IP-адрес клиента
-| `POST` | `"/clearClientIps/:email"` | Очистить IP-адрес клиента
+| `POST` | `"/clearClientIps/:email"` | Очистить IP-адреса клиента
| `POST` | `"/addClient"` | Добавить клиента к входящему соединению
| `POST` | `"/:id/delClient/:clientId"` | Удалить клиента по clientId\*
| `POST` | `"/updateClient/:clientId"` | Обновить клиента по clientId\*
| `POST` | `"/:id/resetClientTraffic/:email"` | Сбросить трафик клиента
| `POST` | `"/resetAllTraffics"` | Сбросить трафик всех входящих соединений
| `POST` | `"/resetAllClientTraffics/:id"` | Сбросить трафик всех клиентов в входящем соединении
-| `POST` | `"/delDepletedClients/:id"` | Удалить истекших клиентов в входящем соединении (-1: все)
-| `POST` | `"/onlines"` | Получить онлайн пользователей (список электронных почт)
+| `POST` | `"/delDepletedClients/:id"` | Удалить истекших клиентов в входящем соединении (-1: всех)
+| `POST` | `"/onlines"` | Получить пользователей, которые онлайн (список email'ов)
\*- Поле `clientId` должно быть заполнено следующим образом:
@@ -484,7 +519,7 @@ WARP встроен, и дополнительная установка не т
- [
](https://app.getpostman.com/run-collection/16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415?action=collection%2Ffork&source=rip_markdown&collection-url=entityId%3D16802678-1a4c9270-ac77-40ed-959a-7aa56dc4a415%26entityType%3Dcollection%26workspaceId%3D2cd38c01-c851-4a15-a972-f181c23359d9)
-## Переменные Среды
+## Переменные среды
Нажмите для получения информации о переменных среды
@@ -521,11 +556,11 @@ XUI_BIN_FOLDER="bin" XUI_DB_FOLDER="/etc/x-ui" go build main.go
- [alireza0](https://github.com/alireza0/)
-## Подтверждение
+## Благодарности
- [Iran v2ray rules](https://github.com/chocolate4u/Iran-v2ray-rules) (License: **GPL-3.0**): _Enhanced v2ray/xray and v2ray/xray-clients routing rules with built-in Iranian domains and a focus on security and adblocking._
- [Vietnam Adblock rules](https://github.com/vuong2023/vn-v2ray-rules) (License: **GPL-3.0**): _A hosted domain hosted in Vietnam and blocklist with the most efficiency for Vietnamese._
-## Звездочеты со временем
+## Число звёзд со временем
[](https://starchart.cc/MHSanaei/3x-ui)
diff --git a/README.zh_Hans.md b/README.zh_CN.md
similarity index 92%
rename from README.zh_Hans.md
rename to README.zh_CN.md
index f00970dc..b320037c 100644
--- a/README.zh_Hans.md
+++ b/README.zh_CN.md
@@ -1,4 +1,4 @@
-[English](/README.md) | [汉语](/README.zh_Hans.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)
+[English](/README.md) | [中文](/README.zh_CN.md) | [Español](/README.es_ES.md) | [Русский](/README.ru_RU.md)

@@ -32,10 +32,10 @@ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.
## 安装指定版本
-要安装所需的版本,请将该版本添加到安装命令的末尾。 e.g., ver `v2.3.13`:
+要安装所需的版本,请将该版本添加到安装命令的末尾。 e.g., ver `v2.3.14`:
```
-bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.13
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.3.14
```
## SSL 认证
@@ -166,7 +166,7 @@ systemctl restart x-ui
docker compose up -d
```
-从Docker中删除3x-ui
+从Docker中删除3x-ui
```sh
docker stop 3x-ui
@@ -178,6 +178,42 @@ systemctl restart x-ui
+## Nginx 设置
+
+ 点击查看 反向代理配置
+
+#### Nginx反向代理
+```nginx
+location / {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
+#### Nginx子路径
+- 确保 `/sub` 面板设置中的"面板url根路径"一致
+- 面板设置中的 `url` 需要以 `/` 结尾
+
+```nginx
+location /sub {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header Range $http_range;
+ proxy_set_header If-Range $http_if_range;
+ proxy_redirect off;
+ proxy_pass http://127.0.0.1:2053;
+}
+```
+
+
## 建议使用的操作系统
- Ubuntu 20.04+
@@ -258,7 +294,7 @@ systemctl restart x-ui
- http://domain:2053/panel
- **面板链接(有SSL):**
- https://domain:2053/panel
-
+
## WARP 配置
@@ -312,9 +348,9 @@ systemctl restart x-ui
1. 使用面板内置的 `x-ui` 指令
2. 选择 `IP Limit Management`.
3. 根据您的需要选择合适的选项。
-
+
- 确保您的 Xray 配置上有 ./access.log 。在 v2.1.3 之后,我们有一个选项。
-
+
```sh
"log": {
"access": "./access.log",
@@ -372,7 +408,7 @@ Web 面板通过 Telegram Bot 支持每日流量、面板登录、数据库备
- 与 [Botfather](https://t.me/BotFather) 对话:

-
+
- 使用 /newbot 创建新机器人:你需要提供机器人名称以及用户名,注意名称中末尾要包含“bot”

diff --git a/config/version b/config/version
index da924f5d..ac805d3e 100644
--- a/config/version
+++ b/config/version
@@ -1 +1 @@
-2.3.13
\ No newline at end of file
+2.3.14
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 93c816b3..a0071abf 100644
--- a/go.mod
+++ b/go.mod
@@ -14,10 +14,10 @@ require (
github.com/robfig/cron/v3 v3.0.1
github.com/shirou/gopsutil/v4 v4.24.7
github.com/valyala/fasthttp v1.55.0
- github.com/xtls/xray-core v1.8.23
+ github.com/xtls/xray-core v1.8.24
go.uber.org/atomic v1.11.0
golang.org/x/text v0.17.0
- google.golang.org/grpc v1.65.0
+ google.golang.org/grpc v1.66.0
gorm.io/driver/sqlite v1.5.6
gorm.io/gorm v1.25.11
)
@@ -40,7 +40,7 @@ require (
github.com/go-playground/validator/v10 v10.22.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/google/btree v1.1.3 // indirect
- github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
+ github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25 // indirect
github.com/gorilla/context v1.1.2 // indirect
github.com/gorilla/securecookie v1.1.2 // indirect
github.com/gorilla/sessions v1.4.0 // indirect
@@ -57,7 +57,7 @@ require (
github.com/mattn/go-sqlite3 v1.14.22 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
- github.com/onsi/ginkgo/v2 v2.20.1 // indirect
+ github.com/onsi/ginkgo/v2 v2.20.2 // indirect
github.com/pires/go-proxyproto v0.7.0 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
diff --git a/go.sum b/go.sum
index 17b8bf0b..e5169795 100644
--- a/go.sum
+++ b/go.sum
@@ -98,8 +98,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
-github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
+github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25 h1:sEDPKUw6iPjczdu33njxFjO6tYa9bfc0z/QyB/zSsBw=
+github.com/google/pprof v0.0.0-20240829160300-da1f7e9f2b25/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@@ -150,8 +150,8 @@ github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs=
-github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ=
+github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
+github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -164,8 +164,8 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM=
github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4=
-github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo=
-github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
+github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
+github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=
@@ -275,8 +275,8 @@ github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1Y
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
github.com/xtls/reality v0.0.0-20240712055506-48f0b2d5ed6d h1:+B97uD9uHLgAAulhigmys4BVwZZypzK7gPN3WtpgRJg=
github.com/xtls/reality v0.0.0-20240712055506-48f0b2d5ed6d/go.mod h1:dm4y/1QwzjGaK17ofi0Vs6NpKAHegZky8qk6J2JJZAE=
-github.com/xtls/xray-core v1.8.23 h1:A8Wr50ildMYLpaNu3EiK+Stg/tps6i0h7z5Hr4f9H2k=
-github.com/xtls/xray-core v1.8.23/go.mod h1:0CwyMPNA5Cs+ukPXHbYQGgne/ug0PuXOSVqBu7zyXOc=
+github.com/xtls/xray-core v1.8.24 h1:Y2NumdlnJ9C9gvh1Ivs2+73ui5XQgB70wZXYCiI9DyY=
+github.com/xtls/xray-core v1.8.24/go.mod h1:cWIOI6iBBOsB0HHU9PGhaiBhaMPfiktUjwA0IWolWJc=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
@@ -374,8 +374,8 @@ google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmE
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
-google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
+google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c=
+google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/sub/sub.go b/sub/sub.go
index 47b6158c..a8a20868 100644
--- a/sub/sub.go
+++ b/sub/sub.go
@@ -92,6 +92,11 @@ func (s *Server) initRouter() (*gin.Engine, error) {
SubJsonFragment = ""
}
+ SubJsonNoise, err := s.settingService.GetSubJsonNoise()
+ if err != nil {
+ SubJsonNoise = ""
+ }
+
SubJsonMux, err := s.settingService.GetSubJsonMux()
if err != nil {
SubJsonMux = ""
@@ -106,7 +111,7 @@ func (s *Server) initRouter() (*gin.Engine, error) {
s.sub = NewSUBController(
g, LinksPath, JsonPath, Encrypt, ShowInfo, RemarkModel, SubUpdates,
- SubJsonFragment, SubJsonMux, SubJsonRules)
+ SubJsonFragment, SubJsonNoise, SubJsonMux, SubJsonRules)
return engine, nil
}
diff --git a/sub/subController.go b/sub/subController.go
index 4f23c424..9afbc8da 100644
--- a/sub/subController.go
+++ b/sub/subController.go
@@ -27,6 +27,7 @@ func NewSUBController(
rModel string,
update string,
jsonFragment string,
+ jsonNoise string,
jsonMux string,
jsonRules string,
) *SUBController {
@@ -38,7 +39,7 @@ func NewSUBController(
updateInterval: update,
subService: sub,
- subJsonService: NewSubJsonService(jsonFragment, jsonMux, jsonRules, sub),
+ subJsonService: NewSubJsonService(jsonFragment, jsonNoise, jsonMux, jsonRules, sub),
}
a.initRouter(g)
return a
diff --git a/sub/subJsonService.go b/sub/subJsonService.go
index 8d90876f..cbda594a 100644
--- a/sub/subJsonService.go
+++ b/sub/subJsonService.go
@@ -21,13 +21,14 @@ type SubJsonService struct {
configJson map[string]interface{}
defaultOutbounds []json_util.RawMessage
fragment string
+ noise string
mux string
inboundService service.InboundService
SubService *SubService
}
-func NewSubJsonService(fragment string, mux string, rules string, subService *SubService) *SubJsonService {
+func NewSubJsonService(fragment string, noise string, mux string, rules string, subService *SubService) *SubJsonService {
var configJson map[string]interface{}
var defaultOutbounds []json_util.RawMessage
json.Unmarshal([]byte(defaultJson), &configJson)
@@ -52,10 +53,15 @@ func NewSubJsonService(fragment string, mux string, rules string, subService *Su
defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(fragment))
}
+ if noise != "" {
+ defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(noise))
+ }
+
return &SubJsonService{
configJson: configJson,
defaultOutbounds: defaultOutbounds,
fragment: fragment,
+ noise: noise,
mux: mux,
SubService: subService,
}
diff --git a/web/assets/js/langs.js b/web/assets/js/langs.js
index 17bef741..218c02b0 100644
--- a/web/assets/js/langs.js
+++ b/web/assets/js/langs.js
@@ -10,8 +10,8 @@ const supportLangs = [
icon: '🇮🇷',
},
{
- name: '汉语',
- value: 'zh-Hans',
+ name: '中文',
+ value: 'zh-CN',
icon: '🇨🇳',
},
{
diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js
index f1909552..5c019a3c 100644
--- a/web/assets/js/model/outbound.js
+++ b/web/assets/js/model/outbound.js
@@ -861,23 +861,34 @@ Outbound.Settings = class extends CommonClass {
}
};
Outbound.FreedomSettings = class extends CommonClass {
- constructor(domainStrategy = '', fragment = {}) {
+ constructor(
+ domainStrategy = '',
+ timeout = '',
+ fragment = {},
+ noise = {}
+ ) {
super();
this.domainStrategy = domainStrategy;
+ this.timeout = timeout;
this.fragment = fragment;
+ this.noise = noise;
}
static fromJson(json = {}) {
return new Outbound.FreedomSettings(
json.domainStrategy,
+ json.timeout,
json.fragment ? Outbound.FreedomSettings.Fragment.fromJson(json.fragment) : undefined,
+ json.noise ? Outbound.FreedomSettings.Noise.fromJson(json.noise) : undefined,
);
}
toJson() {
return {
domainStrategy: ObjectUtil.isEmpty(this.domainStrategy) ? undefined : this.domainStrategy,
+ timeout: this.timeout,
fragment: Object.keys(this.fragment).length === 0 ? undefined : this.fragment,
+ noise: Object.keys(this.noise).length === 0 ? undefined : this.noise,
};
}
};
@@ -897,6 +908,21 @@ Outbound.FreedomSettings.Fragment = class extends CommonClass {
);
}
};
+Outbound.FreedomSettings.Noise = class extends CommonClass {
+ constructor(packet = '', delay = '') {
+ super();
+ this.packet = packet;
+ this.delay = delay;
+ }
+
+ static fromJson(json = {}) {
+ return new Outbound.FreedomSettings.Noise(
+ json.packet,
+ json.delay,
+ );
+ }
+};
+
Outbound.BlackholeSettings = class extends CommonClass {
constructor(type) {
super();
diff --git a/web/assets/js/model/setting.js b/web/assets/js/model/setting.js
index 607fd069..2dea875b 100644
--- a/web/assets/js/model/setting.js
+++ b/web/assets/js/model/setting.js
@@ -38,6 +38,7 @@ class AllSetting {
this.subURI = "";
this.subJsonURI = "";
this.subJsonFragment = "";
+ this.subJsonNoise = "";
this.subJsonMux = "";
this.subJsonRules = "";
diff --git a/web/entity/entity.go b/web/entity/entity.go
index 533fe973..ae11d614 100644
--- a/web/entity/entity.go
+++ b/web/entity/entity.go
@@ -52,6 +52,7 @@ type AllSetting struct {
SubJsonPath string `json:"subJsonPath" form:"subJsonPath"`
SubJsonURI string `json:"subJsonURI" form:"subJsonURI"`
SubJsonFragment string `json:"subJsonFragment" form:"subJsonFragment"`
+ SubJsonNoise string `json:"subJsonNoise" form:"subJsonNoise"`
SubJsonMux string `json:"subJsonMux" form:"subJsonMux"`
SubJsonRules string `json:"subJsonRules" form:"subJsonRules"`
Datepicker string `json:"datepicker" form:"datepicker"`
diff --git a/web/html/login.html b/web/html/login.html
index ae6bfde5..102e4856 100644
--- a/web/html/login.html
+++ b/web/html/login.html
@@ -416,19 +416,19 @@
-
-
-
diff --git a/web/html/xui/component/password.html b/web/html/xui/component/password.html
index 13dbfb51..37e4c793 100644
--- a/web/html/xui/component/password.html
+++ b/web/html/xui/component/password.html
@@ -1,8 +1,10 @@
{{define "component/passwordInput"}}
+ :placeholder="placeholder"
+ :autocomplete="autocomplete"
+ :name="name"
+ @input="$emit('input', $event.target.value)">
@@ -18,7 +20,7 @@
{{define "component/password"}}