Подписка (Subscription)
Подписка позволяет во время загрузки конфигурации подтянуть внешние фрагменты и объединить их с текущим конфигом.
Сейчас есть три типа:
full: зарезервировано, пока не реализовано (пишет warning и игнорируется)outbound: реализовано, подтягивает и объединяетoutboundsdatabase: реализовано, скачивает и перезаписывает geodata базы (geoip.dat/geosite.dat)
SubscriptionObject
{
"subscription": {
"subscription-inbound": "sub-in",
"outbound": [
{
"name": "mySub",
"url": "https://example.com/sub",
"format": "auto",
"tagPrefix": "sub-",
"insert": "tail",
"interval": "30m",
"enabled": true
}
],
"database": [
{
"type": "geoip",
"url": "https://example.com/geoip.dat",
"interval": "24h",
"enabled": true
},
{
"type": "geosite",
"url": "https://example.com/geosite.dat",
"cron": "0 3 * * *",
"enabled": true
}
]
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
TIP
subscription.outbound, subscription.full и subscription.database могут задаваться как одним объектом, так и массивом.
subscription-inbound: string
(Опционально) Виртуальный inboundTag для трафика загрузки/обновления подписок. При задании, HTTP-запросы подписок выполняются через внутренний роутер Xray:
- правила маршрутизации могут матчить этот трафик через
inboundTagи выбирать outbound (например, заставить подписки ходить через прокси) - если не задано: HTTP-загрузка выполняется обычным
net/httpнапрямую (без маршрутизации через Xray)
OutboundSubscriptionObject
subscription.outbound разбирает содержимое подписки в список outbounds и объединяет их с текущей конфигурацией.
name: string
Имя подписки (используется для генерации тегов по умолчанию и в логах).
url: string
Источник подписки:
- поддерживается
http:///https:// - поддерживаются локальные пути к файлам (абсолютные и относительные)
stdin:не допускается
Приоритет разрешения относительных путей:
- каталог из
xray run -confdir <dir> - каталог конфигурации (один файл: каталог файла; несколько файлов: только если у всех общий каталог)
cwd(рабочий каталог при старте)
format: string
Формат содержимого:
auto(по умолчанию): определение по расширению (.json/.jsonc-> json,.yaml/.yml-> yaml), иначе по умолчанию json; при ошибке разбора будет автоматически выполнен fallback к стандартной share-подпискеjson: JSON / JSONCyaml/yml: YAML (сначала конвертируется в JSON; имена полей должны соответствовать JSON schema)xray/share/sharelink/base64: стандартная share-подписка (см. ниже)
WARNING
Подписки пока не поддерживают TOML. Даже при расширении .toml format=auto не сможет корректно разобрать содержимое.
tagPrefix: string
Префикс, добавляемый к tag каждого outbound, созданного из подписки (рекомендуется, чтобы избежать конфликтов тегов).
insert: "head" | "tail"
Позиция слияния:
tail(по умолчанию, также принимаетappend): добавить в конец текущихoutboundshead(также принимаетprepend): вставить перед текущимиoutbounds
enabled: true | false
Включена ли подписка. По умолчанию true.
interval: string
(Опционально) Интервал runtime-обновления (например "10m" / "1h"). Взаимоисключающе с cron/crontab.
cron: string
(Опционально) Расписание runtime-обновления (стандартное crontab из 5 полей: мин час день месяц день-нед, например "0 3 * * *"). Также поддерживаются дескрипторы @daily / @weekly / @every 1h.
Алиас: crontab.
TIP
Если задан subscription.subscription-inbound или настроен interval/cron/crontab, подписка обновляется в runtime; иначе она загружается/сливается при загрузке конфигурации.
DatabaseSubscriptionObject
subscription.database скачивает и перезаписывает geodata базы:
geoip.dat(используется правиламиgeoip:)geosite.dat(используется правиламиgeosite:)
type: "geoip" | "geosite"
Тип базы:
geoip: перезаписываетgeoip.datgeosite: перезаписываетgeosite.dat
url: string
Источник подписки. Поддерживает http:// / https:// / локальные пути к файлам (разрешение относительных путей как у subscription.outbound.url).
enabled: true | false
Включена ли подписка. По умолчанию true.
interval: string
(Опционально) Интервал runtime-обновления (например "24h"). Взаимоисключающе с cron/crontab.
cron: string
(Опционально) Расписание runtime-обновления. Алиас: crontab.
Куда устанавливается:
- При успешной загрузке файл записывается в каталог ресурсов (asset) и перезаписывает существующий. Каталог задается через
xray.location.asset/XRAY_LOCATION_ASSET.
WARNING
Перезапись .dat файлов не пересоздает автоматически уже работающие правила маршрутизации. Обычно требуется перезапуск core или перезагрузка конфигурации, чтобы применить новые geodata.
Форматы содержимого
JSON / JSONC
Поддерживаются два варианта:
- Список outbounds:
[
{ "protocol": "freedom", "tag": "direct" },
{ "protocol": "blackhole", "tag": "block" }
]2
3
4
- Объект-обертка (читается только
outbounds):
{
"outbounds": [{ "protocol": "freedom", "tag": "direct" }]
}2
3
YAML
YAML сначала конвертируется в JSON и затем разбирается как JSON; имена полей должны совпадать с JSON schema (например, streamSettings, tlsSettings).
Пример (список outbounds):
- protocol: freedom
tag: direct
- protocol: blackhole
tag: block2
3
4
Стандартные Share-подписки (Base64)
Многие серверы подписок отдают Base64-строку. После декодирования это несколько share-ссылок, например:
vless://...
vmess://...
trojan://...
ss://...2
3
4
Xray автоматически:
- пробует Base64-декодирование (поддерживает Base64(JSON/YAML) и Base64(share links))
- разбирает распознанные share-ссылки и преобразует их в
outbounds
Поддерживаемые схемы:
vless://vmess://(распространенный base64(json) формат)trojan://ss://(параметрpluginпока игнорируется)
WARNING
Нераспознанные строки пропускаются с предупреждениями. Если не найдено ни одной поддерживаемой share-ссылки, Xray завершится с ошибкой.
Base64 URL
Если url сам по себе закодирован в Base64, используйте:
base64:<BASE64>b64:<BASE64>base64://<BASE64>b64://<BASE64>
Сначала Xray декодирует строку в реальный URL/путь и затем загружает содержимое.
Правила слияния и тегов
- Если у сгенерированного outbound пустой
tag, Xray создаст"<name>-<index>"(еслиnameпустое, используетсяsubscription). - Если задан
tagPrefix, он добавляется в начало итогового тега. - Слияние выполняется по
tag: одинаковые теги перезаписывают существующие; новые теги вставляются в начало/конец в зависимости отinsert. - Для управления подписками каждый outbound, созданный из подписки, автоматически получает поле
managed(а также полеsubscriptionкак эквивалентный алиас) со значением имени подписки. Значение берется изsubscription.outbound.name(автозаполняется, если не задано). При следующей загрузке конфигурации Xray сначала удаляет outbounds с тем жеmanaged/subscription, затем сливает новый результат подписки, поэтому удаления/добавления/обновления в подписке начинают работать корректно.
TIP
Всегда используйте tagPrefix, чтобы избежать конфликтов тегов между подпиской и локальными outbounds.
Поведение -dump
xray run -dump выполняет загрузку/объединение подписок:
- когда подписки разворачиваются при загрузке конфигурации, блок
subscription {}удаляется из вывода (разворачивается вoutbounds) - когда включено runtime-обновление (
subscription-inbound/interval/cron), блокsubscription {}сохраняется, а вывод не будет содержать outbounds, обновленные в runtime