17 Commits

Author SHA1 Message Date
DenPiligrim 0c16656c4f Merge pull request #5 from denpiligrim/dp-fix
v1.0.2
2026-01-05 14:29:03 +03:00
Den Piligrim 45f67d3848 add: self-signed cert, docker, cmd rotate 2026-01-05 14:27:03 +03:00
Den Piligrim b77e5560c8 fix url 2026-01-03 22:09:46 +03:00
Den Piligrim c48e3df360 fix var 2026-01-03 22:04:50 +03:00
Den Piligrim 17f7baaf61 fix: docker panel, selfsigned cert 2026-01-03 16:05:00 +03:00
DenPiligrim 1738fe4d64 Merge pull request #3 from denpiligrim/dp-fix
v1.0.1
2025-12-27 19:31:37 +03:00
Den Piligrim 36163093ea v1.0.1 2025-12-27 19:00:29 +03:00
Den Piligrim e4015d0adf fix port 2025-12-27 18:22:21 +03:00
Den Piligrim 88cc96a75d few fixes 2025-12-27 18:16:04 +03:00
Den Piligrim fa3e984189 update shell scripts 2025-12-27 17:27:53 +03:00
Den Piligrim 94fb12194e update readme 2025-12-27 16:57:25 +03:00
Den Piligrim 1906ed4969 new whitelist 2025-12-27 16:28:24 +03:00
Den Piligrim 28c59783c9 fix docker installation 2025-12-27 16:00:16 +03:00
Den Piligrim 39eab5bf4e fix gpg key 2025-12-27 15:36:34 +03:00
Den Piligrim f385b57b1b sub token 2025-12-27 15:28:46 +03:00
Den Piligrim f20f722743 branch 2025-12-27 15:16:44 +03:00
Den Piligrim b6ffaa722c fix install.sh/index.js 2025-12-27 15:14:11 +03:00
15 changed files with 545 additions and 535 deletions
+11
View File
@@ -0,0 +1,11 @@
# Внести вклад
Буду рад любому вкладу в разработку проекта! Простой процесс для контрибьюторов:
1. Форкните репозиторий на GitHub.
2. Создайте ветку с осмысленным именем, например `feature/add-README` или `fix/whitelist-load`.
3. Внесите изменения и добавьте короткое описание в коммите.
4. Запустите локально базовые проверки (если есть).
5. Отправьте ветку в ваш форк и создайте Pull Request в основной репозиторий.
<sup>Советы: описывайте изменения в PR, указывайте цель и тестовые шаги. Если изменения большие — разделяйте на маленькие коммиты.</sup>
+41 -14
View File
@@ -2,7 +2,7 @@
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
![Version](https://img.shields.io/badge/version-1.0-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](https://www.youtube.com/@denpiligrim)
![Version](https://img.shields.io/badge/version-1.0.2-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](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
View File
@@ -2,7 +2,7 @@
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
![Version](https://img.shields.io/badge/version-1.0-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](https://www.youtube.com/@denpiligrim)
![Version](https://img.shields.io/badge/version-1.0.2.1-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](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
View File
@@ -2,7 +2,7 @@
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
![Version](https://img.shields.io/badge/version-1.0-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](https://www.youtube.com/@denpiligrim)
![Version](https://img.shields.io/badge/version-1.0.2-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](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
View File
@@ -2,7 +2,7 @@
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
![Version](https://img.shields.io/badge/version-1.0-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](https://www.youtube.com/@denpiligrim)
![Version](https://img.shields.io/badge/version-1.0.2-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](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
View File
@@ -2,7 +2,7 @@
<p><img src="https://denpiligrim.ru/storage/images/3dp-manager.png" alt="3dp-manager preview"></p>
![Version](https://img.shields.io/badge/version-1.0-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](https://www.youtube.com/@denpiligrim)
![Version](https://img.shields.io/badge/version-1.0.2-blue.svg) [![License](https://img.shields.io/badge/license-GPL%20V3-blue.svg?longCache=true)](https://www.gnu.org/licenses/gpl-3.0) [![Telegram](https://img.shields.io/badge/Telegram-26A5E4?style=flat&logo=telegram&logoColor=white)](https://t.me/denpiligrim_web) [![YouTube Channel Subscribers](https://img.shields.io/youtube/channel/subscribers/UCOv2tFFYDY4mXOM60PVz8zw)](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>
---
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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();
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
#################################
+11
View File
@@ -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
View File
@@ -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