diff --git a/FORK-CHANGELOG.md b/FORK-CHANGELOG.md index e09b486..13ec5f4 100644 --- a/FORK-CHANGELOG.md +++ b/FORK-CHANGELOG.md @@ -1,3 +1,15 @@ +## v1.2.13: вопросов после показа доступов нет, и никакой работы для невыбранных протоколов + +* **Все вопросы — до установщика.** Раньше после установки (когда на экране уже были данные входа + в панель) скрипт спрашивал про ping, автообновления, порт SSH и пароль root — доступы терялись + в потоке вопросов. Теперь спрашиваем всё заранее, а действия выполняем после установки; последнее, + что видит человек, — доступ к панели, подписка и QR-код. +* Автор тянет подписки «-awg» и «-tg» (наследие установок kit < 1.1) всегда — теперь только если + AmneziaWG или MTProto выбраны. +* Наши команды помнят выбор: установщик пишет список протоколов в `/etc/kit/kl-protos`, и + `kit local site` не синхронизирует ответ Hysteria2, если Hysteria2 не ставился (раньше он это делал + и выдавал предупреждение про отсутствующий Hysteria2). + ## v1.2.12: не сканируем соседей, когда они не нужны * Автор подбирал сайты-соседи для XHTTP и MTProto **всегда**, когда маскировка доверенная («панель по IP») diff --git a/VERSION b/VERSION index f2ae0b4..0b1f1ed 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.12 +1.2.13 diff --git a/scripts/3x-ui-local.sh b/scripts/3x-ui-local.sh index 4c9a7ab..3a25e26 100644 --- a/scripts/3x-ui-local.sh +++ b/scripts/3x-ui-local.sh @@ -43,7 +43,7 @@ set -Eeuo pipefail -KIT_VERSION="1.2.12" # версия сборки форка; должна совпадать с VERSION релиза +KIT_VERSION="1.2.13" # версия сборки форка; должна совпадать с VERSION релиза GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}" NS="3x-ui-kit-release" SIG_ID="releases@3x-ui-kit" @@ -341,67 +341,9 @@ else fi say "протоколы: $protos — под остальные не создаётся ничего" -[[ $clean == yes ]] && clean_previous - -say "запускаю установщик автора (панель 3X-UI, протоколы, сайт-заглушка, подписка)" -if ((${#INSTALLER_ARGS[@]})); then printf ' флаги: %s\n' "${INSTALLER_ARGS[*]}"; else printf ' флагов нет: установщик задаст вопросы (маскировка, домен)\n'; fi -# stdin: если есть терминал — отдаём его установщику (там есть вопросы), иначе /dev/null, -# иначе установщик начнёт читать наш собственный скрипт вместо ответов. -if [[ -r /dev/tty ]]; then - bash "$tmp/scripts/3x-ui.sh" ${INSTALLER_ARGS[@]+"${INSTALLER_ARGS[@]}"} /dev/null || die "после установки нет команды kit — что-то пошло не так, смотрите вывод выше" - -# ------------------------------------------------------------------ наши дополнения - -ask_yes() { # "вопрос" y|n — по умолчанию - local q=$1 def=$2 ans="" - interactive || { [[ $def == y ]]; return; } - printf '\n%s [%s]: ' "$q" "$([[ $def == y ]] && echo 'Y/n' || echo 'y/N'])" - read -r -t 300 ans <"$ASK_SRC" 2>/dev/null || true - ans=${ans,,}; ans=${ans//[[:space:]]/} - [[ -z $ans && $def == y ]] && return 0 - [[ $ans =~ ^(y|yes|д|да)$ ]] -} - -# Сайт-заглушка: у автора это случайные «кофейни и пекарни», у нас — правдоподобный ИТ-сайт. -# Меняем не файл вручную, а командой форка: она же обновляет копию страницы в ответе Hysteria2, -# иначе 443/tcp и UDP-порт начнут отвечать разными страницами (это видно снаружи). -case $site in - off) say "заглушку не трогаю (--no-site): остаётся страница автора" ;; - random) - say "ставлю сайт-заглушку: случайный ИТ-сайт из нашего набора" - kit local site || warn "не удалось поставить заглушку — позже: kit local site" - ;; - *) - say "ставлю сайт-заглушку №$site" - kit local site "$site" || warn "не удалось поставить заглушку — позже: kit local site $site" - ;; -esac - -if [[ $fix_time == yes ]]; then - say "kit fix: синхронизация времени и безопасные починки (авторская команда, ничего необратимого)" - kit fix || warn "kit fix завершился с замечаниями — посмотрите вывод" -fi - -# ping и автообновления: --harden/--no-harden решают без вопросов, иначе спрашиваем -want_ping=$harden; want_update=$harden -[[ $want_ping == auto ]] && want_ping=yes -[[ $want_update == auto ]] && want_update=yes -if [[ $harden == auto ]] && interactive; then - if ask_yes "Закрыть ответ сервера на ping? Снаружи пинг перестанет отвечать (подписка и VPN не затрагиваются)." y; then want_ping=yes; else want_ping=no; fi - if ask_yes "Включить автообновления безопасности? Только security-обновления, без перезагрузки." y; then want_update=yes; else want_update=no; fi -fi -if [[ $want_ping == yes ]]; then - say "закрываю ответ на ping (правилом ufw)" - kit local ping off || warn "не удалось — повторите: kit local ping off" -fi -if [[ $want_update == yes ]]; then - say "включаю автообновления безопасности" - kit local upgrades on || warn "не удалось — повторите: kit local upgrades on" -fi +# ------------------------------------------------------------------ вопросы (всё спросим ДО установки) +# После установщика на экране появляются доступы к панели: там вопросы уже неуместны. Поэтому +# спрашиваем всё заранее, а действия выполняем после установки (см. «наши дополнения» ниже). # порт SSH: по флагу или по вопросу. Смена делается в два шага: сначала ДОБАВИТЬ новый порт # (прежний продолжает работать), потом закрыть прежние — иначе одна опечатка оставляет сервер без доступа. @@ -439,19 +381,78 @@ ask_ssh_port() { # пусто — оставить как есть; иначе warn "оставляю прежний порт ($cur)" } +want_ping=$harden; want_update=$harden +[[ $want_ping == auto ]] && want_ping=yes +[[ $want_update == auto ]] && want_update=yes +if [[ $harden == auto ]] && interactive; then + if ask_yes "Закрыть ответ сервера на ping? Снаружи пинг перестанет отвечать (подписка и VPN не затрагиваются)." y; then want_ping=yes; else want_ping=no; fi + if ask_yes "Включить автообновления безопасности? Только security-обновления, без перезагрузки." y; then want_update=yes; else want_update=no; fi +fi + [[ -n $ssh_port ]] || ssh_port=$(ask_ssh_port) +want_passwd=no +if interactive; then + if ask_yes "Сменить пароль root прямо сейчас? Новый пароль введёте в следующем окне." n; then want_passwd=yes; fi +fi + +[[ $clean == yes ]] && clean_previous + +say "запускаю установщик автора (панель 3X-UI, протоколы, сайт-заглушка, подписка)" +if ((${#INSTALLER_ARGS[@]})); then printf ' флаги: %s\n' "${INSTALLER_ARGS[*]}"; else printf ' флагов нет: установщик задаст вопросы (маскировка, домен)\n'; fi +# stdin: если есть терминал — отдаём его установщику (там есть вопросы), иначе /dev/null, +# иначе установщик начнёт читать наш собственный скрипт вместо ответов. +if [[ -r /dev/tty ]]; then + bash "$tmp/scripts/3x-ui.sh" ${INSTALLER_ARGS[@]+"${INSTALLER_ARGS[@]}"} /dev/null || die "после установки нет команды kit — что-то пошло не так, смотрите вывод выше" + +# Запоминаем, какие протоколы выбраны: наши команды (kit local site и др.) смотрят сюда и не +# делают ничего для протоколов, которых в этой установке нет. +printf '%s\n' "${protos//,/ }" | tr ' ' '\n' | sed '/^$/d' > /etc/kit/kl-protos 2>/dev/null || true + +# Сайт-заглушка: у автора это случайные «кофейни и пекарни», у нас — правдоподобный ИТ-сайт. +# Меняем не файл вручную, а командой форка: она же обновляет копию страницы в ответе Hysteria2, +# иначе 443/tcp и UDP-порт начнут отвечать разными страницами (это видно снаружи). +case $site in + off) say "заглушку не трогаю (--no-site): остаётся страница автора" ;; + random) + say "ставлю сайт-заглушку: случайный ИТ-сайт из нашего набора" + kit local site || warn "не удалось поставить заглушку — позже: kit local site" + ;; + *) + say "ставлю сайт-заглушку №$site" + kit local site "$site" || warn "не удалось поставить заглушку — позже: kit local site $site" + ;; +esac + +if [[ $fix_time == yes ]]; then + say "kit fix: синхронизация времени и безопасные починки (авторская команда, ничего необратимого)" + kit fix || warn "kit fix завершился с замечаниями — посмотрите вывод" +fi + +# Действия по ответам, которые были заданы ДО установщика (см. блок вопросов выше). +if [[ $want_ping == yes ]]; then + say "закрываю ответ на ping (правилом ufw)" + kit local ping off || warn "не удалось — повторите: kit local ping off" +fi +if [[ $want_update == yes ]]; then + say "включаю автообновления безопасности" + kit local upgrades on || warn "не удалось — повторите: kit local upgrades on" +fi + +if [[ $want_passwd == yes ]]; then + say "меняю пароль root" + kit local passwd || warn "не получилось — повторите: kit local passwd" +fi + +# порт SSH: новый порт добавляем, прежний остаётся рабочим до вашей проверки входа. if [[ -n $ssh_port ]]; then say "перевожу SSH на порт $ssh_port: новый добавляю, прежний пока остаётся рабочим" kit local ssh "$ssh_port" || warn "порт не добавился — сделайте отдельно: kit local ssh $ssh_port" fi -# пароль root: в флагах его нет намеренно — значение в командной строке видно в списке процессов -if interactive; then - if ask_yes "Сменить пароль root прямо сейчас?" n; then - kit local passwd || warn "не получилось — повторите: kit local passwd" - fi -fi - # ------------------------------------------------------------------ проверка if [[ $do_check == yes ]]; then diff --git a/scripts/3x-ui.sh b/scripts/3x-ui.sh index 42e3d18..50a33e5 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.12" +KIT_VERSION="1.2.13" # 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, @@ -757,7 +757,11 @@ main() { links=$(sub_links "$SUBID") # У установок до kit 1.1 AmneziaWG и MTProto лежат в подписках «-awg» и «-tg». local extra - extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1) + # Наш шов: подписки «-awg»/«-tg» есть только у установок с AmneziaWG и MTProto — не тянем их, + # если эти протоколы не выбраны (никаких лишних обращений к панели). + if [[ " ${PROTOS[*]} " == *" awg "* || " ${PROTOS[*]} " == *" awg3 "* || " ${PROTOS[*]} " == *" mtproto "* ]]; then + extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1) + fi [[ -n $extra ]] && links+=$'\n'"$extra" AWG_LINKS=$(grep '^vpn://' <<<"$links" || true) # MTProto слушает localhost, а клиенты приходят через nginx на 443. diff --git a/scripts/hysteria2.sh b/scripts/hysteria2.sh index 58a0b4e..4a551a4 100755 --- a/scripts/hysteria2.sh +++ b/scripts/hysteria2.sh @@ -8,7 +8,7 @@ # Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём # останавливается и не заменяет команду hy2. -KIT_VERSION="1.2.12" +KIT_VERSION="1.2.13" cat >&2 <<'MSG' Отдельный установщик Hysteria2 больше не поддерживается. diff --git a/scripts/kit-local.sh b/scripts/kit-local.sh index 82ca456..66ae68f 100644 --- a/scripts/kit-local.sh +++ b/scripts/kit-local.sh @@ -874,7 +874,9 @@ kit_local_site() { # Порт 443 отдаёт файл через nginx (перезагрузка не нужна). UDP-порт Hysteria2 держит копию # страницы внутри подключения — её надо обновить, иначе ответы разойдутся. if kl_have kit; then - if kit net masq on >/dev/null 2>&1; then + if [[ -f /etc/kit/kl-protos ]] && ! grep -qE '(^|[ ,])hy2([ ,]|$)' /etc/kit/kl-protos; then + kl_ok "Hysteria2 в этой установке не ставился — синхронизировать нечего" + elif kit net masq on >/dev/null 2>&1; then kl_ok "Hysteria2 отвечает той же страницей" else kl_warn "Hysteria2 не синхронизирован (может, его нет в этой установке) — проверьте: kit net masq on" diff --git a/scripts/kit.sh b/scripts/kit.sh index 3be83fb..4fb0f85 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.12" +KIT_VERSION="1.2.13" 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 56e04c5..f2dd4c6 100644 --- a/tools/fork_apply.py +++ b/tools/fork_apply.py @@ -254,6 +254,13 @@ 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', 'не сканировать соседей, если XHTTP и MTProto не выбраны', ), + ( + 'scripts/3x-ui.sh', + ' extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1)', + False, + ' # Наш шов: подписки «-awg»/«-tg» есть только у установок с AmneziaWG и MTProto — не тянем их,\n # если эти протоколы не выбраны (никаких лишних обращений к панели).\n if [[ " ${PROTOS[*]} " == *" awg "* || " ${PROTOS[*]} " == *" awg3 "* || " ${PROTOS[*]} " == *" mtproto "* ]]; then\n extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1)\n fi', + 'не тянуть legacy-подписки awg/tg, если протоколы не выбраны', + ), ] bad = 0