diff --git a/FORK-CHANGELOG.md b/FORK-CHANGELOG.md index 5da85f9..5ad6f07 100644 --- a/FORK-CHANGELOG.md +++ b/FORK-CHANGELOG.md @@ -1,3 +1,18 @@ +## v1.2.23: чистый вывод — без дублей доступов, без авторской заглушки, без лишних ссылок + +* **Убран дублирующий блок автора.** Он печатал «Готово! Сервер работает» с адресом панели, логином, + паролем, подпиской, QR-кодом и ссылками — а потом то же самое выводил наш финальный блок. + Теперь авторский блок заканчивается строкой «Установка завершена» и списком предупреждений; + доступы и подписка печатаются один раз, в самом конце. +* **Авторская заглушка больше не ставится.** Наш сайт кладётся до установщика, а его страница из + релиза убирается — иначе она перезаписывала нашу на шаге сборки сайта. Заодно пропадает лишний + шаг «поставить поверх» и его бэкап. +* **Ссылки по протоколам — только если протоколов больше одного.** При одном REALITY печатается + подписка и QR-код, без списка «отдельные ссылки на каждый протокол». +* Самопроверка в конце установки больше не перечисляет чужие протоколы («REALITY, XHTTP и + Hysteria2») — пишет те, что реально созданы. Предупреждение про XHTTP/MTProto показывается только + если эти протоколы выбраны. + ## v1.2.22: 80 в ufw открывается прямо перед выпуском сертификата * Настоящая причина сбоя сертификата (проверено на живом сервере): установщик открывает список diff --git a/VERSION b/VERSION index 9a83513..a93a6f7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.22 +1.2.23 diff --git a/scripts/3x-ui-local.sh b/scripts/3x-ui-local.sh index 5dda1c0..92eed5f 100644 --- a/scripts/3x-ui-local.sh +++ b/scripts/3x-ui-local.sh @@ -44,7 +44,7 @@ set -Eeuo pipefail -KIT_VERSION="1.2.22" # версия сборки форка; должна совпадать с VERSION релиза +KIT_VERSION="1.2.23" # версия сборки форка; должна совпадать с VERSION релиза GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}" NS="3x-ui-kit-release" SIG_ID="releases@3x-ui-kit" @@ -446,6 +446,28 @@ else fi command -v kit >/dev/null || die "после установки нет команды kit — что-то пошло не так, смотрите вывод выше" +# Ставим нашу заглушку СРАЗУ (а не поверх авторской): страницу кладём до установщика, а его собственную +# страницу из релиза убираем — иначе она перезапишет нашу на шаге сборки сайта. +stub_staged=no +if [[ $site != off ]]; then + stub_n="" + case $site in + random) stub_n=$(( RANDOM % 10 )) ;; + *) [[ $site =~ ^[0-9]+$ ]] && stub_n=$((10#$site - 1)) ;; + esac + if [[ -n $stub_n ]]; then + install -d -m 755 /var/www/kit + if ( source "$tmp/scripts/kit-local.sh" 2>/dev/null; kl_site_html "$stub_n" ) >/var/www/kit/index.html 2>/dev/null \ + && [[ -s /var/www/kit/index.html ]]; then + stub_staged=yes + rm -f "$tmp/var/www/kit/index.html" + say "заглушка: наш сайт №$((stub_n + 1)) — ставится сразу, авторская страница не используется" + else + warn "не смог подготовить нашу заглушку — поставлю после установки (kit local site)" + fi + fi +fi + # Запоминаем, какие протоколы выбраны: наши команды (kit local site и др.) смотрят сюда и не # делают ничего для протоколов, которых в этой установке нет. printf '%s\n' "${protos//,/ }" | tr ' ' '\n' | sed '/^$/d' > /etc/kit/kl-protos 2>/dev/null || true @@ -462,7 +484,9 @@ fi # Сайт-заглушка: у автора это случайные «кофейни и пекарни», у нас — правдоподобный ИТ-сайт. # Меняем не файл вручную, а командой форка: она же обновляет копию страницы в ответе Hysteria2, # иначе 443/tcp и UDP-порт начнут отвечать разными страницами (это видно снаружи). -case $site in +case ${stub_staged:-no} in + yes) say "заглушка уже стоит (поставлена при установке, Hysteria2 синхронизирован тем же файлом)" ;; + *) case $site in off) say "заглушку не трогаю (--no-site): остаётся страница автора" ;; random) say "ставлю сайт-заглушку: случайный ИТ-сайт из нашего набора" @@ -472,6 +496,7 @@ case $site in say "ставлю сайт-заглушку №$site" kit local site "$site" || warn "не удалось поставить заглушку — позже: kit local site $site" ;; + esac ;; esac if [[ $fix_time == yes ]]; then @@ -558,8 +583,14 @@ if [[ $show_sub == yes ]]; then 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" - if ! kit user link "$sub_user" --all; then - warn "не смог показать ссылки для «$sub_user» — список пользователей: kit user list" + # Ссылки на каждый протокол показываем только если протоколов больше одного: при одном это лишний шум. + 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" diff --git a/scripts/3x-ui.sh b/scripts/3x-ui.sh index 9b41c96..123d5b9 100755 --- a/scripts/3x-ui.sh +++ b/scripts/3x-ui.sh @@ -30,7 +30,7 @@ wait_apt_idle() { XUI_VERSION="v3.9.0" # SHA256 установщика 3X-UI этой версии: тег могут передвинуть, а хеш – нет (проверено 2026-09-30). XUI_INSTALL_SHA256="18616fe26c8f6c92db6daa2dcd7cd53c5143ee69ecfd26d8ea6dc9b2c78607a6" -KIT_VERSION="1.2.22" +KIT_VERSION="1.2.23" # 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, @@ -711,7 +711,9 @@ kl_sni_menu() { done SNI2=${SNI2:-$SNI}; SNI3=${SNI3:-www.cloudflare.com} if [[ $TRUSTED == yes && $multi == no && ( $SNI2 =~ $SNI_BRAND_RE || $SNI3 =~ $SNI_BRAND_RE ) ]]; then - later "XHTTP и MTProto используют известные сайты из общего списка (достаточно соседей по подсети не нашлось). Заменить: kit net site" + # Наш шов: про XHTTP и MTProto говорим только если они выбраны — иначе это шум. + [[ " ${PROTOS[*]} " == *" xhttp "* || " ${PROTOS[*]} " == *" mtproto "* ]] && \ + later "XHTTP и MTProto используют известные сайты из общего списка (достаточно соседей по подсети не нашлось). Заменить: kit net site" fi step "Пакеты" @@ -841,7 +843,7 @@ kl_sni_menu() { chk=$(/usr/local/bin/kit check --deep 2>&1) && { bad=no; break; } done if [[ $bad == no ]]; then - ok "подключения работают: REALITY, XHTTP и Hysteria2 проверены клиентом с самого сервера" + ok "подключения работают (проверено клиентом с самого сервера): ${CREATED[*]:-нет}" else install -m 600 /dev/null /var/log/kit-install-check.log printf '%s\n' "$chk" >/var/log/kit-install-check.log @@ -886,33 +888,7 @@ kl_sni_menu() { } >"$RESULT" echo - echo "${G}${B}Готово! Сервер работает.${N}" - [[ -n $DOMAIN ]] && echo "Маскировка: свой домен ${B}$DOMAIN${N}, сертификат Let's Encrypt продлевается сам." - [[ $SELF_IP_CERT == yes ]] && later "Сертификат на IP самоподписанный: пользуйтесь ссылками на отдельные подключения, подписка в приложениях может не открыться." - echo - echo "${B}ПАНЕЛЬ${N}" - if [[ $TRUSTED == yes ]]; then - echo " $panel_url" - else - echo " Только через SSH-туннель. На вашем компьютере:" - echo " ssh -L $XUI_PANEL_PORT:127.0.0.1:$XUI_PANEL_PORT root@$HOST" - echo " Затем в браузере: http://127.0.0.1:$XUI_PANEL_PORT/$XUI_WEB_BASE_PATH" - fi - echo " Логин: ${B}$XUI_USERNAME${N} Пароль: ${B}$XUI_PASSWORD${N}" - echo " ${D}(сохранено в $RESULT, файл виден только root)${N}" - echo - if [[ $TRUSTED == yes ]]; then - echo "${B}ПОДПИСКА${N} – одна ссылка для всех протоколов" - echo " ${B}$SUB_URL${N}" - echo " Вставьте в Happ, Hiddify, Karing, v2rayN, Clash Verge или FlClash." - qrencode -t ANSIUTF8 -m 1 "$SUB_URL" || true - echo - KIT_NO_QR=1 /usr/local/bin/kit __links "$NAME" "$SUBID" || true - else - /usr/local/bin/kit __links "$NAME" "$SUBID" || true - fi - echo - echo "${D}Порты, выключение и включение протоколов: ${N}${B}kit net${N}" + echo "${G}${B}Установка завершена.${N} Доступы к панели, подписка и QR-код — в самом конце вывода." if ((${#WARNINGS[@]})); then echo echo "${B}ВНИМАНИЕ${N}" @@ -923,12 +899,7 @@ kl_sni_menu() { done ((${#WARNINGS[@]} > 3)) && echo " … и ещё $((${#WARNINGS[@]} - 3)): kit check" fi - echo - echo "${B}ДАЛЬШЕ${N}" - echo " ${B}kit${N} меню управления" - echo " ${B}kit user add имя --gb 50 --days 30${N} добавить пользователя" - echo " ${B}kit check --deep${N} проверить, что всё работает" - echo " ${B}kit backup${N} копия сервера (держите в надёжном месте)" + } # Официальный установщик 3X-UI закреплённой версии, сверенный по SHA256. diff --git a/scripts/hysteria2.sh b/scripts/hysteria2.sh index 3183c31..56b7d7e 100755 --- a/scripts/hysteria2.sh +++ b/scripts/hysteria2.sh @@ -8,7 +8,7 @@ # Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём # останавливается и не заменяет команду hy2. -KIT_VERSION="1.2.22" +KIT_VERSION="1.2.23" cat >&2 <<'MSG' Отдельный установщик Hysteria2 больше не поддерживается. diff --git a/scripts/kit.sh b/scripts/kit.sh index 6659d18..b235f73 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.22" +KIT_VERSION="1.2.23" 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"; } diff --git a/tools/fork_apply.py b/tools/fork_apply.py index f1e9ef5..85298ed 100644 --- a/tools/fork_apply.py +++ b/tools/fork_apply.py @@ -352,6 +352,20 @@ def main(): ' # Наш шов: если XHTTP и MTProto не выбраны, имена для них сейчас не нужны — не сканируем соседей\n # по подсети впустую (около 250 обращений к чужим 443). Имена SNI2/SNI3 возьмутся из общего списка ниже.\n if [[ $TRUSTED == yes && $multi == no && ( -z $SNI2 || -z $SNI3 ) ]] \\\n && [[ " ${PROTOS[*]} " == *" xhttp "* || " ${PROTOS[*]} " == *" mtproto "* ]]; then\n', 'авто-шов: replace, строк 1', ), + ( + 'scripts/3x-ui.sh', + ' later "XHTTP и MTProto используют известные сайты из общего списка (достаточно соседей по подсети не нашлось). Заменить: kit net site"\n', + False, + ' # Наш шов: про XHTTP и MTProto говорим только если они выбраны — иначе это шум.\n [[ " ${PROTOS[*]} " == *" xhttp "* || " ${PROTOS[*]} " == *" mtproto "* ]] && \\\n later "XHTTP и MTProto используют известные сайты из общего списка (достаточно соседей по подсети не нашлось). Заменить: kit net site"\n', + 'авто-шов: replace, строк 1', + ), + ( + 'scripts/3x-ui.sh', + ' ok "подключения работают: REALITY, XHTTP и Hysteria2 проверены клиентом с самого сервера"\n', + False, + ' ok "подключения работают (проверено клиентом с самого сервера): ${CREATED[*]:-нет}"\n', + 'авто-шов: replace, строк 1', + ), ( 'scripts/3x-ui.sh', ' local extra\n extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1)\n', @@ -366,6 +380,20 @@ def main(): ' echo "3X-UI_autoVPS (3X-UI $XUI_VERSION) – данные для входа (файл виден только root)"\n', 'авто-шов: replace, строк 1', ), + ( + 'scripts/3x-ui.sh', + ' echo "${G}${B}Готово! Сервер работает.${N}"\n [[ -n $DOMAIN ]] && echo "Маскировка: свой домен ${B}$DOMAIN${N}, сертификат Let\'s Encrypt продлевается сам."\n [[ $SELF_IP_CERT == yes ]] && later "Сертификат на IP самоподписанный: пользуйтесь ссылками на отдельные подключения, подписка в приложениях может не открыться."\n echo\n echo "${B}ПАНЕЛЬ${N}"\n if [[ $TRUSTED == yes ]]; then\n echo " $panel_url"\n else\n echo " Только через SSH-туннель. На вашем компьютере:"\n echo " ssh -L $XUI_PANEL_PORT:127.0.0.1:$XUI_PANEL_PORT root@$HOST"\n echo " Затем в браузере: http://127.0.0.1:$XUI_PANEL_PORT/$XUI_WEB_BASE_PATH"\n fi\n echo " Логин: ${B}$XUI_USERNAME${N} Пароль: ${B}$XUI_PASSWORD${N}"\n echo " ${D}(сохранено в $RESULT, файл виден только root)${N}"\n echo\n if [[ $TRUSTED == yes ]]; then\n echo "${B}ПОДПИСКА${N} – одна ссылка для всех протоколов"\n echo " ${B}$SUB_URL${N}"\n echo " Вставьте в Happ, Hiddify, Karing, v2rayN, Clash Verge или FlClash."\n qrencode -t ANSIUTF8 -m 1 "$SUB_URL" || true\n echo\n KIT_NO_QR=1 /usr/local/bin/kit __links "$NAME" "$SUBID" || true\n else\n /usr/local/bin/kit __links "$NAME" "$SUBID" || true\n fi\n echo\n echo "${D}Порты, выключение и включение протоколов: ${N}${B}kit net${N}"\n', + False, + ' echo "${G}${B}Установка завершена.${N} Доступы к панели, подписка и QR-код — в самом конце вывода."\n', + 'авто-шов: replace, строк 27', + ), + ( + 'scripts/3x-ui.sh', + ' fi\n echo\n echo "${B}ДАЛЬШЕ${N}"\n echo " ${B}kit${N} меню управления"\n echo " ${B}kit user add имя --gb 50 --days 30${N} добавить пользователя"\n echo " ${B}kit check --deep${N} проверить, что всё работает"\n echo " ${B}kit backup${N} копия сервера (держите в надёжном месте)"\n', + False, + ' fi\n\n', + 'авто-шов: replace, строк 7', + ), ( 'scripts/3x-ui.sh', 'KIT_CLI_URL="$KIT_RAW/scripts/kit.sh"\n',