Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0c16656c4f | |||
| 45f67d3848 | |||
| b77e5560c8 | |||
| c48e3df360 | |||
| 17f7baaf61 | |||
| 1738fe4d64 | |||
| 36163093ea | |||
| e4015d0adf | |||
| 88cc96a75d | |||
| fa3e984189 | |||
| 94fb12194e | |||
| 1906ed4969 | |||
| 28c59783c9 | |||
| 39eab5bf4e | |||
| f385b57b1b | |||
| f20f722743 | |||
| b6ffaa722c |
@@ -0,0 +1,11 @@
|
||||
# Внести вклад
|
||||
|
||||
Буду рад любому вкладу в разработку проекта! Простой процесс для контрибьюторов:
|
||||
|
||||
1. Форкните репозиторий на GitHub.
|
||||
2. Создайте ветку с осмысленным именем, например `feature/add-README` или `fix/whitelist-load`.
|
||||
3. Внесите изменения и добавьте короткое описание в коммите.
|
||||
4. Запустите локально базовые проверки (если есть).
|
||||
5. Отправьте ветку в ваш форк и создайте Pull Request в основной репозиторий.
|
||||
|
||||
<sup>Советы: описывайте изменения в PR, указывайте цель и тестовые шаги. Если изменения большие — разделяйте на маленькие коммиты.</sup>
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
|
||||
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
|
||||
# 3DP-MANAGER
|
||||
|
||||
@@ -10,11 +10,13 @@
|
||||
|
||||
**Поддержать проект**
|
||||
|
||||
- Реквизиты / донаты:
|
||||
- Банковским переводом:
|
||||
- Карта МИР: `2204320436318077`
|
||||
- Карта MasterCard: `5395452209474530`
|
||||
- На электронный кошелек:
|
||||
- ЮМоney: `4100116897060652`
|
||||
- PayPal: `vasiljevdenisx@gmail.com`
|
||||
- Криптовалютой:
|
||||
- USDT | ETH (ERC20 | BEP20): `0x6fe140040f6Cdc1E1Ff2136cd1d60C0165809463`
|
||||
- USDT | TRX (TRC20): `TEWxXmJxvkAmhshp7E61XJGHB3VyM9hNAb`
|
||||
- Bitcoin: `bc1qctntwncsv2yn02x2vgnkrqm00c4h04c0afkgpl`
|
||||
@@ -32,7 +34,7 @@
|
||||
|
||||
Все подключения объединяются в одну подписку со статичным URL. Бот работает с панелью `3x-ui` и не вмешивается в её работу напрямую, используя открытое API панели.
|
||||
|
||||
Вторичная цель — стабильность подключения: клиент получает 10 вариантов поключений и может выбрать любое из них.
|
||||
Вторичная цель — стабильность подключения: клиент получает 10 вариантов подключений и может выбрать любое из них.
|
||||
|
||||
Дополнительно: бот можно использовать в каскадной схеме. Сервис перенаправления автоматически настроит переадресацию подписки и трафика к основному серверу.
|
||||
|
||||
@@ -51,21 +53,31 @@
|
||||
|
||||
## Требования
|
||||
|
||||
- Ubuntu 20.04 (и выше)
|
||||
- Панель `3x-ui`
|
||||
- Ubuntu 20.04 (и выше), Debian 12.11 (и выше)
|
||||
- Панель `3x-ui` v2.8.4 (и выше)
|
||||
- Домен + SSL сертификат (опционально)
|
||||
|
||||
---
|
||||
|
||||
## Установка
|
||||
|
||||
> [!WARNING]
|
||||
> Утилита работает на основном сервере
|
||||
|
||||
У вас должны быть установлены пакеты на сервере `curl`, `jq` командой: `apt install curl jq` и панель управления `3x-ui`, которую можно установить командой: `bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)`
|
||||
Установите проект на сервер командой:
|
||||
|
||||
```bash
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/install.sh)
|
||||
```
|
||||
|
||||
<small>Краткое описание: запускает скрипт установки и разворачивает контейнеры и сервисы.</small>
|
||||
<sup>Краткое описание: запускает скрипт установки и разворачивает контейнеры и сервисы.</sup>
|
||||
|
||||
Если панель 3x-ui находится в Docker контейнере, установите командой:
|
||||
|
||||
```bash
|
||||
REMOTE_PANEL=true bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/install.sh)
|
||||
```
|
||||
|
||||
## Обновление
|
||||
|
||||
@@ -75,7 +87,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/update.sh)
|
||||
```
|
||||
|
||||
<small>Краткое описание: подтягивает последние изменения и перезапускает контейнеры.</small>
|
||||
<sup>Краткое описание: подтягивает последние изменения и перезапускает контейнеры.</sup>
|
||||
|
||||
## Удаление
|
||||
|
||||
@@ -85,19 +97,22 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/delete.sh)
|
||||
```
|
||||
|
||||
<small>Краткое описание: удаляет контейнеры и файлы конфигурации, возвращая систему к состоянию до установки.</small>
|
||||
<sup>Краткое описание: удаляет контейнеры и файлы конфигурации, возвращая систему к состоянию до установки.</sup>
|
||||
|
||||
---
|
||||
|
||||
## Установка сервиса перенаправления (forwarding)
|
||||
|
||||
> [!WARNING]
|
||||
> Сервис перенаправления работает на промежуточном сервере
|
||||
|
||||
Сервис перенаправления позволяет проксировать входящие порты с промежуточного сервера на основной.
|
||||
|
||||
```bash
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_install.sh)
|
||||
```
|
||||
|
||||
<small>Краткое описание: добавляет правила перенаправления и создает сервис для обновления подписки.</small>
|
||||
<sup>Краткое описание: добавляет правила перенаправления и создает сервис для обновления подписки.</sup>
|
||||
|
||||
## Удаление перенаправления
|
||||
|
||||
@@ -105,7 +120,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_delete.sh)
|
||||
```
|
||||
|
||||
<small>Краткое описание: удаляет правила и отключает сервис перенаправления.</small>
|
||||
<sup>Краткое описание: удаляет правила и отключает сервис перенаправления.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -117,7 +132,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
cd /opt/3dp-manager && docker compose exec node env | grep SUB_URL | cut -d'=' -f2
|
||||
```
|
||||
|
||||
<small>Краткое описание: выводит статичный URL подписки, который можно использовать в клиентах. Работает как на основном, так и на промежуточном сервере.</small>
|
||||
<sup>Краткое описание: выводит статичный URL подписки, который можно использовать в клиентах. Работает как на основном, так и на промежуточном сервере.</sup>
|
||||
|
||||
## Сбор доменов из мульти-подписок
|
||||
|
||||
@@ -127,7 +142,7 @@ cd /opt/3dp-manager && docker compose exec node env | grep SUB_URL | cut -d'=' -
|
||||
node get_domains.js
|
||||
```
|
||||
|
||||
<small>Краткое описание: добавьте ссылку на мульти-подписку в скрипт и запустите команду — на выходе получите список доменов. Неободим `Node.js` для работы скрипта.</small>
|
||||
<sup>Краткое описание: добавьте ссылку на мульти-подписку в скрипт и запустите команду — на выходе получите список доменов. Необходим `Node.js` для работы скрипта.</sup>
|
||||
|
||||
## Использование собственного белого списка
|
||||
|
||||
@@ -138,7 +153,19 @@ node get_domains.js
|
||||
cd /opt/3dp-manager && docker cp ./app/my_whitelist.txt node:/app/my_whitelist.txt
|
||||
```
|
||||
|
||||
<small>Краткое описание: добавляет ваш файл доменов в контейнер приложения. Чтобы сразу же сгенерировать инбаунды с новыи списком, выполните `docker exec -it node sh` и затем `node index.js`.</small>
|
||||
<sup>Краткое описание: добавляет ваш файл доменов в контейнер приложения. Чтобы сразу же сгенерировать инбаунды с новым списком, выполните `docker exec -it node sh` и затем `node rotate.js`.</sup>
|
||||
|
||||
## Ручной запуск генерации
|
||||
|
||||
Чтобы создать новые инбаунды, выполните команды поочередно:
|
||||
|
||||
```bash
|
||||
cd /opt/3dp-manager
|
||||
docker exec -it node sh
|
||||
node rotate.js
|
||||
```
|
||||
|
||||
<sup>Краткое описание: выполняет немедленную генерацию инбаундов, не влияя на заданный интервал ротации.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -158,7 +185,7 @@ cd /opt/3dp-manager && docker cp ./app/my_whitelist.txt node:/app/my_whitelist.t
|
||||
4. Запустите локально базовые проверки (если есть).
|
||||
5. Отправьте ветку в ваш форк и создайте Pull Request в основной репозиторий.
|
||||
|
||||
<small>Советы: описывайте изменения в PR, указывайте цель и тестовые шаги. Если изменения большие — разделяйте на маленькие коммиты.</small>
|
||||
<sup>Советы: описывайте изменения в PR, указывайте цель и тестовые шаги. Если изменения большие — разделяйте на маленькие коммиты.</sup>
|
||||
|
||||
---
|
||||
|
||||
|
||||
+10
-10
@@ -2,7 +2,7 @@
|
||||
|
||||
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
|
||||
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
|
||||
# 3DP-MANAGER
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/install.sh)
|
||||
```
|
||||
|
||||
<small>简要说明:运行安装脚本并部署容器和服务。</small>
|
||||
<sup>简要说明:运行安装脚本并部署容器和服务。</sup>
|
||||
|
||||
## 更新
|
||||
|
||||
@@ -74,7 +74,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/update.sh)
|
||||
```
|
||||
|
||||
<small>简要说明:拉取最新更改并重启容器。</small>
|
||||
<sup>简要说明:拉取最新更改并重启容器。</sup>
|
||||
|
||||
## 删除
|
||||
|
||||
@@ -84,7 +84,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/delete.sh)
|
||||
```
|
||||
|
||||
<small>简要说明:删除容器和配置文件,恢复到安装前状态。</small>
|
||||
<sup>简要说明:删除容器和配置文件,恢复到安装前状态。</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -96,7 +96,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_install.sh)
|
||||
```
|
||||
|
||||
<small>简要说明:添加转发规则并创建用于更新订阅的服务。</small>
|
||||
<sup>简要说明:添加转发规则并创建用于更新订阅的服务。</sup>
|
||||
|
||||
## 删除转发
|
||||
|
||||
@@ -104,7 +104,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_delete.sh)
|
||||
```
|
||||
|
||||
<small>简要说明:删除规则并禁用转发服务。</small>
|
||||
<sup>简要说明:删除规则并禁用转发服务。</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -116,7 +116,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
cd /opt/3dp-manager && docker compose exec node env | grep SUB_URL | cut -d'=' -f2
|
||||
```
|
||||
|
||||
<small>简要说明:打印可在客户端使用的静态订阅 URL,适用于主服务器和中继服务器。</small>
|
||||
<sup>简要说明:打印可在客户端使用的静态订阅 URL,适用于主服务器和中继服务器。</sup>
|
||||
|
||||
## 从多订阅收集域名
|
||||
|
||||
@@ -126,7 +126,7 @@ cd /opt/3dp-manager && docker compose exec node env | grep SUB_URL | cut -d'=' -
|
||||
node get_domains.js
|
||||
```
|
||||
|
||||
<small>简要说明:在脚本中添加多订阅链接并运行命令 — 输出为域名列表。运行脚本需要 `Node.js`。</small>
|
||||
<sup>简要说明:在脚本中添加多订阅链接并运行命令 — 输出为域名列表。运行脚本需要 `Node.js`。</sup>
|
||||
|
||||
## 使用自定义白名单
|
||||
|
||||
@@ -137,7 +137,7 @@ node get_domains.js
|
||||
cd /opt/3dp-manager && docker cp ./app/my_whitelist.txt node:/app/my_whitelist.txt
|
||||
```
|
||||
|
||||
<small>简要说明:将您的域名文件添加到应用容器中。</small>
|
||||
<sup>简要说明:将您的域名文件添加到应用容器中。</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -157,7 +157,7 @@ cd /opt/3dp-manager && docker cp ./app/my_whitelist.txt node:/app/my_whitelist.t
|
||||
4. 在本地运行检查(如有)。
|
||||
5. 推送分支到您的 fork 并创建 Pull Request。
|
||||
|
||||
<small>建议:在 PR 中说明更改和测试步骤;较大更改请拆成小提交。</small>
|
||||
<sup>建议:在 PR 中说明更改和测试步骤;较大更改请拆成小提交。</sup>
|
||||
|
||||
---
|
||||
|
||||
|
||||
+10
-10
@@ -2,7 +2,7 @@
|
||||
|
||||
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
|
||||
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
|
||||
# 3DP-MANAGER
|
||||
|
||||
@@ -64,7 +64,7 @@ Install the project on your server with:
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/install.sh)
|
||||
```
|
||||
|
||||
<small>Short description: runs the installer script and deploys containers and services.</small>
|
||||
<sup>Short description: runs the installer script and deploys containers and services.</sup>
|
||||
|
||||
## Update
|
||||
|
||||
@@ -74,7 +74,7 @@ Update to the latest version:
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/update.sh)
|
||||
```
|
||||
|
||||
<small>Short description: pulls the latest changes and restarts containers.</small>
|
||||
<sup>Short description: pulls the latest changes and restarts containers.</sup>
|
||||
|
||||
## Removal
|
||||
|
||||
@@ -84,7 +84,7 @@ Remove the service completely:
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/delete.sh)
|
||||
```
|
||||
|
||||
<small>Short description: removes containers and configuration files, restoring the system to the pre-install state.</small>
|
||||
<sup>Short description: removes containers and configuration files, restoring the system to the pre-install state.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -96,7 +96,7 @@ The forwarding service allows proxying incoming ports from the intermediate serv
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_install.sh)
|
||||
```
|
||||
|
||||
<small>Short description: adds forwarding rules and creates a service to update the subscription.</small>
|
||||
<sup>Short description: adds forwarding rules and creates a service to update the subscription.</sup>
|
||||
|
||||
## Remove forwarding
|
||||
|
||||
@@ -104,7 +104,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_delete.sh)
|
||||
```
|
||||
|
||||
<small>Short description: removes rules and disables the forwarding service.</small>
|
||||
<sup>Short description: removes rules and disables the forwarding service.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -116,7 +116,7 @@ Command to print the current subscription URL from the container environment:
|
||||
cd /opt/3dp-manager && docker compose exec node env | grep SUB_URL | cut -d'=' -f2
|
||||
```
|
||||
|
||||
<small>Short description: prints the static subscription URL that can be used in clients. Works on both main and intermediate servers.</small>
|
||||
<sup>Short description: prints the static subscription URL that can be used in clients. Works on both main and intermediate servers.</sup>
|
||||
|
||||
## Collect domains from multi-subscriptions
|
||||
|
||||
@@ -126,7 +126,7 @@ The utility extracts domains from subscriptions and builds a `whitelist` for the
|
||||
node get_domains.js
|
||||
```
|
||||
|
||||
<small>Short description: add a multi-subscription link to the script and run the command — the output will be a list of domains. `Node.js` is required to run the script.</small>
|
||||
<sup>Short description: add a multi-subscription link to the script and run the command — the output will be a list of domains. `Node.js` is required to run the script.</sup>
|
||||
|
||||
## Use your own whitelist
|
||||
|
||||
@@ -137,7 +137,7 @@ node get_domains.js
|
||||
cd /opt/3dp-manager && docker cp ./app/my_whitelist.txt node:/app/my_whitelist.txt
|
||||
```
|
||||
|
||||
<small>Short description: adds your domain file into the application container.</small>
|
||||
<sup>Short description: adds your domain file into the application container.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -157,7 +157,7 @@ Contributions are welcome! Simple contributor workflow:
|
||||
4. Run local checks if available.
|
||||
5. Push the branch to your fork and create a Pull Request to the main repository.
|
||||
|
||||
<small>Tips: describe changes and testing steps in the PR. For large changes, split into smaller commits.</small>
|
||||
<sup>Tips: describe changes and testing steps in the PR. For large changes, split into smaller commits.</sup>
|
||||
|
||||
---
|
||||
|
||||
|
||||
+10
-10
@@ -2,7 +2,7 @@
|
||||
|
||||
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
|
||||
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
|
||||
# 3DP-MANAGER
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/install.sh)
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: اسکریپت نصب را اجرا کرده و کانتینرها و سرویسها را راهاندازی میکند.</small>
|
||||
<sup>توضیح کوتاه: اسکریپت نصب را اجرا کرده و کانتینرها و سرویسها را راهاندازی میکند.</sup>
|
||||
|
||||
## بهروزرسانی
|
||||
|
||||
@@ -74,7 +74,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/update.sh)
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: تغییرات جدید را میکشد و کانتینرها را ریاستارت میکند.</small>
|
||||
<sup>توضیح کوتاه: تغییرات جدید را میکشد و کانتینرها را ریاستارت میکند.</sup>
|
||||
|
||||
## حذف
|
||||
|
||||
@@ -84,7 +84,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/delete.sh)
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: کانتینرها و فایلهای پیکربندی را حذف میکند و سیستم را به وضعیت پیش از نصب برمیگرداند.</small>
|
||||
<sup>توضیح کوتاه: کانتینرها و فایلهای پیکربندی را حذف میکند و سیستم را به وضعیت پیش از نصب برمیگرداند.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -96,7 +96,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_install.sh)
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: قوانین فورواردینگ را اضافه کرده و سرویسی برای بهروزرسانی اشتراک ایجاد میکند.</small>
|
||||
<sup>توضیح کوتاه: قوانین فورواردینگ را اضافه کرده و سرویسی برای بهروزرسانی اشتراک ایجاد میکند.</sup>
|
||||
|
||||
## حذف فورواردینگ
|
||||
|
||||
@@ -104,7 +104,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/forwarding_delete.sh)
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: قوانین را حذف کرده و سرویس فورواردینگ را غیرفعال میکند.</small>
|
||||
<sup>توضیح کوتاه: قوانین را حذف کرده و سرویس فورواردینگ را غیرفعال میکند.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -116,7 +116,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main
|
||||
cd /opt/3dp-manager && docker compose exec node env | grep SUB_URL | cut -d'=' -f2
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: URL ثابت اشتراک را نمایش میدهد که میتوان در کلاینتها استفاده کرد. هم در سرور اصلی و هم در سرور واسط کار میکند.</small>
|
||||
<sup>توضیح کوتاه: URL ثابت اشتراک را نمایش میدهد که میتوان در کلاینتها استفاده کرد. هم در سرور اصلی و هم در سرور واسط کار میکند.</sup>
|
||||
|
||||
## جمعآوری دامنهها از چندین اشتراک
|
||||
|
||||
@@ -126,7 +126,7 @@ cd /opt/3dp-manager && docker compose exec node env | grep SUB_URL | cut -d'=' -
|
||||
node get_domains.js
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: لینک چندین اشتراک را در اسکریپت قرار داده و فرمان را اجرا کنید — خروجی فهرست دامنهها خواهد بود. نیازمند `Node.js` است.</small>
|
||||
<sup>توضیح کوتاه: لینک چندین اشتراک را در اسکریپت قرار داده و فرمان را اجرا کنید — خروجی فهرست دامنهها خواهد بود. نیازمند `Node.js` است.</sup>
|
||||
|
||||
## استفاده از whitelist شخصی
|
||||
|
||||
@@ -137,7 +137,7 @@ node get_domains.js
|
||||
cd /opt/3dp-manager && docker cp ./app/my_whitelist.txt node:/app/my_whitelist.txt
|
||||
```
|
||||
|
||||
<small>توضیح کوتاه: فایل دامنه شما را به کانتینر برنامه اضافه میکند.</small>
|
||||
<sup>توضیح کوتاه: فایل دامنه شما را به کانتینر برنامه اضافه میکند.</sup>
|
||||
|
||||
---
|
||||
|
||||
@@ -157,7 +157,7 @@ cd /opt/3dp-manager && docker cp ./app/my_whitelist.txt node:/app/my_whitelist.t
|
||||
4. در صورت وجود، بررسیهای محلی را اجرا کنید.
|
||||
5. شاخه را به fork خود پوش کرده و Pull Request ایجاد کنید.
|
||||
|
||||
<small>نکات: تغییرات را در PR شرح دهید و مراحل تست را بنویسید. در صورت تغییرات بزرگ، آنها را به کامیتهای کوچک تقسیم کنید.</small>
|
||||
<sup>نکات: تغییرات را در PR شرح دهید و مراحل تست را بنویسید. در صورت تغییرات بزرگ، آنها را به کامیتهای کوچک تقسیم کنید.</sup>
|
||||
|
||||
---
|
||||
|
||||
|
||||
+4
-4
@@ -2,7 +2,7 @@
|
||||
|
||||
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
|
||||
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
 [](https://www.gnu.org/licenses/gpl-3.0) [](https://t.me/denpiligrim_web) [](https://www.youtube.com/@denpiligrim)
|
||||
|
||||
# 3DP-MANAGER
|
||||
|
||||
@@ -64,7 +64,7 @@ Taslamany serwera gurnamak üçin şu komandany ýerine ýetiriň:
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/install.sh)
|
||||
```
|
||||
|
||||
<small>Gysgaça: gurnama skripti işledilýär we konteýnerler we hyzmatlar döredilýär.</small>
|
||||
<sup>Gysgaça: gurnama skripti işledilýär we konteýnerler we hyzmatlar döredilýär.</sup>
|
||||
|
||||
## Täzelik
|
||||
|
||||
@@ -74,7 +74,7 @@ Soňky wersiýa çenli täzeläň:
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/update.sh)
|
||||
```
|
||||
|
||||
<small>Gysgaça: iň soňky üýtgeşmeleri çekýär we konteýnerleri gaýtadan işledýär.</small>
|
||||
<sup>Gysgaça: iň soňky üýtgeşmeleri çekýär we konteýnerleri gaýtadan işledýär.</sup>
|
||||
|
||||
## Pozmak
|
||||
|
||||
@@ -84,7 +84,7 @@ Hyzmaty doly pozmak üçin:
|
||||
bash <(curl -fsSL https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/delete.sh)
|
||||
```
|
||||
|
||||
<small>Gysgaça: konteýnerleri we konfigurasiýa faýllaryny pozup, systemany gurnamadan öňki ýagdaýyna getirer.</small>
|
||||
<sup>Gysgaça: konteýnerleri we konfigurasiýa faýllaryny pozup, systemany gurnamadan öňki ýagdaýyna getirer.</sup>
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ COPY package.json ./
|
||||
RUN npm install --production
|
||||
|
||||
COPY index.js .
|
||||
COPY rotate.js .
|
||||
COPY builders ./builders
|
||||
|
||||
CMD ["node", "index.js"]
|
||||
+27
-15
@@ -1,5 +1,5 @@
|
||||
import axios from "axios";
|
||||
import cron from "node-cron";
|
||||
import https from "https";
|
||||
import fs from "fs";
|
||||
import net from "net";
|
||||
import { buildVlessRealityTcp } from "./builders/buildVlessRealityTcp.js";
|
||||
@@ -16,7 +16,10 @@ const SUB_FILE = "/subscriptions/list.txt";
|
||||
const LAST_INBOUNDS = '/subscriptions/latestInbounds.json';
|
||||
|
||||
const cookieJar = {};
|
||||
const api = axios.create({ baseURL: UI_URL, timeout: 15000, withCredentials: true });
|
||||
const agent = new https.Agent({
|
||||
rejectUnauthorized: false
|
||||
});
|
||||
const api = axios.create({ baseURL: UI_URL, timeout: 15000, withCredentials: true, httpsAgent: agent });
|
||||
|
||||
api.interceptors.request.use(config => {
|
||||
if (cookieJar.value) config.headers['Cookie'] = cookieJar.value;
|
||||
@@ -76,7 +79,10 @@ async function getFreePort(used) {
|
||||
while (true) {
|
||||
const p = Math.floor(Math.random() * (60000 - 10000)) + 10000;
|
||||
if (used.has(p)) continue;
|
||||
if (await isPortFree(p)) return p;
|
||||
if (await isPortFree(p)) {
|
||||
used.add(p);
|
||||
return p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,12 +124,12 @@ async function login() {
|
||||
} catch (e) { console.error("Login failed:", e.message); throw e; }
|
||||
}
|
||||
|
||||
async function getInbounds() {
|
||||
try {
|
||||
const res = await api.get("/panel/api/inbounds/list");
|
||||
return res.status === 200 ? res.data.obj || [] : [];
|
||||
} catch (e) { console.error("Get inbounds failed:", e.message); return []; }
|
||||
}
|
||||
// async function getInbounds() {
|
||||
// try {
|
||||
// const res = await api.get("/panel/api/inbounds/list");
|
||||
// return res.status === 200 ? res.data.obj || [] : [];
|
||||
// } catch (e) { console.error("Get inbounds failed:", e.message); return []; }
|
||||
// }
|
||||
|
||||
async function deleteInbounds() {
|
||||
try {
|
||||
@@ -187,8 +193,7 @@ async function rotate() {
|
||||
|
||||
for (const b of builders) {
|
||||
const domain = pickDomain(whitelist);
|
||||
const inbound = await b(domain);
|
||||
usedPorts.add(inbound.port);
|
||||
const inbound = await b(domain);
|
||||
const idOrPass = inbound.settings ? JSON.parse(inbound.settings).clients?.[0]?.id || JSON.parse(inbound.settings).clients?.[0]?.password : "";
|
||||
|
||||
// Build the link depending on the protocol
|
||||
@@ -210,8 +215,15 @@ async function rotate() {
|
||||
// Initial run
|
||||
rotate();
|
||||
|
||||
let interval = parseInt(process.env.ROTATE_INTERVAL) || 30;
|
||||
if (interval < 10) interval = 10;
|
||||
let interval = parseInt(process.env.ROTATE_INTERVAL, 10);
|
||||
|
||||
const cronExpression = `*/${interval} * * * *`;
|
||||
cron.schedule(cronExpression, rotate);
|
||||
if (isNaN(interval) || interval < 10) {
|
||||
console.warn('⚠ Интервал некорректен или меньше 10 минут. Используется значение по умолчанию 30 минут.');
|
||||
interval = 30;
|
||||
}
|
||||
|
||||
const intervalMs = interval * 60 * 1000;
|
||||
|
||||
console.log(`✔ Интервал ротации установлен: ${interval} минут`);
|
||||
|
||||
setInterval(rotate, intervalMs);
|
||||
+216
@@ -0,0 +1,216 @@
|
||||
import axios from "axios";
|
||||
import https from "https";
|
||||
import fs from "fs";
|
||||
import net from "net";
|
||||
import { buildVlessRealityTcp } from "./builders/buildVlessRealityTcp.js";
|
||||
import { buildVlessRealityXhttp } from "./builders/buildVlessRealityXhttp.js";
|
||||
import { buildTrojanRealityTcp } from "./builders/buildTrojanRealityTcp.js";
|
||||
import { buildShadowsocksTcp } from "./builders/buildShadowsocksTcp.js";
|
||||
import { buildVmessTcp } from "./builders/buildVmessTcp.js";
|
||||
import { buildVlessRealityGrpc } from "./builders/buildVlessRealityGrpc.js";
|
||||
import { buildVlessWs } from "./builders/buildVlessWs.js";
|
||||
import { buildInboundLink } from "./builders/buildInboundLink.js";
|
||||
|
||||
const { UI_URL, UI_LOGIN, UI_PASSWORD, UI_HOST } = process.env;
|
||||
const SUB_FILE = "/subscriptions/list.txt";
|
||||
const LAST_INBOUNDS = '/subscriptions/latestInbounds.json';
|
||||
|
||||
const cookieJar = {};
|
||||
const agent = new https.Agent({
|
||||
rejectUnauthorized: false
|
||||
});
|
||||
const api = axios.create({ baseURL: UI_URL, timeout: 15000, withCredentials: true, httpsAgent: agent });
|
||||
|
||||
api.interceptors.request.use(config => {
|
||||
if (cookieJar.value) config.headers['Cookie'] = cookieJar.value;
|
||||
return config;
|
||||
});
|
||||
|
||||
const WHITELIST_FILE = "/app/whitelist.txt";
|
||||
const WHITELIST_REPO_URL = "https://raw.githubusercontent.com/denpiligrim/3dp-manager/main/whitelist.txt";
|
||||
|
||||
// Helper functions
|
||||
async function updateWhitelist() {
|
||||
try {
|
||||
const res = await axios.get(WHITELIST_REPO_URL, { timeout: 10000 });
|
||||
fs.writeFileSync(WHITELIST_FILE, res.data, "utf8");
|
||||
console.log("✔ whitelist.txt обновлен из репозитория");
|
||||
} catch (err) {
|
||||
console.warn("⚠ Не удалось обновить whitelist.txt, будет использоваться локальный файл:", err.message);
|
||||
}
|
||||
}
|
||||
|
||||
function loadWhitelist() {
|
||||
let fileToUse = WHITELIST_FILE;
|
||||
|
||||
if (fs.existsSync("/app/my_whitelist.txt")) {
|
||||
console.log('Найден кастомный whitelist: /app/my_whitelist.txt. Используется он.');
|
||||
fileToUse = "/app/my_whitelist.txt";
|
||||
} else {
|
||||
console.log(`Кастомный whitelist не найден. Используется дефолтный: ${WHITELIST_FILE}`);
|
||||
if (!fs.existsSync(WHITELIST_FILE)) {
|
||||
throw new Error("Дефолтный whitelist.txt не найден");
|
||||
}
|
||||
}
|
||||
|
||||
return fs.readFileSync(fileToUse, "utf8")
|
||||
.split("\n")
|
||||
.map(v => v.trim())
|
||||
.filter(Boolean);
|
||||
}
|
||||
|
||||
function pickDomain(list) {
|
||||
return list[Math.floor(Math.random() * list.length)];
|
||||
}
|
||||
|
||||
async function isPortFree(port) {
|
||||
return new Promise(resolve => {
|
||||
const s = net.createServer()
|
||||
.once("error", () => resolve(false))
|
||||
.once("listening", () => {
|
||||
s.close();
|
||||
resolve(true);
|
||||
})
|
||||
.listen(port, "0.0.0.0");
|
||||
});
|
||||
}
|
||||
|
||||
async function getFreePort(used) {
|
||||
while (true) {
|
||||
const p = Math.floor(Math.random() * (60000 - 10000)) + 10000;
|
||||
if (used.has(p)) continue;
|
||||
if (await isPortFree(p)) {
|
||||
used.add(p);
|
||||
return p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function generateRealityKeys() {
|
||||
try {
|
||||
const res = await api.get("/panel/api/server/getNewX25519Cert");
|
||||
if (res.data?.success && res.data?.obj) {
|
||||
return {
|
||||
privateKey: res.data.obj.privateKey,
|
||||
publicKey: res.data.obj.publicKey
|
||||
};
|
||||
}
|
||||
throw new Error("Invalid key response");
|
||||
} catch (e) {
|
||||
console.error("Failed to get Reality keys:", e.message);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
async function uuid() {
|
||||
try {
|
||||
const res = await api.get("/panel/api/server/getNewUUID");
|
||||
if (res.data?.success && res.data?.obj?.uuid) {
|
||||
return res.data.obj.uuid;
|
||||
}
|
||||
throw new Error("Invalid UUID response");
|
||||
} catch (e) {
|
||||
console.error("Failed to get UUID:", e.message);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
// API 3x-ui
|
||||
async function login() {
|
||||
try {
|
||||
const res = await api.post("/login", { username: UI_LOGIN, password: UI_PASSWORD });
|
||||
if (res.headers['set-cookie']) cookieJar.value = res.headers['set-cookie'].join('; ');
|
||||
console.log("Login success");
|
||||
} catch (e) { console.error("Login failed:", e.message); throw e; }
|
||||
}
|
||||
|
||||
// async function getInbounds() {
|
||||
// try {
|
||||
// const res = await api.get("/panel/api/inbounds/list");
|
||||
// return res.status === 200 ? res.data.obj || [] : [];
|
||||
// } catch (e) { console.error("Get inbounds failed:", e.message); return []; }
|
||||
// }
|
||||
|
||||
async function deleteInbounds() {
|
||||
try {
|
||||
const data = fs.readFileSync(LAST_INBOUNDS, 'utf-8');
|
||||
const oldIds = JSON.parse(data);
|
||||
|
||||
if (Array.isArray(oldIds) && oldIds.length > 0) {
|
||||
console.log(`Удаляем старые инбаунды: ${oldIds.length} шт.`);
|
||||
for (const id of oldIds) {
|
||||
try {
|
||||
await deleteInbound(id);
|
||||
} catch (err) {
|
||||
console.error(`Ошибка при удалении инбаунда ${id}:`, err.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("Старых ID не найдено, пропускаем удаление.");
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteInbound(id) {
|
||||
try { await api.post(`/panel/api/inbounds/del/${id}`); } catch { }
|
||||
}
|
||||
|
||||
async function addInbound(config) {
|
||||
try {
|
||||
const res = await api.post("/panel/api/inbounds/add", config);
|
||||
return res.data?.obj?.id || null;
|
||||
} catch (e) {
|
||||
console.error("Add inbound failed:", e.message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Main rotation of inbound entries
|
||||
async function rotate() {
|
||||
await login();
|
||||
|
||||
await updateWhitelist();
|
||||
const whitelist = loadWhitelist();
|
||||
const usedPorts = new Set();
|
||||
const subs = [];
|
||||
|
||||
await deleteInbounds();
|
||||
|
||||
const builders = [
|
||||
async (d) => buildVlessRealityTcp({ port: await isPortFree(8443) ? 8443 : await getFreePort(usedPorts), uuid: await uuid(), domain: d, keys: await generateRealityKeys() }),
|
||||
async (d) => buildVlessRealityXhttp({ port: await isPortFree(443) ? 443 : await getFreePort(usedPorts), uuid: await uuid(), domain: d, keys: await generateRealityKeys() }),
|
||||
async (d) => buildVlessRealityGrpc({ port: await getFreePort(usedPorts), uuid: await uuid(), domain: d, keys: await generateRealityKeys() }),
|
||||
async (d) => buildVlessWs({ port: await getFreePort(usedPorts), uuid: await uuid(), domain: d }),
|
||||
async (d) => buildVlessRealityTcp({ port: await getFreePort(usedPorts), uuid: await uuid(), domain: d, keys: await generateRealityKeys() }),
|
||||
async (d) => buildVlessRealityTcp({ port: await getFreePort(usedPorts), uuid: await uuid(), domain: d, keys: await generateRealityKeys() }),
|
||||
async (d) => buildVlessRealityTcp({ port: await getFreePort(usedPorts), uuid: await uuid(), domain: d, keys: await generateRealityKeys() }),
|
||||
async (d) => buildVmessTcp({ port: await getFreePort(usedPorts), uuid: await uuid() }),
|
||||
async (d) => buildShadowsocksTcp({ port: await getFreePort(usedPorts), uuid: await uuid() }),
|
||||
async (d) => buildTrojanRealityTcp({ port: await getFreePort(usedPorts), uuid: await uuid(), domain: d, keys: await generateRealityKeys() }),
|
||||
];
|
||||
|
||||
const inboundIds = [];
|
||||
|
||||
for (const b of builders) {
|
||||
const domain = pickDomain(whitelist);
|
||||
const inbound = await b(domain);
|
||||
const idOrPass = inbound.settings ? JSON.parse(inbound.settings).clients?.[0]?.id || JSON.parse(inbound.settings).clients?.[0]?.password : "";
|
||||
|
||||
// Build the link depending on the protocol
|
||||
const link = buildInboundLink(inbound, UI_HOST, idOrPass);
|
||||
if (link) subs.push(link);
|
||||
const id = await addInbound(inbound);
|
||||
inboundIds.push(id);
|
||||
}
|
||||
|
||||
if (inboundIds.length > 0) {
|
||||
fs.writeFileSync(LAST_INBOUNDS, JSON.stringify(inboundIds, null, 2));
|
||||
console.log(`Новые ID (${inboundIds.length} шт.) сохранены в ${LAST_INBOUNDS}`);
|
||||
}
|
||||
|
||||
fs.writeFileSync(SUB_FILE, subs.join("\n") + "\n", "utf8");
|
||||
console.log("✔ 10 inbound created, подписка обновлена");
|
||||
}
|
||||
|
||||
// Initial run
|
||||
rotate();
|
||||
@@ -17,7 +17,7 @@ need_root() {
|
||||
[[ $EUID -eq 0 ]] || die "Запускать только от root"
|
||||
}
|
||||
|
||||
read -r -p "Вы уверены, что хотите удалить? (y/N): " answer
|
||||
read -r -p "Вы уверены, что хотите удалить? (y/n): " answer
|
||||
|
||||
case "$answer" in
|
||||
y|Y)
|
||||
|
||||
@@ -14,7 +14,7 @@ warn() { echo -e "\033[1;33m[WARN]\033[0m $1"; }
|
||||
|
||||
[[ $EUID -eq 0 ]] || { echo "Запускать нужно от root"; exit 1; }
|
||||
|
||||
read -r -p "Вы уверены, что хотите удалить? (y/N): " answer
|
||||
read -r -p "Вы уверены, что хотите удалить? (y/n): " answer
|
||||
|
||||
case "$answer" in
|
||||
y|Y)
|
||||
|
||||
+31
-11
@@ -15,6 +15,12 @@ die() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; }
|
||||
|
||||
[[ $EUID -eq 0 ]] || die "Запускать нужно от root"
|
||||
|
||||
# Check OS and set release variable
|
||||
. /etc/os-release
|
||||
if [[ "$ID" != "ubuntu" && "$ID" != "debian" ]]; then
|
||||
die "Этот скрипт поддерживает только Ubuntu или Debian: $ID"
|
||||
fi
|
||||
|
||||
#################################
|
||||
# ASCII-баннер
|
||||
#################################
|
||||
@@ -292,19 +298,33 @@ log "Проверка Docker"
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
log "Docker уже установлен"
|
||||
else
|
||||
log "Docker не найден, будет установлен"
|
||||
log "Docker не найден, будет установлен из официального репозитория"
|
||||
# Add Docker's official GPG key:
|
||||
apt update
|
||||
apt install -y docker.io || die "Ошибка установки docker.io"
|
||||
systemctl enable docker
|
||||
systemctl restart docker
|
||||
fi
|
||||
apt install ca-certificates curl
|
||||
install -m 0755 -d /etc/apt/keyrings
|
||||
if [[ "$ID" == "ubuntu" ]]; then
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc || die "Ошибка добавления ключа Docker"
|
||||
else
|
||||
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc || die "Ошибка добавления ключа Docker"
|
||||
fi
|
||||
chmod a+r /etc/apt/keyrings/docker.asc
|
||||
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
log "docker compose v2 доступен"
|
||||
else
|
||||
log "Устанавливаем docker-compose-v2"
|
||||
apt install -y --allow-downgrades --allow-remove-essential --allow-change-held-packages \
|
||||
docker-compose-v2 || warn "docker-compose-v2 не установлен, возможно уже есть плагин"
|
||||
# Add the repository to Apt sources:
|
||||
CODENAME=${UBUNTU_CODENAME:-$VERSION_CODENAME}
|
||||
tee /etc/apt/sources.list.d/docker.sources <<EOF
|
||||
Types: deb
|
||||
URIs: https://download.docker.com/linux/$ID
|
||||
Suites: $CODENAME
|
||||
Components: stable
|
||||
Signed-By: /etc/apt/keyrings/docker.asc
|
||||
EOF
|
||||
|
||||
apt update
|
||||
|
||||
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
systemctl enable docker
|
||||
systemctl start docker
|
||||
fi
|
||||
|
||||
#################################
|
||||
|
||||
+92
-28
@@ -25,6 +25,24 @@ validate_url() {
|
||||
#################################
|
||||
need_root
|
||||
|
||||
# Check OS and set release variable
|
||||
. /etc/os-release
|
||||
if [[ "$ID" != "ubuntu" && "$ID" != "debian" ]]; then
|
||||
die "Этот скрипт поддерживает только Ubuntu или Debian: $ID"
|
||||
fi
|
||||
|
||||
REMOTE_PANEL=${REMOTE_PANEL:-false}
|
||||
|
||||
if [[ "$REMOTE_PANEL" != "true" ]]; then
|
||||
if ! x-ui status >/dev/null 2>&1; then
|
||||
echo "❌ Панель 3x-ui не найдена или не работает."
|
||||
echo " Чтобы установить, выполните:"
|
||||
echo " bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)"
|
||||
exit 1
|
||||
fi
|
||||
echo "✔ Панель 3x-ui найдена и работает"
|
||||
fi
|
||||
|
||||
#################################
|
||||
# ASCII-баннер
|
||||
#################################
|
||||
@@ -45,9 +63,14 @@ echo ""
|
||||
#################################
|
||||
# Function to get panel URL from 3x-ui
|
||||
get_xui_url() {
|
||||
local output=$(x-ui settings 2>/dev/null)
|
||||
if [[ "$REMOTE_PANEL" == "true" ]]; then
|
||||
echo ""
|
||||
return
|
||||
fi
|
||||
|
||||
echo "$output" | sed 's/\x1b\[[0-9;]*m//g' | grep "Access URL:" | grep -oE 'https?://[^[:space:]]+' | head -n1
|
||||
local output=$(x-ui settings 2>/dev/null || true)
|
||||
|
||||
echo "$output" | sed 's/\x1b\[[0-9;]*m//g' | grep "Access URL:" | grep -oE 'https?://[^[:space:]]+' | head -n1 || true
|
||||
}
|
||||
|
||||
echo "Определяем URL панели 3x-ui..."
|
||||
@@ -60,21 +83,28 @@ if [[ -z "$UI_URL" ]]; then
|
||||
fi
|
||||
|
||||
UI_URL=$(echo "$UI_URL" | sed -E 's/[[:space:]]*$//; s|/*$||')
|
||||
|
||||
echo "URL панели 3x-ui: $UI_URL"
|
||||
|
||||
# Validate URL correctness
|
||||
validate_url "$UI_URL" || die "Некорректный URL панели 3x-ui: $UI_URL"
|
||||
|
||||
echo "URL панели 3x-ui: $UI_URL"
|
||||
|
||||
read -rp "Логин 3x-ui: " UI_LOGIN
|
||||
read -rsp "Пароль 3x-ui: " UI_PASSWORD
|
||||
echo
|
||||
|
||||
UI_LOGIN=$(echo "$UI_LOGIN" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
||||
UI_PASSWORD=$(echo "$UI_PASSWORD" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
||||
[[ -z "$UI_LOGIN" || -z "$UI_PASSWORD" ]] && die "Логин/пароль обязательны"
|
||||
|
||||
# Check login
|
||||
LOGIN_RESPONSE=$(curl -s -X POST "$UI_URL/login" -H "Content-Type: application/json" -d "{\"username\":\"$UI_LOGIN\",\"password\":\"$UI_PASSWORD\"}")
|
||||
if ! command -v curl >/dev/null 2>&1; then
|
||||
echo "❌ curl не установлен. Установите curl и повторите попытку"
|
||||
echo " apt install -y curl"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LOGIN_RESPONSE=$(curl -s -k --connect-timeout 10 -X POST "$UI_URL/login" -H "Content-Type: application/json" -d "{\"username\":\"$UI_LOGIN\",\"password\":\"$UI_PASSWORD\"}" || true)
|
||||
|
||||
# Проверка успешного логина по ключевому полю "success" или наличию куки
|
||||
if ! echo "$LOGIN_RESPONSE" | grep -q '"success":true'; then
|
||||
echo "Не удалось залогиниться в 3x-ui. Проверьте URL, логин и пароль."
|
||||
exit 1
|
||||
@@ -98,8 +128,8 @@ if [[ "$UI_PROTO" == "https" ]]; then
|
||||
log "Найдены сертификаты Let's Encrypt для $UI_HOST"
|
||||
else
|
||||
log "⚠ Сертификаты Let's Encrypt для $UI_HOST не найдены"
|
||||
read -rp "Введите полный путь к SSL сертификату (fullchain.pem): " CERT_PATH
|
||||
read -rp "Введите полный путь к SSL ключу (privkey.pem): " KEY_PATH
|
||||
read -rp "Введите полный путь к сертификату (публичный ключ): " CERT_PATH
|
||||
read -rp "Введите полный путь к ключу (приватный ключ): " KEY_PATH
|
||||
|
||||
[[ -f "$CERT_PATH" ]] || die "Файл сертификата не найден: $CERT_PATH"
|
||||
[[ -f "$KEY_PATH" ]] || die "Файл ключа не найден: $KEY_PATH"
|
||||
@@ -109,7 +139,7 @@ fi
|
||||
|
||||
# Input rotation interval
|
||||
read -rp "Интервал генерации инбаундов в минутах (от 10, по умолчанию 30): " ROTATE_INTERVAL
|
||||
ROTATE_INTERVAL="${ROTATE_INTERVAL:-30}" # по умолчанию 30
|
||||
ROTATE_INTERVAL="${ROTATE_INTERVAL:-30}"
|
||||
|
||||
# Check that it's a number and ≥10
|
||||
if ! [[ "$ROTATE_INTERVAL" =~ ^[0-9]+$ ]] || [ "$ROTATE_INTERVAL" -lt 10 ]; then
|
||||
@@ -135,7 +165,13 @@ COUNTRY_FLAG=""
|
||||
IP_JSON=$(curl -s --fail http://ip-api.com/json/ || true)
|
||||
[ -z "$IP_JSON" ] && exit 0
|
||||
|
||||
COUNTRY_CODE=$(echo "$IP_JSON" | jq -r '.countryCode // empty' 2>/dev/null)
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
echo "❌ Не найден jq. Для работы скрипта необходимо установить jq."
|
||||
echo " apt install -y jq"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COUNTRY_CODE=$(echo "$IP_JSON" | jq -r '.countryCode // empty' 2>/dev/null || true)
|
||||
[ -z "$COUNTRY_CODE" ] && exit 0
|
||||
|
||||
# Flags JSON URL
|
||||
@@ -144,19 +180,22 @@ FLAGS_JSON_URL="$REPO_BASE/app/assets/flags.json"
|
||||
FLAGS_JSON=$(curl -s "$FLAGS_JSON_URL" || true)
|
||||
[ -z "$FLAGS_JSON" ] && exit 0
|
||||
|
||||
# Ищем emoji
|
||||
# emoji
|
||||
COUNTRY_FLAG=$(echo "$FLAGS_JSON" | jq -r --arg code "$COUNTRY_CODE" '.[] | select(.code == $code) | .emoji // empty' 2>/dev/null | head -n1)
|
||||
|
||||
#################################
|
||||
# Whitelist
|
||||
#################################
|
||||
curl -fsSL "$REPO_BASE/whitelist.txt" -o whitelist.txt
|
||||
log "whitelist.txt скопирован"
|
||||
if curl -fsSL "$REPO_BASE/whitelist.txt" -o whitelist.txt; then
|
||||
log "whitelist.txt скопирован"
|
||||
else
|
||||
log "⚠ Не удалось скачать whitelist.txt"
|
||||
fi
|
||||
|
||||
#################################
|
||||
# TOKEN GENERATION
|
||||
#################################
|
||||
SUB_TOKEN="$(openssl rand -hex 24)"
|
||||
SUB_TOKEN=$(date +%s%N | sha256sum | cut -c1-16)
|
||||
log "Сгенерирован токен подписки"
|
||||
|
||||
#################################
|
||||
@@ -167,21 +206,33 @@ log "Проверка Docker"
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
log "Docker уже установлен"
|
||||
else
|
||||
log "Docker не найден, будет установлен"
|
||||
log "Docker не найден, будет установлен из официального репозитория"
|
||||
# Add Docker's official GPG key:
|
||||
apt update
|
||||
apt install -y docker.io || die "Ошибка установки docker.io"
|
||||
systemctl enable docker
|
||||
systemctl restart docker
|
||||
fi
|
||||
apt install ca-certificates curl
|
||||
install -m 0755 -d /etc/apt/keyrings
|
||||
if [[ "$ID" == "ubuntu" ]]; then
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc || die "Ошибка добавления ключа Docker"
|
||||
else
|
||||
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc || die "Ошибка добавления ключа Docker"
|
||||
fi
|
||||
chmod a+r /etc/apt/keyrings/docker.asc
|
||||
|
||||
# Check docker compose v2
|
||||
if docker compose version >/dev/null 2>&1; then
|
||||
log "docker compose v2 доступен"
|
||||
else
|
||||
log "Устанавливаем docker-compose-v2"
|
||||
# решаем конфликт с docker-compose-plugin
|
||||
apt install -y --allow-downgrades --allow-remove-essential --allow-change-held-packages \
|
||||
docker-compose-v2 || warn "docker-compose-v2 не установлен, возможно уже есть плагин"
|
||||
# Add the repository to Apt sources:
|
||||
CODENAME=${UBUNTU_CODENAME:-$VERSION_CODENAME}
|
||||
tee /etc/apt/sources.list.d/docker.sources <<EOF
|
||||
Types: deb
|
||||
URIs: https://download.docker.com/linux/$ID
|
||||
Suites: $CODENAME
|
||||
Components: stable
|
||||
Signed-By: /etc/apt/keyrings/docker.asc
|
||||
EOF
|
||||
|
||||
apt update
|
||||
|
||||
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
systemctl enable docker
|
||||
systemctl start docker
|
||||
fi
|
||||
|
||||
#################################
|
||||
@@ -234,6 +285,7 @@ curl -fsSL "$REPO_BASE/app/package.json" -o app/package.json
|
||||
# JS Files
|
||||
#################################
|
||||
curl -fsSL "$REPO_BASE/app/index.js" -o app/index.js
|
||||
curl -fsSL "$REPO_BASE/app/rotate.js" -o app/rotate.js
|
||||
curl -fsSL "$REPO_BASE/app/builders/buildVlessRealityTcp.js" -o app/builders/buildVlessRealityTcp.js
|
||||
curl -fsSL "$REPO_BASE/app/builders/buildVlessRealityXhttp.js" -o app/builders/buildVlessRealityXhttp.js
|
||||
curl -fsSL "$REPO_BASE/app/builders/buildTrojanRealityTcp.js" -o app/builders/buildTrojanRealityTcp.js
|
||||
@@ -342,6 +394,18 @@ http {
|
||||
EOF
|
||||
fi
|
||||
|
||||
# ufw
|
||||
if LC_ALL=C ufw status 2>/dev/null | grep -q "Status: active"; then
|
||||
echo "UFW найден и активен. Открываем порты..."
|
||||
ufw allow 443/tcp
|
||||
ufw allow 443/udp
|
||||
ufw allow 8443/tcp
|
||||
ufw allow 8443/udp
|
||||
ufw allow "$NGINX_PORT"/tcp
|
||||
ufw allow 10000:60000/tcp
|
||||
ufw allow 10000:60000/udp
|
||||
fi
|
||||
|
||||
#################################
|
||||
# RUN
|
||||
#################################
|
||||
|
||||
@@ -17,6 +17,12 @@ need_root() {
|
||||
[[ $EUID -eq 0 ]] || die "Запускать только от root"
|
||||
}
|
||||
|
||||
if ! command -v curl >/dev/null 2>&1; then
|
||||
echo "❌ curl не установлен. Установите curl и повторите попытку"
|
||||
echo " apt install -y curl"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#################################
|
||||
# CONFIG
|
||||
#################################
|
||||
@@ -74,6 +80,11 @@ docker compose build node
|
||||
log "Перезапускаем контейнеры"
|
||||
docker compose up -d
|
||||
|
||||
if [ -f "app/my_whitelist.txt" ]; then
|
||||
log "✔ Копируем my_whitelist.txt в контейнер..."
|
||||
docker cp app/my_whitelist.txt node:/app/my_whitelist.txt
|
||||
fi
|
||||
|
||||
#################################
|
||||
# HEALTH CHECK
|
||||
#################################
|
||||
|
||||
+79
-431
@@ -1,452 +1,100 @@
|
||||
2gis.com
|
||||
2gis.ru
|
||||
300.ya.ru
|
||||
3475482542.mc.yandex.ru
|
||||
742231.ms.ok.ru
|
||||
a.auth-nsdi.ru
|
||||
a.res-nsdi.ru
|
||||
a.wb.ru
|
||||
adm.digital.gov.ru
|
||||
adm.mp.rzd.ru
|
||||
admin.cs7777.vk.ru
|
||||
admin.tau.vk.ru
|
||||
ads.vk.ru
|
||||
ir.ozone.ru
|
||||
ozon.ru
|
||||
refersion.com
|
||||
st.ozone.ru
|
||||
stats.vk-portal.net
|
||||
www.vk.com
|
||||
ads.x5.ru
|
||||
adv.ozon.ru
|
||||
ai-gpt1.vepene.site
|
||||
ai4.vepene.site
|
||||
akashi.vk-portal.net
|
||||
alfabank.ru
|
||||
aliusfilms.ru
|
||||
ams2-cdn.2gis.com
|
||||
an.yandex.ru
|
||||
analytics.vk.ru
|
||||
api-maps.yandex.ru
|
||||
api.2gis.ru
|
||||
api.avito.ru
|
||||
api.browser.yandex.com
|
||||
api.browser.yandex.ru
|
||||
api.cs7777.vk.ru
|
||||
api.events.plus.yandex.net
|
||||
api.fastload.site
|
||||
api.furypay.ru
|
||||
api.max.ru
|
||||
api.nodesecure.ru
|
||||
api.ok.ru
|
||||
api.photo.2gis.com
|
||||
api.plus.kinopoisk.ru
|
||||
api.reviews.2gis.com
|
||||
api.s3.yandex.net
|
||||
api.speedload.online
|
||||
api.speedload.ru
|
||||
api.tau.vk.ru
|
||||
api.uxfeedback.yandex.net
|
||||
api.vk.ru
|
||||
apiok.ru
|
||||
apple.com
|
||||
at.ultima.foundation
|
||||
auto.ru
|
||||
autodiscover.ord.ozon.ru
|
||||
avatars.mds.yandex.com
|
||||
avatars.mds.yandex.net
|
||||
avito.ru
|
||||
avito.st
|
||||
away.cs7777.vk.ru
|
||||
away.tau.vk.ru
|
||||
b.auth-nsdi.ru
|
||||
b.res-nsdi.ru
|
||||
bank.ozon.ru
|
||||
banners-website.wildberries.ru
|
||||
bfds.sberbank.ru
|
||||
bg.fasssst.ru
|
||||
bot.gosuslugi.ru
|
||||
botapi.max.ru
|
||||
bro-bg-store.s3.yandex.com
|
||||
bro-bg-store.s3.yandex.net
|
||||
bro-bg-store.s3.yandex.ru
|
||||
brontp-pre.yandex.ru
|
||||
browser.yandex.com
|
||||
browser.yandex.ru
|
||||
business.vk.ru
|
||||
cargo.rzd.ru
|
||||
catalog.api.2gis.com
|
||||
cdn-de.maviks.ru
|
||||
cdn.fastload.site
|
||||
cdn.glorypay.ru
|
||||
cdn.kickdown.click
|
||||
cdn.lemanapro.ru
|
||||
cdn.m1space.ru
|
||||
cdn.s3.yandex.net
|
||||
cdn.speedload.ru
|
||||
cdn.tbank.ru
|
||||
cdn.yandex.ru
|
||||
cdncloudone.serverstats.ru
|
||||
cdncloudthree.serverstats.ru
|
||||
cdncloudtwo.serverstats.ru
|
||||
cdnfive.serverstats.ru
|
||||
cdnmsk.serverstats.ru
|
||||
cdnrhkgfkkpupuotntfj.svc.cdn.yandex.net
|
||||
cdnsix.vk-com.ru
|
||||
cdntwo.dnsttlocate.ru
|
||||
cdntwo.speedstream.ru
|
||||
ch.fjdjdjfjd.icu
|
||||
chat-prod.wildberries.ru
|
||||
chat.speedload.ru
|
||||
chat3.vtb.ru
|
||||
cloud.cdn.yandex.com
|
||||
cloud.cdn.yandex.net
|
||||
cloud.cdn.yandex.ru
|
||||
cloud.vk.com
|
||||
cloud.vk.ru
|
||||
cloudcdn-ams19.cdn.yandex.net
|
||||
cloudcdn-m9-10.cdn.yandex.net
|
||||
cloudcdn-m9-12.cdn.yandex.net
|
||||
cloudcdn-m9-13.cdn.yandex.net
|
||||
cloudcdn-m9-14.cdn.yandex.net
|
||||
cloudcdn-m9-15.cdn.yandex.net
|
||||
cloudcdn-m9-2.cdn.yandex.net
|
||||
cloudcdn-m9-3.cdn.yandex.net
|
||||
cloudcdn-m9-4.cdn.yandex.net
|
||||
cloudcdn-m9-5.cdn.yandex.net
|
||||
cloudcdn-m9-6.cdn.yandex.net
|
||||
cloudcdn-m9-7.cdn.yandex.net
|
||||
cloudcdn-m9-9.cdn.yandex.net
|
||||
cloudlane.xyz
|
||||
cms-res-web.online.sberbank.ru
|
||||
cobrowsing.tbank.ru
|
||||
collections.yandex.com
|
||||
collections.yandex.ru
|
||||
company.rzd.ru
|
||||
connect.cs7777.vk.ru
|
||||
contacts.rzd.ru
|
||||
contract.gosuslugi.ru
|
||||
crowdtest.payment-widget-smarttv.plus.tst.kinopoisk.ru
|
||||
crowdtest.payment-widget.plus.tst.kinopoisk.ru
|
||||
cs.avito.ru
|
||||
cs7777.vk.ru
|
||||
csp.yandex.net
|
||||
d-assets.2gis.ru
|
||||
dating.ok.ru
|
||||
de1.vepene.site
|
||||
dev.cs7777.vk.ru
|
||||
dev.max.ru
|
||||
dev.tau.vk.ru
|
||||
digital.gov.ru
|
||||
disk.2gis.com
|
||||
disk.rzd.ru
|
||||
dmp.dmpkit.lemanapro.ru
|
||||
dnd.wb.ru
|
||||
download.max.ru
|
||||
dr.yandex.net
|
||||
dr2.yandex.net
|
||||
dropbox.com
|
||||
dzen.ru
|
||||
edgeport.xyz
|
||||
career.ozon.ru
|
||||
dancer.sbrf-cdn342.ru
|
||||
egress.yandex.net
|
||||
eh.vk.com
|
||||
eh.vk.ru
|
||||
ekmp-a-51.rzd.ru
|
||||
enterprise.api-maps.yandex.ru
|
||||
esa-res.online.sberbank.ru
|
||||
esia.gosuslugi.ru
|
||||
event.yandex.ru
|
||||
expert.vk.ru
|
||||
external-api.mediabilling.kinopoisk.ru
|
||||
external-api.plus.kinopoisk.ru
|
||||
fastsync.xyz
|
||||
favicon.yandex.com
|
||||
favicon.yandex.net
|
||||
favicon.yandex.ru
|
||||
favorites.api.2gis.com
|
||||
filekeeper-vod.2gis.com
|
||||
finance.wb.ru
|
||||
fr.connectvpn.tech
|
||||
frontend.vh.yandex.ru
|
||||
fw.wb.ru
|
||||
gbr.fasssst.online
|
||||
germany1.cdn.yandexdns.ru
|
||||
germany2.cdn.yandexdns.ru
|
||||
gos9.portal-guard.com
|
||||
gosuslugi.ru
|
||||
gosweb.gosuslugi.ru
|
||||
gotraf.nodesecure.ru
|
||||
goya.rutube.ru
|
||||
gpt-plus.vepene.site
|
||||
gpt3.vepene.site
|
||||
graphql-web.kinopoisk.ru
|
||||
graphql.kinopoisk.ru
|
||||
greone.dnsttlocate.ru
|
||||
gretwo.dnsttlocate.ru
|
||||
gu-st.ru
|
||||
hd.kinopoisk.ru
|
||||
hello.opengate.tech
|
||||
help.max.ru
|
||||
hkg.tunnelguard.ru
|
||||
hlb.tunnelguard.ru
|
||||
hls-svod.itunes.apple.com
|
||||
hrc.tbank.ru
|
||||
http-check-headers.yandex.ru
|
||||
i.max.ru
|
||||
i0.photo.2gis.com
|
||||
i1.photo.2gis.com
|
||||
i1ugrwg2dj.a.trbcdn.net
|
||||
i2.photo.2gis.com
|
||||
i3.photo.2gis.com
|
||||
i4.photo.2gis.com
|
||||
i5.photo.2gis.com
|
||||
i6.photo.2gis.com
|
||||
i7.photo.2gis.com
|
||||
i8.photo.2gis.com
|
||||
i9.photo.2gis.com
|
||||
id.cs7777.vk.ru
|
||||
id.sber.ru
|
||||
id.tau.vk.ru
|
||||
id.tbank.ru
|
||||
id.vk.ru
|
||||
ietf.org
|
||||
images.apple.com
|
||||
imgproxy.cdn-tinkoff.ru
|
||||
informer.yandex.ru
|
||||
invest.ozon.ru
|
||||
io.ozone.ru
|
||||
ir.ozone.ru
|
||||
izbirkom.ru
|
||||
jam.api.2gis.com
|
||||
jitsi.wb.ru
|
||||
keys.api.2gis.com
|
||||
kiks.yandex.com
|
||||
kiks.yandex.ru
|
||||
kinopoisk.ru
|
||||
knix.fasssst.online
|
||||
le.tbank.ru
|
||||
learning.ozon.ru
|
||||
legal.max.ru
|
||||
lemanapro.ru
|
||||
link.max.ru
|
||||
link.mp.rzd.ru
|
||||
live.com
|
||||
live.ok.ru
|
||||
lk.gosuslugi.ru
|
||||
log.strm.yandex.ru
|
||||
login.cs7777.vk.ru
|
||||
login.tau.vk.ru
|
||||
login.vk.com
|
||||
login.vk.ru
|
||||
lv2.ultima.foundation
|
||||
lva.tunnelguard.ru
|
||||
m.47news.ru
|
||||
m.avito.ru
|
||||
m.cs7777.vk.ru
|
||||
m.ok.ru
|
||||
m.tau.vk.ru
|
||||
google.com
|
||||
ign.com
|
||||
ir-2.ozone.ru
|
||||
m.ok.com
|
||||
m.vk.com
|
||||
m.vk.ru
|
||||
m.vkvideo.cs7777.vk.ru
|
||||
ma.kinopoisk.ru
|
||||
mail.yandex.com
|
||||
mail.yandex.ru
|
||||
map.gosuslugi.ru
|
||||
mapgl.2gis.com
|
||||
mapi.learning.ozon.ru
|
||||
market.rzd.ru
|
||||
maviks.ru
|
||||
max.ru
|
||||
mc.yandex.com
|
||||
mc.yandex.ru
|
||||
me.cs7777.vk.ru
|
||||
mediafeeds.yandex.com
|
||||
mediafeeds.yandex.ru
|
||||
mediarush.xyz
|
||||
megafon.ru
|
||||
metrics.alfabank.ru
|
||||
microapps.kinopoisk.ru
|
||||
mp.rzd.ru
|
||||
ms.cs7777.vk.ru
|
||||
msk.t2.ru
|
||||
mts.ru
|
||||
multitest.ok.ru
|
||||
music.vk.ru
|
||||
music.yandex.ru
|
||||
my.oversecure.pro
|
||||
my.rzd.ru
|
||||
mynode.nodesecure.ru
|
||||
mynoderu.nodesecure.ru
|
||||
neself.nodesecure.ru
|
||||
neuro.translate.yandex.ru
|
||||
nl.ultima.foundation
|
||||
nl3.truservice.top
|
||||
nla.tunnelguard.ru
|
||||
novorossiya.gosuslugi.ru
|
||||
nr9.strelkavpn.ru
|
||||
oauth.cs7777.vk.ru
|
||||
oauth.tau.vk.ru
|
||||
oauth2.cs7777.vk.ru
|
||||
ok.ufavpn.ru
|
||||
oneclick-payment.kinopoisk.ru
|
||||
online.sberbank.ru
|
||||
ord.ozon.ru
|
||||
ord.vk.ru
|
||||
oversecure.pro
|
||||
owa.ozon.ru
|
||||
ozon.ru
|
||||
partners.gosuslugi.ru
|
||||
partners.lemanapro.ru
|
||||
pay.ozon.ru
|
||||
payment-widget-smarttv.plus.kinopoisk.ru
|
||||
payment-widget.kinopoisk.ru
|
||||
payment-widget.plus.kinopoisk.ru
|
||||
pic.rutubelist.ru
|
||||
pl-res.online.sberbank.ru
|
||||
playself.nodesecure.ru
|
||||
plb.tunnelguard.ru
|
||||
plr.strelkavpn.ru
|
||||
pos.gosuslugi.ru
|
||||
powodzenia.xyz
|
||||
pptest.userapi.com
|
||||
preview.rutube.ru
|
||||
prodvizhenie.rzd.ru
|
||||
public-api.reviews.2gis.com
|
||||
pulse.mp.rzd.ru
|
||||
push.vk.ru
|
||||
queuev4.vk.com
|
||||
quiz.kinopoisk.ru
|
||||
r.vk.ru
|
||||
r0.mradx.net
|
||||
receive-sentry.lmru.tech
|
||||
reserve.ayagut.ovh
|
||||
rontgen.fasssst.ru
|
||||
ru.ultima.foundation
|
||||
runstream.xyz
|
||||
rutube.ru
|
||||
rzd.ru
|
||||
s.vtb.ru
|
||||
s0.bss.2gis.com
|
||||
s1.bss.2gis.com
|
||||
s3.t2.ru
|
||||
s3.yandex.net
|
||||
sba.yandex.com
|
||||
sba.yandex.net
|
||||
sba.yandex.ru
|
||||
sberbank.ru
|
||||
secure-cloud.rzd.ru
|
||||
secure.rzd.ru
|
||||
securepay.ozon.ru
|
||||
selfpl.speedload.online
|
||||
seller.ozon.ru
|
||||
sfd.gosuslugi.ru
|
||||
shiftline.xyz
|
||||
smartcaptcha.yandexcloud.net
|
||||
sntr.avito.ru
|
||||
softpipe.xyz
|
||||
speller.yandex.net
|
||||
sso-app4.vtb.ru
|
||||
sso-app5.vtb.ru
|
||||
sso.auto.ru
|
||||
sso.dzen.ru
|
||||
sso.passport.yandex.ru
|
||||
ssp.rutube.ru
|
||||
st-im.kinopoisk.ru
|
||||
st-ok.cdn-vk.ru
|
||||
st.avito.ru
|
||||
st.kinopoisk.ru
|
||||
st.max.ru
|
||||
st.okcdn.ru
|
||||
st.ozone.ru
|
||||
st.vk.com
|
||||
static-mon.yandex.net
|
||||
static.lemanapro.ru
|
||||
news.ufa-help.ru
|
||||
ob06vexvjl.a.trbcdn.net
|
||||
static.rutube.ru
|
||||
stats.avito.ru
|
||||
stats.vk-portal.net
|
||||
sto.eu-ffast.com
|
||||
storage.ape.yandex.net
|
||||
streamport.xyz
|
||||
strm-rad-23.strm.yandex.net
|
||||
strm.yandex.net
|
||||
strm.yandex.ru
|
||||
styles.api.2gis.com
|
||||
suggest.dzen.ru
|
||||
suggest.sso.dzen.ru
|
||||
sun6-20.userapi.com
|
||||
sun6-21.userapi.com
|
||||
sun6-22.userapi.com
|
||||
sun9-101.userapi.com
|
||||
sun9-38.userapi.com
|
||||
surveys.yandex.ru
|
||||
sync.browser.yandex.net
|
||||
tamtam.ok.ru
|
||||
target.vk.ru
|
||||
team.rzd.ru
|
||||
tech.vk.ru
|
||||
tgju.org
|
||||
ticket.rzd.ru
|
||||
tickets.widget.kinopoisk.ru
|
||||
tile0.maps.2gis.com
|
||||
tile1.maps.2gis.com
|
||||
tile2.maps.2gis.com
|
||||
tile3.maps.2gis.com
|
||||
tile4.maps.2gis.com
|
||||
tradingview.com
|
||||
travel.rzd.ru
|
||||
travel.yandex.ru
|
||||
travel.yastatic.net
|
||||
ui.cs7777.vk.ru
|
||||
ui.tau.vk.ru
|
||||
usa1.vepene.site
|
||||
user-geo-data.wildberries.ru
|
||||
uslugi.yandex.ru
|
||||
uxfeedback-cdn.s3.yandex.net
|
||||
uxfeedback.yandex.ru
|
||||
vk-portal.net
|
||||
vkvideo.cs7777.vk.ru
|
||||
tvdesign.ru
|
||||
vk.com
|
||||
vkvideo.ru
|
||||
ws.fjdjdjfjd.icu
|
||||
www.rutube.ru
|
||||
www.vkvideo.ru
|
||||
xverager2.uspn.io
|
||||
ya.ru
|
||||
01.img.avito.st
|
||||
0ru84.tcpdoor.net
|
||||
aliusfilms.ru
|
||||
api.avito.ru
|
||||
azizoarjmand.info
|
||||
breeze.mos-drywall.shop
|
||||
breeze.my-rebar.shop
|
||||
cdn.tbank.ru
|
||||
content.fasssst.ru
|
||||
download.cdn.yandex.net
|
||||
es5.fasssst.online
|
||||
fin1.nfnpx.online
|
||||
fr1.nfnpx.online
|
||||
ger1.nfnpx.online
|
||||
ger2.nfnpx.online
|
||||
ger3.nfnpx.online
|
||||
ger4.nfnpx.online
|
||||
hkg.tunnelguard.ru
|
||||
hls-svod.itunes.apple.com
|
||||
i2pd.website
|
||||
j1p.1gb.site
|
||||
khabarovsk.geodema.network
|
||||
kz1.nfnpx.online
|
||||
max3.skystreamgame.com
|
||||
maxru.outlinekeys.net
|
||||
miro.com
|
||||
my-rebar.shop
|
||||
nl1.nfnpx.online
|
||||
nsk.geodema.network
|
||||
ovhwuxian.pai50288.uk
|
||||
pl1.nfnpx.online
|
||||
plb.tunnelguard.ru
|
||||
res.fasssst.ru
|
||||
ru2.nfnpx.online
|
||||
rutube.ru
|
||||
sni.111000.dynv6.net
|
||||
statue.lnmarketplace.net
|
||||
sun6-20.userapi.com
|
||||
tbankru.outlinekeys.net
|
||||
tunnel.vk-apps.com
|
||||
turkmenistan.gov.tm
|
||||
usa1.nfnpx.online
|
||||
veraams2.uspn.io
|
||||
verager2.uspn.io
|
||||
verahk1.uspn.io
|
||||
verakz1.uspn.io
|
||||
verarussia1.uspn.io
|
||||
vk.ookcdn.ru
|
||||
vless.hubp.de
|
||||
vless.muzheng.top
|
||||
voter.gosuslugi.ru
|
||||
vt-1.ozone.ru
|
||||
wap.yandex.com
|
||||
wap.yandex.ru
|
||||
wb.ru
|
||||
web.max.ru
|
||||
wechat.com
|
||||
welcome.rzd.ru
|
||||
widgets.kinopoisk.ru
|
||||
wikiportal.su
|
||||
ws-api.oneme.ru
|
||||
ws.seller.ozon.ru
|
||||
wtvp7ujn9v.a.trbcdn.net
|
||||
www.abingdon.org.uk
|
||||
www.apple.com
|
||||
www.avito.ru
|
||||
www.avito.st
|
||||
www.bing.com
|
||||
www.cikrf.ru
|
||||
www.gosuslugi.ru
|
||||
workerr.schodog1.workers.dev
|
||||
www.cloudflare.com
|
||||
www.google.com
|
||||
www.ietf.org
|
||||
www.kinopoisk.ru
|
||||
www.microsoft.com
|
||||
www.ok.ru
|
||||
www.mozilla.org
|
||||
www.ozon.ru
|
||||
www.rutube.ru
|
||||
www.rzd.ru
|
||||
www.sberbank.ru
|
||||
www.t2.ru
|
||||
www.trustnav.com
|
||||
www.vk.com
|
||||
www.vtb.ru
|
||||
xapi.ozon.ru
|
||||
ya.ru
|
||||
yabro-wbplugin.edadeal.yandex.ru
|
||||
yabs.yandex.ru
|
||||
xfer.mos-drywall.shop
|
||||
xfer.my-rebar.shop
|
||||
xverakz1.uspn.io
|
||||
xverarussia1.uspn.io
|
||||
yahoo.com
|
||||
yandex.com
|
||||
yandex.net
|
||||
yandex.ru
|
||||
yandexcdn.yandexdns.ru
|
||||
yandexcdn2.yandexdns.ru
|
||||
yastatic.net
|
||||
yt.fasssst.ru
|
||||
zen-yabro-morda.mediascope.mc.yandex.ru
|
||||
zen.yandex.com
|
||||
zen.yandex.net
|
||||
zen.yandex.ru
|
||||
zoomzoom.xyz
|
||||
yt.fasssst.ru
|
||||
Reference in New Issue
Block a user