Настройка с помощью нескольких файлов

Программа Xray поддерживает использование нескольких файлов конфигурации.

Основная цель использования нескольких файлов конфигурации — разделение настроек модулей с разными функциями для удобства управления и обслуживания.

Эта функция в основном предназначена для обогащения экосистемы Xray. Например, для клиентских GUI обычно реализуются только фиксированные функции, такие как выбор узла, и слишком сложные конфигурации трудно реализовать графически. Можно оставить только один пользовательский каталог конфигурации confdir для настройки сложных функций. Для сценариев развертывания сервера достаточно добавить файлы в confdir для настройки различных протоколов.

Запуск с несколькими файлами

Подсказка

В информации о запуске будет указан каждый считываемый файл конфигурации. Убедитесь, что порядок считывания соответствует ожидаемому. Вы можете контролировать порядок, добавляя префиксы с номерами к именам файлов. Например, 01_имя_файла, 02_имя_файла, чем больше число, тем позже файл будет обработан.

$ xray run -confdir /etc/xray/confs

Также можно использовать Xray.location.confdir или Xray_LOCATION_CONFDIR для указания confdir.

Параметр -confdir имеет приоритет над переменной среды. Если параметр указывает на допустимый каталог, значение переменной среды игнорируется.

Правила

Обычные объекты ({})

Последующие объекты верхнего уровня перезаписывают или дополняют предыдущие.

Массивы ([])

В конфигурации JSON inbounds и outbounds имеют структуру массива, для них действуют особые правила:

  • Поиск существующего элемента с тем же tag для перезаписи. Если элемент не найден:
    • Для inbounds: добавляется в конец (порядок элементов в inbounds не имеет значения).
    • Для outbounds: добавляется в начало (по умолчанию используется первый выход в outbounds); но если имя файла содержит tail (регистр не имеет значения), элемент добавляется в конец.

Пример конфигурации

Предположим, что в папке confs есть следующие три файла конфигурации:

  • 01.json
{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "socks",
      "protocol": "socks",
      "listen": "0.0.0.0",
      "port": 8888
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom"
    }
  ]
}
  • 02.json
{
  "log": {
    "loglevel": "debug"
  },
  "inbounds": [
    {
      "tag": "socks",
      "protocol": "socks",
      "listen": "127.0.0.1",
      "port": 1080
    }
  ],
  "outbounds": [
    {
      "tag": "block",
      "protocol": "blackhole"
    }
  ]
}
  • 03_tail.json
{
  "outbounds": [
    {
      "tag": "direct2",
      "protocol": "freedom"
    }
  ]
}

Три конфигурации будут объединены следующим образом:

{
  "log": {
    "loglevel": "debug"  // объект верхнего уровня перезаписывает предыдущий
  },
  "inbounds": [
    {
      "tag": "socks", // перезапись элемента с тем же tag
      "protocol": "socks",
      "listen": "127.0.0.1",
      "port": 1080 
    }
  ],
  "outbounds": [
    {
      "tag": "block",  // добавлено в начало outbounds
      "protocol": "blackhole"
    },
    {
      "tag": "direct",
      "protocol": "freedom"
    },
    {
      "tag": "direct2", // добавлено в конец, так как имя файла 03_tail.json содержит tail
      "protocol": "freedom"
    }
  ]
}

Подсказка

Вы можете использовать команду xray run -confdir=./confs -dump для просмотра объединенной конфигурации. Однако, поскольку ядро использует формат данных protobuf, формат вывода конфигурации для параметра -dump будет отличаться.