From b6ffaa722c1b4c8550565a13161d31f4c5c0dba1 Mon Sep 17 00:00:00 2001 From: Den Piligrim <89912505+vasiljevdenis@users.noreply.github.com> Date: Sat, 27 Dec 2025 15:14:11 +0300 Subject: [PATCH] fix install.sh/index.js --- app/index.js | 15 ++++++--- install.sh | 92 +++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 76 insertions(+), 31 deletions(-) diff --git a/app/index.js b/app/index.js index 56afa2e..dc441f6 100644 --- a/app/index.js +++ b/app/index.js @@ -210,8 +210,15 @@ async function rotate() { // Initial run rotate(); -let interval = parseInt(process.env.ROTATE_INTERVAL) || 30; -if (interval < 10) interval = 10; +let interval = parseInt(process.env.ROTATE_INTERVAL, 10); -const cronExpression = `*/${interval} * * * *`; -cron.schedule(cronExpression, rotate); \ No newline at end of file +if (isNaN(interval) || interval < 10) { + console.warn('⚠ Интервал некорректен или меньше 10 минут. Используется значение по умолчанию 30 минут.'); + interval = 30; +} + +const intervalMs = interval * 60 * 1000; + +console.log(`✔ Интервал ротации установлен: ${interval} минут`); + +setInterval(rotate, intervalMs); \ No newline at end of file diff --git a/install.sh b/install.sh index 686b977..d801309 100644 --- a/install.sh +++ b/install.sh @@ -25,6 +25,21 @@ validate_url() { ################################# need_root +# Check OS and set release variable +. /etc/os-release +if [[ "$ID" != "ubuntu" && "$ID" != "debian" ]]; then + die "Этот скрипт поддерживает только Ubuntu или Debian: $ID" +fi + +if ! x-ui status >/dev/null 2>&1; then + echo "❌ Панель 3x-ui не найдена или не работает." + echo " Чтобы установить, выполните:" + echo "bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)" + exit 1 +fi + +echo "✔ Панель 3x-ui найдена и работает" + ################################# # ASCII-баннер ################################# @@ -45,9 +60,9 @@ echo "" ################################# # Function to get panel URL from 3x-ui get_xui_url() { - local output=$(x-ui settings 2>/dev/null) + local output=$(x-ui settings 2>/dev/null || true) - echo "$output" | sed 's/\x1b\[[0-9;]*m//g' | grep "Access URL:" | grep -oE 'https?://[^[:space:]]+' | head -n1 + echo "$output" | sed 's/\x1b\[[0-9;]*m//g' | grep "Access URL:" | grep -oE 'https?://[^[:space:]]+' | head -n1 || true } echo "Определяем URL панели 3x-ui..." @@ -60,21 +75,25 @@ if [[ -z "$UI_URL" ]]; then fi UI_URL=$(echo "$UI_URL" | sed -E 's/[[:space:]]*$//; s|/*$||') - -echo "URL панели 3x-ui: $UI_URL" - # Validate URL correctness validate_url "$UI_URL" || die "Некорректный URL панели 3x-ui: $UI_URL" +echo "URL панели 3x-ui: $UI_URL" + read -rp "Логин 3x-ui: " UI_LOGIN read -rsp "Пароль 3x-ui: " UI_PASSWORD echo [[ -z "$UI_LOGIN" || -z "$UI_PASSWORD" ]] && die "Логин/пароль обязательны" # Check login -LOGIN_RESPONSE=$(curl -s -X POST "$UI_URL/login" -H "Content-Type: application/json" -d "{\"username\":\"$UI_LOGIN\",\"password\":\"$UI_PASSWORD\"}") +if ! command -v curl >/dev/null 2>&1; then + echo "❌ curl не установлен. Установите curl и повторите попытку" + echo " sudo apt install -y curl" + exit 1 +fi + +LOGIN_RESPONSE=$(curl -s -X POST "$UI_URL/login" -H "Content-Type: application/json" -d "{\"username\":\"$UI_LOGIN\",\"password\":\"$UI_PASSWORD\"}" || true) -# Проверка успешного логина по ключевому полю "success" или наличию куки if ! echo "$LOGIN_RESPONSE" | grep -q '"success":true'; then echo "Не удалось залогиниться в 3x-ui. Проверьте URL, логин и пароль." exit 1 @@ -109,7 +128,7 @@ fi # Input rotation interval read -rp "Интервал генерации инбаундов в минутах (от 10, по умолчанию 30): " ROTATE_INTERVAL -ROTATE_INTERVAL="${ROTATE_INTERVAL:-30}" # по умолчанию 30 +ROTATE_INTERVAL="${ROTATE_INTERVAL:-30}" # Check that it's a number and ≥10 if ! [[ "$ROTATE_INTERVAL" =~ ^[0-9]+$ ]] || [ "$ROTATE_INTERVAL" -lt 10 ]; then @@ -135,7 +154,13 @@ COUNTRY_FLAG="" IP_JSON=$(curl -s --fail http://ip-api.com/json/ || true) [ -z "$IP_JSON" ] && exit 0 -COUNTRY_CODE=$(echo "$IP_JSON" | jq -r '.countryCode // empty' 2>/dev/null) +if ! command -v jq >/dev/null 2>&1; then + echo "❌ Не найден jq. Для работы скрипта необходимо установить jq." + echo " sudo apt install -y jq" + exit 1 +fi + +COUNTRY_CODE=$(echo "$IP_JSON" | jq -r '.countryCode // empty' 2>/dev/null || true) [ -z "$COUNTRY_CODE" ] && exit 0 # Flags JSON URL @@ -144,19 +169,22 @@ FLAGS_JSON_URL="$REPO_BASE/app/assets/flags.json" FLAGS_JSON=$(curl -s "$FLAGS_JSON_URL" || true) [ -z "$FLAGS_JSON" ] && exit 0 -# Ищем emoji +# emoji COUNTRY_FLAG=$(echo "$FLAGS_JSON" | jq -r --arg code "$COUNTRY_CODE" '.[] | select(.code == $code) | .emoji // empty' 2>/dev/null | head -n1) ################################# # Whitelist ################################# -curl -fsSL "$REPO_BASE/whitelist.txt" -o whitelist.txt -log "whitelist.txt скопирован" +if curl -fsSL "$REPO_BASE/whitelist.txt" -o whitelist.txt; then + log "whitelist.txt скопирован" +else + log "⚠ Не удалось скачать whitelist.txt" +fi ################################# # TOKEN GENERATION ################################# -SUB_TOKEN="$(openssl rand -hex 24)" +SUB_TOKEN=$(tr -dc 'a-f0-9' /dev/null) log "Сгенерирован токен подписки" ################################# @@ -167,21 +195,31 @@ log "Проверка Docker" if command -v docker >/dev/null 2>&1; then log "Docker уже установлен" else - log "Docker не найден, будет установлен" - apt update - apt install -y docker.io || die "Ошибка установки docker.io" - systemctl enable docker - systemctl restart docker -fi + log "Docker не найден, будет установлен из официального репозитория" + # Add Docker's official GPG key: + sudo apt update + sudo apt install ca-certificates curl + sudo install -m 0755 -d /etc/apt/keyrings + if [[ "$ID" == "ubuntu" ]]; then + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.asc || die "Ошибка добавления ключа Docker" + else + curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.asc || die "Ошибка добавления ключа Docker" + fi + sudo chmod a+r /etc/apt/keyrings/docker.asc -# Check docker compose v2 -if docker compose version >/dev/null 2>&1; then - log "docker compose v2 доступен" -else - log "Устанавливаем docker-compose-v2" - # решаем конфликт с docker-compose-plugin - apt install -y --allow-downgrades --allow-remove-essential --allow-change-held-packages \ - docker-compose-v2 || warn "docker-compose-v2 не установлен, возможно уже есть плагин" + # Add the repository to Apt sources: + CODENAME=${UBUNTU_CODENAME:-$VERSION_CODENAME} + sudo tee /etc/apt/sources.list.d/docker.sources <