Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47328b33b3 | ||
|
|
776b7a8c5e | ||
|
|
2d63136853 | ||
|
|
1b85a4bb23 |
@@ -1,3 +1,26 @@
|
||||
## v1.2.1.3: ссылки и QR — в меню kit; сертификат панели видно в итоге
|
||||
|
||||
* **Ссылки для подключения и QR-код больше не печатаются в выводе установки.** Их смотрят позже, когда
|
||||
настраивают телефон, и они всегда доступны заново: `kit → Пользователи → Показать ссылки`. В итоговом
|
||||
блоке вместо них — короткий путь к этому пункту и команды `kit local links` (подписка и QR) и
|
||||
`kit user link <имя> --all` (все протоколы). Доступы к панели (адрес, логин, пароль) по-прежнему
|
||||
в конце установки: их вы просили показывать один раз и сразу.
|
||||
* **Добавлена команда `kit local links`** — подписка, QR-код и ссылки по протоколам одной командой;
|
||||
пользователя можно указать, иначе берётся первый.
|
||||
* **В итоговом блоке видно состояние сертификата панели.** Панель и подписка висят на IP, поэтому
|
||||
печатается: «Let's Encrypt на IP — доверенный, браузер не ругается» либо «самоподписанный» с датой,
|
||||
после которой Let's Encrypt выпустит сертификат на IP (тот же лимит, что и для домена).
|
||||
|
||||
## v1.2.1.2: сертификат на IP — с датой повтора; «без домена» продолжает установку
|
||||
|
||||
* **Отказ Let's Encrypt на IP теперь объясняется честно.** Как и для домена, при лимите в выводе дата,
|
||||
после которой выпуск возможен, и прямо сказано, что порт 80 и файрвол тут не при чём. Раньше печатались
|
||||
«частые причины» и человек шёл проверять хостера.
|
||||
* **Пункт «без своего домена» больше не останавливает установку.** При отказе с сертификатом домена выбор
|
||||
«3» продолжает работу сразу: маскировка берётся из соседей по подсети (или известный сайт, если соседей
|
||||
нет), панель и подписка переключаются на IP, дальше установка идёт своим ходом. Перезапускать скрипт
|
||||
и заново отвечать на вопросы не нужно.
|
||||
|
||||
## v1.2.1.1: сборка на новой базе автора (3X-UI KIT 1.2.1)
|
||||
|
||||
**Правило нумерации:** берём версию автора и через точку добавляем свою, начиная с 1. У автора 1.2.1 —
|
||||
|
||||
+8
-8
@@ -1,9 +1,9 @@
|
||||
# 3X-UI KIT 1.2.1.1
|
||||
# 3X-UI_autoVPS 1.2.1.1
|
||||
f2c191e06de726a68f69453b33a4c042b09f50e4feb0285459a8ad8b696a9b18 scripts/3x-ui.sh
|
||||
6f8187aef75658bbd77adf1ad560aaebd103ad6f13654851f7e6ddbcce95d05b scripts/hysteria2.sh
|
||||
1e5338461ef9cec1445335812cf73659329f16a0ac92a5b622e9788b74fdc773 scripts/kit.sh
|
||||
# 3X-UI KIT 1.2.1.3
|
||||
# 3X-UI_autoVPS 1.2.1.3
|
||||
dc3668609015e68fe008026cd9e3456305f019cd04bffccf59c56987d4511e6c scripts/3x-ui.sh
|
||||
020884ccc78e07108b145975377b29213e2d0d04b21ece51c1bf5028071748ff scripts/hysteria2.sh
|
||||
5c50d0f6d192952ddf685f7834e5ff1ce4f23edab3721576319caacd23b7d25b scripts/kit.sh
|
||||
f214671464e1c2e174e5af9df42c95567a9b4a9141f31a39f7df2e971e89d240 scripts/kit-sub.py
|
||||
79e53e4c4ffcfdbcf1209196901ac48c4c76c32ae677ef5800d3658f51ca1a55 scripts/kit-local.sh
|
||||
7df814ffab37d8e1c48b895677b63311a0e993a275c2095fbb97c5d359ba1bed scripts/3x-ui-local.sh
|
||||
91c47310dd65fd1f86ad29aad31e72c5d5661532039230a52d5a90f630ef21ff VERSION
|
||||
04855a17e360eefb025f4fd6d1e8e49cb8fa09287b9b8884a4cb53d4b96815a1 scripts/kit-local.sh
|
||||
33c9dab6ce6f82a4a0ead93108b20e25c1030c9863e92a3fa6128cc674df187e scripts/3x-ui-local.sh
|
||||
3030c01eabf883790e48256b43cf177b159b87f2f69a6c196c8d13bcf765cdd3 VERSION
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
-----BEGIN SSH SIGNATURE-----
|
||||
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgozRJ+f9RB6qO9S9j3BWCDtC0bV
|
||||
FHakRSSqtQPljLoQUAAAARM3gtdWkta2l0LXJlbGVhc2UAAAAAAAAABnNoYTUxMgAAAFMA
|
||||
AAALc3NoLWVkMjU1MTkAAABAXrsYVkh26UyCTiwNfxwKgBQzrKOSAubhberognGoaeNfTp
|
||||
YRJzjFe7Y03DQBilCb39W2RKLLOlZyz2ncRCWGDQ==
|
||||
AAALc3NoLWVkMjU1MTkAAABA14Sm1dcHury6A2+pEYc8Tj4tK3iEMVgp1DibjGQxLWdedu
|
||||
kMFFfU3f+3pWyLm0yw/piCgRY+9NVxoFXap1ogDw==
|
||||
-----END SSH SIGNATURE-----
|
||||
|
||||
+20
-19
@@ -44,7 +44,7 @@
|
||||
|
||||
set -Eeuo pipefail
|
||||
|
||||
KIT_VERSION="1.2.1.1" # версия сборки форка; должна совпадать с VERSION релиза
|
||||
KIT_VERSION="1.2.1.3" # версия сборки форка; должна совпадать с VERSION релиза
|
||||
GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}"
|
||||
NS="3x-ui-kit-release"
|
||||
SIG_ID="releases@3x-ui-kit"
|
||||
@@ -565,8 +565,20 @@ if [[ $show_sub == yes ]]; then
|
||||
else
|
||||
warn "файла /root/3x-ui.txt нет — адрес панели и логин были в выводе установщика выше"
|
||||
fi
|
||||
# Наш шов: показываем состояние сертификата панели. Панель и подписка живут на IP, поэтому
|
||||
# сертификат Let's Encrypt на IP — не мелочь: с ним браузер и приложения не ругаются.
|
||||
cert=/root/cert/ip/fullchain.pem
|
||||
if [[ -s $cert ]] && openssl x509 -in "$cert" -noout -issuer 2>/dev/null | grep -q "Let's Encrypt"; then
|
||||
printf ' %sсертификат панели: Let'"'"'s Encrypt на IP — доверенный, браузер не ругается%s\n' "$G" "$N"
|
||||
elif [[ -s $cert ]]; then
|
||||
printf ' %sсертификат панели: самоподписанный — браузер предупредит, подписка в приложениях может не открыться%s\n' "$Y" "$N"
|
||||
till2=
|
||||
till2=$(grep -rhoE 'retry after [0-9-]+ [0-9:]+ UTC' /var/log/3x-ui-install.log "$HOME"/.acme.sh/*/ca 2>/dev/null | tail -1 | sed 's/^retry after //')
|
||||
if [[ -n $till2 ]]; then
|
||||
printf ' %sLet'"'"'s Encrypt на IP: лимит выпусков, повтор возможен после %s — тогда запустите установщик снова, он возьмёт сертификат%s\n' "$D" "$till2" "$N"
|
||||
fi
|
||||
fi
|
||||
if grep -qaE '^Панель: ?https?://[0-9]' /root/3x-ui.txt 2>/dev/null; then
|
||||
printf ' %sпанель открывается по IP: сертификат самоподписанный, браузер предупредит.\n' "$D"
|
||||
printf ' Завести свой домен и перейти на него: kit net panel domain%s\n' "$N"
|
||||
fi
|
||||
fi
|
||||
@@ -581,21 +593,10 @@ if [[ $show_sub == yes ]]; then
|
||||
for ((_i = 0; _i < ${#INSTALLER_ARGS[@]}; _i++)); do
|
||||
[[ ${INSTALLER_ARGS[_i]} == --user ]] && sub_user=${INSTALLER_ARGS[_i + 1]:-admin}
|
||||
done
|
||||
say "подписка и доступы — это то, что стоит сохранить"
|
||||
printf ' подписка — одна ссылка на все устройства; QR-код ниже наводите камерой в приложении\n'
|
||||
printf ' приложения: Happ, Hiddify, Karing, v2rayN, Clash/Mihomo\n'
|
||||
printf ' отдельные ссылки по протоколам — ниже же (если приложение не умеет подписку)\n'
|
||||
printf ' %sпозже то же самое: kit user link %s --all (или меню: kit)%s\n' "$D" "$sub_user" "$N"
|
||||
[[ -n ${ssh_port:-} ]] && printf ' SSH: новый порт %s, прежние (%s) ещё открыты — закройте их после проверки входа: kit local ssh --close-old %s\n' "$ssh_port" "${ssh_ports_before:-22}" "$ssh_port"
|
||||
# Ссылки на каждый протокол показываем только если протоколов больше одного: при одном это лишний шум.
|
||||
protos_now=$(tr '\n' ' ' < /etc/kit/kl-protos 2>/dev/null || true)
|
||||
if [[ $(wc -w <<<"$protos_now") -gt 1 ]]; then
|
||||
if ! kit user link "$sub_user" --all; then
|
||||
warn "не смог показать ссылки для «$sub_user» — список пользователей: kit user list"
|
||||
fi
|
||||
elif ! kit user link "$sub_user"; then
|
||||
warn "не смог показать подписку для «$sub_user» — список пользователей: kit user list"
|
||||
fi
|
||||
else
|
||||
say "ссылки и QR-код не показываю (--no-sub). Посмотреть: kit user link admin --all"
|
||||
# Наш шов: ссылки для подключения и QR-код в выводе установки не печатаем — их смотрят потом,
|
||||
# когда настраивают телефон, и они всегда доступны заново в меню kit. Здесь только путь к ним.
|
||||
say "ссылки для подключения и QR-код — в меню kit"
|
||||
printf ' %skit%s → Пользователи → Показать ссылки подписка, QR-код и ссылки по протоколам\n' "$B" "$N"
|
||||
printf ' из командной строки: %s kit local links %s (подписка и QR) · kit user link %s --all\n' "$D" "$N" "$sub_user"
|
||||
[[ -n ${ssh_port:-} ]] && printf ' SSH: новый порт %s, прежние (%s) ещё открыты — закройте их, когда убедитесь, что вход работает: kit local ssh --close-old\n' "$ssh_port" "22" >&2
|
||||
fi
|
||||
|
||||
+20
-2
@@ -39,7 +39,7 @@ wait_apt_idle() {
|
||||
XUI_VERSION="v3.9.0"
|
||||
# SHA256 установщика 3X-UI этой версии: тег могут передвинуть, а хеш – нет (проверено 2026-09-30).
|
||||
XUI_INSTALL_SHA256="18616fe26c8f6c92db6daa2dcd7cd53c5143ee69ecfd26d8ea6dc9b2c78607a6"
|
||||
KIT_VERSION="1.2.1.1"
|
||||
KIT_VERSION="1.2.1.3"
|
||||
# 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,
|
||||
@@ -451,11 +451,21 @@ issue_domain_cert() {
|
||||
ip_cert_self_signed_fallback() {
|
||||
local san="IP:$HOST"
|
||||
[[ $HOST =~ ^[0-9.]+$ ]] || san="DNS:$HOST"
|
||||
# Наш шов: если причина — лимит Let's Encrypt, говорим это прямо и с датой повтора, как для домена.
|
||||
# Иначе человек читает «частые причины» и ищет проблему у хостера, которой нет.
|
||||
local till
|
||||
till=$(grep -rhoE 'retry after [0-9-]+ [0-9:]+ UTC' /var/log/3x-ui-install.log "$HOME"/.acme.sh/*/ca 2>/dev/null | tail -1 | sed 's/^retry after //')
|
||||
if grep -rqsE 'rateLimited|too many certificates' /var/log/3x-ui-install.log 2>/dev/null; then
|
||||
warn "Причина: лимит Let's Encrypt — на этот IP за 7 суток уже выпущено 5 сертификатов${till:+; повтор возможен после $till}. Это ограничение Let's Encrypt, а не вашего сервера: порт 80 и файрвол тут не при чём."
|
||||
else
|
||||
warn "Let's Encrypt не выдал сертификат на IP $HOST. Частые причины:"
|
||||
{
|
||||
echo " – лимит Let's Encrypt: 5 сертификатов в неделю на один IP;"
|
||||
echo " – входящий порт 80 закрыт (у хостера или в файрволе);"
|
||||
echo " – сбой у самого Let's Encrypt (лог: /var/log/3x-ui-install.log)."
|
||||
} >&2
|
||||
fi
|
||||
{
|
||||
echo " Можно продолжить с самоподписанным сертификатом: ссылки на подключения работают, браузер покажет"
|
||||
echo " предупреждение, а подписка в приложениях может не открыться."
|
||||
} >&2
|
||||
@@ -1022,7 +1032,15 @@ kl_sni_menu() {
|
||||
[[ -n $d ]] || continue
|
||||
if domain_points_here "$d"; then DOMAIN=$d; SNI=$DOMAIN
|
||||
else warn "оставляю прежний домен $DOMAIN — новый не указывает на этот сервер"; fi ;;
|
||||
3) die "Установка остановлена по вашему выбору. Чтобы поставить без домена — перезапустите и выберите соседа по подсети или общедоступный сайт." ;;
|
||||
3) # Наш шов: продолжаем без своего домена прямо здесь — маскировка соседом по подсети
|
||||
# (или известным сайтом), панель и подписка по IP. Перезапускать установку не нужно.
|
||||
local nb2
|
||||
nb2=$(nearby_sites 2>/dev/null | shuf | head -1)
|
||||
[[ -n $nb2 ]] || nb2=dl.google.com
|
||||
DOMAIN=""; PANEL_ON=ip; LINK_HOST=$HOST
|
||||
SNI=$nb2; SNI2=${SNI2:-$nb2}
|
||||
ok "продолжаю без своего домена: маскировка ${B}$SNI${N}, панель и подписка — по IP"
|
||||
break ;;
|
||||
*) sleep 5 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём
|
||||
# останавливается и не заменяет команду hy2.
|
||||
|
||||
KIT_VERSION="1.2.1.1"
|
||||
KIT_VERSION="1.2.1.3"
|
||||
|
||||
cat >&2 <<'MSG'
|
||||
Отдельный установщик Hysteria2 больше не поддерживается.
|
||||
|
||||
@@ -73,6 +73,7 @@ kit_local_help() {
|
||||
kit local seams какие места форк правит в файлах автора
|
||||
kit local masking состояние маскировки (у REALITY должен быть свой домен)
|
||||
kit local hardening сводка по защите сервера и что ещё можно включить
|
||||
kit local links подписка, QR-код и ссылки по протоколам (как в меню kit)
|
||||
kit local uninstall то же, что kit uninstall: снести всё, включая сам kit (SSH не трогает)
|
||||
|
||||
Заглушка (сайт на 443 и ответ Hysteria2 — одна и та же страница)
|
||||
@@ -900,6 +901,7 @@ kit_local_cmd() {
|
||||
upgrades | auto) shift; kit_local_upgrades "$@" ;;
|
||||
hardening | hard) shift; kit_local_hardening "$@" ;;
|
||||
uninstall | remove) shift; kit_local_uninstall "$@" ;;
|
||||
links | link) shift; kit_local_links "$@" ;;
|
||||
site | stub | stub-site) shift; kit_local_site "$@" ;;
|
||||
*)
|
||||
printf 'Неизвестная команда форка: %s\n' "$1" >&2
|
||||
@@ -922,6 +924,18 @@ kit_local_cmd() {
|
||||
#
|
||||
# kit local uninstall спросит подтверждение словом «удалить»
|
||||
# kit local uninstall --dry-run только покажет, что будет удалено
|
||||
kit_local_links() { # [имя] — подписка, QR-код и ссылки по протоколам (то же, что «kit → Пользователи → Показать ссылки»)
|
||||
local u=${1:-} now
|
||||
if [[ -z $u ]]; then
|
||||
u=$(kit user list 2>/dev/null | awk 'NR > 1 && NF { print $1; exit }')
|
||||
u=${u:-admin}
|
||||
fi
|
||||
printf ' пользователь: %s\n' "$u"
|
||||
now=$(tr '\n' ' ' </etc/kit/kl-protos 2>/dev/null || true)
|
||||
# Ссылки на каждый протокол — только если протоколов больше одного; при одном достаточно подписки.
|
||||
if [[ $(wc -w <<<"$now") -gt 1 ]]; then kit user link "$u" --all; else kit user link "$u"; fi
|
||||
}
|
||||
|
||||
kit_local_uninstall() {
|
||||
# Наш шов: логику удаления отдаём авторской команде «kit uninstall». Она снимает и сам kit, чтобы на
|
||||
# сервере не осталось следов, поэтому своя реализация здесь больше не нужна — команда оставлена
|
||||
@@ -987,6 +1001,7 @@ ${B:-}3X-UI_autoVPS ${KIT_VERSION:-?} — все команды${N:-} (то ж
|
||||
kit local site [--list | N | --show] сайт-заглушка: случайный ИТ-сайт, список, конкретный, какой стоит
|
||||
|
||||
Проверка и починка
|
||||
kit local links [имя] подписка, QR-код и ссылки по протоколам (по умолчанию — первый пользователь)
|
||||
kit local uninstall то же, что kit uninstall: снести установку целиком и сам kit; SSH не трогает
|
||||
kit check [--deep | --fix] проверка сервера (--deep — ходит наружу как клиент)
|
||||
kit fix [--dry-run] безопасные починки: время, службы, конфиги
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
set -Eeuo pipefail
|
||||
export LC_ALL=C.UTF-8 # ширина колонок по символам, а не байтам
|
||||
|
||||
KIT_VERSION="1.2.1.1"
|
||||
KIT_VERSION="1.2.1.3"
|
||||
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"; }
|
||||
|
||||
+15
-1
@@ -289,6 +289,20 @@ def main():
|
||||
' [[ $rc == 0 || $rc == 2 ]] || {\n # Наш шов: лимит Let\'s Encrypt — частая причина, и она не про сервер. Говорим прямо и с датой повтора.\n if grep -qE \'rateLimited|too many certificates\' "$log"; then\n local till\n till=$(grep -oE \'retry after [0-9-]+ [0-9:]+ UTC\' "$log" | tail -1 | sed \'s/^retry after //\')\n warn "Лимит Let\'s Encrypt: на имя ${B}$DOMAIN${N} за 7 суток уже выпущено 5 сертификатов${till:+ — повтор возможен после $till}. С вашим сервером всё в порядке: DNS, порты и ufw не при чём. Подождите до этой даты либо возьмите другое имя (например node3.…): лимит считается на точный набор имён."\n else\n warn "Let\'s Encrypt не выдал сертификат для $DOMAIN. Обычно дело в одном из трёх: A-запись ещё не обновилась, порт 80 закрыт у хостера или домен за проксированием Cloudflare. Лог: $log"\n fi\n return 1\n }\n',
|
||||
'авто-шов: replace, строк 1',
|
||||
),
|
||||
(
|
||||
'scripts/3x-ui.sh',
|
||||
' local san="IP:$HOST"\n [[ $HOST =~ ^[0-9.]+$ ]] || san="DNS:$HOST"\n',
|
||||
False,
|
||||
' local san="IP:$HOST"\n [[ $HOST =~ ^[0-9.]+$ ]] || san="DNS:$HOST"\n # Наш шов: если причина — лимит Let\'s Encrypt, говорим это прямо и с датой повтора, как для домена.\n # Иначе человек читает «частые причины» и ищет проблему у хостера, которой нет.\n local till\n till=$(grep -rhoE \'retry after [0-9-]+ [0-9:]+ UTC\' /var/log/3x-ui-install.log "$HOME"/.acme.sh/*/ca 2>/dev/null | tail -1 | sed \'s/^retry after //\')\n if grep -rqsE \'rateLimited|too many certificates\' /var/log/3x-ui-install.log 2>/dev/null; then\n warn "Причина: лимит Let\'s Encrypt — на этот IP за 7 суток уже выпущено 5 сертификатов${till:+; повтор возможен после $till}. Это ограничение Let\'s Encrypt, а не вашего сервера: порт 80 и файрвол тут не при чём."\n else\n',
|
||||
'авто-шов: insert, строк 2',
|
||||
),
|
||||
(
|
||||
'scripts/3x-ui.sh',
|
||||
' echo " – сбой у самого Let\'s Encrypt (лог: /var/log/3x-ui-install.log)."\n',
|
||||
False,
|
||||
' echo " – сбой у самого Let\'s Encrypt (лог: /var/log/3x-ui-install.log)."\n } >&2\n fi\n {\n',
|
||||
'авто-шов: insert, строк 1',
|
||||
),
|
||||
(
|
||||
'scripts/3x-ui.sh',
|
||||
" _ _ _ _ _ _ _\n (_) |_ ___ _ __ ___ | |_| | ___ _| |__ _ __(_) ___| | __\n | | __/ __| '_ \\ / _ \\| __| |/ / | | | '_ \\| '__| |/ __| |/ /\n | | |_\\__ \\ | | | (_) | |_| <| |_| | |_) | | | | (__| <\n |_|\\__|___/_| |_|\\___/ \\__|_|\\_\\\\__,_|_.__/|_| |_|\\___|_|\\_\\\n",
|
||||
@@ -356,7 +370,7 @@ def main():
|
||||
'scripts/3x-ui.sh',
|
||||
' issue_domain_cert || die "Без сертификата для $DOMAIN продолжать нельзя. Исправьте причину и запустите скрипт снова."\n',
|
||||
False,
|
||||
' # Наш шов: провал сертификата не обрывает установку. Человек может повторить попытку (DNS доехал,\n # лимит Let\'s Encrypt кончился) или ввести другое имя — установка продолжится с него же.\n while ! issue_domain_cert; do\n echo\n echo " ${B}Что делать дальше?${N}"\n echo " ${B}1${N} повторить попытку если ждали обновления A-записи или лимита Let\'s Encrypt"\n echo " ${B}2${N} ввести другой домен проверим, что он указывает на этот сервер, и повторим"\n echo " ${B}3${N} остановиться поставить без своего домена: перезапустите и выберите соседа по подсети"\n ask_tty " Выбор [1]: " || die "Сертификат для $DOMAIN не выпущен. Подробности: /var/log/kit-domain-cert.log"\n case ${REPLY//[[:space:]]/} in\n 2) ask_tty " адрес сайта (например vpn.example.com): " || continue\n local d=${REPLY//[[:space:]]/}\n [[ -n $d ]] || continue\n if domain_points_here "$d"; then DOMAIN=$d; SNI=$DOMAIN\n else warn "оставляю прежний домен $DOMAIN — новый не указывает на этот сервер"; fi ;;\n 3) die "Установка остановлена по вашему выбору. Чтобы поставить без домена — перезапустите и выберите соседа по подсети или общедоступный сайт." ;;\n *) sleep 5 ;;\n esac\n done\n',
|
||||
' # Наш шов: провал сертификата не обрывает установку. Человек может повторить попытку (DNS доехал,\n # лимит Let\'s Encrypt кончился) или ввести другое имя — установка продолжится с него же.\n while ! issue_domain_cert; do\n echo\n echo " ${B}Что делать дальше?${N}"\n echo " ${B}1${N} повторить попытку если ждали обновления A-записи или лимита Let\'s Encrypt"\n echo " ${B}2${N} ввести другой домен проверим, что он указывает на этот сервер, и повторим"\n echo " ${B}3${N} остановиться поставить без своего домена: перезапустите и выберите соседа по подсети"\n ask_tty " Выбор [1]: " || die "Сертификат для $DOMAIN не выпущен. Подробности: /var/log/kit-domain-cert.log"\n case ${REPLY//[[:space:]]/} in\n 2) ask_tty " адрес сайта (например vpn.example.com): " || continue\n local d=${REPLY//[[:space:]]/}\n [[ -n $d ]] || continue\n if domain_points_here "$d"; then DOMAIN=$d; SNI=$DOMAIN\n else warn "оставляю прежний домен $DOMAIN — новый не указывает на этот сервер"; fi ;;\n 3) # Наш шов: продолжаем без своего домена прямо здесь — маскировка соседом по подсети\n # (или известным сайтом), панель и подписка по IP. Перезапускать установку не нужно.\n local nb2\n nb2=$(nearby_sites 2>/dev/null | shuf | head -1)\n [[ -n $nb2 ]] || nb2=dl.google.com\n DOMAIN=""; PANEL_ON=ip; LINK_HOST=$HOST\n SNI=$nb2; SNI2=${SNI2:-$nb2}\n ok "продолжаю без своего домена: маскировка ${B}$SNI${N}, панель и подписка — по IP"\n break ;;\n *) sleep 5 ;;\n esac\n done\n',
|
||||
'авто-шов: replace, строк 1',
|
||||
),
|
||||
(
|
||||
|
||||
Reference in New Issue
Block a user