From 776b7a8c5e7624eb51ebe2f7264e9299baa55bbd Mon Sep 17 00:00:00 2001 From: hacker07 Date: Wed, 14 Oct 2026 16:49:45 +0300 Subject: [PATCH] =?UTF-8?q?v1.2.1.3:=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20QR=20=E2=80=94=20=D0=B2=20=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8E=20kit=20(=D0=B8=20kit=20local=20links),=20=D0=B2=20?= =?UTF-8?q?=D0=B8=D1=82=D0=BE=D0=B3=D0=B5=20=D0=B2=D0=B8=D0=B4=D0=BD=D0=BE?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FORK-CHANGELOG.md | 13 +++++++++++++ VERSION | 2 +- scripts/3x-ui-local.sh | 39 ++++++++++++++++++++------------------- scripts/3x-ui.sh | 2 +- scripts/hysteria2.sh | 2 +- scripts/kit-local.sh | 15 +++++++++++++++ scripts/kit.sh | 2 +- 7 files changed, 52 insertions(+), 23 deletions(-) diff --git a/FORK-CHANGELOG.md b/FORK-CHANGELOG.md index 72b141e..b38af7d 100644 --- a/FORK-CHANGELOG.md +++ b/FORK-CHANGELOG.md @@ -1,3 +1,16 @@ +## v1.2.1.3: ссылки и QR — в меню kit; сертификат панели видно в итоге + +* **Ссылки для подключения и QR-код больше не печатаются в выводе установки.** Их смотрят позже, когда + настраивают телефон, и они всегда доступны заново: `kit → Пользователи → Показать ссылки`. В итоговом + блоке вместо них — короткий путь к этому пункту и команды `kit local links` (подписка и QR) и + `kit user link <имя> --all` (все протоколы). Доступы к панели (адрес, логин, пароль) по-прежнему + в конце установки: их вы просили показывать один раз и сразу. +* **Добавлена команда `kit local links`** — подписка, QR-код и ссылки по протоколам одной командой; + пользователя можно указать, иначе берётся первый. +* **В итоговом блоке видно состояние сертификата панели.** Панель и подписка висят на IP, поэтому + печатается: «Let's Encrypt на IP — доверенный, браузер не ругается» либо «самоподписанный» с датой, + после которой Let's Encrypt выпустит сертификат на IP (тот же лимит, что и для домена). + ## v1.2.1.2: сертификат на IP — с датой повтора; «без домена» продолжает установку * **Отказ Let's Encrypt на IP теперь объясняется честно.** Как и для домена, при лимите в выводе дата, diff --git a/VERSION b/VERSION index ff81ff4..5a81cb2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.1.2 +1.2.1.3 diff --git a/scripts/3x-ui-local.sh b/scripts/3x-ui-local.sh index 6489b84..f1cd950 100644 --- a/scripts/3x-ui-local.sh +++ b/scripts/3x-ui-local.sh @@ -44,7 +44,7 @@ set -Eeuo pipefail -KIT_VERSION="1.2.1.2" # версия сборки форка; должна совпадать с VERSION релиза +KIT_VERSION="1.2.1.3" # версия сборки форка; должна совпадать с VERSION релиза GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}" NS="3x-ui-kit-release" SIG_ID="releases@3x-ui-kit" @@ -565,8 +565,20 @@ if [[ $show_sub == yes ]]; then else warn "файла /root/3x-ui.txt нет — адрес панели и логин были в выводе установщика выше" fi + # Наш шов: показываем состояние сертификата панели. Панель и подписка живут на IP, поэтому + # сертификат Let's Encrypt на IP — не мелочь: с ним браузер и приложения не ругаются. + cert=/root/cert/ip/fullchain.pem + if [[ -s $cert ]] && openssl x509 -in "$cert" -noout -issuer 2>/dev/null | grep -q "Let's Encrypt"; then + printf ' %sсертификат панели: Let'"'"'s Encrypt на IP — доверенный, браузер не ругается%s\n' "$G" "$N" + elif [[ -s $cert ]]; then + printf ' %sсертификат панели: самоподписанный — браузер предупредит, подписка в приложениях может не открыться%s\n' "$Y" "$N" + till2= + till2=$(grep -rhoE 'retry after [0-9-]+ [0-9:]+ UTC' /var/log/3x-ui-install.log "$HOME"/.acme.sh/*/ca 2>/dev/null | tail -1 | sed 's/^retry after //') + if [[ -n $till2 ]]; then + printf ' %sLet'"'"'s Encrypt на IP: лимит выпусков, повтор возможен после %s — тогда запустите установщик снова, он возьмёт сертификат%s\n' "$D" "$till2" "$N" + fi + fi if grep -qaE '^Панель: ?https?://[0-9]' /root/3x-ui.txt 2>/dev/null; then - printf ' %sпанель открывается по IP: сертификат самоподписанный, браузер предупредит.\n' "$D" printf ' Завести свой домен и перейти на него: kit net panel domain%s\n' "$N" fi fi @@ -581,21 +593,10 @@ if [[ $show_sub == yes ]]; then for ((_i = 0; _i < ${#INSTALLER_ARGS[@]}; _i++)); do [[ ${INSTALLER_ARGS[_i]} == --user ]] && sub_user=${INSTALLER_ARGS[_i + 1]:-admin} done - say "подписка и доступы — это то, что стоит сохранить" - printf ' подписка — одна ссылка на все устройства; QR-код ниже наводите камерой в приложении\n' - printf ' приложения: Happ, Hiddify, Karing, v2rayN, Clash/Mihomo\n' - printf ' отдельные ссылки по протоколам — ниже же (если приложение не умеет подписку)\n' - printf ' %sпозже то же самое: kit user link %s --all (или меню: kit)%s\n' "$D" "$sub_user" "$N" - [[ -n ${ssh_port:-} ]] && printf ' SSH: новый порт %s, прежние (%s) ещё открыты — закройте их после проверки входа: kit local ssh --close-old %s\n' "$ssh_port" "${ssh_ports_before:-22}" "$ssh_port" - # Ссылки на каждый протокол показываем только если протоколов больше одного: при одном это лишний шум. - protos_now=$(tr '\n' ' ' < /etc/kit/kl-protos 2>/dev/null || true) - if [[ $(wc -w <<<"$protos_now") -gt 1 ]]; then - if ! kit user link "$sub_user" --all; then - warn "не смог показать ссылки для «$sub_user» — список пользователей: kit user list" - fi - elif ! kit user link "$sub_user"; then - warn "не смог показать подписку для «$sub_user» — список пользователей: kit user list" - fi -else - say "ссылки и QR-код не показываю (--no-sub). Посмотреть: kit user link admin --all" + # Наш шов: ссылки для подключения и QR-код в выводе установки не печатаем — их смотрят потом, + # когда настраивают телефон, и они всегда доступны заново в меню kit. Здесь только путь к ним. + say "ссылки для подключения и QR-код — в меню kit" + printf ' %skit%s → Пользователи → Показать ссылки подписка, QR-код и ссылки по протоколам\n' "$B" "$N" + printf ' из командной строки: %s kit local links %s (подписка и QR) · kit user link %s --all\n' "$D" "$N" "$sub_user" + [[ -n ${ssh_port:-} ]] && printf ' SSH: новый порт %s, прежние (%s) ещё открыты — закройте их, когда убедитесь, что вход работает: kit local ssh --close-old\n' "$ssh_port" "22" >&2 fi diff --git a/scripts/3x-ui.sh b/scripts/3x-ui.sh index bd28805..2418bdc 100755 --- a/scripts/3x-ui.sh +++ b/scripts/3x-ui.sh @@ -39,7 +39,7 @@ wait_apt_idle() { XUI_VERSION="v3.9.0" # SHA256 установщика 3X-UI этой версии: тег могут передвинуть, а хеш – нет (проверено 2026-09-30). XUI_INSTALL_SHA256="18616fe26c8f6c92db6daa2dcd7cd53c5143ee69ecfd26d8ea6dc9b2c78607a6" -KIT_VERSION="1.2.1.2" +KIT_VERSION="1.2.1.3" # kit и kit-sub берём из того же релиза, что и этот скрипт, а не из меняющейся ветки main. KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$KIT_VERSION" # Ядро Xray для панели. С 26.7.x клиенты на Mihomo и sing-box (Hiddify, FlClash, diff --git a/scripts/hysteria2.sh b/scripts/hysteria2.sh index 514f379..583152a 100755 --- a/scripts/hysteria2.sh +++ b/scripts/hysteria2.sh @@ -8,7 +8,7 @@ # Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём # останавливается и не заменяет команду hy2. -KIT_VERSION="1.2.1.2" +KIT_VERSION="1.2.1.3" cat >&2 <<'MSG' Отдельный установщик Hysteria2 больше не поддерживается. diff --git a/scripts/kit-local.sh b/scripts/kit-local.sh index 4653494..0ef9b06 100644 --- a/scripts/kit-local.sh +++ b/scripts/kit-local.sh @@ -73,6 +73,7 @@ kit_local_help() { kit local seams какие места форк правит в файлах автора kit local masking состояние маскировки (у REALITY должен быть свой домен) kit local hardening сводка по защите сервера и что ещё можно включить + kit local links подписка, QR-код и ссылки по протоколам (как в меню kit) kit local uninstall то же, что kit uninstall: снести всё, включая сам kit (SSH не трогает) Заглушка (сайт на 443 и ответ Hysteria2 — одна и та же страница) @@ -900,6 +901,7 @@ kit_local_cmd() { upgrades | auto) shift; kit_local_upgrades "$@" ;; hardening | hard) shift; kit_local_hardening "$@" ;; uninstall | remove) shift; kit_local_uninstall "$@" ;; + links | link) shift; kit_local_links "$@" ;; site | stub | stub-site) shift; kit_local_site "$@" ;; *) printf 'Неизвестная команда форка: %s\n' "$1" >&2 @@ -922,6 +924,18 @@ kit_local_cmd() { # # kit local uninstall спросит подтверждение словом «удалить» # kit local uninstall --dry-run только покажет, что будет удалено +kit_local_links() { # [имя] — подписка, QR-код и ссылки по протоколам (то же, что «kit → Пользователи → Показать ссылки») + local u=${1:-} now + if [[ -z $u ]]; then + u=$(kit user list 2>/dev/null | awk 'NR > 1 && NF { print $1; exit }') + u=${u:-admin} + fi + printf ' пользователь: %s\n' "$u" + now=$(tr '\n' ' ' /dev/null || true) + # Ссылки на каждый протокол — только если протоколов больше одного; при одном достаточно подписки. + if [[ $(wc -w <<<"$now") -gt 1 ]]; then kit user link "$u" --all; else kit user link "$u"; fi +} + kit_local_uninstall() { # Наш шов: логику удаления отдаём авторской команде «kit uninstall». Она снимает и сам kit, чтобы на # сервере не осталось следов, поэтому своя реализация здесь больше не нужна — команда оставлена @@ -987,6 +1001,7 @@ ${B:-}3X-UI_autoVPS ${KIT_VERSION:-?} — все команды${N:-} (то ж kit local site [--list | N | --show] сайт-заглушка: случайный ИТ-сайт, список, конкретный, какой стоит Проверка и починка + kit local links [имя] подписка, QR-код и ссылки по протоколам (по умолчанию — первый пользователь) kit local uninstall то же, что kit uninstall: снести установку целиком и сам kit; SSH не трогает kit check [--deep | --fix] проверка сервера (--deep — ходит наружу как клиент) kit fix [--dry-run] безопасные починки: время, службы, конфиги diff --git a/scripts/kit.sh b/scripts/kit.sh index a23c0c3..ba95caa 100644 --- a/scripts/kit.sh +++ b/scripts/kit.sh @@ -12,7 +12,7 @@ set -Eeuo pipefail export LC_ALL=C.UTF-8 # ширина колонок по символам, а не байтам -KIT_VERSION="1.2.1.2" +KIT_VERSION="1.2.1.3" KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/branch/main" # Файлы новой версии берём из её тега, а не из меняющейся ветки main. kit_ref_raw() { echo "https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$1"; }