[
  {
    "path": "Readme.md",
    "content": "# Скрипт для лёгкой установки и настройки ядра X-ray без графического интерфейса\n\nВы все знакомы с такими панелями управления, как 3x-ui, Marzban и другими. Все эти панели являются всего лишь графическими надстройками над ядром X-ray и служат для удобного управления им, а также для создания подключений и настроек. Ядро же может работать без всяких панелей и управляться полностью через терминал. Основное преимущество использования «голого» ядра заключается в том, что вам не нужно заморачиваться с доменами и TLS-сертификатами. Само ядро можно установить и администрировать вручную с помощью официальной документации. Этот скрипт предназначен для упрощения этой задачи: он автоматически установит ядро на сервер, создаст конфигурационные файлы и несколько исполняемых файлов для удобного управления пользователями.\n\n## VPS для панели\n\nДля установки панели нам понадобится VPS-сервер. Приобрести его можно в [ishosting](https://bit.ly/3rOqvPE).  \nВ сервисе доступны более 36 локаций. Если вам не нужна какая-то конкретная страна, выбирайте ту, что ближе к вам.\n\n## Системные требования\n\n- 1 CPU  \n- 1 GB RAM  \n- 10 GB диска  \n- ОС Ubuntu 22 x64 или Ubuntu 24 x64\n\n\n## Как пользоваться скриптом. Старая инструкция из видео. Установка с протоколом Vless TCP Reality\n\nСкрипт создавался и тестировался под ОС Ubuntu 22 x64 и Ubuntu 24 x64. На других ОС может работать некорректно. Чтобы скачать и запустить скрипт, используйте эту команду:\n\n```sh\nwget -qO- https://raw.githubusercontent.com/ServerTechnologies/simple-xray-core/refs/heads/main/xray-install | bash\n```\n\n## Команды для управления пользователями\n\n**Вывести список всех клиентов:**\n\n```sh\nuserlist\n```\n\n**Вывести ссылку и QR-код для подключения основного пользователя:**\n\n```sh\nmainuser\n```\n\n**Создать нового пользователя:**\n\n```sh\nnewuser\n```\n\n**Удалить пользователя:**\n\n```sh\nrmuser\n```\n\n**Создать ссылку для подключения:**\n\n```sh\nsharelink\n```\n\nВ домашней папке пользователя будет создан файл `help` — в нём содержатся подсказки с описанием команд. Посмотреть его можно с помощью команды (нужно находиться в домашней папке пользователя):\n\n```sh\ncat help\n```\n\n## Проблемы с доступом по протоколу Vless на транспорте TCP.\n> Многие заметили, что с доступностью Vless на транспорте TCP наблюдались некоторые проблемы. Я добавил вариацию этого скрипта с протоколом XHTTP. Важно! XHTTP - сравнительно новый транспорт, поэтому далеко не все клиенты его поддерживают. Список клиентов есть в текстовой версии видео на Github.\n- [Ссылка на видео YouTube про XHTTP](https://youtu.be/XASBkzQE00s)\n- [Текстовая версия видео на Github](https://github.com/ServerTechnologies/3x-ui-with-xhttp)\n\nЕсли вы уже установили ядро по видео с транспортом tcp, не спешите все сносить и устанавливать XHTTP. Для начала просто обновите ядро командой\n```sh\nbash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install\n```\nЕсли обновление не помогло, то можно приступать к установке новой версии скрипта с транспортом XHTTP. На всякий случай создадим бэкап файла конфигурации и файла с ключами, если вдруг захочется откатится обратно на tcp\n```sh\ncp /usr/local/etc/xray/config.json /usr/local/etc/xray/config.json.old\ncp /usr/local/etc/xray/.keys /usr/local/etc/xray/.keys.old\n```\nЧтобы восстановить конфигурацию, введите:\n```sh\nwget -qO- https://raw.githubusercontent.com/ServerTechnologies/simple-xray-core/refs/heads/main/xray-install | bash\nmv /usr/local/etc/xray/config.json.old /usr/local/etc/xray/config.json\nmv /usr/local/etc/xray/.keys.old /usr/local/etc/xray/.keys\nsystemctl restart xray\n```\nБудет переустановлено ядро, восстановлена старая конфигурация, в том числе старые клиенты.\n\n## Установка с транспортом XHTTP.\nУстановка производится слудующей командой. Внимание! Все пользователи будут удалены - их придется подключать заново.\n```sh\nwget -qO- https://raw.githubusercontent.com/ServerTechnologies/simple-xray-core/refs/heads/main/xhttp-xray-install | bash\n```\nКоманды для управления пользователями те же самые, что и в предыдущем пункте\n\n\n## Полезные ссылки\n\n- [GitHub проекта X-ray Core](https://github.com/XTLS/Xray-core)\n- [Официальная документация на русском](https://xtls.github.io/ru/)\n\n## Клиенты для подключения\n\n**Windows**\n\n- [v2rayN](https://github.com/2dust/v2rayN)  \n- [Furious](https://github.com/LorenEteval/Furious)  \n- [Invisible Man - Xray](https://github.com/InvisibleManVPN/InvisibleMan-XRayClient)  \n\n**Android**\n\n- [v2rayNG](https://github.com/2dust/v2rayNG)  \n- [X-flutter](https://github.com/XTLS/X-flutter)  \n- [SaeedDev94/Xray](https://github.com/SaeedDev94/Xray)  \n\n**iOS & macOS arm64**\n\n- [Streisand](https://apps.apple.com/app/streisand/id6450534064)  \n- [Happ](https://apps.apple.com/app/happ-proxy-utility/id6504287215)  \n- [OneXray](https://github.com/OneXray/OneXray)  \n\n**macOS arm64 & x64**\n\n- [V2rayU](https://github.com/yanue/V2rayU)  \n- [V2RayXS](https://github.com/tzmax/V2RayXS)  \n- [Furious](https://github.com/LorenEteval/Furious)  \n- [OneXray](https://github.com/OneXray/OneXray)  \n\n**Linux**\n\n- [Nekoray](https://github.com/MatsuriDayo/nekoray)  \n- [v2rayA](https://github.com/v2rayA/v2rayA)  \n- [Furious](https://github.com/LorenEteval/Furious)  \n\n## Если вдруг нужно удалить, то воспользуйтесь этими командами:\n```sh\nbash -c \"$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ remove\nrm /usr/local/etc/xray/config.json\nrm /usr/local/etc/xray/.keys\nrm /usr/local/bin/userlist\nrm /usr/local/bin/mainuser\nrm /usr/local/bin/newuser\nrm /usr/local/bin/rmuser\nrm /usr/local/bin/sharelink\n```\n"
  },
  {
    "path": "xhttp-xray-install",
    "content": "#!/bin/bash\necho \"Будет установлен Vless с транспортом XHTTP\"\nsleep 3\napt update\napt install qrencode curl jq -y\n\n# Включаем bbr\nbbr=$(sysctl -a | grep net.ipv4.tcp_congestion_control)\nif [ \"$bbr\" = \"net.ipv4.tcp_congestion_control = bbr\" ]; then\necho \"bbr уже включен\"\nelse\necho \"net.core.default_qdisc=fq\" >> /etc/sysctl.conf\necho \"net.ipv4.tcp_congestion_control=bbr\" >> /etc/sysctl.conf\nsysctl -p\necho \"bbr включен\"\nfi\n\n# Устанавливаем ядро Xray\nbash -c \"$(curl -4 -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install\n[ -f /usr/local/etc/xray/.keys ] && rm /usr/local/etc/xray/.keys\ntouch /usr/local/etc/xray/.keys\necho \"shortsid: $(openssl rand -hex 8)\" >> /usr/local/etc/xray/.keys\necho \"uuid: $(xray uuid)\" >> /usr/local/etc/xray/.keys\nxray x25519 >> /usr/local/etc/xray/.keys\n\nexport uuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}')\nexport privatkey=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/PrivateKey/ {print $2}')\nexport shortsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\n\n# Создаем файл конфигурации Xray\ntouch /usr/local/etc/xray/config.json\ncat << EOF > /usr/local/etc/xray/config.json\n{\n    \"log\": {\n        \"loglevel\": \"warning\"\n    },\n    \"routing\": {\n        \"domainStrategy\": \"IPIfNonMatch\",\n        \"rules\": [\n            {\n                \"type\": \"field\",\n                \"domain\": [\n                    \"geosite:category-ads-all\"\n                ],\n                \"outboundTag\": \"block\"\n            },\n            {\n                \"type\": \"field\",\n                \"ip\": [\n                    \"geoip:cn\"\n                ],\n                \"outboundTag\": \"block\"\n            }\n        ]\n    },\n    \"inbounds\": [\n        {\n            \"listen\": \"0.0.0.0\",\n            \"port\": 443,\n            \"protocol\": \"vless\",\n            \"settings\": {\n                \"clients\": [\n                    {\n                        \"email\": \"main\",\n                        \"id\": \"$uuid\",\n                        \"flow\": \"\"\n                    }\n                ],\n                \"decryption\": \"none\"\n            },\n            \"streamSettings\": {\n                \"network\": \"xhttp\",\n                \"xhttpSettings\": {\n                    \"path\": \"/\"\n                },\n                \"security\": \"reality\",\n                \"realitySettings\": {\n                    \"show\": false,\n                    \"target\": \"github.com:443\",\n                    \"serverNames\": [\n                        \"github.com\",\n                        \"www.github.com\"\n                    ],\n                    \"privateKey\": \"$privatkey\",\n                    \"minClientVer\": \"\",\n                    \"maxClientVer\": \"\",\n                    \"maxTimeDiff\": 0,\n                    \"shortIds\": [\n                        \"$shortsid\"\n                    ]\n                }\n            },\n            \"sniffing\": {\n                \"enabled\": true,\n                \"destOverride\": [\n                    \"http\",\n                    \"tls\",\n                    \"quic\"\n                ]\n            }\n        }\n    ],\n    \"outbounds\": [\n        {\n            \"protocol\": \"freedom\",\n            \"tag\": \"direct\"\n        },\n        {\n            \"protocol\": \"blackhole\",\n            \"tag\": \"block\"\n        }\n    ],\n    \"policy\": {\n        \"levels\": {\n            \"0\": {\n                \"handshake\": 3,\n                \"connIdle\": 180\n            }\n        }\n    }\n}\nEOF\n\n# Исполняемый файл для списка клиентов\ntouch /usr/local/bin/userlist\ncat << 'EOF' > /usr/local/bin/userlist\n#!/bin/bash\nemails=($(jq -r '.inbounds[0].settings.clients[].email' \"/usr/local/etc/xray/config.json\"))\n\nif [[ ${#emails[@]} -eq 0 ]]; then\n    echo \"Список клиентов пуст\"\n    exit 1\nfi\n\necho \"Список клиентов:\"\nfor i in \"${!emails[@]}\"; do\n    echo \"$((i+1)). ${emails[$i]}\"\ndone\nEOF\nchmod +x /usr/local/bin/userlist\n\n# исполняемый файл для ссылки основного пользователя\ntouch /usr/local/bin/mainuser\ncat << 'EOF' > /usr/local/bin/mainuser\n#!/bin/bash\nprotocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json)\nport=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json)\nuuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}')\npbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}')\nsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\nsni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json)\nip=$(timeout 3 curl -4 -s icanhazip.com)\nlink=\"$protocol://$uuid@$ip:$port?security=reality&path=%2F&host=&mode=auto&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=%2F&type=xhttp&encryption=none#vless-$ip\"\necho \"\"\necho \"Ссылка для подключения\":\necho \"$link\"\necho \"\"\necho \"QR-код:\"\necho ${link} | qrencode -t ansiutf8\nEOF\nchmod +x /usr/local/bin/mainuser\n\n# Исполняемый файл для создания новых клиентов\ntouch /usr/local/bin/newuser\ncat << 'EOF' > /usr/local/bin/newuser\n#!/bin/bash\nread -p \"Введите имя пользователя (email): \" email\n\n    if [[ -z \"$email\" || \"$email\" == *\" \"* ]]; then\n    echo \"Имя пользователя не может быть пустым или содержать пробелы. Попробуйте снова.\"\n    exit 1\n    fi\nuser_json=$(jq --arg email \"$email\" '.inbounds[0].settings.clients[] | select(.email == $email)' /usr/local/etc/xray/config.json)\n\nif [[ -z \"$user_json\" ]]; then\nuuid=$(xray uuid)\njq --arg email \"$email\" --arg uuid \"$uuid\" '.inbounds[0].settings.clients += [{\"email\": $email, \"id\": $uuid, \"flow\": \"\"}]' /usr/local/etc/xray/config.json > tmp.json && mv tmp.json /usr/local/etc/xray/config.json\nsystemctl restart xray\nindex=$(jq --arg email \"$email\" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key'  /usr/local/etc/xray/config.json)\nprotocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json)\nport=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json)\nuuid=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json)\npbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}')\nsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\nusername=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json)\nsni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json)\nip=$(curl -4 -s icanhazip.com)\nlink=\"$protocol://$uuid@$ip:$port?security=reality&path=%2F&host=&mode=auto&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=%2F&type=xhttp&encryption=none#$username\"\necho \"\"\necho \"Ссылка для подключения\":\necho \"$link\"\necho \"\"\necho \"QR-код:\"\necho ${link} | qrencode -t ansiutf8\nelse\necho \"Пользователь с таким именем уже существует. Попробуйте снова.\" \nfi\nEOF\nchmod +x /usr/local/bin/newuser\n\n# Исполняемый файл для удаления клиентов\ntouch /usr/local/bin/rmuser\ncat << 'EOF' > /usr/local/bin/rmuser\n#!/bin/bash\nemails=($(jq -r '.inbounds[0].settings.clients[].email' \"/usr/local/etc/xray/config.json\"))\n\nif [[ ${#emails[@]} -eq 0 ]]; then\n    echo \"Нет клиентов для удаления.\"\n    exit 1\nfi\n\necho \"Список клиентов:\"\nfor i in \"${!emails[@]}\"; do\n    echo \"$((i+1)). ${emails[$i]}\"\ndone\n\nread -p \"Введите номер клиента для удаления: \" choice\n\nif ! [[ \"$choice\" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#emails[@]} )); then\n    echo \"Ошибка: номер должен быть от 1 до ${#emails[@]}\"\n    exit 1\nfi\n\nselected_email=\"${emails[$((choice - 1))]}\"\n\njq --arg email \"$selected_email\" \\\n   '(.inbounds[0].settings.clients) |= map(select(.email != $email))' \\\n   \"/usr/local/etc/xray/config.json\" > tmp && mv tmp \"/usr/local/etc/xray/config.json\"\n\nsystemctl restart xray\n\necho \"Клиент $selected_email удалён.\"\nEOF\nchmod +x /usr/local/bin/rmuser\n\n# Исполняемый файл для вывода списка пользователей и создания ссылкок\ntouch /usr/local/bin/sharelink\ncat << 'EOF' > /usr/local/bin/sharelink\n#!/bin/bash\nemails=($(jq -r '.inbounds[0].settings.clients[].email' /usr/local/etc/xray/config.json))\n\nfor i in \"${!emails[@]}\"; do\n   echo \"$((i + 1)). ${emails[$i]}\"\ndone\n\nread -p \"Выберите клиента: \" client\n\nif ! [[ \"$client\" =~ ^[0-9]+$ ]] || (( client < 1 || client > ${#emails[@]} )); then\n    echo \"Ошибка: номер должен быть от 1 до ${#emails[@]}\"\n    exit 1\nfi\n\nselected_email=\"${emails[$((client - 1))]}\"\n\n\nindex=$(jq --arg email \"$selected_email\" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key'  /usr/local/etc/xray/config.json)\nprotocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json)\nport=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) \nuuid=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json)\npbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}')\nsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\nusername=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json)\nsni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json)\nip=$(curl -4 -s icanhazip.com)\nlink=\"$protocol://$uuid@$ip:$port?security=reality&path=%2F&host=&mode=auto&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=%2F&type=xhttp&encryption=none#$username\"\necho \"\"\necho \"Ссылка для подключения\":\necho \"$link\"\necho \"\"\necho \"QR-код:\"\necho ${link} | qrencode -t ansiutf8\nEOF\nchmod +x /usr/local/bin/sharelink\n\nsystemctl restart xray\n\necho \"Xray-core успешно установлен\"\nmainuser\n\n# Создаем файл с подсказками\ntouch $HOME/help\ncat << 'EOF' > $HOME/help\n\nКоманды для управления пользователями Xray:\n\n    mainuser - выводит ссылку для подключения основного пользователя\n    newuser - создает нового пользователя\n    rmuser - удаление пользователей\n    sharelink - выводит список пользователей и позволяет создать для них ссылки для подключения\n    userlist - выводит список клиентов\n\n\n\nФайл конфигурации находится по адресу:\n\n    /usr/local/etc/xray/config.json\n\nКоманда для перезагрузки ядра Xray:\n\n    systemctl restart xray\n\nEOF"
  },
  {
    "path": "xray-install",
    "content": "#!/bin/bash\necho \"Будет установлен Vless с транспортом TCP\"\nsleep 3\napt update\napt install qrencode curl jq -y\n\n# Включаем bbr\nbbr=$(sysctl -a | grep net.ipv4.tcp_congestion_control)\nif [ \"$bbr\" = \"net.ipv4.tcp_congestion_control = bbr\" ]; then\necho \"bbr уже включен\"\nelse\necho \"net.core.default_qdisc=fq\" >> /etc/sysctl.conf\necho \"net.ipv4.tcp_congestion_control=bbr\" >> /etc/sysctl.conf\nsysctl -p\necho \"bbr включен\"\nfi\n\n# Устанавливаем ядро Xray\nbash -c \"$(curl -4 -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)\" @ install\n[ -f /usr/local/etc/xray/.keys ] && rm /usr/local/etc/xray/.keys\ntouch /usr/local/etc/xray/.keys\necho \"shortsid: $(openssl rand -hex 8)\" >> /usr/local/etc/xray/.keys\necho \"uuid: $(xray uuid)\" >> /usr/local/etc/xray/.keys\nxray x25519 >> /usr/local/etc/xray/.keys\n\nexport uuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}')\nexport privatkey=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/PrivateKey/ {print $2}')\nexport shortsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\n\n# Создаем файл конфигурации Xray\ntouch /usr/local/etc/xray/config.json\ncat << EOF > /usr/local/etc/xray/config.json\n{\n    \"log\": {\n        \"loglevel\": \"warning\"\n    },\n    \"routing\": {\n        \"domainStrategy\": \"IPIfNonMatch\",\n        \"rules\": [\n            {\n                \"type\": \"field\",\n                \"domain\": [\n                    \"geosite:category-ads-all\"\n                ],\n                \"outboundTag\": \"block\"\n            }\n        ]\n    },\n    \"inbounds\": [\n        {\n            \"listen\": \"0.0.0.0\",\n            \"port\": 443,\n            \"protocol\": \"vless\",\n            \"settings\": {\n                \"clients\": [\n                    {\n                        \"email\": \"main\",\n                        \"id\": \"$uuid\",\n                        \"flow\": \"xtls-rprx-vision\"\n                    }\n                ],\n                \"decryption\": \"none\"\n            },\n            \"streamSettings\": {\n                \"network\": \"tcp\",\n                \"security\": \"reality\",\n                \"realitySettings\": {\n                    \"show\": false,\n                    \"dest\": \"github.com:443\",\n                    \"xver\": 0,\n                    \"serverNames\": [\n                        \"github.com\",\n                        \"www.github.com\"\n                    ],\n                    \"privateKey\": \"$privatkey\",\n                    \"minClientVer\": \"\",\n                    \"maxClientVer\": \"\",\n                    \"maxTimeDiff\": 0,\n                    \"shortIds\": [\n                        \"$shortsid\"\n                    ]\n                }\n            },\n            \"sniffing\": {\n                \"enabled\": true,\n                \"destOverride\": [\n                    \"http\",\n                    \"tls\"\n                ]\n            }\n        }\n    ],\n    \"outbounds\": [\n        {\n            \"protocol\": \"freedom\",\n            \"tag\": \"direct\"\n        },\n        {\n            \"protocol\": \"blackhole\",\n            \"tag\": \"block\"\n        }\n    ],\n    \"policy\": {\n        \"levels\": {\n            \"0\": {\n                \"handshake\": 3,\n                \"connIdle\": 180\n            }\n        }\n    }\n}\nEOF\n\n# Исполняемый файл для списка клиентов\ntouch /usr/local/bin/userlist\ncat << 'EOF' > /usr/local/bin/userlist\n#!/bin/bash\nemails=($(jq -r '.inbounds[0].settings.clients[].email' \"/usr/local/etc/xray/config.json\"))\n\nif [[ ${#emails[@]} -eq 0 ]]; then\n    echo \"Список клиентов пуст\"\n    exit 1\nfi\n\necho \"Список клиентов:\"\nfor i in \"${!emails[@]}\"; do\n    echo \"$((i+1)). ${emails[$i]}\"\ndone\nEOF\nchmod +x /usr/local/bin/userlist\n\n# исполняемый файл для ссылки основного пользователя\ntouch /usr/local/bin/mainuser\ncat << 'EOF' > /usr/local/bin/mainuser\n#!/bin/bash\nprotocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json)\nport=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json)\nuuid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/uuid/ {print $2}')\npbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}')\nsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\nsni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json)\nip=$(timeout 3 curl -4 -s icanhazip.com)\nlink=\"$protocol://$uuid@$ip:$port?security=reality&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=/&type=tcp&flow=xtls-rprx-vision&encryption=none#vless-$ip\"\necho \"\"\necho \"Ссылка для подключения\":\necho \"$link\"\necho \"\"\necho \"QR-код:\"\necho ${link} | qrencode -t ansiutf8\nEOF\nchmod +x /usr/local/bin/mainuser\n\n# Исполняемый файл для создания новых клиентов\ntouch /usr/local/bin/newuser\ncat << 'EOF' > /usr/local/bin/newuser\n#!/bin/bash\nread -p \"Введите имя пользователя (email): \" email\n\n    if [[ -z \"$email\" || \"$email\" == *\" \"* ]]; then\n    echo \"Имя пользователя не может быть пустым или содержать пробелы. Попробуйте снова.\"\n    exit 1\n    fi\nuser_json=$(jq --arg email \"$email\" '.inbounds[0].settings.clients[] | select(.email == $email)' /usr/local/etc/xray/config.json)\n\nif [[ -z \"$user_json\" ]]; then\nuuid=$(xray uuid)\njq --arg email \"$email\" --arg uuid \"$uuid\" '.inbounds[0].settings.clients += [{\"email\": $email, \"id\": $uuid, \"flow\": \"xtls-rprx-vision\"}]' /usr/local/etc/xray/config.json > tmp.json && mv tmp.json /usr/local/etc/xray/config.json\nsystemctl restart xray\nindex=$(jq --arg email \"$email\" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key'  /usr/local/etc/xray/config.json)\nprotocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json)\nport=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json)\nuuid=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json)\npbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}')\nsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\nusername=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json)\nsni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json)\nip=$(curl -4 -s icanhazip.com)\nlink=\"$protocol://$uuid@$ip:$port?security=reality&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=/&type=tcp&flow=xtls-rprx-vision&encryption=none#$username\"\necho \"\"\necho \"Ссылка для подключения\":\necho \"$link\"\necho \"\"\necho \"QR-код:\"\necho ${link} | qrencode -t ansiutf8\nelse\necho \"Пользователь с таким именем уже существует. Попробуйте снова.\" \nfi\nEOF\nchmod +x /usr/local/bin/newuser\n\n# Исполняемый файл для удаления клиентов\ntouch /usr/local/bin/rmuser\ncat << 'EOF' > /usr/local/bin/rmuser\n#!/bin/bash\nemails=($(jq -r '.inbounds[0].settings.clients[].email' \"/usr/local/etc/xray/config.json\"))\n\nif [[ ${#emails[@]} -eq 0 ]]; then\n    echo \"Нет клиентов для удаления.\"\n    exit 1\nfi\n\necho \"Список клиентов:\"\nfor i in \"${!emails[@]}\"; do\n    echo \"$((i+1)). ${emails[$i]}\"\ndone\n\nread -p \"Введите номер клиента для удаления: \" choice\n\nif ! [[ \"$choice\" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#emails[@]} )); then\n    echo \"Ошибка: номер должен быть от 1 до ${#emails[@]}\"\n    exit 1\nfi\n\nselected_email=\"${emails[$((choice - 1))]}\"\n\njq --arg email \"$selected_email\" \\\n   '(.inbounds[0].settings.clients) |= map(select(.email != $email))' \\\n   \"/usr/local/etc/xray/config.json\" > tmp && mv tmp \"/usr/local/etc/xray/config.json\"\n\nsystemctl restart xray\n\necho \"Клиент $selected_email удалён.\"\nEOF\nchmod +x /usr/local/bin/rmuser\n\n# Исполняемый файл для вывода списка пользователей и создания ссылкок\ntouch /usr/local/bin/sharelink\ncat << 'EOF' > /usr/local/bin/sharelink\n#!/bin/bash\nemails=($(jq -r '.inbounds[0].settings.clients[].email' /usr/local/etc/xray/config.json))\n\nfor i in \"${!emails[@]}\"; do\n   echo \"$((i + 1)). ${emails[$i]}\"\ndone\n\nread -p \"Выберите клиента: \" client\n\nif ! [[ \"$client\" =~ ^[0-9]+$ ]] || (( client < 1 || client > ${#emails[@]} )); then\n    echo \"Ошибка: номер должен быть от 1 до ${#emails[@]}\"\n    exit 1\nfi\n\nselected_email=\"${emails[$((client - 1))]}\"\n\n\nindex=$(jq --arg email \"$selected_email\" '.inbounds[0].settings.clients | to_entries[] | select(.value.email == $email) | .key'  /usr/local/etc/xray/config.json)\nprotocol=$(jq -r '.inbounds[0].protocol' /usr/local/etc/xray/config.json)\nport=$(jq -r '.inbounds[0].port' /usr/local/etc/xray/config.json) \nuuid=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].id' /usr/local/etc/xray/config.json)\npbk=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/Password/ {print $2}')\nsid=$(cat /usr/local/etc/xray/.keys | awk -F': ' '/shortsid/ {print $2}')\nusername=$(jq --argjson index \"$index\" -r '.inbounds[0].settings.clients[$index].email' /usr/local/etc/xray/config.json)\nsni=$(jq -r '.inbounds[0].streamSettings.realitySettings.serverNames[0]' /usr/local/etc/xray/config.json)\nip=$(curl -4 -s icanhazip.com)\nlink=\"$protocol://$uuid@$ip:$port?security=reality&sni=$sni&fp=firefox&pbk=$pbk&sid=$sid&spx=/&type=tcp&flow=xtls-rprx-vision&encryption=none#$username\"\necho \"\"\necho \"Ссылка для подключения\":\necho \"$link\"\necho \"\"\necho \"QR-код:\"\necho ${link} | qrencode -t ansiutf8\nEOF\nchmod +x /usr/local/bin/sharelink\n\nsystemctl restart xray\n\necho \"Xray-core успешно установлен\"\nmainuser\n\n# Создаем файл с подсказками\ntouch $HOME/help\ncat << 'EOF' > $HOME/help\n\nКоманды для управления пользователями Xray:\n\n    mainuser - выводит ссылку для подключения основного пользователя\n    newuser - создает нового пользователя\n    rmuser - удаление пользователей\n    sharelink - выводит список пользователей и позволяет создать для них ссылки для подключения\n    userlist - выводит список клиентов\n\n\n\nФайл конфигурации находится по адресу:\n\n    /usr/local/etc/xray/config.json\n\nКоманда для перезагрузки ядра Xray:\n\n    systemctl restart xray\n\nEOF"
  }
]