#!/bin/bash # ═══════════════════════════════════════════════════════════════════════ # Panel NaiveProxy by RIXXX — Полный установщик # Устанавливает: панель управления + NaiveProxy (Caddy + forwardproxy) # Запуск: bash <(curl -fsSL https://raw.githubusercontent.com/cwash797-cmd/Panel-NaiveProxy-by-RIXXX/main/install.sh) # Требования: Ubuntu 22.04 / 24.04, root, чистый сервер # ═══════════════════════════════════════════════════════════════════════ set -uo pipefail export DEBIAN_FRONTEND=noninteractive export NEEDRESTART_MODE=a export NEEDRESTART_SUSPEND=1 REPO_URL="https://github.com/cwash797-cmd/Panel-NaiveProxy-by-RIXXX" PANEL_DIR="/opt/naiveproxy-panel" SERVICE_NAME="naiveproxy-panel" INTERNAL_PORT=3000 # ── Colors ────────────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' BLUE='\033[0;34m'; PURPLE='\033[0;35m'; CYAN='\033[0;36m' BOLD='\033[1m'; RESET='\033[0m' header() { clear echo "" echo -e "${PURPLE}${BOLD}╔══════════════════════════════════════════════════════════╗${RESET}" echo -e "${PURPLE}${BOLD}║ Panel NaiveProxy by RIXXX — Установщик ║${RESET}" echo -e "${PURPLE}${BOLD}╚══════════════════════════════════════════════════════════╝${RESET}" echo "" } log_step() { echo -e "\n${CYAN}${BOLD}▶ $1${RESET}"; } log_ok() { echo -e "${GREEN}✅ $1${RESET}"; } log_warn() { echo -e "${YELLOW}⚠ $1${RESET}"; } log_err() { echo -e "${RED}❌ $1${RESET}"; } log_info() { echo -e " ${BLUE}$1${RESET}"; } header # ── Root check ────────────────────────────────────────────────────────── if [[ $EUID -ne 0 ]]; then log_err "Запускайте скрипт от root: sudo bash install.sh" exit 1 fi # ── OS check ──────────────────────────────────────────────────────────── if ! command -v apt-get &>/dev/null; then log_err "Поддерживается только Ubuntu/Debian" exit 1 fi # ── Определяем IP ─────────────────────────────────────────────────────── SERVER_IP=$(curl -4 -s --connect-timeout 8 ifconfig.me 2>/dev/null \ || curl -4 -s --connect-timeout 8 icanhazip.com 2>/dev/null \ || hostname -I | awk '{print $1}') echo -e " ${BLUE}IP сервера: ${BOLD}${SERVER_IP}${RESET}" echo "" # ════════════════════════════════════════════════════════════════════════ # РАЗДЕЛ А — НАСТРОЙКИ (собираем всё сразу, потом устанавливаем) # ════════════════════════════════════════════════════════════════════════ # ── A1. Способ доступа к панели управления ────────────────────────────── echo -e "${BOLD}Выберите способ доступа к панели управления:${RESET}" echo "" echo -e " ${CYAN}1)${RESET} Через Nginx на порту ${BOLD}8080${RESET} ${GREEN}(рекомендуется — порт 3000 не светится)${RESET}" echo -e " ${CYAN}2)${RESET} Напрямую на порту ${BOLD}3000${RESET} (проще, но порт виден)" echo -e " ${CYAN}3)${RESET} Через Nginx с доменом + HTTPS (максимальная защита)" echo "" read -rp "Ваш выбор [1/2/3]: " ACCESS_MODE ACCESS_MODE="${ACCESS_MODE:-1}" PANEL_DOMAIN="" PANEL_EMAIL_SSL="" if [[ "$ACCESS_MODE" == "3" ]]; then echo "" read -rp " Домен для панели (например panel.yourdomain.com): " PANEL_DOMAIN read -rp " Email для Let's Encrypt (SSL панели): " PANEL_EMAIL_SSL fi echo "" # ── A2. Параметры NaiveProxy ───────────────────────────────────────────── echo -e "${BOLD}Настройка NaiveProxy:${RESET}" echo -e "${YELLOW} ⚠ Убедитесь что A-запись домена уже указывает на ${SERVER_IP}${RESET}" echo "" read -rp " Домен для NaiveProxy (например vpn.yourdomain.com): " NAIVE_DOMAIN read -rp " Email для Let's Encrypt (TLS): " NAIVE_EMAIL # Генерируем credentials NAIVE_LOGIN=$(openssl rand -base64 48 | tr -dc 'A-Za-z0-9' | head -c 16) NAIVE_PASS=$(openssl rand -base64 48 | tr -dc 'A-Za-z0-9' | head -c 24) echo "" echo -e "${GREEN} ✅ Сгенерированы credentials для NaiveProxy:${RESET}" log_info "Логин: ${NAIVE_LOGIN}" log_info "Пароль: ${NAIVE_PASS}" echo "" echo -e "${YELLOW} ⚠ Запомните эти данные! Они также будут показаны в конце.${RESET}" echo "" read -rp "Всё верно? Начать установку? [Enter / Ctrl+C для отмены]: " _CONFIRM echo "" # ════════════════════════════════════════════════════════════════════════ # РАЗДЕЛ Б — УСТАНОВКА # ════════════════════════════════════════════════════════════════════════ # ── Б1. needrestart фикс + обновление системы ────────────────────────── log_step "[1/14] Обновление системы..." systemctl stop unattended-upgrades 2>/dev/null || true systemctl disable unattended-upgrades 2>/dev/null || true pkill -9 unattended-upgrades 2>/dev/null || true sleep 1 rm -f /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock \ /var/cache/apt/archives/lock /var/lib/apt/lists/lock 2>/dev/null || true dpkg --configure -a >/dev/null 2>&1 || true # Фикс needrestart — главная причина зависания на Ubuntu 22.04+/24.04 if [ -f /etc/needrestart/needrestart.conf ]; then sed -i "s/#\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/" \ /etc/needrestart/needrestart.conf 2>/dev/null || true sed -i "s/\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/" \ /etc/needrestart/needrestart.conf 2>/dev/null || true log_info "needrestart настроен (авто-режим)" fi # Только update + нужные пакеты — без upgrade всей системы DEBIAN_FRONTEND=noninteractive apt-get update -qq \ -o DPkg::Lock::Timeout=60 2>/dev/null || true DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \ -o Dpkg::Options::="--force-confdef" \ -o Dpkg::Options::="--force-confold" \ -o DPkg::Lock::Timeout=60 \ curl wget git openssl ufw build-essential 2>/dev/null || true log_ok "Система обновлена" # ── Б2. Включение BBR ────────────────────────────────────────────────── log_step "[2/14] Включение BBR (оптимизация скорости)..." grep -qxF "net.core.default_qdisc=fq" /etc/sysctl.conf \ || echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf grep -qxF "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf \ || echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p >/dev/null 2>&1 || true log_ok "BBR включён" # ── Б3. Установка Go ─────────────────────────────────────────────────── log_step "[3/14] Установка Go..." rm -rf /usr/local/go GO_VERSION="" for attempt in 1 2 3; do GO_VERSION=$(curl -fsSL --connect-timeout 10 'https://go.dev/VERSION?m=text' 2>/dev/null | head -n1 | tr -d '[:space:]' || true) [[ -n "$GO_VERSION" && "$GO_VERSION" == go* ]] && break sleep 2 done [[ -z "$GO_VERSION" || "$GO_VERSION" != go* ]] && GO_VERSION="go1.22.5" log_info "Загружаем ${GO_VERSION}..." wget -q --show-progress --timeout=180 \ "https://go.dev/dl/${GO_VERSION}.linux-amd64.tar.gz" \ -O /tmp/go.tar.gz 2>&1 || { log_err "Не удалось загрузить Go!" exit 1 } if [[ ! -s /tmp/go.tar.gz ]]; then log_err "Файл Go пустой, проверьте интернет" exit 1 fi tar -C /usr/local -xzf /tmp/go.tar.gz rm -f /tmp/go.tar.gz export GOROOT=/usr/local/go export GOPATH=/root/go export PATH=$GOROOT/bin:$GOPATH/bin:$PATH grep -q "/usr/local/go/bin" /root/.profile 2>/dev/null || { echo 'export GOROOT=/usr/local/go' >> /root/.profile echo 'export GOPATH=/root/go' >> /root/.profile echo 'export PATH=$GOROOT/bin:$GOPATH/bin:$PATH' >> /root/.profile } GO_VER=$(/usr/local/go/bin/go version 2>/dev/null || echo "неизвестно") log_ok "Go установлен: ${GO_VER}" # ── Б4. Сборка Caddy с naive-плагином ───────────────────────────────── log_step "[4/14] Сборка Caddy + naive forward proxy (3-7 минут, не прерывайте)..." export GOROOT=/usr/local/go export GOPATH=/root/go export PATH=$GOROOT/bin:$GOPATH/bin:$PATH export TMPDIR=/root/tmp export GOPROXY=https://proxy.golang.org,direct mkdir -p /root/tmp /root/go log_info "Установка xcaddy..." /usr/local/go/bin/go install \ github.com/caddyserver/xcaddy/cmd/xcaddy@latest 2>&1 | tail -2 if [[ ! -f /root/go/bin/xcaddy ]]; then log_err "xcaddy не установился! Проверьте интернет." exit 1 fi log_info "xcaddy установлен, собираем Caddy..." rm -f /root/caddy cd /root /root/go/bin/xcaddy build \ --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive \ 2>&1 | while IFS= read -r line; do [[ -n "$line" ]] && echo " $line" done if [[ ! -f /root/caddy ]]; then log_err "Caddy не собран! Проверьте вывод выше." exit 1 fi mv /root/caddy /usr/bin/caddy chmod +x /usr/bin/caddy CADDY_VER=$(/usr/bin/caddy version 2>/dev/null || echo "неизвестно") log_ok "Caddy собран: ${CADDY_VER}" # ── Б5. Камуфляжная HTML-страница ────────────────────────────────────── log_step "[5/14] Создание камуфляжной страницы..." mkdir -p /var/www/html /etc/caddy cat > /var/www/html/index.html << 'HTMLEOF' Loading
LOADING CONTENT
HTMLEOF log_ok "Камуфляжная страница создана в /var/www/html" # ── Б6. Создание Caddyfile ───────────────────────────────────────────── log_step "[6/14] Создание Caddyfile..." { printf '{\n order forward_proxy before file_server\n}\n\n' printf ':443, %s {\n' "${NAIVE_DOMAIN}" printf ' tls %s\n\n' "${NAIVE_EMAIL}" printf ' forward_proxy {\n' printf ' basic_auth %s %s\n' "${NAIVE_LOGIN}" "${NAIVE_PASS}" printf ' hide_ip\n' printf ' hide_via\n' printf ' probe_resistance\n' printf ' }\n\n' printf ' file_server {\n' printf ' root /var/www/html\n' printf ' }\n' printf '}\n' } > /etc/caddy/Caddyfile log_info "Валидация конфига..." if /usr/bin/caddy validate --config /etc/caddy/Caddyfile >/dev/null 2>&1; then log_ok "Caddyfile создан и валиден" else log_warn "Предупреждение валидации (продолжаем, SSL получим при первом старте)" fi # ── Б7. Systemd сервис Caddy ────────────────────────────────────────── log_step "[7/14] Создание systemd сервиса Caddy..." systemctl stop caddy 2>/dev/null || true pkill -x caddy 2>/dev/null || true sleep 1 cat > /etc/systemd/system/caddy.service << 'SVCEOF' [Unit] Description=Caddy with NaiveProxy (by RIXXX) Documentation=https://caddyserver.com/docs/ After=network.target network-online.target Requires=network-online.target [Service] Type=notify User=root Group=root ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force TimeoutStopSec=5s LimitNOFILE=1048576 LimitNPROC=512 PrivateTmp=true ProtectSystem=full AmbientCapabilities=CAP_NET_BIND_SERVICE Restart=always RestartSec=5s StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target SVCEOF systemctl daemon-reload systemctl enable caddy >/dev/null 2>&1 || true log_ok "Systemd сервис Caddy создан" # ── Б8. Запуск Caddy ────────────────────────────────────────────────── log_step "[8/14] Запуск Caddy (получение TLS сертификата)..." systemctl start caddy 2>&1 || { log_warn "systemctl start вернул ошибку, пробуем fallback..." pkill -f "caddy run" 2>/dev/null || true sleep 1 nohup /usr/bin/caddy run --config /etc/caddy/Caddyfile \ > /var/log/caddy.log 2>&1 & } # Ждём до 20 секунд CADDY_OK=0 for i in $(seq 1 20); do if systemctl is-active --quiet caddy 2>/dev/null || pgrep -x caddy >/dev/null 2>/dev/null; then log_ok "Caddy запущен (${i}с)" CADDY_OK=1 break fi sleep 1 done if [[ $CADDY_OK -eq 0 ]]; then log_warn "Caddy запускается медленно. Проверьте: systemctl status caddy" log_warn "Возможно SSL сертификат ещё получается (до 2 минут)" fi # ── Б9. Установка Node.js ───────────────────────────────────────────── log_step "[9/14] Установка Node.js 20..." if ! command -v node &>/dev/null || [[ "$(node -v 2>/dev/null | cut -d. -f1 | tr -d 'v')" -lt 18 ]]; then log_info "Скачиваем NodeSource репозиторий..." curl -fsSL https://deb.nodesource.com/setup_20.x | bash - 2>&1 | grep -E "^##|^Running|error" || true DEBIAN_FRONTEND=noninteractive apt-get install -y -qq nodejs \ -o Dpkg::Options::="--force-confdef" \ -o Dpkg::Options::="--force-confold" 2>/dev/null || true fi NODE_VER=$(node -v 2>/dev/null || echo "не найден") log_ok "Node.js: ${NODE_VER}" # ── Б10. Установка PM2 ──────────────────────────────────────────────── log_step "[10/14] Установка PM2..." npm install -g pm2 --silent 2>&1 | grep -v "^npm warn" | tail -2 || true PM2_VER=$(pm2 -v 2>/dev/null || echo "ok") log_ok "PM2: ${PM2_VER}" # ── Б11. Установка Nginx (если нужно) ──────────────────────────────── if [[ "$ACCESS_MODE" == "1" || "$ACCESS_MODE" == "3" ]]; then log_step "[11/14] Установка Nginx..." DEBIAN_FRONTEND=noninteractive apt-get install -y -qq nginx \ -o Dpkg::Options::="--force-confdef" \ -o Dpkg::Options::="--force-confold" 2>/dev/null || true log_ok "Nginx установлен" fi # ── Б12. Клонирование панели и зависимости ──────────────────────────── log_step "[12/14] Загрузка панели управления..." if [[ -d "${PANEL_DIR}/.git" ]]; then log_warn "Панель уже установлена — обновляем..." cd "${PANEL_DIR}" && git pull --ff-only 2>&1 | tail -2 || true else rm -rf "${PANEL_DIR}" git clone "${REPO_URL}" "${PANEL_DIR}" 2>&1 || { log_err "Не удалось клонировать репозиторий. Проверьте интернет." exit 1 } fi cd "${PANEL_DIR}/panel" npm install --omit=dev 2>&1 | grep -v "^npm warn" | tail -3 || true mkdir -p "${PANEL_DIR}/panel/data" log_ok "Панель загружена в ${PANEL_DIR}" # ── Запись config.json ПОСЛЕ клонирования ───────────────────────────── if [[ ! -f "${PANEL_DIR}/panel/data/config.json" ]]; then log_step "Сохранение конфигурации NaiveProxy в панель..." cat > "${PANEL_DIR}/panel/data/config.json" << CONFIGEOF { "installed": true, "domain": "${NAIVE_DOMAIN}", "email": "${NAIVE_EMAIL}", "serverIp": "${SERVER_IP}", "adminPassword": "", "proxyUsers": [ { "username": "${NAIVE_LOGIN}", "password": "${NAIVE_PASS}", "createdAt": "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" } ] } CONFIGEOF log_ok "config.json записан → панель покажет установленный NaiveProxy" else log_warn "config.json уже существует — не перезаписываем (сохраняем пользователей)" fi # ── Б13. Настройка UFW ──────────────────────────────────────────────── log_step "[13/14] Настройка файрволла UFW..." ufw allow 22/tcp >/dev/null 2>&1 || true ufw allow 80/tcp >/dev/null 2>&1 || true ufw allow 443/tcp >/dev/null 2>&1 || true if [[ "$ACCESS_MODE" == "1" ]]; then ufw allow 8080/tcp >/dev/null 2>&1 || true ufw deny ${INTERNAL_PORT}/tcp >/dev/null 2>&1 || true log_info "Порт 8080 открыт, порт 3000 закрыт снаружи" elif [[ "$ACCESS_MODE" == "2" ]]; then ufw allow ${INTERNAL_PORT}/tcp >/dev/null 2>&1 || true log_info "Порт 3000 открыт (прямой доступ)" elif [[ "$ACCESS_MODE" == "3" ]]; then ufw deny ${INTERNAL_PORT}/tcp >/dev/null 2>&1 || true log_info "Порт 3000 закрыт снаружи (Nginx с доменом)" fi echo "y" | ufw enable >/dev/null 2>&1 || ufw --force enable >/dev/null 2>&1 || true log_ok "Файрволл настроен" # ── Б14. Запуск панели через PM2 ────────────────────────────────────── log_step "[14/14] Запуск панели управления через PM2..." cd "${PANEL_DIR}/panel" pm2 delete "${SERVICE_NAME}" 2>/dev/null || true sleep 1 pm2 start server/index.js \ --name "${SERVICE_NAME}" \ --time \ --restart-delay=3000 \ 2>&1 | tail -3 pm2 save --force >/dev/null 2>&1 || true PM2_STARTUP=$(pm2 startup systemd -u root --hp /root 2>/dev/null | grep "^sudo" || true) [[ -n "$PM2_STARTUP" ]] && eval "$PM2_STARTUP" >/dev/null 2>&1 || true sleep 2 if pm2 describe "${SERVICE_NAME}" 2>/dev/null | grep -q "online"; then log_ok "Панель запущена через PM2" else log_warn "Проверьте: pm2 status && pm2 logs ${SERVICE_NAME}" fi # ── Настройка Nginx (если выбраны режимы 1 или 3) ──────────────────── if [[ "$ACCESS_MODE" == "1" ]]; then log_info "Настройка Nginx (8080 → 3000)..." cat > /etc/nginx/sites-available/naiveproxy-panel << NGINXEOF server { listen 8080; server_name _; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; location / { proxy_pass http://127.0.0.1:${INTERNAL_PORT}; proxy_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_read_timeout 86400; } } NGINXEOF ln -sf /etc/nginx/sites-available/naiveproxy-panel \ /etc/nginx/sites-enabled/naiveproxy-panel 2>/dev/null || true rm -f /etc/nginx/sites-enabled/default 2>/dev/null || true nginx -t >/dev/null 2>&1 && systemctl restart nginx && systemctl enable nginx >/dev/null 2>&1 || \ log_warn "Nginx не запустился, проверьте: nginx -t" log_ok "Nginx настроен (8080 → 3000)" elif [[ "$ACCESS_MODE" == "3" && -n "$PANEL_DOMAIN" ]]; then log_info "Настройка Nginx с доменом + SSL..." DEBIAN_FRONTEND=noninteractive apt-get install -y -qq python3-certbot-nginx 2>/dev/null || true cat > /etc/nginx/sites-available/naiveproxy-panel << NGINXEOF server { listen 80; server_name ${PANEL_DOMAIN}; location / { proxy_pass http://127.0.0.1:${INTERNAL_PORT}; proxy_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_read_timeout 86400; } } NGINXEOF ln -sf /etc/nginx/sites-available/naiveproxy-panel \ /etc/nginx/sites-enabled/naiveproxy-panel 2>/dev/null || true rm -f /etc/nginx/sites-enabled/default 2>/dev/null || true nginx -t >/dev/null 2>&1 && systemctl restart nginx && systemctl enable nginx >/dev/null 2>&1 || true certbot --nginx -d "${PANEL_DOMAIN}" \ --email "${PANEL_EMAIL_SSL:-admin@${PANEL_DOMAIN}}" \ --agree-tos --non-interactive 2>&1 | tail -4 \ || log_warn "SSL для панели: проверьте DNS запись домена" log_ok "Nginx + SSL настроен для ${PANEL_DOMAIN}" fi # ════════════════════════════════════════════════════════════════════════ # ФИНАЛЬНЫЙ ВЫВОД # ════════════════════════════════════════════════════════════════════════ NAIVE_LINK="naive+https://${NAIVE_LOGIN}:${NAIVE_PASS}@${NAIVE_DOMAIN}:443" echo "" echo -e "${PURPLE}${BOLD}╔══════════════════════════════════════════════════════════════╗${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}║ ✅ Panel NaiveProxy by RIXXX — Установка завершена! ║${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}╠══════════════════════════════════════════════════════════════╣${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}║ 🌐 ПАНЕЛЬ УПРАВЛЕНИЯ ║${RESET}" if [[ "$ACCESS_MODE" == "1" ]]; then echo -e "${PURPLE}${BOLD}║ ➜ http://${SERVER_IP}:8080${RESET}" elif [[ "$ACCESS_MODE" == "3" && -n "$PANEL_DOMAIN" ]]; then echo -e "${PURPLE}${BOLD}║ ➜ https://${PANEL_DOMAIN}${RESET}" else echo -e "${PURPLE}${BOLD}║ ➜ http://${SERVER_IP}:${INTERNAL_PORT}${RESET}" fi echo -e "${PURPLE}${BOLD}║ 👤 Логин: admin 🔑 Пароль: admin ║${RESET}" echo -e "${PURPLE}${BOLD}║ ⚠️ Сразу смените пароль в разделе «Настройки»! ║${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}╠══════════════════════════════════════════════════════════════╣${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}║ 🔒 NAIVEPROXY ║${RESET}" echo -e "${PURPLE}${BOLD}║ Домен: ${NAIVE_DOMAIN}${RESET}" echo -e "${PURPLE}${BOLD}║ Логин: ${NAIVE_LOGIN}${RESET}" echo -e "${PURPLE}${BOLD}║ Пароль: ${NAIVE_PASS}${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}║ 🔗 Ссылка подключения:${RESET}" echo -e "${CYAN} ${NAIVE_LINK}${RESET}" echo -e "${PURPLE}${BOLD}║ 📋 Karing → Импорт → Вставить из буфера обмена ║${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}╠══════════════════════════════════════════════════════════════╣${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}║ 📌 Полезные команды: ║${RESET}" echo -e "${PURPLE}${BOLD}║ pm2 status — статус панели ║${RESET}" echo -e "${PURPLE}${BOLD}║ pm2 logs ${SERVICE_NAME} — логи панели ║${RESET}" echo -e "${PURPLE}${BOLD}║ systemctl status caddy — статус NaiveProxy ║${RESET}" echo -e "${PURPLE}${BOLD}║ journalctl -u caddy -f — логи Caddy ║${RESET}" echo -e "${PURPLE}${BOLD}║ systemctl restart caddy — перезапуск Caddy ║${RESET}" echo -e "${PURPLE}${BOLD}║ ║${RESET}" echo -e "${PURPLE}${BOLD}╚══════════════════════════════════════════════════════════════╝${RESET}" echo "" echo -e "${GREEN}${BOLD} Удачи! Telegram: https://t.me/russian_paradice_vpn${RESET}" echo ""