3x-ui3x-ui test
Конфигурация

Подписка

Запуск сервера подписок 3x-ui — форматы base64/JSON/Clash, порты и пути, TLS, заголовки ответа и пользовательские шаблоны.

Подписка — это единый URL, который возвращает все конфигурации клиента. Клиентские приложения периодически обновляют его, поэтому при изменении входящего соединения клиенты подхватывают изменения автоматически. Сервер подписок работает как отдельный сервер от панели.

Включение и настройка

Сервер подписок включён по умолчанию (subEnable). Настройте его в параметрах подписки панели:

ПараметрПо умолчаниюНазначение
subPort2096Порт прослушивания (отдельный от панели).
subListen(все)Адрес привязки.
subPath/sub/Базовый путь для необработанных URL подписок.
subDomain(нет)Публичный хост; если задан, сервер отвечает только для этого Host.
subCertFile / subKeyFile(нет)Сертификат + ключ TLS — когда заданы, сервер работает по HTTPS.
subEncrypttrueКодировать тело необработанной подписки в base64.
subUpdates12Рекомендуемый интервал обновления (часы), отправляемый клиентам.

URL подписки выглядит так:

https://<sub-host>:<sub-port>/sub/<sub-id>

где <sub-id> — это Sub ID клиента.

Один и тот же Sub ID отдаётся в нескольких форматах по разным путям — список Base64 по subPath и конфигурация JSON (Xray-json) по пути JSON. Соберите URL и предпросмотрите оба тела здесь:

Subscription & sub-JSON builder

Build the subscription URLs and preview both body formats — the Base64 link list and the JSON (Xray-json) config.

Base64 subscription URL
https://sub.example.com:2096/sub/user-1
JSON subscription URL
https://sub.example.com:2096/json/user-1

Clients in this subscription

Subscription links (decoded body)
vless://11111111-2222-3333-4444-555555555555@a.example.com:443?type=tcp&security=reality&sni=www.microsoft.com#HK-01
Base64 body
dmxlc3M6Ly8xMTExMTExMS0yMjIyLTMzMzMtNDQ0NC01NTU1NTU1NTU1NTVAYS5leGFtcGxlLmNvbTo0NDM/dHlwZT10Y3Amc2VjdXJpdHk9cmVhbGl0eSZzbmk9d3d3Lm1pY3Jvc29mdC5jb20jSEstMDE=
JSON subscription (preview)
{
  "remarks": "HK-01",
  "dns": {
    "tag": "dns_out",
    "queryStrategy": "UseIP",
    "servers": [
      {
        "address": "8.8.8.8",
        "skipFallback": false
      }
    ]
  },
  "inbounds": [
    {
      "port": 10808,
      "protocol": "mixed",
      "settings": {
        "auth": "noauth",
        "udp": true,
        "userLevel": 8
      },
      "sniffing": {
        "destOverride": [
          "http",
          "tls",
          "quic",
          "fakedns"
        ],
        "enabled": true
      },
      "tag": "mixed"
    },
    {
      "port": 10809,
      "protocol": "http",
      "settings": {
        "userLevel": 8
      },
      "tag": "http"
    }
  ],
  "log": {
    "loglevel": "warning"
  },
  "policy": {
    "levels": {
      "8": {
        "connIdle": 300,
        "downlinkOnly": 1,
        "handshake": 4,
        "uplinkOnly": 1
      }
    },
    "system": {
      "statsOutboundUplink": true,
      "statsOutboundDownlink": true
    }
  },
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  },
  "stats": {},
  "outbounds": [
    {
      "protocol": "vless",
      "tag": "proxy",
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "tcpSettings": {
          "header": {
            "type": "none"
          }
        },
        "realitySettings": {
          "fingerprint": "chrome",
          "serverName": "www.microsoft.com"
        }
      },
      "settings": {
        "address": "a.example.com",
        "port": 443,
        "id": "11111111-2222-3333-4444-555555555555",
        "encryption": "none",
        "level": 8
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "AsIs",
        "redirect": "",
        "noises": []
      }
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      }
    }
  ]
}

Форматы вывода

Формат выбирается по пути, у каждого свой переключатель включения:

ФорматПутьВключаетсяВывод
Необработанные ссылки/sub/всегда (если включён)Список ссылок vless://, vmess://, … (закодированных в base64, когда включён subEncrypt).
JSON/json/subJsonEnableПолные клиентские конфигурации Xray.
Clash / Mihomo/clash/subClashEnableYAML-профиль.

В подписке появляются только включённые входящие соединения, использующие VLESS, VMess, Trojan, Shadowsocks или Hysteria2, упорядоченные по их индексу сортировки подписки. Запрос /sub/ с заголовком Accept: text/html (или ?html=1) возвращает удобочитаемую информационную страницу вместо необработанного тела.

Base64 vs JSON

Тело Base64 — это просто ссылки для обмена, объединённые через перевод строки и закодированные в стандартный base64 (переключается через subEncrypt). Тело JSON оборачивает каждого клиента в полную клиентскую конфигурацию Xray — фиксированный каркас (локальные входящие mixed/HTTP, DNS, маршрутизация, policy) плюс исходящее соединение proxy, указывающее на входящее. 3x-ui выдаёт единый объект конфигурации для одного клиента и массив для нескольких, использует плоскую форму settings исходящего соединения (address/port/id, level: 8) и удаляет sockopt из streamSettings.

Заголовки ответа

Подписки возвращают стандартные заголовки, которые читают совместимые приложения:

  • Subscription-Userinfoupload, download, total (байты; total=0 означает без ограничений) и expire (Unix-секунды).
  • Profile-Update-Interval — интервал обновления в часах (subUpdates).
  • Profile-Title, Support-Url, Profile-Web-Page-Url, Announce — необязательный брендинг, отображаемый некоторыми клиентами.

Пользовательские шаблоны страниц

Укажите в subThemeDir папку с пользовательским шаблоном информационной страницы, чтобы оформить HTML-страницу подписки в фирменном стиле. Примечание для каждого клиента на каждой ссылке полностью шаблонизируется — см. Ссылки для обмена → переменные примечаний.

Разместите сервер подписок за TLS (задайте subCertFile/subKeyFile или обратный прокси), чтобы содержимое подписки не передавалось в открытом виде.

On this page