diff --git a/CHANGELOG.md b/CHANGELOG.md index c6ea88a..f331b26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ **Новое** * Обновления приходят сами. Раз в сутки ночью сервер проверяет подпись автора и обновляет `kit`, а пользователи и ссылки остаются прежними. «Мам, удали старый VPN, вот новый» больше не нужно. Подпись не сошлась или подписка замолчала – откат. Не любите сюрпризы: `kit update --manual`. -* Переезд за 5 минут. `kit backup` складывает сервер в один файл, `--restore` поднимает его на новом VPS. Хостер поднял цены или IP попал в немилость? Клиенты на домене даже не заметят. +* Копия сервера одной командой. `kit backup` складывает подключения, ключи и пользователей в один файл. Восстановление из него придёт в 1.2: решили выпускать только то, что успели проверить на настоящем сервере, а не то, что «вроде работает». * Маскировка на выбор. Установщик спрашивает: стандартный чужой сайт (работает сразу) или свой домен (надёжнее: настоящая страница и сертификат Let's Encrypt). Без вопросов: `--domain vpn.example.com`. Теперь «под кого косим» решаете вы, а не скрипт за вас. * Заглушка с характером. На случайный заход сервер показывает кофейню, фотографа или блог про Linux. Тысячи серверов 3X-UI KIT больше не выглядят как близнецы. diff --git a/README.md b/README.md index 60c43d2..7af5d84 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ > [!TIP] > **Вышла версия 1.1:** исправления по аудиту безопасности, автообновление только подписанных -> релизов, резервная копия и переезд. [Что нового](CHANGELOG.md) · сервер на 1.0 обновляется +> релизов, выбор маскировки (свой домен). [Что нового](CHANGELOG.md) · сервер на 1.0 обновляется > одной командой: > ```bash > curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/v1.1/scripts/kit.sh -o /usr/local/bin/kit && chmod 755 /usr/local/bin/kit && kit update @@ -41,8 +41,8 @@ получают свой формат и только те протоколы, которые умеют. - 👥 **Дополнительные пользователи одной командой** – `kit user add` добавляет пользователя сразу во все протоколы с общим лимитом трафика, сроком и числом устройств. -- 🔄 **Обновляется сам, но только подписанными релизами**, а `kit backup` переносит сервер - на новый VPS вместе с пользователями и ключами. +- 🔄 **Обновляется сам, но только подписанными релизами**, а `kit backup` сохраняет + копию сервера с пользователями и ключами (восстановление придёт в 1.2). - 🔒 **Сертификат Let's Encrypt на IP** выпускается и продлевается сам, панель скрыта на случайном пути со случайными логином и паролем. - ✅ **Проверено настоящими клиентами** – каждый протокол на ядрах Xray, Mihomo и sing-box, diff --git a/SECURITY.md b/SECURITY.md index 511a1a5..b488819 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -18,8 +18,7 @@ `SHA256SUMS` релиза подписан ключом автора (`ssh-keygen -Y sign`), версия внутри подписи совпадает, а каждый файл сошёлся с подписанным SHA256. Закрытый ключ не хранится на GitHub. Откат на старую версию запрещён, после обновления проверяется подписка, при сбое – возврат. -- Резервная копия `kit backup` доступна только root (права 600); `--restore` принимает только - локальный файл и отклоняет архивы с лишними файлами, ссылками и путями вида `../`. +- Резервная копия `kit backup` доступна только root (права 600). - Подписка `kit-sub` работает без прав root: systemd `DynamicUser` и `LoadCredential`. - Все данные, которые попадают в файлы настроек, проверяются и экранируются. - Генераторы конфигов для роутеров работают только в браузере и никуда не отправляют ваши ссылки. diff --git a/manuals/3x-ui.md b/manuals/3x-ui.md index d00c7d4..e4142ab 100644 --- a/manuals/3x-ui.md +++ b/manuals/3x-ui.md @@ -138,7 +138,7 @@ curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/v1.1/script Панель 3X-UI обновляется отдельно, через `x-ui`. Ядро Xray в панели не обновляйте до последней версии: с Xray 26.7 и новее Hiddify, FlClash и Clash Verge не подключаются к REALITY. -## Резервная копия и переезд +## Резервная копия ```bash kit backup @@ -152,21 +152,8 @@ kit backup scp root@IP:/root/kit-backup-ДАТА.tar.gz . ``` -Переезд на новый VPS: скопируйте файл на новый сервер и запустите установщик с `--restore`: - -```bash -scp kit-backup-ДАТА.tar.gz root@НОВЫЙ_IP: -bash <(curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/main/scripts/3x-ui.sh) --restore kit-backup-ДАТА.tar.gz -``` - -Скрипт поставит ту же версию 3X-UI и вернёт всё из копии, логин и пароль панели остаются -прежними. Копию он берёт только из локального файла и сначала проверяет: лишние файлы или -странные пути внутри архива, и восстановление не начнётся. - -- **Сервер на домене** (`--cert`, `--key`, `--host`): переключите A-запись домена на новый IP, - и клиенты ничего не заметят. -- **Сервер на IP:** скрипт сам поменяет адрес в подключениях, но старые подписки указывают на - старый IP. Клиентам нужно один раз добавить подписку заново: `kit user link имя`. +Восстановление из копии на новом VPS появится в версии 1.2. Пока копия нужна как страховка: +храните её отдельно от сервера. ## Параметры @@ -175,10 +162,10 @@ bash <(curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/main | `--protocols reality,hy2,ws` | только выбранные протоколы; `minimal` – только REALITY | | `--port 8443` | порт REALITY (TCP) и Hysteria2 (UDP) вместо 443 | | `--cert fullchain.pem --key privkey.pem --host домен` | свой сертификат, например для домена | -| `--sni www.samsung.com` | свой сайт для маскировки REALITY | +| `--sni www.samsung.com` | чужой сайт для маскировки REALITY | +| `--domain vpn.example.com` | свой домен для маскировки (A-запись на IP сервера, свободный порт 80) | | `--no-ufw` | не трогать файрвол | | `--multi-port` | прежняя схема: у каждого протокола свой порт, без nginx | -| `--restore файл` | поднять сервер из резервной копии `kit backup` | ## Как устроена подписка diff --git a/scripts/3x-ui.sh b/scripts/3x-ui.sh index 3a7e8e2..3fb71e6 100755 --- a/scripts/3x-ui.sh +++ b/scripts/3x-ui.sh @@ -291,11 +291,8 @@ main() { esac done [[ $PORT =~ ^[0-9]+$ ]] && ((PORT > 0 && PORT < 65536)) || die "Неверный порт: $PORT" - if [[ -n $restore ]]; then - [[ -z $HOST || $HOST =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]] || die "--host при восстановлении: IP нового сервера" - restore_main "$restore" - return - fi + # Восстановление из копии (restore_main) отключено до версии 1.2: его ещё не проверили на настоящем сервере. + [[ -z $restore ]] || die "Восстановление из копии появится в версии 1.2. Пока доступна только резервная копия: kit backup." local re_host='^([A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$' [[ -z $SNI || $SNI =~ $re_host ]] || die "--sni: нужно имя сайта, например dl.google.com" [[ -z $DOMAIN || $DOMAIN =~ $re_host ]] || die "--domain: нужно имя вашего домена, например vpn.example.com" @@ -398,6 +395,16 @@ main() { wait_panel fi + # Установщик 3X-UI мог не получить сертификат на IP (порт 80 закрыт у хостера, лимит + # Let's Encrypt, сбой). Без него панель осталась бы без TLS, а nginx проксирует её по https: + # получился бы сервер, который говорит «Готово», а панель не открывается. + if [[ $PANEL_SSL == ip && ! -s /root/cert/ip/fullchain.pem ]]; then + [[ -z $DOMAIN ]] || die "Let's Encrypt не выдал сертификат на IP $HOST, а свой домен без него не работает. Частые причины: порт 80 закрыт у хостера, лимит Let's Encrypt (5 выпусков на один IP за неделю), сбой у Let's Encrypt. Лог: /var/log/3x-ui-install.log" + warn "Let's Encrypt не выдал сертификат на IP $HOST (порт 80 закрыт у хостера, лимит выпусков или сбой). Ставлю без него: панель будет доступна только через SSH-туннель." + PANEL_SSL=none + TRUSTED=no + fi + # Без сертификата панель и подписки не должны торчать наружу по HTTP. if [[ $PANEL_SSL == none ]]; then say "Панель без сертификата – открываю её только для SSH-туннеля (127.0.0.1)" @@ -1487,7 +1494,6 @@ usage() { --user admin имя первого клиента --host 1.2.3.4 адрес в ссылке, если IP определился неверно --no-ufw не трогать файрвол - --restore файл поднять сервер из резервной копии kit backup (на чистом VPS) -y не задавать вопросов EOF } diff --git a/scripts/kit.sh b/scripts/kit.sh index 7926a61..e441b12 100644 --- a/scripts/kit.sh +++ b/scripts/kit.sh @@ -527,8 +527,7 @@ PY echo "В ней ключи и пароли от сервера, храните её как пароль. Скачать к себе (на компьютере):" echo " ${B}scp root@$HOST:$out .${N}" echo - echo "Поднять сервер из копии на новом VPS:" - echo " ${B}bash <(curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/main/scripts/3x-ui.sh) --restore ${out##*/}${N}" + echo "${D}Восстановление из копии на новом VPS появится в версии 1.2.${N}" } usage() {