Files
3X-UI_autoVPS/FORK-CHANGELOG.md
T

54 KiB
Raw Permalink Blame History

v1.2.1.8: подсказка меню исправлена, установка стала тише

  • «Выбор [0-10]» при 11 пунктах — подсказка главного меню отстала, когда мы добавили пункт «Доступ к панели, ссылки и заглушка». Теперь «Выбор [0-11]». Чтобы это не повторилось, добавлен тест tools/check-menus.py: он сверяет подсказку каждого меню с числом пунктов и запускается в релизном гейте — если мы снова добавим пункт и забудем подсказку, выпуск остановится.
  • kit fix больше не выполняется при установке (в выводе это выглядело как «Чинить нечего: всё в порядке»). Нужен — запускается из меню или ключом --time.
  • Вывод про автообновления безопасности сокращён до одной строки («автообновления безопасности включены…»): три строки про ядро и перезагрузку убраны из установки.

v1.2.1.7: исправлена установка (моя регрессия в 1.2.1.6)

  • В 1.2.1.6 я переписал загрузку файлов релиза и оставил проверку SHA256 установщика раньше скачивания — установка обрывалась на первой же строке: sha256sum: .../scripts/3x-ui.sh: No such file or directory. Теперь сначала скачиваются все файлы релиза (каждый сверяется с подписанным списком), и только потом проверяется установщик.
  • Проверено не на глаз: воспроизвёл ошибку у себя тем же путём (--verify-only) — красное, затем после правки зелёное. Этот прогон добавлен в процедуру выпуска: перед подписью я запускаю установщик в режиме --verify-only и убеждаюсь, что путь «скачать и проверить релиз» проходит целиком.

v1.2.1.6: доступы к панели в конце установки и рабочая заглушка

  • Исправлено: доступы к панели не выводились. Автор пишет строки в /root/3x-ui.txt без ведущих пробелов, а наш фильтр требовал два пробела — отсюда «данных панели нет». Теперь адрес панели, логин и пароль печатаются в конце установки (и в пункте меню «9. Доступ к панели, ссылки и заглушка»). Рядом указывается, что подписка и ссылки по протоколам лежат в том же файле.
  • Исправлено: наша заглушка не готовилась до установщика. Обёртка скачивала из релиза только три файла, а scripts/kit-local.sh (там функция страницы) не качала — падало с «kl_site_html: command not found». Теперь качаются все файлы релиза, и каждый сверяется с подписанным списком (проверка целостности стала полной, а не только для установщика).

v1.2.1.5: доступ к панели, ссылки и заглушка — одним пунктом меню

  • В меню kit пункт «9. Доступ к панели, ссылки и заглушка» — открывает одним экраном: адрес панели, логин и пароль (из /root/3x-ui.txt), состояние сертификата панели (доверенный на IP или самоподписанный, с датой повтора при лимите Let's Encrypt), ссылки на подключения с QR-кодом и что сейчас стоит заглушкой. Раньше доступ к панели в меню не показывался вообще, а про заглушку было непонятно, как её посмотреть.
  • Меню перенумеровано: «10. Панель x-ui», «11. Удалить KIT с сервера» (логика удаления — авторская).
  • То же самое доступно из консоли: kit local access [имя].

v1.2.1.4: короткий итог установки, автовыбор в общедоступных сайтах, команда про порты

  • Итог установки вместо простыни текста — компактный блок: сборка, сервер, протоколы, состояние сертификата панели, одна строка проверки. Дальше только то, что нужно человеку: доступ к панели (адрес, логин, пароль — по просьбе из ранних правок), указатель на меню kit для ссылок и QR, открытые порты и команда для закрытия лишних. Длинные отчёты (состояние защиты, полный вывод kit check) убраны из установки — они остались доступны командами, в том числе kit local hardening.
  • Ссылки на подключения больше не попадают в вывод установки даже косвенно: раньше печатался весь файл /root/3x-ui.txt, а в нём лежат и ссылки vless://. Теперь из него берутся только строки панели — адрес, логин, пароль.
  • В меню общедоступных сайтов последним пунктом добавлен автовыбор (раньше можно было только выбрать номером или вернуться).
  • Новая команда kit local ports — что открыто в ufw, что реально нужно (порты подключений и SSH), что лишнее; kit local ports --close-extra закрывает лишнее.
  • Ошибка подготовки нашей заглушки теперь печатает причину, а не просто «не смог».

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 теперь объясняется честно. Как и для домена, при лимите в выводе дата, после которой выпуск возможен, и прямо сказано, что порт 80 и файрвол тут не при чём. Раньше печатались «частые причины» и человек шёл проверять хостера.
  • Пункт «без своего домена» больше не останавливает установку. При отказе с сертификатом домена выбор «3» продолжает работу сразу: маскировка берётся из соседей по подсети (или известный сайт, если соседей нет), панель и подписка переключаются на IP, дальше установка идёт своим ходом. Перезапускать скрипт и заново отвечать на вопросы не нужно.

v1.2.1.1: сборка на новой базе автора (3X-UI KIT 1.2.1)

Правило нумерации: берём версию автора и через точку добавляем свою, начиная с 1. У автора 1.2.1 — значит наша сборка 1.2.1.1; когда выйдет его 1.2.2, наша будет 1.2.2.1.

Взяли от автора (его код теперь работает вместо наших заплаток):

  • проверка A-записи домена сверяется с публичным DNS, а не с кэшем самого сервера — та самая причина, когда запись уже есть, а сервер её «не видит»;
  • пропал наш шов, открывавший порт 80: автор делает это сам перед выпуском сертификата и закрывает обратно;
  • пропал наш шов переиспользования сертификата: автор тоже берёт прошлый;
  • повторный запуск после неудачной установки: автор заново спрашивает протоколы и сайт маскировки и не оставляет сервер на полпути — прежнее наше «доустанавливаю» больше не нужно;
  • полное удаление: наш kit local uninstall теперь делегирует авторской команде kit uninstall (она снимает и сам kit) и остаётся синонимом;
  • меню kit — авторское (в том числе «9. Панель 3X-UI (меню x-ui)», «10. Удалить KIT с сервера»);
  • попутно приехали его починки: Hiddify 4.x снова принимает подписку, ссылка MTProto ведёт на 443, смена сайта маскировки не обрывает клиентов (прежнее имя живёт неделю), nginx -t в проверке сервера, устойчивость к битому apt-репозиторию, длинные имена сайта в nginx, проверка копии (в т.ч. U+202E), честная глубокая проверка, предупреждение «обновлять панель и ядро только через kit».

Сохранили своё:

  • наш файл scripts/kit-local.sh и наша обёртка установщика — автор их не трогает;
  • наш канал обновлений (GitHub → наш Gitea) и только наш ключ подписи в KIT_SIGNERS: сервер обязан принимать обновления лишь из нашего канала;
  • наш экран выбора протоколов (13 пунктов, дефолт REALITY + AmneziaWG-3.1) — теперь номера вводятся через пробел («1 12»), как вы просили; запятые по-прежнему принимаются;
  • наши меню маскировки REALITY и XHTTP/MTProto, вопрос «панель по IP или по домену», возврат «ввести другой домен» без обрыва установки;
  • наша заглушка ставится сразу, авторская не устанавливается;
  • финальный блок: доступы, подписка и QR печатает наш установщик один раз, в самом конце (авторский дубль «Готово! Сервер работает» убран, предупреждения остаются).

Технически: из 77 прежних швов 66 легли без изменений, 8 больше не нужны (их работу делает автор), 3 перенастроены на его новый код (ключ подписи, защита наших меню, финальный блок).

v1.2.27: ошибка с доменом больше не обрывает установку

  • Свой домен вводится заново, пока не заработает. Раньше при промахе (A-запись ещё не разошлась по DNS, опечатка в имени) установка молча маскировалась под чужой сайт, а при домене из флага — обрывалась с «исправьте причину и запустите скрипт снова». Теперь сразу после ввода домена идёт проверка и при промахе — выбор: «проверить снова» (DNS расходится от минут до часов), «ввести другой домен», «без своего домена — маскировка соседом по подсети».
  • Провал сертификата на шаге подключений не прерывает установку. Предлагается повторить попытку (пока ждали обновления DNS или лимит Let's Encrypt), ввести другое имя (с той же проверкой A-записи) или остановиться с понятной инструкцией, как поставить без домена. Причина и дата повтора при лимите печатаются в самом отказе, лог остаётся в /var/log/kit-domain-cert.log.

v1.2.26: лимит Let's Encrypt виден прямо, готовый сертификат переиспользуется

  • Причина отказа теперь называется честно. Let's Encrypt разрешает 5 сертификатов на точный набор имён за 7 суток; при повторных установках лимит выбирается, и acme.sh отвечает rateLimited, а установщик писал про «A-запись, порт 80 или Cloudflare» — то есть отправлял искать причину не там. Теперь в выводе дата, после которой повтор сработает, и подсказка взять другое имя (node3.… — лимит считается на набор имён).
  • Готовый сертификат переиспользуется. Если у acme.sh уже лежит годный сертификат на этот домен, новый не заказывается — лишний заказ и упирался в лимит. Заодно не тратится время на повторные попытки.
  • Итоговая ошибка установщика больше не повторяет догадки про порт и DNS: причина печатается выше, а лог остаётся в /var/log/kit-domain-cert.log.

v1.2.25: вопрос про панель возвращён, блок про защиту переписан понятнее

  • Снова спрашиваем, где открывать панель и подписку. У автора этот вопрос задавался только когда домен передан флагом --domain; при выборе «ввести свой домен» в меню маскировки его не было, и панель молча оставалась по IP с самоподписанным сертификатом — то самое «панель на это ругается». Теперь: выбрали свой домен → сразу вопрос «По IP (как раньше) или По домену» (https://домен/…, сертификат Let's Encrypt, браузер не ругается).
  • В отчёте защиты блок «чего здесь нет» больше не ссылается на сторонний проект без пояснений: сказано, что именно сделано мягче (без полного обновления системы, без автоперезагрузки, без общесистемного запрета ICMP) и почему — панель и ядро закреплённых версий, сервер не должен вставать сам.

v1.2.24: сертификат идёт вслед за выбором «домен или IP»

  • Выбрали в меню маскировки свой домен — панель и подписка тоже переезжают на домен: https://ваш.домен/... и открываются тем же сертификатом Let's Encrypt, без предупреждений браузера. Раньше сертификат выписывался только для маскировки, а панель оставалась по IP с самоподписанным — отсюда ругань и в панели, и в подписке.
  • Если выбрали соседа или общедоступный сайт (своего домена нет) — панель остаётся по IP, и в итоговом блоке прямо сказано: сертификат самоподписанный, браузер предупредит; перейти на домен потом — kit net panel domain.
  • Домен, который не указывает на этот сервер, используется только как маска (и об этом сообщается), панель в этом случае остаётся по IP.

v1.2.23: чистый вывод — без дублей доступов, без авторской заглушки, без лишних ссылок

  • Убран дублирующий блок автора. Он печатал «Готово! Сервер работает» с адресом панели, логином, паролем, подпиской, QR-кодом и ссылками — а потом то же самое выводил наш финальный блок. Теперь авторский блок заканчивается строкой «Установка завершена» и списком предупреждений; доступы и подписка печатаются один раз, в самом конце.
  • Авторская заглушка больше не ставится. Наш сайт кладётся до установщика, а его страница из релиза убирается — иначе она перезаписывала нашу на шаге сборки сайта. Заодно пропадает лишний шаг «поставить поверх» и его бэкап.
  • Ссылки по протоколам — только если протоколов больше одного. При одном REALITY печатается подписка и QR-код, без списка «отдельные ссылки на каждый протокол».
  • Самопроверка в конце установки больше не перечисляет чужие протоколы («REALITY, XHTTP и Hysteria2») — пишет те, что реально созданы. Предупреждение про XHTTP/MTProto показывается только если эти протоколы выбраны.

v1.2.22: 80 в ufw открывается прямо перед выпуском сертификата

  • Настоящая причина сбоя сертификата (проверено на живом сервере): установщик открывает список портов в ufw позже, чем пробует выпустить сертификат. На свежем сервере ufw в этот момент разрешает только 22, поэтому проверка Let's Encrypt доходила до сервера и «проглатывалась» — в логе acme Timeout during connect (likely firewall problem). Провайдер тут ни при чём: с настоящим слушателем 80 и 443 отвечают снаружи нормально (проверено в том числе с другого сервера).
  • Теперь 80/tcp открывается в ufw непосредственно перед issue_domain_cert, а формулировка ошибки в установщике исправлена: сначала проверяем ufw, потом хостера.

v1.2.21: порты до выпуска сертификата и понятный блок про SSH-порт

  • Порты до сертификата. Установщик теперь сам открывает 80 и 443 в ufw перед работой и прямо предупреждает, что такие же правила нужны в файрволе хостинга: частая причина срыва — порт 80 закрыт именно у провайдера, а не в сервере. Если сертификат всё же не выпустился, в выводе разбирается причина: при Timeout during connect (likely firewall problem) пишется, что делать (открыть 80 в панели хостинга) и предлагается вариант без своего домена (тогда сертификат домена не нужен, панель остаётся на самоподписанном). После установки 80 и 443 в ufw проверяются ещё раз.
  • Смена порта SSH — с понятным завершением. Прежние порты запоминаются до смены, и в конце печатается блок: новый порт, какие прежние ещё открыты, команда проверки входа во втором окне и готовая команда kit local ssh --close-old <новый> для закрытия прежних. Строка про SSH-порт добавлена и в итоговый блок с доступом к панели и подпиской.

v1.2.20: после сноса меню не показывается, и нет ошибок про latest-version

  • Удаление из меню (kit, пункт 9) теперь завершается сразу: печатается «Готово: сервер в состоянии до установки» — и выход. Раньше меню перерисовывалось на уже удалённом сервере и сыпало touch: cannot touch '/etc/kit/latest-version'.
  • update_hint больше не пытается что-либо писать, если каталога /etc/kit уже нет.
  • Входит исправление 1.2.19: extra объявлена пустой (иначе set -u валил установку на шаге «[6/6] Проверка» сообщением extra: unbound variable).

v1.2.19: исправлено «extra: unbound variable» при установке

  • На середине установки (после проверки протоколов) скрипт падал: extra: unbound variable. Причина — моя правка v1.2.13: присваивание ссылок legacy-подписок завёрнуто в if, а переменная объявлялась как local extra без значения. Авторский скрипт работает с set -u, поэтому при невыполненном условии (AWG и MTProto не выбраны) чтение $extra валило установку. Объявлена пустой.
  • Правило записано в FORK.md: оборачивая авторское присваивание в if, объявляй переменную пустой — local extra="", иначе set -u обрывает установку на середине.

v1.2.18: выбранный «свой домен» больше не подменяется соседом

  • Что было: после выбора «ввести свой домен» установщик всё равно брал запасной сайт из подсети. Две причины, обе в моём коде: (1) выбор перезаписывался сырым значением меню (own:домен) вместо самого домена; (2) домен проверялся на «TLS 1.3 + HTTP/2» — а до установки на нём ещё нет сертификата, поэтому проверка честно не проходила и срабатывал откат на соседа. Теперь для своего домена проверка TLS не делается (он указывает на этот сервер — установщик сам выпустит сертификат Let's Encrypt), а автоподбор и запасной сайт включаются только если вы НЕ выбрали ничего (автовыбор).

v1.2.17: меню маскировки идёт ПЕРВЫМ (меню автора больше не перебивает)

  • Причина, по которой меню не было видно: меню спрашивал сам установщик («Свой домен / Сосед / Свой сайт») — и до нашего скана подсети дело не доходило. Теперь, когда включено наше меню, меню автора не показывается вообще: сразу скан, список найденных доменов и выбор — из найденных, автовыбор, общедоступный или свой домен. Отключить и вернуть поведение автора: --auto-sni.
  • Ответ меню помечается: если вы ввели домен, который указывает на этот сервер, маскировка идёт «под свой домен» (сертификат Let's Encrypt выпустит установщик); если не указывает — маскируюсь под него как под чужой сайт и прямо об этом сообщаю.
  • Входит исправление 1.2.16: возвращён ask_yes (в 1.2.13–1.2.15 при установке печаталось ask_yes: command not found, и значения брались по умолчанию) + гейт «определение раньше вызова».

v1.2.16: возвращён ask_yes (вылезало «command not found» при установке)

  • При переносе вопросов наверх (v1.2.13) потерялось определение функции ask_yes — установщик писал ask_yes: command not found на двух строках и молча брал значения по умолчанию: ping оставался открытым, автообновления выключались. Скрипт при этом не падал, поэтому ошибку было видно, но установку она не срывала.
  • Почему не поймали: гейт в релизе прогонял только --dry-run, а он выходит ДО вопросов. Добавлена статическая проверка: каждая наша функция должна быть определена раньше первого вызова (ask_yes, ask_ssh_port, ask_protocols, interactive, clean_previous и др.).

v1.2.15: меню выбора сайта в вашем виде, быстрый скан, снос с добивкой

  • Меню маскировки выглядит так, как и просили. Если соседи нашлись — их список по номерам, затем автовыбор из списка, выбрать общедоступный (отдельным списком) и ввести свой домен. Если в подсети ничего не нашлось — сразу «общедоступный» или «свой домен» (ничего лишнего). Enter — автовыбор. Общедоступные сайты предлагаются и для REALITY, и для XHTTP/MTProto.
  • Скан подсети стал быстрым. Было: адреса проверялись по 8 сразу, а найденные имена — по очереди (до 40 имён × три проверки с сетевыми запросами ≈ минуты). Стало: 32 адреса сразу и имена проверяются параллельно по 8; таймаут проверки адреса 3 с вместо 4.
  • В выводе видно, сколько соседей нашлось (раньше было не понять, работает ли скан).
  • После нашего меню автор больше не спрашивает «продолжить с запасным сайтом?» — выбор уже сделан.
  • В меню kit: 9 — «Удалить всё установленное», 10 — «Выход» (меню панели x-ui переехало в пункт 11).
  • kit local uninstall доводит дело до конца: после явного списка идёт добивка по шаблонам (/etc/kit*, /usr/local/lib/kit*, юниты kit-*/x-ui*, /var/www/kit, сертификаты), повторная проверка и внятный итог. Появился флаг --yes — снести без вопроса.

v1.2.14: выбор сайта маскировки по результатам скана + снос, который не обрывается

  • Появилось меню маскировки. Сначала один скан подсети (~250 обращений к 443 соседних адресов), потом выбор: номер из найденного, 0 — ввести адрес вручную, Enter — автоподбор. Отдельно для REALITY (найденное или свой) и отдельно для XHTTP/MTProto (найденное, свой или известный сайт — список известных расширен Microsoft, AMD, Intel, NVIDIA). Если XHTTP/MTProto не выбраны, второго меню не будет. Отключить меню: --auto-sni.
  • Исправлено: kit local uninstall обрывался на середине. kit запускает наши команды с set -e, и подсчёт чужих сайтов nginx (find | grep | wc -l, где grep не находит ничего и возвращает 1) убивал скрипт сразу после остановки служб — файлы и /usr/local/bin/kit оставались, поэтому kit help продолжал работать. Теперь снос выполняется с отключённым set -e и все подобные конвейеры защищены; проверка после сноса это подтверждает списком, если что-то осталось.

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») и всё висит на 443 — независимо от того, выбраны ли эти протоколы. При установке одного REALITY это давало ~250 обращений к чужим адресам впустую. Теперь скан идёт только если XHTTP или MTProto выбраны; иначе имена SNI2/SNI3 берутся из общего списка сайтов автора (как и раньше при неудаче скана).

Что нового в сборке форка

Здесь записи о наших версиях. Файл автора (CHANGELOG.md) мы не трогаем — так обновления автора не конфликтуют с нашими записями.

v1.2.11: снос знает про kit-limit и находит свои службы сам

  • В списке сноса не было kit-limit.service и kit-limit.timer (юнит «общий лимит трафика» из kit) — его создаёт установка, а kit local uninstall его не убирал. Из-за этого после сноса оставался работающий таймер, который раз в 5 минут дёргал уже удалённый kit и падал.
  • Теперь снос берёт список служб и из явного перечня, и по шаблонам x-ui*/kit* из systemd — новая служба, добавленная автором позже, не останется незамеченной. Проверка после сноса ищет по тем же шаблонам и показывает всё найденное.
  • Флаг --clean у установщика использует тот же список.

v1.2.10: убран мусор в выводе установщика

  • В шапке scripts/3x-ui-local.sh один из флагов потерял # и при каждом запуске печаталось --dry-run: command not found (до set -e — потому и не роняло установку, но выглядело как ошибка). Исправлено, заодно выровнены строки справки.
  • В релизный гейт добавлена проверка, которая такое ловит: холостой прогон установщика, чей вывод в stderr содержит «command not found / syntax error / bad substitution», релиз не собирается.

v1.2.9: снос действительно убирает всё, повторная установка после сноса

  • Список удаляемого в kit local uninstall собран заново по коду установщика и дополнен тем, чего не хватало: /usr/local/lib/kit-sub, /root/kit-backup-* и /root/x-ui-before-* (копии kit), /var/log/kit-install-check.log, /usr/bin/x-ui.new, строка include kit-stream.conf в nginx.conf, симлинки в sites-enabled/streams-enabled, файл автообновлений безопасности, пользователь kit-sub. Из-за пропущенных файлов установщик после сноса отказывался ставить заново («3X-UI уже установлена»).
  • После сноса печатается проверка теми же условиями, что у установщика, и список того, что осталось на диске — вместо бодрого «удалено» вслепую.
  • Флаг --reset-ssh: снести и наш ssh-дроп-ин (порт возвращается к системному). По умолчанию SSH не трогаем.
  • У установщика появился флаг --clean: убрать прошлую установку и поставить заново. Если установщик всё-таки упал на «уже установлена», в подсказке прямо сказано запустить с --clean.

v1.2.8: доступ к панели в конце установки и снос сервера из меню

  • В конце установки (перед подпиской) печатается доступ к панели 3X-UI: адрес, логин и пароль из файла /root/3x-ui.txt — раньше это было видно только в общем потоке вывода установщика.
  • kit local uninstall — снос установки целиком: панель и служба x-ui, ядро Xray, службы и файлы kit (kit-sub, автообновление, cron), конфиги nginx и сайт-заглушка, сертификаты (acme.sh), наши правки системы (правило ICMP, обновления безопасности), наши бэкапы и файл с данными панели. Правила ufw для 80/443 снимаются, ответ на ping возвращается. Спрашивает подтверждение словом «удалить», есть --dry-run. SSH не трогается — ни порт, ни конфиги, ни правила для него: иначе легко потерять доступ к серверу. В главном меню kit появился пункт 10. Удалить всё установленное.

v1.2.7: имя 3X-UI_autoVPS, справка kit help, подписка с QR, живые кнопки на заглушках

  • Сборка называется 3X-UI_autoVPS (было 3X-UI KIT): баннер сервера — Hacker 07 в том же стиле, новое имя в справке, версии, описаниях служб и в имени профиля в клиенте. В файлах автора это сделано швами (tools/fork_apply.py), поэтому обновление автора правки не затирает.

  • Совместимость шапки релиза. В подписанном SHA256SUMS этого релиза шапка пишется двумя строками (старая и новая), а проверка на сервере принимает обе. Иначе уже установленные серверы отказались бы ставить обновление: они сверяют точный вид строки. Со следующего релиза останется только новое имя.

  • Убрано дублирование подсказки «Дальше обязательно» при смене порта SSH: она печаталась и установщиком, и командой kit local ssh.

  • kit help — полный справочник по категориям: пользователи, подключения и порты, маскировка и сайт, проверка и починка, обслуживание и обновление, защита сервера (наш слой). Раньше kit help показывал короткий список автора и не упоминал наши команды. Чтобы справка не отставала молча, добавлена проверка tools/check-help.sh: она сверяет справку с диспетчером команд и встроена в сборку релиза (tools/release.sh).

  • У сайтов-заглушек все ссылки и кнопки живые: нажатие открывает окно «раздел в разработке, приносим извинения» (закрыть — кнопкой, кликом мимо окна или Esc). Никаких внешних запросов: скрипт и стили внутри страницы.

  • В самом конце установки (после всех проверок) печатается то, что нужно сохранить: подписка с QR-кодом и ссылки по протоколам — авторской командой kit user link <имя> --all, поэтому вывод совпадает с тем, что показывает kit потом. Отключается флагом --no-sub.

  • Набор по умолчанию — REALITY + AmneziaWG-3.1 (самый совместимый минимум); ответ «все» ставит полный набор автора. Умолчание задаётся в одном месте (DEFAULT_PROTOS).

  • Сайт-заглушка переделан на ИТ-тематику: десять правдоподобных сайтов (дата-аналитика, DevOps, мониторинг, разработка, аудит, ИТ-поддержка, колокейшн, заметки про Linux, бэкапы, документация) вместо авторских «кофеен и пекарен». Ставится случайный, конкретный — kit local site 7, список — kit local site --list. Команда обновляет и файл для nginx, и копию страницы внутри подключения Hysteria2 (kit net masq on): если менять файл вручную, 443/tcp и UDP-порт начнут отвечать разными страницами — это заметно снаружи.

  • Обёртка спрашивает, какие протоколы ставить (нумерованный список, 1,3,11 или «все», Enter — набор автора): невыбранные протоколы не создаются вообще — ни подключения в панели, ни записей в nginx, ни ссылок в подписке. Список и умолчание взяты из самого установщика (ALL_PROTOS/DEFAULT_PROTOS), передаётся его же флагом --protocols, так что поведение не расходится с авторским. Свой --protocols можно задать флагом — тогда вопроса не будет.

  • Обёртка scripts/3x-ui-local.sh теперь спрашивает, а не решает за вас: закрывать ли ответ на ping, включать ли автообновления безопасности, менять ли порт SSH (Enter — оставить текущий, число — перевести на него; мусор и занятый порт переспрашивает), менять ли пароль root. Маскировку и домен, как и раньше, спрашивает установщик автора.

  • Смена порта SSH никогда не закрывает прежний порт сама: сначала добавляется новый, затем скрипт печатает две команды — проверить вход во втором окне и закрыть прежние (kit local ssh --close-old).

  • Запуск без флагов = «одна команда, дальше вопросы». Флаг --yes — наоборот, ничего не спрашивать (для автоматизации): ping закрывается, автообновления включаются, порт SSH и пароль не трогаются.

  • Флаг --harden теперь действительно существует (раньше он уходил установщику автора неизвестным параметром и ронял установку): закрыть ping и включить автообновления без вопросов.

  • --dry-run показывает, что именно будет спрошено или сделано по умолчанию.

v1.2.6: вопросы при установке

  • README.md переписан целиком: убрано авторское описание с его командой установки, добавлены актуальная команда, флаги, таблица протоколов, список сайтов-заглушек, команды kit и kit local, канал обновлений и оговорки. Две картинки — наши (manuals/assets/fork-banner.svg и manuals/assets/script-3x-ui-local.svg, терминал собран из настоящего вывода скрипта).
  • Шов в README больше не нужен (tools/fork_apply.py): файл наш целиком, как kit-local.sh.

v1.2.5: суммы релиза в формате, который понимает kit

  • Исправлена ошибка нашего релизного конвейера: на Windows sha256sum пишет суммы как hash *файл, а kit на сервере сверяет имя строго ($2 == "файл") — то есть kit update отклонил бы релизы v1.2.1–v1.2.4 как «в подписанном списке нет такого файла». Теперь tools/release.sh приводит список к POSIX-виду (hash файл) до подписи.
  • scripts/3x-ui-local.sh принимает оба формата, чтобы не спотыкаться о суммы, собранные на другой машине.
  • Проверка теперь повторяет логику самого kit: подпись SHA256SUMS + строгая сверка имени каждого файла из подписанного списка (а не только sha256sum -c, который звёздочку прощает).

v1.2.4: проверка релиза отдельной командой

  • Флаг --verify-only: скачать релиз, проверить подпись SHA256SUMS и SHA256 установщика и выйти — можно проверить канал на сервере, ничего не устанавливая.
  • Порядок шагов изменён: проверка подписи теперь идёт до предполётных проверок и до любых изменений на сервере, чтобы чужой код не запускался раньше проверки.

v1.2.3: установка одной командой (scripts/3x-ui-local.sh)

  • Один скрипт на чистом VPS: проверка сервера → скачивание нашего релиза → проверка подписи SHA256SUMS и SHA256 самого установщика → установщик автора (панель 3X-UI, протоколы, сайт-заглушка, маскировка, сертификат, подписка, ufw) → наши дополнения → проверка.
  • По умолчанию досыпает: закрыть ответ на ping (правилом ufw), включить обновления безопасности, kit fix (время и безопасные починки), в конце kit check и сводку kit local hardening. Отключается флагами --no-harden, --no-time, --no-check.
  • Второй порт SSH — только по явному флагу --ssh-port N: прежний порт продолжает работать, закрытие — отдельным шагом kit local ssh --close-old N. Автоматически доступ не запираем.
  • Все флаги установщика автора (--domain, --sni, --panel-on, --host, --restore …) передаются как есть; есть --dry-run (план без изменений) и --help.
  • Публичный ключ форка вшит в обёртку — подпись проверяется до запуска чужого кода; при смене ключа обновляется и здесь, и в kit.

v1.2.2: команды защиты сервера (поведение из StressOzz/vps-setup)

  • Новые команды kit local: ssh <порт> (добавить порт SSH), ssh --close-old (закрыть прежние порты), ping off|on (не отвечать на ICMP echo), passwd [--generate] (сменить пароль), upgrades on|off|status (автообновления безопасности), hardening (сводка по защите сервера).
  • Сделано безопаснее, чем в источнике: конфиг sshd проверяется через sshd -t до перезапуска, новый порт сначала открывается в ufw, прежний порт продолжает работать до отдельного шага --close-old, у правок есть --dry-run, а копии изменённых файлов остаются в /root/kit-local-backup-<дата>/ (не в /tmp).
  • apt full-upgrade из источника не выполняется: вместо него включаются обновления безопасности (только security, без самовольной перезагрузки) — это не затрагивает закреплённые версии панели и ядра, которые ставятся не из apt.
  • Учтён Ubuntu 24.04: если SSH слушает systemd (ssh.socket), порт добавляется socket-drop-in'ом, а закрытие старых портов не делается автоматически — там ошибка запирает доступ к серверу.
  • Ping отключается правилом ufw (before.rules), а не общесистемным icmp_echo_ignore_all: видно в ufw status, отменяется одной командой и не глушит ICMP для внутренних интерфейсов.

v1.2.1: сборка форка поверх 3X-UI_autoVPS 1.2

  • Источник файлов и обновлений — свой репозиторий Gitea: установка и kit update берут релиз оттуда, а подпись релиза проверяется ключом форка. Авторский ночной апдейт приходит в наш канал, поэтому наши доработки не стираются ночью.
  • Дополнения форка живут отдельным файлом /usr/local/lib/kit/kit-local.sh и подключаются одной строкой: kit local help | version | channel | seams | masking.
  • Наш файл едет в том же подписанном релизе, что и код автора: он входит в SHA256SUMS, проверяется по подписи и обновляется вместе с kit.
  • Швы в коде автора описаны в tools/fork_apply.py (источник правды), синхронизация с автором и проверки — tools/fork-sync.sh.

Основа — 3X-UI_autoVPS 1.2 (панель 3X-UI v3.9.0, ядро Xray v26.6.27). Что нового у автора — в CHANGELOG.md.