v1.2.26: лимит Let-Encrypt называется прямо; готовый сертификат переиспользуется вместо нового заказа
This commit is contained in:
@@ -44,7 +44,7 @@
|
||||
|
||||
set -Eeuo pipefail
|
||||
|
||||
KIT_VERSION="1.2.25" # версия сборки форка; должна совпадать с VERSION релиза
|
||||
KIT_VERSION="1.2.26" # версия сборки форка; должна совпадать с VERSION релиза
|
||||
GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}"
|
||||
NS="3x-ui-kit-release"
|
||||
SIG_ID="releases@3x-ui-kit"
|
||||
|
||||
+34
-11
@@ -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.25"
|
||||
KIT_VERSION="1.2.26"
|
||||
# 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,
|
||||
@@ -286,20 +286,43 @@ issue_domain_cert() {
|
||||
return 0
|
||||
fi
|
||||
[[ -x $acme ]] || { warn "Не нашёл acme.sh, которым установщик 3X-UI получает сертификаты: не могу выпустить сертификат для $DOMAIN."; return 1; }
|
||||
# Наш шов: лимит Let's Encrypt считается на точный набор имён (5 сертификатов за 7 суток). Если у acme.sh
|
||||
# уже лежит годный сертификат на этот домен — берём его и не заказываем новый, лишний заказ упирается в лимит.
|
||||
local need_issue=yes
|
||||
if [[ -s /root/.acme.sh/${DOMAIN}_ecc/fullchain.cer ]] \
|
||||
&& openssl x509 -in "/root/.acme.sh/${DOMAIN}_ecc/fullchain.cer" -noout -checkhost "$DOMAIN" 2>/dev/null | grep -q 'does match' \
|
||||
&& openssl x509 -in "/root/.acme.sh/${DOMAIN}_ecc/fullchain.cer" -noout -checkend 86400 >/dev/null 2>&1; then
|
||||
ok "у acme.sh уже есть годный сертификат для ${B}$DOMAIN${N} — беру его, новый не заказываю"
|
||||
need_issue=no
|
||||
fi
|
||||
port_busy 80 tcp && { warn "Порт 80/tcp занят: Let's Encrypt не сможет проверить домен $DOMAIN."; return 1; }
|
||||
say "Получаю сертификат Let's Encrypt для ${B}$DOMAIN${N}"
|
||||
install -m 600 /dev/null "$log"
|
||||
# Сбои бывают временными (например, ошибка TLS при скачивании готового сертификата): до трёх попыток.
|
||||
local try
|
||||
for try in 1 2 3; do
|
||||
rc=0
|
||||
"$acme" --issue -d "$DOMAIN" --standalone --httpport 80 --server letsencrypt --keylength ec-256 ${rc_force:-} >>"$log" 2>&1 || rc=$?
|
||||
[[ $rc == 0 || $rc == 2 ]] && break
|
||||
local rc_force="--force"
|
||||
sleep 10
|
||||
done
|
||||
if [[ $need_issue == yes ]]; then
|
||||
local try
|
||||
for try in 1 2 3; do
|
||||
rc=0
|
||||
"$acme" --issue -d "$DOMAIN" --standalone --httpport 80 --server letsencrypt --keylength ec-256 ${rc_force:-} >>"$log" 2>&1 || rc=$?
|
||||
[[ $rc == 0 || $rc == 2 ]] && break
|
||||
local rc_force="--force"
|
||||
sleep 10
|
||||
done
|
||||
else
|
||||
rc=2 # сертификат взяли готовый: для кода ниже это то же, что «уже свежий»
|
||||
fi
|
||||
# 2 – сертификат уже свежий, выпускать заново не нужно.
|
||||
[[ $rc == 0 || $rc == 2 ]] || { warn "Let's Encrypt не выдал сертификат для $DOMAIN. Обычно дело в одном из трёх: A-запись ещё не обновилась, порт 80 закрыт у хостера или домен за проксированием Cloudflare. Лог: $log"; return 1; }
|
||||
[[ $rc == 0 || $rc == 2 ]] || {
|
||||
# Наш шов: лимит Let's Encrypt — частая причина, и она не про сервер. Говорим прямо и с датой повтора.
|
||||
if grep -qE 'rateLimited|too many certificates' "$log"; then
|
||||
local till
|
||||
till=$(grep -oE 'retry after [0-9-]+ [0-9:]+ UTC' "$log" | tail -1 | sed 's/^retry after //')
|
||||
warn "Лимит Let's Encrypt: на имя ${B}$DOMAIN${N} за 7 суток уже выпущено 5 сертификатов${till:+ — повтор возможен после $till}. С вашим сервером всё в порядке: DNS, порты и ufw не при чём. Подождите до этой даты либо возьмите другое имя (например node3.…): лимит считается на точный набор имён."
|
||||
else
|
||||
warn "Let's Encrypt не выдал сертификат для $DOMAIN. Обычно дело в одном из трёх: A-запись ещё не обновилась, порт 80 закрыт у хостера или домен за проксированием Cloudflare. Лог: $log"
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
# Каталог и ключ – только для root (nginx читает их от root).
|
||||
install -d -m 700 "$DOMAIN_CERT_DIR"
|
||||
(umask 077; "$acme" --install-cert -d "$DOMAIN" --ecc --fullchain-file "$DOMAIN_CERT_DIR/fullchain.pem" \
|
||||
@@ -2140,7 +2163,7 @@ PY
|
||||
# позже (после сборки nginx), поэтому на свежем сервере проверка Let's Encrypt доходила до сервера и
|
||||
# «проглатывалась» — в логе acme это «Timeout during connect (likely firewall problem)».
|
||||
command -v ufw >/dev/null 2>&1 && ufw allow 80/tcp >/dev/null 2>&1 || true
|
||||
[[ -n $DOMAIN ]] && { issue_domain_cert || die "Не удалось получить сертификат для $DOMAIN: нужен свободный порт 80, открытый в ufw (и у хостера), и A-запись домена на этот сервер. Лог: /var/log/kit-domain-cert.log"; }
|
||||
[[ -n $DOMAIN ]] && { issue_domain_cert || die "Без сертификата для $DOMAIN продолжать нельзя — причина выше, подробности в /var/log/kit-domain-cert.log"; }
|
||||
setup_nginx
|
||||
fi
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём
|
||||
# останавливается и не заменяет команду hy2.
|
||||
|
||||
KIT_VERSION="1.2.25"
|
||||
KIT_VERSION="1.2.26"
|
||||
|
||||
cat >&2 <<'MSG'
|
||||
Отдельный установщик Hysteria2 больше не поддерживается.
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
set -Eeuo pipefail
|
||||
export LC_ALL=C.UTF-8 # ширина колонок по символам, а не байтам
|
||||
|
||||
KIT_VERSION="1.2.25"
|
||||
KIT_VERSION="1.2.26"
|
||||
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"; }
|
||||
|
||||
Reference in New Issue
Block a user