Если 3x-ui не создает пользователя, нажатие кнопки может не давать результата, панель показывает общую ошибку либо новый клиент появляется в интерфейсе, но не попадает в рабочую конфигурацию Xray. Причина бывает как в форме и сессии администратора, так и в правах на базу SQLite, нехватке места, конфликте идентификатора или ошибке генерации конфигурации.
Не переустанавливайте панель и не удаляйте базу до диагностики. В ней хранятся inbound, клиенты и часть настроек. Сначала сделайте резервную копию, сохраните журналы и определите этап, на котором прекращается операция: запрос из браузера, запись в базу, сборка конфигурации или перезапуск Xray.
Сначала сохраните текущее состояние
- Сделайте копию базы панели, конфигурации и сертификатов в закрытый каталог.
- Запишите версию 3x-ui, Xray и операционной системы.
- Зафиксируйте время неудачной попытки создания клиента.
- Не публикуйте UUID, ключи, ссылки подключения и резервные копии.
- Проверьте наличие свободного места и inode до перезапуска сервисов.
- Сохраните вывод журналов панели и Xray за нужный интервал.
Резервная копия должна быть сделана до обновления, ручной правки SQLite или восстановления прав. После копирования полезно проверить, что файл имеет ненулевой размер и доступен только администратору.
Определите, что именно означает «не создает»
- Форма не отправляется и не появляется сетевой запрос.
- Сервер отвечает 401 или 403 из-за сессии и прав.
- API панели возвращает 400 с ошибкой валидации.
- Возникает 500 при записи в базу или сборке конфигурации.
- Клиент появляется после обновления страницы, но Xray его не принимает.
- Запись сохраняется, затем исчезает после перезапуска.
- Клиент создан, но скрыт фильтром, другим inbound или страницей списка.
Эти симптомы требуют разных действий. Например, ошибка интерфейса не исправляется изменением firewall, а readonly database не лечится созданием нового UUID.
Проверьте запрос из браузера
Откройте инструменты разработчика, вкладку Network и повторите создание тестового клиента. Найдите запрос панели и сохраните его статус, безопасный текст ответа и request URL. Не копируйте наружу cookie, токены авторизации и содержимое конфигурации.
- Если запроса нет, проверьте ошибки JavaScript и обязательные поля формы.
- При 401 заново войдите в панель и проверьте срок жизни сессии.
- При 403 проверьте права пользователя панели и защиту reverse proxy.
- При 400 изучите название отклоненного поля, а не повторяйте запрос вслепую.
- При 500 сопоставьте время запроса с журналом сервиса.
- Если возвращается HTML вместо JSON, проверьте redirect и конфигурацию proxy.
Проверьте поля клиента и inbound
В 3x-ui клиент создается внутри конкретного inbound. Набор обязательных полей зависит от протокола и версии панели. Неверный идентификатор, дублирующее имя, некорректная дата или несовместимые параметры могут остановить сохранение.
- Выбран существующий inbound нужного протокола.
- UUID или другой идентификатор имеет корректный формат и не повторяется.
- Email или имя клиента уникально, если панель использует его как ключ.
- Лимит трафика является допустимым числом и не содержит лишних символов.
- Дата окончания находится в будущем и правильно интерпретируется часовым поясом.
- Параметры flow, security и transport совместимы с текущим inbound.
- IP limit и другие дополнительные ограничения поддерживаются установленной версией.
Для проверки создайте минимального временного клиента без необязательных ограничений. Если он сохраняется, возвращайте дополнительные поля по одному. Так можно найти конкретный параметр, а не менять всю конфигурацию.
Проверьте свободное место и файловую систему
SQLite не сможет надежно записать клиента, если диск заполнен, закончились inode, каталог стал read-only или сервис не может создать временный journal-файл. При этом интерфейс иногда показывает только общую ошибку.
- Проверьте свободное место на разделе с базой и журналами.
- Проверьте количество свободных inode.
- Убедитесь, что файловая система не перемонтирована в read-only после сбоя.
- Найдите быстро растущие логи, старые backup и временные файлы.
- Не удаляйте файлы базы SQLite с расширениями journal, wal или shm во время работы сервиса.
- После очистки контролируйте, что место не заканчивается повторно.
Проверьте владельца и права базы
Панель должна иметь права на файл базы и каталог, в котором SQLite создает служебные файлы. Проблема часто возникает после ручного копирования, восстановления backup или запуска команды от root, когда владелец изменяется.
- Определите, от какого системного пользователя работает сервис 3x-ui.
- Сравните владельца базы и родительского каталога с пользователем процесса.
- Проверьте права на запись без выдачи доступа всем пользователям.
- Учитывайте AppArmor, SELinux и ограничения контейнера, если они используются.
- Не применяйте chmod 777 как постоянное решение.
- После исправления прав перезапустите только нужный сервис и проверьте журнал.
Исключите блокировку или повреждение SQLite
Одновременные операции, зависший процесс или аварийное завершение могут оставить базу занятой. При повреждении возможны ошибки disk I/O, database is locked, malformed или невозможность выполнить transaction.
- Проверьте, нет ли двух экземпляров панели, использующих одну базу.
- Не открывайте production-базу графическим редактором в режиме записи.
- Выполните штатную проверку целостности на копии или при остановленном сервисе.
- Сохраните исходный файл до любой попытки восстановления.
- Не подменяйте базу старым backup без учета клиентов, созданных после него.
- Если требуется восстановление, сначала проверьте его на отдельном экземпляре.
Ручная вставка строки в SQLite обычно не решает проблему: панель может хранить вложенную структуру клиента, статистику и связанные параметры. Неконсистентная запись способна сломать генерацию всей конфигурации.
Проверьте журналы панели и Xray
Сопоставьте время HTTP-запроса с журналами systemd, контейнера или встроенного логирования. Ищите первую ошибку, а не только последующий message о невозможности перезапустить Xray.
- Ошибки SQL и transaction указывают на базу или права.
- Validation error указывает на поля клиента.
- Duplicate key означает конфликт идентификатора или имени.
- Permission denied требует проверки владельца, каталога и политики доступа.
- No space left on device относится к месту или inode.
- Failed to parse config означает, что сгенерированная конфигурация Xray невалидна.
- Address already in use относится к inbound и порту, а не к самому клиенту.
Проверьте конфигурацию Xray до перезапуска
После сохранения клиента панель обновляет конфигурацию Xray. Если новая версия не проходит проверку, сервис может продолжить работать со старой конфигурацией либо остановиться. Перед принудительным restart используйте штатную проверку конфигурации той версии Xray, которая реально установлена.
- Путь к проверяемому файлу совпадает с файлом, который запускает сервис.
- Версия binary соответствует синтаксису сгенерированной конфигурации.
- Нет повторяющихся портов и конфликтующих inbound.
- Сертификаты и ключи доступны процессу.
- Все referenced-файлы существуют и имеют правильные права.
- Панель и Xray используют одну и ту же активную конфигурацию.
Не заменяйте рабочую конфигурацию вручную без резервной копии. Сначала подтвердите конкретный невалидный блок, исправьте источник генерации и только затем применяйте изменения.
Учтите обновление панели и миграции базы
После обновления 3x-ui старая схема базы или параметры inbound могут не соответствовать новой версии. Признак проблемы — существующие записи отображаются, но новые клиенты не сохраняются либо сервис падает при их добавлении.
- Сверьте установленную версию с журналом обновления и требованиями.
- Проверьте, завершилась ли миграция базы без ошибок.
- Убедитесь, что панель и Xray обновлены совместимым способом.
- Не смешивайте файлы нескольких fork или разных способов установки.
- Перед повторным обновлением сохраните базу и конфигурацию.
- При откате учитывайте совместимость старой версии с уже измененной схемой.
Проверьте reverse proxy и защиту панели
Если панель открывается через Nginx, CDN или дополнительную авторизацию, запрос создания клиента может блокироваться по размеру, методу, CSRF, timeout или правилу WAF. Прямой контрольный запрос к локальному интерфейсу помогает отделить proxy от приложения, но выполнять его нужно только с сервера и без публикации панели наружу.
- Proxy передает правильный Host, схему и адрес клиента.
- POST-запросы не перенаправляются на форму входа.
- Base path панели совпадает в proxy и настройках приложения.
- Cookie имеет корректные Secure, SameSite и Path.
- WAF не отклоняет JSON формы как подозрительный запрос.
- Панель не доступна всему интернету без ограничений и надежной аутентификации.
Безопасный порядок исправления
- Сделайте резервную копию базы, конфигурации и сертификатов.
- Повторите создание одного тестового клиента и сохраните время ошибки.
- Проверьте HTTP-статус и безопасный текст ответа панели.
- Сопоставьте запрос с журналами 3x-ui и Xray.
- Проверьте место, inode, read-only mode, владельца и права каталога базы.
- Исключите блокировку SQLite и второй экземпляр панели.
- Проверьте минимальный набор полей клиента и уникальность идентификатора.
- Проверьте сгенерированную конфигурацию Xray до restart.
- Исправьте один подтвержденный источник ошибки.
- Создайте нового временного клиента и проверьте сохранение после перезапуска.
Как проверить результат
- Панель возвращает успешный ответ без скрытой ошибки JavaScript.
- Новый клиент виден после обновления страницы и повторного входа.
- Запись сохраняется после штатного перезапуска панели.
- Конфигурация Xray проходит встроенную проверку.
- Xray запускается без fallback на старый файл.
- Тестовый клиент работает в разрешенном административном сценарии.
- Журналы не содержат SQL, permission, parse или duplicate ошибок.
- Удаление тестовой записи не затрагивает существующих клиентов.
Типичные ошибки
- Переустановить панель до копирования базы.
- Удалить SQLite journal, wal или shm при работающем сервисе.
- Выдать chmod 777 всему каталогу.
- Редактировать production-базу вручную без проверки структуры.
- Перезапускать Xray после каждой попытки, не читая первую ошибку.
- Считать любой сбой проблемой firewall или закрытого порта.
- Обновлять панель и Xray одновременно без плана отката.
- Публиковать admin panel, UUID и ссылки подключения в открытом доступе.
Как предотвратить повторение
- Настройте регулярный зашифрованный backup базы и сертификатов.
- Контролируйте свободное место, inode и рост журналов.
- Обновляйте 3x-ui сначала на тестовом экземпляре или после снимка VPS.
- Храните сведения о версии панели, Xray и способе установки.
- Ограничьте доступ к панели по сети и используйте надежную аутентификацию.
- Проверяйте конфигурацию Xray перед применением.
- Следите за ошибками SQLite и перезапусками сервиса.
- Не используйте одну базу одновременно несколькими экземплярами панели.
Когда нужна помощь
Если 3x-ui не создает пользователя, можно прислать версию панели и Xray, способ установки, HTTP-статус запроса и обезличенный фрагмент журнала за время ошибки. Я проверю форму, базу SQLite, права, миграции, конфигурацию Xray и reverse proxy, найду точную причину и восстановлю создание клиентов с сохранением действующих настроек.