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)

Image

@@ -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: ![Botfather](./media/botfather.png) - + - 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". ![Create new bot](./media/newbot.png) 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)

Image

@@ -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: ![Botfather](./media/botfather.png) - + - 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". ![Create new bot](./media/newbot.png) 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)

Image

@@ -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" (см. скриншот ниже): ![](media/APIKey1.PNG) -4. Возможно, вам потребуется повторно пройти аутентификацию. После этого ключ API будет отображен (см. скриншот ниже): +4. Возможно, вам потребуется повторно пройти аутентификацию. После этого ключ API будет отображён (см. скриншот ниже): ![](media/APIKey2.png) -При использовании просто введите ваше `доменное имя`, `электронную почту` и `API KEY`. Схема приведена ниже: +При использовании просто введите ваше `доменное имя`, `email` и `API-ключ`. Схема приведена ниже: ![](media/DetailEnter.png)
@@ -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: ![Botfather](./media/botfather.png) - -- Создайте новый бот с помощью команды /newbot: Вас попросят ввести 2 вопроса, имя и имя пользователя для вашего бота. Обратите внимание, что имя пользователя должно заканчиваться на слово "bot". + +- Создайте нового бота с помощью команды /newbot: у вас спросят 2 вопроса: отображаемое имя и имя пользователя для вашего бота. Обратите внимание, что имя пользователя должно заканчиваться на слово "bot". ![Создать нового бота](./media/newbot.png) - Запустите созданного бота. Ссылку на вашего бота можно найти здесь. ![токен](./media/token.png) -- Перейдите в панель и настройте параметры Телеграм-бота следующим образом: +- Перейдите в панель и настройте параметры телеграм-бота следующим образом: ![Настройки панели](./media/panel-bot-config.png) Введите токен вашего бота в поле ввода номер 3. Введите ID пользователя в поле ввода номер 4. Telegram-аккаунты с этим ID будут администраторами бота. (Вы можете ввести несколько ID, разделяя их запятой) -- Как получить ID пользователя Telegram? Используйте этот [бот](https://t.me/useridinfobot), начните бота, и он предоставит вам ID пользователя Telegram. +- Как получить ID пользователя Telegram? Используйте этого [бота](https://t.me/useridinfobot). Запустите бота, и он предоставит вам ваше ID пользователя Telegram. ![ID пользователя](./media/user-id.png)
-## 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 встроен, и дополнительная установка не т - [Run In Postman](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._ -## Звездочеты со временем +## Число звёзд со временем [![Stargazers over time](https://starchart.cc/MHSanaei/3x-ui.svg)](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)

Image

@@ -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) 对话: ![Botfather](./media/botfather.png) - + - 使用 /newbot 创建新机器人:你需要提供机器人名称以及用户名,注意名称中末尾要包含“bot” ![创建机器人](./media/newbot.png) 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"}}