Агрегация подписок 3X-UI
В первой моей публикации обсудим, как объединить ссылки на подписки 3x-ui с нескольких серверов
Допустим, у нас есть два VPS с панелями на борту: один в Германии, другой в Нидерландах. Как же сделать так, чтобы оба добавлялись в клиентское приложение одной ссылкой?
Контакты и не только
Автор: https://t.me/noisycake
Блог: https://noisycake.ru
Зачем это вообще нужно?
Объединение нескольких панелей может быть крайне полезным для продавцов VPN-подписок и пользователей, ведь вместо того, чтобы вставлять кучу ссылок для каждой локации/сервера, клиенту нужно будет скопировать лишь одну.
Неполноценный способ
В качестве разминки просто объединим две ссылки на конфигурации, то есть основная функция подписки (обновление конфигурации) работать не будет!
1) Открываем 3x-ui на первом сервере и копируем обычную ссылку клиента;
2) Вставляем её в пустой текстовый файл (.txt);
3) Повторяем то же самое со вторым сервером, и получившийся результат вставляем на следующую строку в том же файле;
4) .txt теперь можно выложить в открытый доступ и скормить ссылку приложению-клиенту.
К примеру, закинем файл на GitHub.
Создаём новый репозиторий -> нажимаем "upload an existing file" -> прикрепляем наш файл -> жмём "Commit changes".
Тыкаем на файл. Чтобы получить правильную ссылку, нужно нажать на кнопку "Raw" в правой части экрана.
На открывшейся вкладке копируем ссылку из поисковой строки. Выглядеть она будет примерно так:
https://raw.githubusercontent.com/Whoami/justfortest/refs/heads/main/sub.txt
Как раз её мы и будем вставлять в приложения-клиенты по типу Hiddify и Nekobox. Проверим в первом. Копипастим ссылку, переходим в раздел "Прокси" левой менюшки. Отлично, видим оба наших подключения. Если нажать на "auto", будет выбираться сервер с наименьшим пингом.
Вуаля! И вроде никаких заморочек, но есть две проблемы:
- Ссылку может получить кто угодно. Решается ограничением доступа или использованием других способов публикации ссылки;
- Если вы измените конфигурацию подключения, клиент (NekoBox, Hiddify и т.п.) не сможет достать новые данные, ведь мы дали ссылки на статичные конфигурационные файлы, которые не обновляются автоматически. Получается, вносить изменения придётся вручную.
Посмотрим, как можно решить эти вопросы.
Оптимальное решение
Главное условие: включить функцию "подписки" в 3x-ui на каждом из серверов (рассказывал об этом в своём блоге), а также сделать одинаковый ник в поле "Subscription" для клиентов, которых вы будете объединять.
Чтобы исключить проблемы прошлого варианта, можно поднять обратный прокси на одном из имеющихся VPS, который будет автоматически брать конфиги с панелей и объединять их. Воспользуемся готовым решением от пользователя GitHub https://github.com/apa4h
UPD: Написал своё приложение, работающее на Python + Nginx: https://github.com/NoisyCake/3x-ui_subscriptions_aggregator. Процесс установки описан по ссылке, но в этой статье оставил разбор стороннего решения
Вы можете спросить меня, что ещё за обратный прокси такой? В общем-то, это ПО (в нашем случае nginx), которое получает от пользователей запросы, перенаправляет их другим приложениям и возвращает ответы
Заходим на какой-нибудь из серверов. Установим необходимые утилиты и скачаем репозиторий:
sudo apt install docker-compose git clone https://github.com/apa4h/nginx-3x-ui-subscription-proxy.git cd nginx-3x-ui-subscription-proxy.git/ cp .env.template .env
Теперь нужно настроить переменные окружения. Переходим в только что созданный файл: nano .env
Перед нами будут следующие строки:
Для начала определимся, нужен нам https или нет. Если у вас нет сертификатов на сервере, и вы не хотите с ними заморачиваться, оставьте TLS_MODE=off. Но в таком случае могут возникнуть проблемы с подключением, поскольку многие клиентские приложения проверяют ссылку на наличие https. Если же у вас есть сертификат или вы хотите его сделать (рассказывал в этом гайде), смените на "on".
В первой строке нужно указать папку, где хранятся ключи сертификата.
SITE_HOST: если устанавливали сертификат, нужно писать адрес, на который этот сертификат распространяется. В противном случае вбиваем IP сервера.
В SITE_PORT пишем любой свободный порт на сервере.
SERVERS: перечисляем через пробел пути к подписке каждого сервера. Ссылки должны выглядеть так:
https://<ip_или_домен>:<порт_подписки>/<корневой_url_подписки>/
Можете просто скопировать ссылку на подписку в подключении и убрать имя клиента в конце.
В SUB можете указать, как будет выглядеть статическая часть ссылки на общую подписку. Я оставлю без изменений.
В итоге получаем что-то такое:
Веб-сервер работает 😊. Чтобы получить подписку, нужно обратиться по адресу:
https://<SITE_HOST>/<SUB><никнейм_подписки> (http://... если TLS_MODE=off), где "никнейм_подписки" — "Subscription", который вы указывали в настройках клиента подключений. Напомню, что в каждом подключении они должен быть одинаковыми.
Если вы всё сделали правильно, то при попытке вставить ссылку в клиент, подтянутся конфиги. Также проверьте, работает ли обновление. Для этого измените подключение в панели (к примеру, порт) -> сохраните изменения -> обновите подписку в клиенте -> попробуйте подключиться. Таймаутов быть не должно.
Примечание: При создании сервиса по продаже VPN-подписок нужно понимать, что для каждого пользователя придётся генерировать сложно-подбираемый "Subscription", иначе велика вероятность абуза.