diff --git a/FORK-CHANGELOG.md b/FORK-CHANGELOG.md index 74362c0..f0611a6 100644 --- a/FORK-CHANGELOG.md +++ b/FORK-CHANGELOG.md @@ -10,6 +10,18 @@ канал обновлений и оговорки. Две картинки — наши (`manuals/assets/fork-banner.svg` и `manuals/assets/script-3x-ui-local.svg`, терминал собран из настоящего вывода скрипта). * Шов в README больше не нужен (`tools/fork_apply.py`): файл наш целиком, как `kit-local.sh`. +## 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` в том же diff --git a/VERSION b/VERSION index c04c650..db6fb4a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.7 +1.2.8 diff --git a/scripts/3x-ui-local.sh b/scripts/3x-ui-local.sh index 4d3d6e2..4ddaee2 100644 --- a/scripts/3x-ui-local.sh +++ b/scripts/3x-ui-local.sh @@ -42,7 +42,7 @@ set -Eeuo pipefail -KIT_VERSION="1.2.7" # версия сборки форка; должна совпадать с VERSION релиза +KIT_VERSION="1.2.8" # версия сборки форка; должна совпадать с VERSION релиза GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}" NS="3x-ui-kit-release" SIG_ID="releases@3x-ui-kit" @@ -411,6 +411,18 @@ ${G}${B}Готово.${N} Сервер поставлен из нашей сбо вернуться к авторскому каналу: положить авторский kit поверх и выполнить kit update --force EOF +# ------------------------------------------------------------------ доступ к панели (перед подпиской) + +if [[ $show_sub == yes ]]; then + say "панель 3X-UI: адрес, логин и пароль" + if [[ -s /root/3x-ui.txt ]]; then + printf ' файл: /root/3x-ui.txt (виден только root). Сохраните данные себе:\n' + sed 's/^/ /' /root/3x-ui.txt + else + warn "файла /root/3x-ui.txt нет — адрес панели и логин были в выводе установщика выше" + fi +fi + # ------------------------------------------------------------------ подписка, QR-код и доступы # Показываем в самом конце, после всех проверок: это то, что человек уносит с собой. diff --git a/scripts/3x-ui.sh b/scripts/3x-ui.sh index 129307f..2e0193a 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.7" +KIT_VERSION="1.2.8" # 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 eb5e7c3..95e371d 100755 --- a/scripts/hysteria2.sh +++ b/scripts/hysteria2.sh @@ -8,7 +8,7 @@ # Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём # останавливается и не заменяет команду hy2. -KIT_VERSION="1.2.7" +KIT_VERSION="1.2.8" cat >&2 <<'MSG' Отдельный установщик Hysteria2 больше не поддерживается. diff --git a/scripts/kit-local.sh b/scripts/kit-local.sh index a5ebd0a..3803059 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 uninstall снести всё, что поставила установка (SSH не трогает) Заглушка (сайт на 443 и ответ Hysteria2 — одна и та же страница) kit local site поставить случайный сайт из нашего набора (10 штук) @@ -894,6 +895,7 @@ kit_local_cmd() { passwd | pass) shift; kit_local_passwd "$@" ;; upgrades | auto) shift; kit_local_upgrades "$@" ;; hardening | hard) shift; kit_local_hardening "$@" ;; + uninstall | remove) shift; kit_local_uninstall "$@" ;; site | stub | stub-site) shift; kit_local_site "$@" ;; *) printf 'Неизвестная команда форка: %s\n' "$1" >&2 @@ -905,6 +907,116 @@ kit_local_cmd() { # Точка входа: вызывается из kit.sh с аргументами командной строки. # Если команда не наша — возвращаем 0, и kit работает ровно как раньше. +# ---------------------------------------------------------------- снос установки целиком +# Убираем всё, что появляется после установки: панель 3X-UI и службу x-ui, ядро Xray, службы и файлы +# kit (kit-sub, автообновление, cron), конфиги nginx и сайт-заглушку, сертификаты, правила ufw для 80/443, +# наши правки системы (правило ICMP, обновления безопасности), наши бэкапы и файл с данными панели. +# +# ЧЕГО НЕ ТРОГАЕМ: SSH — ни порт, ни конфиги, ни правила ufw для него, ни наш ssh-дроп-ин. Иначе легко +# остаться без доступа к серверу. Если SSH-порт когда-то менялся, верните его сами: kit local ssh 22 +# (и закрыть лишние: kit local ssh --close-old 22). +# +# kit local uninstall спросит подтверждение словом «удалить» +# kit local uninstall --dry-run только покажет, что будет удалено +kit_local_uninstall() { + kl_args "$@" + local arg=${KL_REST[0]:-} ans answer + case $arg in + "") ;; + --dry-run) KL_DRY=yes ;; + *) kl_die "kit local uninstall [--dry-run]"; return 1 ;; + esac + + local -a svc=(x-ui kit-sub kit-update.timer kit-update.service) + local -a files=( + /usr/local/x-ui /etc/x-ui /usr/bin/x-ui /etc/systemd/system/x-ui.service + /usr/local/bin/kit /usr/local/lib/kit /etc/kit /etc/kit-sub + /etc/systemd/system/kit-sub.service /etc/systemd/system/kit-update.service + /etc/systemd/system/kit-update.timer + /etc/cron.d/kit-nginx-reload /etc/cron.d/kit-xui-menu /etc/cron.d/kit-sub-cert + /etc/nginx/kit-stream.conf /etc/nginx/conf.d/kit.conf + /var/www/kit /root/3x-ui.txt /root/cert /root/.acme.sh /etc/letsencrypt + /etc/sysctl.d/99-kit-local-icmp.conf /etc/apt/apt.conf.d/52-kit-local-upgrades + ) + local -a backups=() + local b + for b in /root/kit-local-backup-*; do [[ -e $b ]] && backups+=("$b"); done + + kl_step "Будет удалено" + printf ' службы: %s\n' "${svc[*]}" + printf ' файлы и каталоги: %s\n' "${files[*]}" + [[ ${#backups[@]} -eq 0 ]] || printf ' наши копии изменённых файлов: %s\n' "${backups[*]}" + printf ' правила ufw для 80/tcp и 443/tcp (правило для SSH не трогаем)\n' + printf ' ответ на ping вернём (снимем наше правило)\n' + if kl_ufw_active; then + if [[ $(grep -c '^# -A ufw-before-input -p icmp --icmp-type echo-request' /etc/ufw/before.rules 2>/dev/null || echo 0) -gt 0 ]]; then + printf ' %s\n' "правило ICMP наше (строка закомментирована) — вернём как было" + fi + fi + kl_ok "перезагрузка не потребуется, SSH и его порт не затрагиваются" + + if kl_dry; then + printf '\n (dry-run) ничего не делаю. Запустить по-настоящему: kit local uninstall\n' + return 0 + fi + kl_need_root || return 1 + + if [[ -z ${KIT_LOCAL_UNINSTALL_CONFIRMED:-} ]]; then + printf '\n%sЧтобы удалить всё перечисленное, напишите слово «удалить»: %s' "${B:-}" "${N:-}" + read -r ans /dev/null || ans="" + [[ ${ans,,} == "удалить" ]] || { kl_warn "не подтверждено — ничего не удаляю"; return 1; } + fi + + kl_step "Останавливаю и отключаю службы" + local s + for s in "${svc[@]}"; do + systemctl disable --now "$s" >/dev/null 2>&1 && kl_ok "остановлено и отключено: $s" || kl_warn "служба $s не найдена (уже удалена?)" + done + if kl_have nginx; then + local others + others=$(find /etc/nginx/conf.d /etc/nginx/sites-enabled -type f -o -type l 2>/dev/null | grep -vE 'kit\.conf$|default$' | wc -l) + if [[ $others -eq 0 ]]; then + kl_run systemctl disable --now nginx >/dev/null 2>&1 && kl_ok "nginx остановлен (своих сайтов, кроме нашего, не было)" + KL_NGINX_PURGE=yes + else + kl_ok "nginx оставляю: в нём есть другие сайты ($others) — уберу только наши конфиги" + KL_NGINX_PURGE=no + fi + fi + + kl_step "Убираю файлы" + for f in "${files[@]}"; do + [[ -e $f ]] || continue + kl_run rm -rf "$f" && kl_ok "удалено: $f" + done + for f in "${backups[@]}"; do kl_run rm -rf "$f" && kl_ok "удалено: $f"; done + [[ ${KL_NGINX_PURGE:-no} == yes ]] && { kl_run apt-get remove -y --purge nginx nginx-common >/dev/null 2>&1 && kl_ok "пакет nginx удалён"; } + + kl_step "Возвращаю систему" + kl_run systemctl daemon-reload + if kl_ufw_active; then + local p + for p in 80/tcp 443/tcp 443/udp; do kl_run ufw delete allow "$p" >/dev/null 2>&1 && kl_ok "правило ufw снято: $p"; done + if [[ -f $KL_UFW_RULES ]]; then + kl_backup "$KL_UFW_RULES"; kl_backup "$KL_UFW6_RULES" + kl_run sed -i 's/^# -A ufw-before-input -p icmp --icmp-type echo-request/-A ufw-before-input -p icmp --icmp-type echo-request/' "$KL_UFW_RULES" + [[ -f $KL_UFW6_RULES ]] && kl_run sed -i 's/^# -A ufw6-before-input -p icmpv6 --icmpv6-type echo-request/-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request/' "$KL_UFW6_RULES" + kl_run ufw reload >/dev/null 2>&1 + kl_ok "ответ на ping возвращён" + fi + fi + kl_run sysctl -q -w net.ipv4.icmp_echo_ignore_all=0 >/dev/null 2>&1 || true + + kl_step "Проверка" + local left=0 + for s in "${svc[@]}"; do systemctl list-unit-files 2>/dev/null | grep -q "^$s" && { kl_warn "осталась служба: $s"; left=1; }; done + command -v kit >/dev/null && { kl_warn "команда kit ещё на месте (запустите команду ещё раз или удалите /usr/local/bin/kit)"; left=1; } + ss -H -ltn 2>/dev/null | awk '{print $4}' | grep -qE '[:.]443$' && { kl_warn "порт 443 всё ещё кем-то слушается"; left=1; } + (( left )) || kl_ok "от установки ничего не осталось, порт 443 свободен" + kl_ok "SSH не тронут: порт 22 (или ваш текущий) и правила для него на месте" + kl_step "Готово. Сервер вернулся к состоянию до установки." +} + # ---------------------------------------------------------------- полная справка `kit help` # Категории и все команды: сначала авторские, затем наши. Если автор добавит команду, а справка # про неё не знает — сборку релиза остановит проверка tools/check-help.sh. @@ -951,6 +1063,7 @@ ${B:-}3X-UI_autoVPS ${KIT_VERSION:-?} — все команды${N:-} (то ж kit local site [--list | N | --show] сайт-заглушка: случайный ИТ-сайт, список, конкретный, какой стоит Проверка и починка + kit local uninstall снести установку целиком (панель, туннель, службы kit, сайт, сертификаты); SSH не трогает kit check [--deep | --fix] проверка сервера (--deep — ходит наружу как клиент) kit fix [--dry-run] безопасные починки: время, службы, конфиги kit local hardening сводка по защите и что ещё можно включить diff --git a/scripts/kit.sh b/scripts/kit.sh index 9da1d36..f7232c8 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.7" +KIT_VERSION="1.2.8" 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"; } @@ -2554,11 +2554,12 @@ menu_main() { box "3X-UI_autoVPS $KIT_VERSION – управление сервером" "1. Пользователи" "2. Протоколы, порты и маскировка" "3. Проверка сервера" "" \ "4. Обновить kit и подписку" "5. Обновить панель 3X-UI" "6. Автообновление: включить или выключить" "" \ "7. Резервная копия" "8. Версии" "" "9. Панель 3X-UI (меню x-ui)" "0. Выход" + "10. Удалить всё установленное (наш пункт)" echo menu_status update_hint echo - ask_num "Выбор [0-9]: "; c=$REPLY + ask_num "Выбор [0-9, 10]: "; c=$REPLY case $c in 1) menu_users ;; 2) menu_net ;; @@ -2569,6 +2570,7 @@ menu_main() { 7) run_action cmd_backup; pause ;; 8) run_action cmd_version; pause ;; 9) command -v x-ui >/dev/null && x-ui || echo "Меню x-ui не найдено." ;; + 10) kit_local_uninstall ;; 0 | "") return 0 ;; *) echo "Нет такого пункта." ;; esac diff --git a/tools/fork_apply.py b/tools/fork_apply.py index b364952..70c6ff6 100644 --- a/tools/fork_apply.py +++ b/tools/fork_apply.py @@ -226,6 +226,27 @@ def main(): ' grep -qxE "# (3X-UI KIT|3X-UI_autoVPS) $v" "$d/SHA256SUMS"', "проверка шапки подписанного релиза принимает и старое, и новое имя", ), + ( + 'scripts/kit.sh', + ' "7. Резервная копия" "8. Версии" "" "9. Панель 3X-UI (меню x-ui)" "0. Выход"', + False, + ' "7. Резервная копия" "8. Версии" "" "9. Панель 3X-UI (меню x-ui)" "0. Выход"\n "10. Удалить всё установленное (наш пункт)"', + 'пункт меню: снос установки', + ), + ( + 'scripts/kit.sh', + ' 9) command -v x-ui >/dev/null && x-ui || echo "Меню x-ui не найдено." ;;', + False, + ' 9) command -v x-ui >/dev/null && x-ui || echo "Меню x-ui не найдено." ;;\n 10) kit_local_uninstall ;;', + 'пункт меню: снос установки (обработчик)', + ), + ( + "scripts/kit.sh", + 'ask_num "Выбор [0-9]: "', + False, + 'ask_num "Выбор [0-9, 10]: "', + "подсказка выбора в меню учитывает новый пункт", + ), ] bad = 0