1.1: --restore отложен до 1.2; без сертификата Let's Encrypt на IP установка не врёт про «Готово»

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
maxdmitrov
2026-10-01 13:16:58 +03:00
co-authored by Claude Sonnet 5.5
parent 4a631ce701
commit 942c2bf9a7
6 changed files with 23 additions and 32 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
**Новое** **Новое**
* Обновления приходят сами. Раз в сутки ночью сервер проверяет подпись автора и обновляет `kit`, а пользователи и ссылки остаются прежними. «Мам, удали старый VPN, вот новый» больше не нужно. Подпись не сошлась или подписка замолчала – откат. Не любите сюрпризы: `kit update --manual`. * Обновления приходят сами. Раз в сутки ночью сервер проверяет подпись автора и обновляет `kit`, а пользователи и ссылки остаются прежними. «Мам, удали старый VPN, вот новый» больше не нужно. Подпись не сошлась или подписка замолчала – откат. Не любите сюрпризы: `kit update --manual`.
* Переезд за 5 минут. `kit backup` складывает сервер в один файл, `--restore` поднимает его на новом VPS. Хостер поднял цены или IP попал в немилость? Клиенты на домене даже не заметят. * Копия сервера одной командой. `kit backup` складывает подключения, ключи и пользователей в один файл. Восстановление из него придёт в 1.2: решили выпускать только то, что успели проверить на настоящем сервере, а не то, что «вроде работает».
* Маскировка на выбор. Установщик спрашивает: стандартный чужой сайт (работает сразу) или свой домен (надёжнее: настоящая страница и сертификат Let's Encrypt). Без вопросов: `--domain vpn.example.com`. Теперь «под кого косим» решаете вы, а не скрипт за вас. * Маскировка на выбор. Установщик спрашивает: стандартный чужой сайт (работает сразу) или свой домен (надёжнее: настоящая страница и сертификат Let's Encrypt). Без вопросов: `--domain vpn.example.com`. Теперь «под кого косим» решаете вы, а не скрипт за вас.
* Заглушка с характером. На случайный заход сервер показывает кофейню, фотографа или блог про Linux. Тысячи серверов 3X-UI KIT больше не выглядят как близнецы. * Заглушка с характером. На случайный заход сервер показывает кофейню, фотографа или блог про Linux. Тысячи серверов 3X-UI KIT больше не выглядят как близнецы.
+3 -3
View File
@@ -16,7 +16,7 @@
> [!TIP] > [!TIP]
> **Вышла версия 1.1:** исправления по аудиту безопасности, автообновление только подписанных > **Вышла версия 1.1:** исправления по аудиту безопасности, автообновление только подписанных
> релизов, резервная копия и переезд. [Что нового](CHANGELOG.md) · сервер на 1.0 обновляется > релизов, выбор маскировки (свой домен). [Что нового](CHANGELOG.md) · сервер на 1.0 обновляется
> одной командой: > одной командой:
> ```bash > ```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 > 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 user add` добавляет пользователя
сразу во все протоколы с общим лимитом трафика, сроком и числом устройств. сразу во все протоколы с общим лимитом трафика, сроком и числом устройств.
- 🔄 **Обновляется сам, но только подписанными релизами**, а `kit backup` переносит сервер - 🔄 **Обновляется сам, но только подписанными релизами**, а `kit backup` сохраняет
на новый VPS вместе с пользователями и ключами. копию сервера с пользователями и ключами (восстановление придёт в 1.2).
- 🔒 **Сертификат Let's Encrypt на IP** выпускается и продлевается сам, панель скрыта на - 🔒 **Сертификат Let's Encrypt на IP** выпускается и продлевается сам, панель скрыта на
случайном пути со случайными логином и паролем. случайном пути со случайными логином и паролем.
- ✅ **Проверено настоящими клиентами** – каждый протокол на ядрах Xray, Mihomo и sing-box, - ✅ **Проверено настоящими клиентами** – каждый протокол на ядрах Xray, Mihomo и sing-box,
+1 -2
View File
@@ -18,8 +18,7 @@
`SHA256SUMS` релиза подписан ключом автора (`ssh-keygen -Y sign`), версия внутри подписи `SHA256SUMS` релиза подписан ключом автора (`ssh-keygen -Y sign`), версия внутри подписи
совпадает, а каждый файл сошёлся с подписанным SHA256. Закрытый ключ не хранится на GitHub. совпадает, а каждый файл сошёлся с подписанным SHA256. Закрытый ключ не хранится на GitHub.
Откат на старую версию запрещён, после обновления проверяется подписка, при сбое – возврат. Откат на старую версию запрещён, после обновления проверяется подписка, при сбое – возврат.
- Резервная копия `kit backup` доступна только root (права 600); `--restore` принимает только - Резервная копия `kit backup` доступна только root (права 600).
локальный файл и отклоняет архивы с лишними файлами, ссылками и путями вида `../`.
- Подписка `kit-sub` работает без прав root: systemd `DynamicUser` и `LoadCredential`. - Подписка `kit-sub` работает без прав root: systemd `DynamicUser` и `LoadCredential`.
- Все данные, которые попадают в файлы настроек, проверяются и экранируются. - Все данные, которые попадают в файлы настроек, проверяются и экранируются.
- Генераторы конфигов для роутеров работают только в браузере и никуда не отправляют ваши ссылки. - Генераторы конфигов для роутеров работают только в браузере и никуда не отправляют ваши ссылки.
+5 -18
View File
@@ -138,7 +138,7 @@ curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/v1.1/script
Панель 3X-UI обновляется отдельно, через `x-ui`. Ядро Xray в панели не обновляйте до последней Панель 3X-UI обновляется отдельно, через `x-ui`. Ядро Xray в панели не обновляйте до последней
версии: с Xray 26.7 и новее Hiddify, FlClash и Clash Verge не подключаются к REALITY. версии: с Xray 26.7 и новее Hiddify, FlClash и Clash Verge не подключаются к REALITY.
## Резервная копия и переезд ## Резервная копия
```bash ```bash
kit backup kit backup
@@ -152,21 +152,8 @@ kit backup
scp root@IP:/root/kit-backup-ДАТА.tar.gz . scp root@IP:/root/kit-backup-ДАТА.tar.gz .
``` ```
Переезд на новый VPS: скопируйте файл на новый сервер и запустите установщик с `--restore`: Восстановление из копии на новом VPS появится в версии 1.2. Пока копия нужна как страховка:
храните её отдельно от сервера.
```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 имя`.
## Параметры ## Параметры
@@ -175,10 +162,10 @@ bash <(curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/main
| `--protocols reality,hy2,ws` | только выбранные протоколы; `minimal` – только REALITY | | `--protocols reality,hy2,ws` | только выбранные протоколы; `minimal` – только REALITY |
| `--port 8443` | порт REALITY (TCP) и Hysteria2 (UDP) вместо 443 | | `--port 8443` | порт REALITY (TCP) и Hysteria2 (UDP) вместо 443 |
| `--cert fullchain.pem --key privkey.pem --host домен` | свой сертификат, например для домена | | `--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` | не трогать файрвол | | `--no-ufw` | не трогать файрвол |
| `--multi-port` | прежняя схема: у каждого протокола свой порт, без nginx | | `--multi-port` | прежняя схема: у каждого протокола свой порт, без nginx |
| `--restore файл` | поднять сервер из резервной копии `kit backup` |
## Как устроена подписка ## Как устроена подписка
+12 -6
View File
@@ -291,11 +291,8 @@ main() {
esac esac
done done
[[ $PORT =~ ^[0-9]+$ ]] && ((PORT > 0 && PORT < 65536)) || die "Неверный порт: $PORT" [[ $PORT =~ ^[0-9]+$ ]] && ((PORT > 0 && PORT < 65536)) || die "Неверный порт: $PORT"
if [[ -n $restore ]]; then # Восстановление из копии (restore_main) отключено до версии 1.2: его ещё не проверили на настоящем сервере.
[[ -z $HOST || $HOST =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]] || die "--host при восстановлении: IP нового сервера" [[ -z $restore ]] || die "Восстановление из копии появится в версии 1.2. Пока доступна только резервная копия: kit backup."
restore_main "$restore"
return
fi
local re_host='^([A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$' 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 $SNI || $SNI =~ $re_host ]] || die "--sni: нужно имя сайта, например dl.google.com"
[[ -z $DOMAIN || $DOMAIN =~ $re_host ]] || die "--domain: нужно имя вашего домена, например vpn.example.com" [[ -z $DOMAIN || $DOMAIN =~ $re_host ]] || die "--domain: нужно имя вашего домена, например vpn.example.com"
@@ -398,6 +395,16 @@ main() {
wait_panel wait_panel
fi 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. # Без сертификата панель и подписки не должны торчать наружу по HTTP.
if [[ $PANEL_SSL == none ]]; then if [[ $PANEL_SSL == none ]]; then
say "Панель без сертификата – открываю её только для SSH-туннеля (127.0.0.1)" say "Панель без сертификата – открываю её только для SSH-туннеля (127.0.0.1)"
@@ -1487,7 +1494,6 @@ usage() {
--user admin имя первого клиента --user admin имя первого клиента
--host 1.2.3.4 адрес в ссылке, если IP определился неверно --host 1.2.3.4 адрес в ссылке, если IP определился неверно
--no-ufw не трогать файрвол --no-ufw не трогать файрвол
--restore файл поднять сервер из резервной копии kit backup (на чистом VPS)
-y не задавать вопросов -y не задавать вопросов
EOF EOF
} }
+1 -2
View File
@@ -527,8 +527,7 @@ PY
echo "В ней ключи и пароли от сервера, храните её как пароль. Скачать к себе (на компьютере):" echo "В ней ключи и пароли от сервера, храните её как пароль. Скачать к себе (на компьютере):"
echo " ${B}scp root@$HOST:$out .${N}" echo " ${B}scp root@$HOST:$out .${N}"
echo echo
echo "Поднять сервер из копии на новом VPS:" echo "${D}Восстановление из копии на новом VPS появится в версии 1.2.${N}"
echo " ${B}bash <(curl -fsSL https://raw.githubusercontent.com/itsnotkubrick/3X-UI_KIT/main/scripts/3x-ui.sh) --restore ${out##*/}${N}"
} }
usage() { usage() {