From 7e58644573c688aa70de9952319e916aa3a72eac Mon Sep 17 00:00:00 2001 From: Den Piligrim <89912505+vasiljevdenis@users.noreply.github.com> Date: Tue, 23 Dec 2025 12:34:20 +0300 Subject: [PATCH] code styling --- app/.env.example | 1 + app/builders/buildVlessWs.js | 2 - app/index.js | 8 ++-- delete.sh | 8 +--- forwarding_delete.sh | 17 ++++---- forwarding_install.sh | 39 ++++-------------- install.sh | 79 +++++++++++++++--------------------- update.sh | 11 +---- 8 files changed, 57 insertions(+), 108 deletions(-) diff --git a/app/.env.example b/app/.env.example index caf9611..3d17eb8 100644 --- a/app/.env.example +++ b/app/.env.example @@ -2,6 +2,7 @@ SUB_TOKEN=$SUB_TOKEN UI_URL=$UI_URL UI_LOGIN=$UI_LOGIN UI_PASSWORD=$UI_PASSWORD +COUNTRY_FLAG=$COUNTRY_FLAG NGINX_PORT=$NGINX_PORT UI_HOST=$UI_HOST UI_PROTO=$UI_PROTO diff --git a/app/builders/buildVlessWs.js b/app/builders/buildVlessWs.js index 2886130..4178cd6 100644 --- a/app/builders/buildVlessWs.js +++ b/app/builders/buildVlessWs.js @@ -1,5 +1,3 @@ -import crypto from "crypto"; - export function buildVlessWs({ port, uuid, domain }) { return { enable: true, diff --git a/app/index.js b/app/index.js index fece88d..50e8af0 100644 --- a/app/index.js +++ b/app/index.js @@ -25,7 +25,7 @@ api.interceptors.request.use(config => { const WHITELIST_FILE = "/app/whitelist.txt"; const WHITELIST_REPO_URL = "https://raw.githubusercontent.com/denpiligrim/3dp-manager/dp-fix/whitelist.txt"; -// Вспомогательные функции +// Helper functions async function updateWhitelist() { try { const res = await axios.get(WHITELIST_REPO_URL, { timeout: 10000 }); @@ -138,7 +138,7 @@ async function addInbound(config) { } } -// Основная ротация inbound'ов +// Main rotation of inbound entries async function rotate() { await login(); @@ -169,7 +169,7 @@ async function rotate() { usedPorts.add(inbound.port); const idOrPass = inbound.settings ? JSON.parse(inbound.settings).clients?.[0]?.id || JSON.parse(inbound.settings).clients?.[0]?.password : ""; - // Формируем ссылку в зависимости от протокола + // Build the link depending on the protocol const link = buildInboundLink(inbound, UI_HOST, idOrPass); if (link) subs.push(link); await addInbound(inbound); @@ -179,7 +179,7 @@ async function rotate() { console.log("✔ 10 inbound created, подписка обновлена"); } -// Первый запуск +// Initial run rotate(); let interval = parseInt(process.env.ROTATE_INTERVAL) || 30; diff --git a/delete.sh b/delete.sh index 14ab825..1bc7e2c 100644 --- a/delete.sh +++ b/delete.sh @@ -9,7 +9,6 @@ trap 'echo -e "\033[1;31m[ERROR]\033[0m Ошибка в строке $LINENO"; e ################################# # HELPERS ################################# - log() { echo -e "\033[1;32m[INFO]\033[0m $1"; } warn() { echo -e "\033[1;33m[WARN]\033[0m $1"; } die() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; } @@ -21,7 +20,6 @@ need_root() { ################################# # START ################################# - need_root PROJECT_DIR="/opt/3dp-manager" @@ -38,7 +36,6 @@ cd "$PROJECT_DIR" ################################# # DOCKER COMPOSE DOWN ################################# - if command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then if [[ -f docker-compose.yml ]]; then log "Останавливаем контейнеры 3dp-manager" @@ -51,9 +48,8 @@ else fi ################################# -# CLEAN IMAGES (ТОЛЬКО НАШИ) +# CLEAN IMAGES ################################# - log "Удаляем образы 3dp-manager (если есть)" docker images --format '{{.Repository}} {{.ID}}' \ @@ -64,12 +60,10 @@ docker images --format '{{.Repository}} {{.ID}}' \ ################################# # REMOVE DIRECTORY ################################# - log "Удаляем $PROJECT_DIR" rm -rf "$PROJECT_DIR" ################################# # DONE ################################# - log "✔ 3dp-manager полностью удалён" \ No newline at end of file diff --git a/forwarding_delete.sh b/forwarding_delete.sh index 9c6fb42..e310a25 100644 --- a/forwarding_delete.sh +++ b/forwarding_delete.sh @@ -42,14 +42,11 @@ rm -rf "$BASE_DIR" ################################# # UFW NAT CLEAN ################################# -echo "--- 1. Удаление оптимизаций ядра ---" +echo "--- Удаление перенаправления ---" rm -f /etc/sysctl.d/99-relay-optimization.conf -# Применяем стандартные настройки (отключаем BBR и forward, если они не были включены до этого) sysctl net.ipv4.ip_forward=0 -sysctl net.core.default_qdisc=pfifo_fast -sysctl net.ipv4.tcp_congestion_control=cubic -echo "--- 2. Восстановление правил UFW из бэкапа ---" +echo "--- Восстановление правил UFW из бэкапа ---" if [ -f /etc/ufw/before.rules.bak ]; then mv /etc/ufw/before.rules.bak /etc/ufw/before.rules echo "Файл before.rules восстановлен из бэкапа." @@ -57,17 +54,19 @@ else echo "ВНИМАНИЕ: Бэкап before.rules.bak не найден. Правила NAT придется удалять вручную." fi -echo "--- 3. Удаление разрешающих правил портов ---" +echo "--- Удаление разрешающих правил портов ---" ufw delete allow 443/tcp +ufw delete allow 443/udp ufw delete allow 8443/tcp +ufw delete allow 8443/udp ufw delete allow "$NGINX_PORT"/tcp ufw delete allow 10000:60000/tcp ufw delete allow 10000:60000/udp -echo "--- 4. Возврат политики FORWARD по умолчанию (DROP) ---" +echo "--- Возврат политики FORWARD по умолчанию (DROP) ---" sed -i 's/DEFAULT_FORWARD_POLICY="ACCEPT"/DEFAULT_FORWARD_POLICY="DROP"/' /etc/default/ufw -echo "--- 5. Перезапуск фаервола ---" +echo "--- Перезапуск фаервола ---" ufw reload ################################# @@ -77,4 +76,4 @@ ufw reload echo "Docker контейнеры удалены" echo "UFW NAT очищен" echo "ip_forward отключён" -log "Откат завершён. Для применения изменений перезагрузите систему!" \ No newline at end of file +log "Откат завершён. Для окончательного применения изменений перезагрузите систему!" \ No newline at end of file diff --git a/forwarding_install.sh b/forwarding_install.sh index af077e7..39a7781 100644 --- a/forwarding_install.sh +++ b/forwarding_install.sh @@ -15,7 +15,9 @@ die() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; } [[ $EUID -eq 0 ]] || die "Запускать нужно от root" -# --- ASCII-баннер --- +################################# +# ASCII-баннер +################################# echo "===================================================" echo " ____ ____ _ ___ _ " echo " / __ \___ ____ / __ \(_) (_)___ ______(_)___ ___ " @@ -27,7 +29,6 @@ echo "" echo " 3DP-MANAGER SUBSCRIPTION FORWARDER " echo "===================================================" echo "" -# -------------------- ################################# # INPUT @@ -51,22 +52,16 @@ SUB_PATH="/$(echo "$ORIGIN_SUB_URL" | cut -d/ -f4-)" ################################# # Определяем ORIGIN_IP ################################# - if [[ "$ORIGIN_HOST" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then - # Это уже IP-адрес ORIGIN_IP="$ORIGIN_HOST" log "Используем прямой IP из URL: $ORIGIN_IP" else - # Это домен — разрешаем в IP log "Разрешаем домен $ORIGIN_HOST в IP..." - # Пробуем getent ahosts (IPv4 приоритет) ORIGIN_IP=$(getent ahosts "$ORIGIN_HOST" | awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ {print $1; exit}') - # Если не вышло — fallback на hosts [[ -z "$ORIGIN_IP" ]] && ORIGIN_IP=$(getent hosts "$ORIGIN_HOST" | awk '{print $1; exit}') - # Последний шанс — dig (если установлен) if [[ -z "$ORIGIN_IP" ]] && command -v dig >/dev/null; then ORIGIN_IP=$(dig +short "$ORIGIN_HOST" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -n1) fi @@ -76,7 +71,6 @@ else log "Домен $ORIGIN_HOST разрешён в IP: $ORIGIN_IP" fi -# Финальная проверка [[ -n "$ORIGIN_IP" && -n "$ORIGIN_PORT" && -n "$SUB_PATH" ]] || die "Ошибка парсинга URL подписки" ################################# @@ -194,7 +188,6 @@ EOF ################################# # NGINX & DOCKER COMPOSE ################################# - if $USE_HTTPS; then cat > nginx.conf </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 не установлен, возможно уже есть плагин" fi @@ -313,27 +304,20 @@ docker compose up -d --build ################################# LOCAL_IP=$(hostname -I | awk '{print $1}') -# Проверка и установка UFW, если не установлен if ! command -v ufw >/dev/null 2>&1; then echo "UFW не установлен. Устанавливаю..." apt update -qq && apt install -y ufw fi -# Проверка статуса UFW (независимо от локали, на английском) if LC_ALL=C ufw status 2>/dev/null | grep -q "Status: active"; then echo "UFW уже активен." else echo "ВНИМАНИЕ: UFW выключен или не настроен. Включаю..." - # Разрешаем SSH (или другой порт, если используете не 22) - # OpenSSH — стандартный профиль, обычно порт 22 ufw allow OpenSSH >/dev/null 2>&1 || true - # Если SSH на другом порту, добавьте: ufw allow 2222/tcp - # Включаем UFW без подтверждения ufw --force enable >/dev/null 2>&1 - # Проверяем, успешно ли включён if LC_ALL=C ufw status 2>/dev/null | grep -q "Status: active"; then echo "UFW успешно включён." else @@ -342,7 +326,7 @@ else fi fi -echo "--- 1. Оптимизация сетевого стека ядра ---" +echo "--- Оптимизация сетевого стека ядра ---" cat < /etc/sysctl.d/99-relay-optimization.conf net.ipv4.ip_forward = 1 net.core.default_qdisc = fq @@ -361,10 +345,9 @@ net.ipv4.tcp_tw_reuse=1 EOF sysctl --system -echo "--- 2. Настройка правил перенаправления (before.rules) ---" +echo "--- Настройка правил перенаправления (before.rules) ---" cp /etc/ufw/before.rules /etc/ufw/before.rules.bak -# Создаем временный файл с вашими правилами cat < /tmp/ufw_nat_rules *nat :PREROUTING ACCEPT [0:0] @@ -400,28 +383,24 @@ COMMIT EOF -# Удаляем старые блоки *nat и *mangle из оригинала, если они там были (от прошлых запусков) -# И создаем чистую копию без них sed -i '/\*nat/,/COMMIT/d' /etc/ufw/before.rules sed -i '/\*mangle/,/COMMIT/d' /etc/ufw/before.rules -# Склеиваем: Сначала NAT/Mangle, потом остаток оригинального before.rules cat /tmp/ufw_nat_rules /etc/ufw/before.rules > /etc/ufw/before.rules.new mv /etc/ufw/before.rules.new /etc/ufw/before.rules -echo "--- 3. Открытие портов в самом фаерволе ---" -# Разрешаем входящий трафик на эти порты +echo "--- Открытие портов в самом фаерволе ---" ufw allow 443/tcp +ufw allow 443/udp ufw allow 8443/tcp +ufw allow 8443/udp ufw allow "$NGINX_PORT"/tcp ufw allow 10000:60000/tcp ufw allow 10000:60000/udp -# Разрешаем FORWARD (пересылку) -# Это критически важный шаг для корректной работы DNAT в UFW sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw -echo "--- 4. Перезапуск ---" +echo "--- Перезапуск ---" ufw reload echo "Готово! Система оптимизирована, порты открыты, трафик перенаправлен." diff --git a/install.sh b/install.sh index 4200947..e06442e 100644 --- a/install.sh +++ b/install.sh @@ -2,14 +2,13 @@ set -euo pipefail ################################# -# TRAP ДЛЯ ОТЛАДКИ +# DEBUG TRAP ################################# trap 'echo -e "\033[1;31m[ERROR]\033[0m Ошибка в строке $LINENO"; exit 1' ERR ################################# -# ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ +# HELPER FUNCTIONS ################################# - log() { echo -e "\033[1;32m[INFO]\033[0m $1"; } die() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; } @@ -22,12 +21,13 @@ validate_url() { } ################################# -# ПРОВЕРКИ +# CHECKS ################################# - need_root -# --- ASCII-баннер --- +################################# +# ASCII-баннер +################################# echo "===================================================" echo " ____ ____ _ ___ _ " echo " / __ \___ ____ / __ \(_) (_)___ ______(_)___ ___ " @@ -39,21 +39,19 @@ echo "" echo " 3DP-MANAGER FOR 3X-UI " echo "===================================================" echo "" -# -------------------- ################################# -# ВВОД ДАННЫХ +# INPUT / USER DATA ################################# - -# Функция для получения URL панели из 3x-ui +# Function to get panel URL from 3x-ui get_xui_url() { - # Пытаемся выполнить x-ui settings и вытащить строку Access URL + # Try to run `x-ui settings` and extract the Access URL line local output output=$(x-ui settings 2>/dev/null | grep "Access URL:" | head -1) if [[ -n "$output" ]]; then - # Обрезаем всё до последнего пробела и берём URL - echo "$output" | awk -F': ' '{print $2}' | sed 's/ *$//' + # Trim everything before the URL and take it + echo "$output" | awk -F': ' '{print $2}' | sed 's/ *$//' return 0 else return 1 @@ -65,15 +63,15 @@ echo "Определяем URL панели 3x-ui..." UI_URL=$(get_xui_url) if [[ -n "$UI_URL" ]]; then - UI_URL="${UI_URL%/}" # убираем trailing slash, если есть - echo "URL панели 3x-ui: $UI_URL" + UI_URL="${UI_URL%/}" # remove trailing slash if present + echo "URL панели 3x-ui: $UI_URL" else echo "Не удалось автоматически получить URL" read -rp "Введите URL панели 3x-ui вручную (полная ссылка): " UI_URL UI_URL="${UI_URL%/}" fi -# Проверка корректности URL +# Validate URL correctness validate_url "$UI_URL" || die "Некорректный URL панели 3x-ui: $UI_URL" read -rp "Логин 3x-ui: " UI_LOGIN @@ -81,7 +79,7 @@ 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\"}") # Проверка успешного логина по ключевому полю "success" или наличию куки @@ -92,9 +90,9 @@ fi echo "✔ Успешный логин в 3x-ui" -# Разбор UI_URL -UI_HOST=$(echo "$UI_URL" | awk -F[/:] '{print $4}') # домен или IP -UI_PROTO=$(echo "$UI_URL" | awk -F: '{print $1}') # http или https +# Parse UI_URL +UI_HOST=$(echo "$UI_URL" | awk -F[/:] '{print $4}') # domain or IP +UI_PROTO=$(echo "$UI_URL" | awk -F: '{print $1}') # http or https if [[ "$UI_PROTO" == "https" ]]; then log "HTTPS панель обнаружена, проверяем SSL сертификаты" @@ -117,11 +115,11 @@ if [[ "$UI_PROTO" == "https" ]]; then fi -# Ввод интервала ротации +# Input rotation interval read -rp "Интервал генерации инбаундов в минутах (от 10, по умолчанию 30): " ROTATE_INTERVAL ROTATE_INTERVAL="${ROTATE_INTERVAL:-30}" # по умолчанию 30 -# Проверка, что это число и ≥10 +# Check that it's a number and ≥10 if ! [[ "$ROTATE_INTERVAL" =~ ^[0-9]+$ ]] || [ "$ROTATE_INTERVAL" -lt 10 ]; then echo "Неверное значение. Используется значение по умолчанию 30 минут." ROTATE_INTERVAL=30 @@ -136,19 +134,19 @@ mkdir -p "$PROJECT_DIR" cd "$PROJECT_DIR" ################################# -# Получаем флаг +# Get country flag ################################# REPO_BASE="https://raw.githubusercontent.com/denpiligrim/3dp-manager/dp-fix" COUNTRY_FLAG="" -# Получаем countryCode +# Get countryCode 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) [ -z "$COUNTRY_CODE" ] && exit 0 -# URL флагов +# Flags JSON URL FLAGS_JSON_URL="$REPO_BASE/app/assets/flags.json" FLAGS_JSON=$(curl -s "$FLAGS_JSON_URL" || true) @@ -158,23 +156,20 @@ FLAGS_JSON=$(curl -s "$FLAGS_JSON_URL" || true) 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 скопирован" ################################# -# ГЕНЕРАЦИЯ ТОКЕНА +# TOKEN GENERATION ################################# - SUB_TOKEN="$(openssl rand -hex 24)" log "Сгенерирован токен подписки" ################################# # DOCKER ################################# - log "Проверка Docker" if command -v docker >/dev/null 2>&1; then @@ -187,7 +182,7 @@ else systemctl restart docker fi -# Проверка docker compose v2 +# Check docker compose v2 if docker compose version >/dev/null 2>&1; then log "docker compose v2 доступен" else @@ -198,15 +193,14 @@ else fi ################################# -# СТРУКТУРА +# STRUCTURE ################################# - mkdir -p app app/builders subscriptions -# Генерация случайного свободного порта для подписки/Nginx +# Generate a random free port for subscription/Nginx get_random_port() { while :; do - PORT=$((RANDOM % 50000 + 10000)) # диапазон 10000-60000 + PORT=$((RANDOM % 50000 + 10000)) # range 10000-60000 if ! ss -ltn | awk '{print $4}' | grep -q ":$PORT\$"; then echo "$PORT" return @@ -215,13 +209,12 @@ get_random_port() { } NGINX_PORT=$(get_random_port) -# Генерация URL подписки +# Generate subscription URL SUB_URL="$UI_PROTO://$UI_HOST:$NGINX_PORT/bus/$SUB_TOKEN" ################################# # ENV ################################# - cat > .env < docker-compose.yml </dev/null || die "Backend не запущен" docker compose ps | grep nginx >/dev/null || die "Nginx не запущен" ################################# -# РЕЗУЛЬТАТ +# RESULT ################################# - log "✔ Установка завершена" echo echo "URL подписки:" diff --git a/update.sh b/update.sh index a7658d0..164b984 100644 --- a/update.sh +++ b/update.sh @@ -9,7 +9,6 @@ trap 'echo -e "\033[1;31m[ERROR]\033[0m Ошибка в строке $LINENO"; e ################################# # HELPERS ################################# - log() { echo -e "\033[1;32m[INFO]\033[0m $1"; } warn() { echo -e "\033[1;33m[WARN]\033[0m $1"; } die() { echo -e "\033[1;31m[ERROR]\033[0m $1"; exit 1; } @@ -21,14 +20,12 @@ need_root() { ################################# # CONFIG ################################# - PROJECT_DIR="/opt/3dp-manager" REPO_RAW="https://raw.githubusercontent.com/denpiligrim/3dp-manager/dp-fix" ################################# # START ################################# - need_root log "Обновление 3dp-manager" @@ -40,14 +37,12 @@ cd "$PROJECT_DIR" ################################# # CHECK DOCKER ################################# - command -v docker >/dev/null 2>&1 || die "Docker не установлен" docker compose version >/dev/null 2>&1 || die "docker compose v2 недоступен" ################################# # DOWNLOAD FILES ################################# - log "Загружаем обновлённые файлы из репозитория" mkdir -p app @@ -70,21 +65,18 @@ log "Файлы обновлены" ################################# # REBUILD BACKEND ################################# - log "Пересобираем backend" docker compose build node ################################# # RESTART CONTAINERS ################################# - log "Перезапускаем контейнеры" docker compose up -d ################################# # HEALTH CHECK ################################# - sleep 2 docker compose ps | grep node >/dev/null || die "Backend не запущен" @@ -93,5 +85,4 @@ docker compose ps | grep nginx >/dev/null || die "Nginx не запущен" ################################# # DONE ################################# - -log "3dp-manager успешно обновлён ✅" +log "3dp-manager успешно обновлён ✅" \ No newline at end of file