← К библиотеке
Панель Практика

3x-ui: клиенты и ссылка-подписка

Инбаунд подняли — теперь надо выдать человеку доступ. Покажу, как правильно завести клиента в 3x-ui (только через интерфейс, и почему это критично), навесить лимиты со сроком и отдать ему одну ссылку-подписку вместо кучи ссылок на каждый сервер. Свои данные впиши в конструктор сверху.

Главная грабля: клиентов создавай ТОЛЬКО через UI

Начну с того, обо что бьются все, кто лезет в базу руками. В 3x-ui есть соблазн добавить пользователей напрямую в SQLite (x-ui.db) или отредактировать конфиг Xray — не делай так. Панель — единственный владелец списка клиентов. Как только она в следующий раз пересоберёт конфиг Xray (а она делает это при любом изменении инбаунда), она обнулит клиентов, которых ты вписал мимо неё.

Правило простое: всё, что касается клиентов, — только через интерфейс панели. Тогда БД и живой конфиг Xray остаются в синхроне. Полезешь в БД — получишь «клиент есть в базе, но его нет в конфиге, и подключение не работает» и потеряешь вечер на диагностику пустоты.

Добавляем клиента к инбаунду

Список входящих: колонка «Клиенты» и меню инбаунда

Клиент в 3x-ui живёт внутри инбаунда. Открываешь Входящие, у нужного инбаунда жмёшь на число клиентов (или «+»), откроется форма добавления. Заполняешь:

  • Email / имя — это метка клиента, по ней он виден в статистике. Пиши осмысленно: ivan-tg-1204, а не client1. Должно быть уникальным.
  • ID (UUID) — панель генерит сама (это CLIENT_UUID). Кнопка рядом — новый.
  • Flow — для VLESS+Reality на TCP ставь xtls-rprx-vision. Для XHTTP/gRPC/Hysteria — пусто, там Vision не используется.
  • Subscription ID / подписка — общий идентификатор подписки клиента (об этом ниже).

Сохранил — клиент появился в конфиге сразу, панель сама перезагрузила Xray. Ничего рестартить руками не нужно.

Лимиты и срок

Тут же в форме клиента — то, что делает из «просто доступа» управляемого платящего пользователя:

  • Total Flow (лимит трафика) — сколько ГБ отдать. 0 — безлимит. Клиент упёрся в лимит — доступ отрубается сам.
  • Expiry time (срок действия) — дата, после которой клиент отключается. Удобно для тарифов «на месяц»: продал — поставил дату.
  • IP Limit — сколько одновременных устройств пустить. Ставь 2–3: это грубая, но рабочая защита от того, что один ключ раздали половине двора. Полностью шеринг это не лечит, но планку ставит.

Изменил лимит или срок — сохрани, панель применит на лету. Клиента можно временно выключить галочкой активности, не удаляя (пригодится для заморозки/грейса неплательщику).

Включаем сервис подписки

Дальше — то, ради чего всё затевалось. Вместо того чтобы слать человеку голую vless://-ссылку на каждый сервер, отдаём одну ссылку-подписку: клиент вставляет её в приложение и получает список всех своих серверов, а ты потом можешь менять серверы, не трогая клиента.

В Настройки панели → Подписка включи сервис подписки и задай:

подписка
Включить сервис подписки : да
Порт подписки            : 2096            (или свой, открой в фаерволе)
Путь подписки            : /sub/           (неочевидный лучше)
Домен / URI              : your-domain.com  (или SERVER_IP, если без домена)

Открой порт подписки наружу:

bash
ufw allow 2096/tcp     # порт сервиса подписки

Сохрани и перезапусти панель. Теперь у каждого клиента появляется его личная ссылка-подписка.

Забираем ссылку и отдаём клиенту

У клиента в списке инбаунда есть иконки: QR-код и ссылка-подписка. Ссылка выглядит так:

ссылка-подписка
https://your-domain.com:2096/sub/SUBSCRIPTION_ID

Именно её отдаёшь человеку — не отдельные vless://. Он вставляет её в клиент (Happ, v2rayTun, Hiddify, любой xray-клиент) и получает все сервера, которые ты завёл под этим Subscription ID. Хочешь дать человеку несколько инбаундов одной ссылкой — заводи в каждом инбаунде клиента с одинаковым Subscription ID: панель склеит их в одну подписку.

QR-код удобен для мобильных: человек сканирует камерой прямо из приложения — и подписка импортирована.

Проверка

Возьми ссылку тестового клиента, вставь в клиент на телефоне/ноуте, подключись и проверь реальный выход:

bash
# с устройства под VPN — должен показать IP сервера, а не твой домашний
curl -s https://api.ipify.org

Вернулся IP сервера — цепочка собралась: клиент → инбаунд → интернет. Пустая подписка почти всегда означает одно из двух: не включён сервис подписки в настройках или клиенты добавлены мимо UI (в БД) и панель их не видит в конфиге.

Клиенты и подписки готовы. Дальше выбирай протокол под ноду в ветке «протоколы» — начни с «VLESS + Reality пошагово», это база, которая держит инбаунд живым под DPI.

Следующий гайд Панель за 15 минут: Remnawave и первая подписка → Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →
Материал носит образовательный характер и посвящён инженерии сетевой инфраструктуры. Вы отвечаете за соблюдение законов своей юрисдикции.