Я реализовал систему Hot Reload для XRay, которая позволяет добавлять и удалять пользователей без рестарта сервиса и без потери активных подключений. XRay изначально поддерживает API, через которое можно обновлять клиентов и правила маршрутизации в реальном времени. Обычно при изменении конфига XRay требуется перезапуск, из-за чего возникает короткий даунтайм. Здесь всё сделано так, что изменения применяются сразу, без остановки сервиса.
Добавлением пользователей управляет отдельный скрипт, который распределяет их между группами по принципу баланса нагрузки — он выбирает ту группу, где меньше клиентов, и добавляет туда нового. Скрипт обновляет общий JSON-файл с актуальным состоянием, в котором хранится информация о всех пользователях и группах.
После обновления данных генерируются два JSON-файла: первый содержит объект клиента с нужными inbound-настройками, второй — полный блок routing с обновлёнными правилами. Эти файлы отправляются напрямую в XRay через его API. Сначала обновляются правила (adrules), затем добавляется сам клиент (adu). XRay применяет изменения мгновенно, без перезапуска и без обрыва текущих подключений.
Важно, что при обновлении правил в XRay нужно передавать весь список routing-rules из конфига, а не только изменённую группу — так XRay не теряет остальные маршруты. В результате новая конфигурация подхватывается «на лету»: клиент сразу может подключаться, все старые остаются онлайн, а система балансирует группы автоматически. Это полностью рабочий Hot Reload для XRay, при котором не требуется перезапуск даже при большом числе пользователей.
А в случае перезагрузки Xray, он просто подхватывает всех из config json и всё :)