36 KiB
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.