Использую 3X-UI на VPS, место WG, OpenVPN и Outline. Но столкнулся с проблемой. VPS хочется использовать не только для обхода ограничений, но еще и для других целей, вроде своего сайта, бота в телеграмме и тп.
Понял, что для решения проблемы стоит использовать реверс-прокси, остановил свой выбор на Traefik, но не получается настроить его для 3X-UI (с условным приложением на React все получилось).
Пробовал искать конфиги, но нашел только пару для X-UI, но с ними не завелось .
Первый вариант
В x-ui для inbound с Reality включен только этот Reality. По поводу путей панели и подписок у меня договорённость между x-ui и Traefik. Для HOSTNAME перед запуском был выполнен экспорт из bash: export HOSTNAME. Энтрипоинт на :54321 был добавлен для удобства с панелью. Сейчас у меня x-ui, а у 3x-ui другой дефолтный порт. Да и вообще обратите внимание на имена энтрипоинтов, вдруг не совпадают.
Идея в том, что нужно создать роутер, который будет отправлять запросы на поддельный адрес (www.microsoft.com в моем случае) на 443 порт контейнера. Для этого используется директива HostSNI.
443 порт в контейнере должен быть свободен, веб-морду и сервис подписок вешайте на другие порты (я на них делаю роутинг через отдельные поддомены, traefik запрашивает сертификат сразу на все поддомены, wildcard certificate).
version: "3.9"
services:
xui:
image: alireza7/x-ui
container_name: x-ui
volumes:
- ПУТЬ_ДЛЯ_БЕКАПА_НАСТРОЕК:/etc/x-ui/
environment:
PUID: 1000
PGID: 1000
TZ: America/Los_Angeles #ПОМЕНЯЙТЕ НА СВОЙ ЧАСОВОЙ ПОЯС
XRAY_VMESS_AEAD_FORCED: "false"
networks:
- intranet
restart: unless-stopped
labels:
- traefik.http.routers.xui.rule=Host(`xui.ДОМЕН_TRAEFIK.com`)
- traefik.http.routers.xui.service=xui-web-config
- traefik.http.services.xui-web-config.loadbalancer.server.port=54321 #ПОРТ ДЛЯ Web-морды
- traefik.http.routers.xui-sub.rule=Host(`sssub.ДОМЕН_TRAEFIK.com`)
- traefik.http.routers.xui-sub.service=xui-subscription
- traefik.http.services.xui-subscription.loadbalancer.server.port=4433 #ПОРТ для подписок
- traefik.tcp.routers.vless.rule=HostSNI(`www.microsoft.com`)
- traefik.tcp.routers.vless.tls.passthrough=true
- traefik.tcp.routers.vless.service=xui-reality
- traefik.tcp.services.xui-reality.loadbalancer.server.port=443
networks:
intranet: #СЕТЬ В КОТОРОЙ РАБОТАЕТ TRAEFIK
external: true
Единственная проблема в том, что в веб-морде неправильно отображается ссылка на подписки, приходится менять http на https в начале и удалять порт.
Думаю тема достаточно актуальна и может быть полезна для настройки нескольких протоколов на сервере не только для меня.
Если кто-то уже использует связку Traefik и 3X-UI, не могли бы вы поделиться своим конфигом compose файла?
Ну можно и так сказать. Просто сайт который стоит на VPS желательно тоже на 443/80 ставить, чтоб посетители не указывали порт при подключении, и Reality очень желательно на 443 ставить.
По сути на 443/80 стоит Traefik, а он уже в зависимости от запроса направляет его куда нужно.
Можно место traefik использовать nginx, но мне traefik показался более удобным ещё и certbot отдельно ставить не нужно.
Настраивал на основе этих конфигов и рекомендаций.
У меня конфиг самого прокси аналогичен роутеру xui-reality-r из первого варианта; но использую другой домен, не www.microsoft.com.
В итоге имею 3 сервиса: 1) поддомен веб-морды 3X-UI; 2) поддомен для подписок (публично доступный); 3) поддомен для самого прокси reality.
XRAY: Failed to start: app/proxyman/inbound: failed to listen TCP on 443 > transport/internet:failed to listen on address: 188.212.125.206:443 > transport/internet/tcp: failed to listen TCP on 188.212.125.206:443 > listen tcp 188.212.125.206:443: bind: cannot assign requested address
Проверю, но думаю дело не в настройке сети, потому что веб морда заводится, а значит traefik видит контейнер с 3x-ui и направляет трафик на морду, значит контейнеры работают в одной сети