1.1: --restore отложен до 1.2; без сертификата Let's Encrypt на IP установка не врёт про «Готово»
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5.5
parent
4a631ce701
commit
942c2bf9a7
+1
-1
@@ -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 больше не выглядят как близнецы.
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user