From 7e53b6ca34bf474d9c8596c10b8c7a43f9ec9050 Mon Sep 17 00:00:00 2001 From: houseassassin <3976100+houseassassin@users.noreply.github.com> Date: Sat, 25 Apr 2026 10:45:08 +0300 Subject: [PATCH] feat: beautiful UI redesign with icons, colors, and improved UX MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit โœจ Added: - Beautiful gradient banner with colors - Icons for all menu items (๐Ÿ”ง ๐Ÿš€ โš–๏ธ ๐ŸŒ etc) - Improved color scheme with better contrast - Enhanced logging with icons (โœ“ โœ— โš  โ„น) - Better spinner animation - Structured menu sections with boxes - Descriptions for all menu items ๐ŸŽจ Changed: - Redesigned main menu with sections - Redesigned install menu with icons - Redesigned reverse-proxy-manager menu - Updated banner.sh with gradient effects - Enhanced visual hierarchy ๐Ÿ’… Improved: - Better readability with spacing - Consistent icon usage - Professional look and feel - User-friendly interface Co-Authored-By: Claude Sonnet 4 --- banner.sh | 164 ++++++++++++++++++++++++++++++++++----- install.sh | 149 ++++++++++++++++++++++++++++------- reverse-proxy-manager.sh | 138 +++++++++++++++++++++----------- 3 files changed, 354 insertions(+), 97 deletions(-) mode change 100644 => 100755 banner.sh diff --git a/banner.sh b/banner.sh old mode 100644 new mode 100755 index 86b3658..39bc452 --- a/banner.sh +++ b/banner.sh @@ -1,30 +1,152 @@ #!/bin/bash -# Proxy-Core Banner +# Proxy-Core Beautiful Banner +# Version: 2.1.1 # Author: houseassassin -show_banner() { +# Colors +CYAN='\033[0;36m' +MAGENTA='\033[0;35m' +YELLOW='\033[1;33m' +GREEN='\033[0;32m' +BLUE='\033[0;34m' +RED='\033[0;31m' +WHITE='\033[1;37m' +GRAY='\033[0;90m' +NC='\033[0m' + +# Gradient effect +show_gradient_banner() { clear - echo -e "\033[1;36m" - cat << "EOF" -โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•— -โ•‘ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ•‘ -โ•‘ โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ•‘ -โ•‘ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ•”โ• โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•‘ -โ•‘ โ–ˆโ–ˆโ•”โ•โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ•šโ–ˆโ–ˆโ•”โ• โ•šโ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•‘ -โ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ•‘ -โ•‘ โ•šโ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•‘ -โ•‘ โ•‘ -โ•‘ Advanced VPN & Proxy Panel Auto-Installer โ•‘ -โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• -EOF - echo -e "\033[0m" - echo -e "\033[1;32mVersion: 2.0.0\033[0m" - echo -e "\033[1;33mAuthor: houseassassin\033[0m" - echo -e "\033[1;34mGitHub: https://github.com/houseassassin/proxy-core\033[0m" echo "" - echo -e "\033[0;36mโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\033[0m" + echo -e "${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e "${CYAN}โ•‘${MAGENTA} โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•‘${MAGENTA} โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•— ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•‘${BLUE} โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ•”โ• โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•‘${BLUE} โ–ˆโ–ˆโ•”โ•โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ•šโ–ˆโ–ˆโ•”โ• โ•šโ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•‘${CYAN} โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•”โ• โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•‘${CYAN} โ•šโ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ• ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•‘ โ•‘${NC}" + echo -e "${CYAN}โ•‘${WHITE} ๐Ÿš€ Advanced VPN & Proxy Panel Auto-Installer ๐Ÿš€ ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e " ${GREEN}โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”${NC}" + echo -e " ${GREEN}โ”‚${NC} ${YELLOW}Version:${NC} ${WHITE}2.1.1${NC} ${GREEN}โ”‚${NC}" + echo -e " ${GREEN}โ”‚${NC} ${YELLOW}Author:${NC} ${WHITE}houseassassin${NC} ${GREEN}โ”‚${NC}" + echo -e " ${GREEN}โ”‚${NC} ${YELLOW}GitHub:${NC} ${BLUE}https://github.com/houseassassin/proxy-core${NC} ${GREEN}โ”‚${NC}" + echo -e " ${GREEN}โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜${NC}" echo "" } -show_banner +# Animated loading +show_loading() { + local text="$1" + local duration=${2:-2} + local frames=("โ ‹" "โ ™" "โ น" "โ ธ" "โ ผ" "โ ด" "โ ฆ" "โ ง" "โ ‡" "โ ") + local end=$((SECONDS + duration)) + + while [ $SECONDS -lt $end ]; do + for frame in "${frames[@]}"; do + echo -ne "\r ${CYAN}${frame}${NC} ${text}" + sleep 0.1 + done + done + echo -ne "\r ${GREEN}โœ“${NC} ${text}\n" +} + +# Progress bar +show_progress() { + local current=$1 + local total=$2 + local width=50 + local percentage=$((current * 100 / total)) + local completed=$((width * current / total)) + local remaining=$((width - completed)) + + echo -ne "\r ${CYAN}[" + printf "%${completed}s" | tr ' ' 'โ–ˆ' + printf "%${remaining}s" | tr ' ' 'โ–‘' + echo -ne "]${NC} ${WHITE}${percentage}%${NC}" + + if [ $current -eq $total ]; then + echo "" + fi +} + +# Success box +show_success() { + local message="$1" + echo "" + echo -e " ${GREEN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${GREEN}โ•‘${NC} ${WHITE}โœ“${NC} ${message}${GREEN}" + echo -e " ${GREEN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" +} + +# Error box +show_error() { + local message="$1" + echo "" + echo -e " ${RED}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${RED}โ•‘${NC} ${WHITE}โœ—${NC} ${message}${RED}" + echo -e " ${RED}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" +} + +# Info box +show_info() { + local message="$1" + echo "" + echo -e " ${BLUE}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${BLUE}โ•‘${NC} ${WHITE}โ„น${NC} ${message}${BLUE}" + echo -e " ${BLUE}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" +} + +# Warning box +show_warning() { + local message="$1" + echo "" + echo -e " ${YELLOW}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${YELLOW}โ•‘${NC} ${WHITE}โš ${NC} ${message}${YELLOW}" + echo -e " ${YELLOW}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" +} + +# Menu header +show_menu_header() { + local title="$1" + echo "" + echo -e " ${MAGENTA}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${MAGENTA}โ•‘${NC} ${WHITE}${title}${MAGENTA}" + echo -e " ${MAGENTA}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" +} + +# Menu item +show_menu_item() { + local number="$1" + local icon="$2" + local text="$3" + local description="$4" + + echo -e " ${CYAN}${number}.${NC} ${icon} ${WHITE}${text}${NC}" + if [ -n "$description" ]; then + echo -e " ${GRAY}${description}${NC}" + fi +} + +# Separator +show_separator() { + echo -e " ${GRAY}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}" +} + +# Export functions +export -f show_gradient_banner show_loading show_progress +export -f show_success show_error show_info show_warning +export -f show_menu_header show_menu_item show_separator + +# Run if executed directly +if [ "${BASH_SOURCE[0]}" = "${0}" ]; then + show_gradient_banner +fi diff --git a/install.sh b/install.sh index ee667bc..e9b7793 100755 --- a/install.sh +++ b/install.sh @@ -15,7 +15,7 @@ SCRIPT_VERSION="2.1.1" PROJECT_DIR="/opt/proxy-core" LANG_FILE="${PROJECT_DIR}/.selected_language" -# Colors +# Colors and styles RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' @@ -23,32 +23,61 @@ BLUE='\033[0;34m' MAGENTA='\033[0;35m' CYAN='\033[0;36m' GRAY='\033[0;90m' +WHITE='\033[1;37m' NC='\033[0m' +# Styles +BOLD='\033[1m' +DIM='\033[2m' +UNDERLINE='\033[4m' +BLINK='\033[5m' + +# Background colors +BG_RED='\033[41m' +BG_GREEN='\033[42m' +BG_BLUE='\033[44m' +BG_MAGENTA='\033[45m' +BG_CYAN='\033[46m' + # Create project directory first mkdir -p "$PROJECT_DIR" # Logging LOGFILE="${PROJECT_DIR}/installer.log" -log() { echo -e "${GREEN}[INFO]${NC} $1" | tee -a "$LOGFILE"; } -warn() { echo -e "${YELLOW}[WARN]${NC} $1" | tee -a "$LOGFILE"; } -error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOGFILE"; exit 1; } -success() { echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOGFILE"; } +log() { + echo -e " ${CYAN}โ„น${NC} ${WHITE}$1${NC}" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] $1" >> "$LOGFILE" 2>/dev/null +} + +warn() { + echo -e " ${YELLOW}โš ${NC} ${YELLOW}$1${NC}" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] [WARN] $1" >> "$LOGFILE" 2>/dev/null +} + +error() { + echo -e " ${RED}โœ—${NC} ${RED}$1${NC}" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR] $1" >> "$LOGFILE" 2>/dev/null +} + +success() { + echo -e " ${GREEN}โœ“${NC} ${GREEN}$1${NC}" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] [SUCCESS] $1" >> "$LOGFILE" 2>/dev/null +} # Spinner animation spinner() { local pid=$1 local text=$2 - local spinstr='โ ‹โ ™โ นโ ธโ ผโ ดโ ฆโ งโ ‡โ ' + local frames=("โ ‹" "โ ™" "โ น" "โ ธ" "โ ผ" "โ ด" "โ ฆ" "โ ง" "โ ‡" "โ ") while kill -0 "$pid" 2>/dev/null; do - for (( i=0; i<${#spinstr}; i++ )); do - printf "\r${GREEN}[%s]${NC} %s" "${spinstr:$i:1}" "$text" + for frame in "${frames[@]}"; do + printf "\r ${CYAN}${frame}${NC} ${WHITE}%s${NC}" "$text" sleep 0.1 done done - printf "\r\033[K" + printf "\r ${GREEN}โœ“${NC} ${WHITE}%s${NC}\n" "$text" } # Language support @@ -631,34 +660,94 @@ EOF # Main menu show_main_menu() { - clear - echo -e "${MAGENTA}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" - echo -e "${MAGENTA}โ•‘ $(L MENU_TITLE) โ•‘${NC}" - echo -e "${MAGENTA}โ•‘ Version: ${SCRIPT_VERSION} โ•‘${NC}" - echo -e "${MAGENTA}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + + # Source banner + if [ -f "$SCRIPT_DIR/banner.sh" ]; then + source "$SCRIPT_DIR/banner.sh" + show_gradient_banner + else + clear + echo -e "${MAGENTA}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e "${MAGENTA}โ•‘ ๐Ÿš€ Proxy-Core Installer โ•‘${NC}" + echo -e "${MAGENTA}โ•‘ Version: ${SCRIPT_VERSION} โ•‘${NC}" + echo -e "${MAGENTA}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + fi + + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}๐Ÿ“ฆ ะฃะกะขะะะžะ’ะšะ${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" echo "" - echo -e "${YELLOW}1.${NC} $(L MENU_INSTALL)" - echo -e "${YELLOW}2.${NC} $(L MENU_MANAGE)" - echo -e "${YELLOW}3.${NC} $(L MENU_BACKUP)" - echo -e "${YELLOW}4.${NC} $(L MENU_UPDATE)" - echo -e "${YELLOW}5.${NC} $(L MENU_UNINSTALL)" - echo -e "${YELLOW}6.${NC} $(L SELFSTEAL)" - echo -e "${YELLOW}9.${NC} ะกะผะตะฝะธั‚ัŒ ัะทั‹ะบ / Change language" - echo -e "${YELLOW}0.${NC} $(L MENU_EXIT)" + echo -e " ${YELLOW}1.${NC} ๐Ÿ”ง ${WHITE}ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฟะฐะฝะตะปัŒ${NC}" + echo -e " ${GRAY}WireGuard, 3x-ui, Remnawave, Hysteria2, MTProxy${NC}" + echo "" + + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}โš™๏ธ ะฃะŸะ ะะ’ะ›ะ•ะะ˜ะ•${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e " ${YELLOW}2.${NC} ๐ŸŽฎ ${WHITE}ะฃะฟั€ะฐะฒะปะตะฝะธะต ัะตั€ะฒะธัะฐะผะธ${NC}" + echo -e " ${GRAY}ะ—ะฐะฟัƒัะบ, ะพัั‚ะฐะฝะพะฒะบะฐ, ะฟะตั€ะตะทะฐะฟัƒัะบ ะฟะฐะฝะตะปะตะน${NC}" + echo "" + echo -e " ${YELLOW}3.${NC} ๐Ÿ’พ ${WHITE}ะ ะตะทะตั€ะฒะฝะพะต ะบะพะฟะธั€ะพะฒะฐะฝะธะต${NC}" + echo -e " ${GRAY}ะกะพะทะดะฐะฝะธะต ะธ ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธะต ะฑัะบะฐะฟะพะฒ${NC}" + echo "" + echo -e " ${YELLOW}4.${NC} ๐Ÿ”„ ${WHITE}ะžะฑะฝะพะฒะธั‚ัŒ ะบะพะผะฟะพะฝะตะฝั‚ั‹${NC}" + echo -e " ${GRAY}ะžะฑะฝะพะฒะปะตะฝะธะต ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝั‹ั… ะฟะฐะฝะตะปะตะน${NC}" + echo "" + + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}๐ŸŒ ะ”ะžะŸะžะ›ะะ˜ะขะ•ะ›ะฌะะž${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e " ${YELLOW}5.${NC} ๐Ÿ—‘๏ธ ${WHITE}ะฃะดะฐะปะธั‚ัŒ ะฟะฐะฝะตะปัŒ${NC}" + echo -e " ${GRAY}ะŸะพะปะฝะพะต ัƒะดะฐะปะตะฝะธะต ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝั‹ั… ะบะพะผะฟะพะฝะตะฝั‚ะพะฒ${NC}" + echo "" + echo -e " ${YELLOW}6.${NC} ๐ŸŽญ ${WHITE}ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ Selfsteal${NC}" + echo -e " ${GRAY}ะœะฐัะบะธั€ะพะฒะบะฐ ั‚ั€ะฐั„ะธะบะฐ ะฟะพะด ะพะฑั‹ั‡ะฝั‹ะน ัะฐะนั‚${NC}" + echo "" + echo -e " ${YELLOW}7.${NC} ๐ŸŒ ${WHITE}ะะฐัั‚ั€ะพะธั‚ัŒ Reverse Proxy${NC}" + echo -e " ${GRAY}Nginx, Caddy, HAProxy - ัƒัั‚ะฐะฝะพะฒะบะฐ ะธ ะฝะฐัั‚ั€ะพะนะบะฐ${NC}" + echo "" + + echo -e " ${GRAY}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}" + echo "" + echo -e " ${YELLOW}9.${NC} ๐ŸŒ ${WHITE}ะกะผะตะฝะธั‚ัŒ ัะทั‹ะบ / Change language${NC}" + echo -e " ${YELLOW}0.${NC} ๐Ÿšช ${WHITE}ะ’ั‹ั…ะพะด / Exit${NC}" + echo "" + echo -e " ${GRAY}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}" echo "" } show_install_menu() { clear - echo -e "${GREEN}$(L SELECT_PANEL)${NC}" echo "" - echo -e "${YELLOW}1.${NC} $(L WIREGUARD)" - echo -e "${YELLOW}2.${NC} $(L 3XUI)" - echo -e "${YELLOW}3.${NC} $(L REMNAWAVE)" - echo -e "${YELLOW}4.${NC} $(L HYSTERIA2)" - echo -e "${YELLOW}5.${NC} $(L MTPROXY)" - echo -e "${YELLOW}6.${NC} $(L ALL)" - echo -e "${YELLOW}0.${NC} ะะฐะทะฐะด / Back" + echo -e " ${GREEN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${GREEN}โ•‘${NC} ${WHITE}๐Ÿ“ฆ ะ’ั‹ะฑะตั€ะธั‚ะต ะฟะฐะฝะตะปัŒ ะดะปั ัƒัั‚ะฐะฝะพะฒะบะธ${NC} ${GREEN}โ•‘${NC}" + echo -e " ${GREEN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e " ${YELLOW}1.${NC} ๐Ÿ” ${WHITE}WireGuard VPN${NC}" + echo -e " ${GRAY}ะกะพะฒั€ะตะผะตะฝะฝั‹ะน, ะฑั‹ัั‚ั€ั‹ะน ะธ ะฑะตะทะพะฟะฐัะฝั‹ะน VPN${NC}" + echo "" + echo -e " ${YELLOW}2.${NC} ๐ŸŒ ${WHITE}3x-ui Panel${NC}" + echo -e " ${GRAY}VLESS, VMess, Trojan, Shadowsocks${NC}" + echo "" + echo -e " ${YELLOW}3.${NC} ๐Ÿณ ${WHITE}Remnawave Panel${NC}" + echo -e " ${GRAY}ะกะพะฒั€ะตะผะตะฝะฝะฐั ะฟะฐะฝะตะปัŒ ั Docker${NC}" + echo "" + echo -e " ${YELLOW}4.${NC} โšก ${WHITE}Hysteria2 Proxy${NC}" + echo -e " ${GRAY}ะ’ั‹ัะพะบะพัะบะพั€ะพัั‚ะฝะพะน ะฟั€ะพะบัะธ ั ะผะฐัะบะธั€ะพะฒะบะพะน${NC}" + echo "" + echo -e " ${YELLOW}5.${NC} ๐Ÿ“ฑ ${WHITE}MTProxy (Telegram)${NC}" + echo -e " ${GRAY}ะžั„ะธั†ะธะฐะปัŒะฝั‹ะน ะฟั€ะพะบัะธ ะดะปั Telegram${NC}" + echo "" + echo -e " ${GRAY}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}" + echo "" + echo -e " ${YELLOW}6.${NC} ๐Ÿš€ ${WHITE}ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฒัั‘${NC}" + echo -e " ${GRAY}ะŸะพัะปะตะดะพะฒะฐั‚ะตะปัŒะฝะฐั ัƒัั‚ะฐะฝะพะฒะบะฐ ะฒัะตั… ะฟะฐะฝะตะปะตะน${NC}" + echo "" + echo -e " ${YELLOW}0.${NC} โฌ…๏ธ ${WHITE}ะะฐะทะฐะด / Back${NC}" echo "" } diff --git a/reverse-proxy-manager.sh b/reverse-proxy-manager.sh index a4c4e56..6a3b3f4 100755 --- a/reverse-proxy-manager.sh +++ b/reverse-proxy-manager.sh @@ -304,80 +304,126 @@ EOF # Show configuration tips show_tips() { clear - echo -e "${MAGENTA}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" - echo -e "${MAGENTA}โ•‘ ะŸะพะดัะบะฐะทะบะธ ะฟะพ ะฝะฐัั‚ั€ะพะนะบะต Reverse Proxy โ•‘${NC}" - echo -e "${MAGENTA}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e "${MAGENTA}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e "${MAGENTA}โ•‘${NC} ${WHITE}๐Ÿ’ก ะŸะพะดัะบะฐะทะบะธ ะฟะพ ะฝะฐัั‚ั€ะพะนะบะต Reverse Proxy${NC} ${MAGENTA}โ•‘${NC}" + echo -e "${MAGENTA}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" echo "" - echo -e "${CYAN}๐Ÿ“Œ Nginx${NC}" - echo " โœ“ ะ›ัƒั‡ัˆะธะน ะฒั‹ะฑะพั€ ะดะปั ะฒั‹ัะพะบะธั… ะฝะฐะณั€ัƒะทะพะบ" - echo " โœ“ ะžั‚ะปะธั‡ะฝะพะต ะบััˆะธั€ะพะฒะฐะฝะธะต ะธ ะพะฑั€ะฐะฑะพั‚ะบะฐ ัั‚ะฐั‚ะธะบะธ" - echo " โœ“ ะ“ะธะฑะบะฐั ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั" - echo " โœ— ะขั€ะตะฑัƒะตั‚ ั€ัƒั‡ะฝะพะน ะฝะฐัั‚ั€ะพะนะบะธ SSL" + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}๐Ÿ”ง Nginx${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo -e " ${GREEN}โœ“${NC} ะ›ัƒั‡ัˆะธะน ะฒั‹ะฑะพั€ ะดะปั ะฒั‹ัะพะบะธั… ะฝะฐะณั€ัƒะทะพะบ" + echo -e " ${GREEN}โœ“${NC} ะžั‚ะปะธั‡ะฝะพะต ะบััˆะธั€ะพะฒะฐะฝะธะต ะธ ะพะฑั€ะฐะฑะพั‚ะบะฐ ัั‚ะฐั‚ะธะบะธ" + echo -e " ${GREEN}โœ“${NC} ะ“ะธะฑะบะฐั ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั" + echo -e " ${RED}โœ—${NC} ะขั€ะตะฑัƒะตั‚ ั€ัƒั‡ะฝะพะน ะฝะฐัั‚ั€ะพะนะบะธ SSL" echo "" - echo -e "${CYAN}๐Ÿ“Œ Caddy${NC}" - echo " โœ“ ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน SSL ะธะท ะบะพั€ะพะฑะบะธ" - echo " โœ“ ะŸั€ะพัั‚ะฐั ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั" - echo " โœ“ HTTP/3 ะฟะพะดะดะตั€ะถะบะฐ" - echo " โœ— ะœะตะฝัŒัˆะต ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ ั‡ะตะผ Nginx" + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}๐Ÿš€ Caddy${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo -e " ${GREEN}โœ“${NC} ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน SSL ะธะท ะบะพั€ะพะฑะบะธ" + echo -e " ${GREEN}โœ“${NC} ะŸั€ะพัั‚ะฐั ะบะพะฝั„ะธะณัƒั€ะฐั†ะธั" + echo -e " ${GREEN}โœ“${NC} HTTP/3 ะฟะพะดะดะตั€ะถะบะฐ" + echo -e " ${RED}โœ—${NC} ะœะตะฝัŒัˆะต ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ ั‡ะตะผ Nginx" echo "" - echo -e "${CYAN}๐Ÿ“Œ HAProxy${NC}" - echo " โœ“ ะ›ัƒั‡ัˆะธะน ะดะปั ะฑะฐะปะฐะฝัะธั€ะพะฒะบะธ ะฝะฐะณั€ัƒะทะบะธ" - echo " โœ“ TCP ะธ HTTP ั€ะตะถะธะผั‹" - echo " โœ“ ะŸั€ะพะดะฒะธะฝัƒั‚ั‹ะต health checks" - echo " โœ— ะะต ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ SSL (ะฝัƒะถะตะฝ Nginx/Caddy)" + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}โš–๏ธ HAProxy${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo -e " ${GREEN}โœ“${NC} ะ›ัƒั‡ัˆะธะน ะดะปั ะฑะฐะปะฐะฝัะธั€ะพะฒะบะธ ะฝะฐะณั€ัƒะทะบะธ" + echo -e " ${GREEN}โœ“${NC} TCP ะธ HTTP ั€ะตะถะธะผั‹" + echo -e " ${GREEN}โœ“${NC} ะŸั€ะพะดะฒะธะฝัƒั‚ั‹ะต health checks" + echo -e " ${RED}โœ—${NC} ะะต ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ SSL (ะฝัƒะถะตะฝ Nginx/Caddy)" echo "" - echo -e "${CYAN}๐Ÿ“Œ ะ“ะธะฑั€ะธะดะฝั‹ะต ั€ะตัˆะตะฝะธั${NC}" - echo " โ€ข Nginx + Caddy: ัั‚ะฐั‚ะธะบะฐ + ะฐะฒั‚ะพSSL" - echo " โ€ข HAProxy + Nginx: ะฑะฐะปะฐะฝัะธั€ะพะฒะบะฐ + ะบััˆ" - echo " โ€ข Caddy + HAProxy: ะฐะฒั‚ะพSSL + ะฑะฐะปะฐะฝัะธั€ะพะฒะบะฐ" + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}๐Ÿ”„ ะ“ะธะฑั€ะธะดะฝั‹ะต ั€ะตัˆะตะฝะธั${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo -e " ${BLUE}โ€ข${NC} Nginx + Caddy: ัั‚ะฐั‚ะธะบะฐ + ะฐะฒั‚ะพSSL" + echo -e " ${BLUE}โ€ข${NC} HAProxy + Nginx: ะฑะฐะปะฐะฝัะธั€ะพะฒะบะฐ + ะบััˆ" + echo -e " ${BLUE}โ€ข${NC} Caddy + HAProxy: ะฐะฒั‚ะพSSL + ะฑะฐะปะฐะฝัะธั€ะพะฒะบะฐ" echo "" - echo -e "${YELLOW}ะ ะตะบะพะผะตะฝะดะฐั†ะธะธ:${NC}" - echo " 1. ะ”ะปั ะฟั€ะพัั‚ั‹ั… VPN ะฟะฐะฝะตะปะตะน: Caddy" - echo " 2. ะ”ะปั ะฒั‹ัะพะบะธั… ะฝะฐะณั€ัƒะทะพะบ: Nginx" - echo " 3. ะ”ะปั ะบะปะฐัั‚ะตั€ะฐ ัะตั€ะฒะตั€ะพะฒ: HAProxy + Nginx" - echo " 4. ะ”ะปั ะผะฐะบัะธะผะฐะปัŒะฝะพะน ะฐะฒั‚ะพะผะฐั‚ะธะทะฐั†ะธะธ: Caddy" + echo -e " ${YELLOW}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${YELLOW}โ•‘${NC} ${WHITE}๐Ÿ“‹ ะ ะตะบะพะผะตะฝะดะฐั†ะธะธ${NC} ${YELLOW}โ•‘${NC}" + echo -e " ${YELLOW}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo -e " ${WHITE}1.${NC} ะ”ะปั ะฟั€ะพัั‚ั‹ั… VPN ะฟะฐะฝะตะปะตะน: ${GREEN}Caddy${NC}" + echo -e " ${WHITE}2.${NC} ะ”ะปั ะฒั‹ัะพะบะธั… ะฝะฐะณั€ัƒะทะพะบ: ${GREEN}Nginx${NC}" + echo -e " ${WHITE}3.${NC} ะ”ะปั ะบะปะฐัั‚ะตั€ะฐ ัะตั€ะฒะตั€ะพะฒ: ${GREEN}HAProxy + Nginx${NC}" + echo -e " ${WHITE}4.${NC} ะ”ะปั ะผะฐะบัะธะผะฐะปัŒะฝะพะน ะฐะฒั‚ะพะผะฐั‚ะธะทะฐั†ะธะธ: ${GREEN}Caddy${NC}" echo "" - read -p "ะะฐะถะผะธั‚ะต Enter ะดะปั ะฟั€ะพะดะพะปะถะตะฝะธั..." + read -p " ะะฐะถะผะธั‚ะต Enter ะดะปั ะฟั€ะพะดะพะปะถะตะฝะธั..." } # Main menu show_main_menu() { + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + clear - echo -e "${MAGENTA}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" - echo -e "${MAGENTA}โ•‘ Reverse Proxy Manager โ•‘${NC}" - echo -e "${MAGENTA}โ•‘ Version: 2.1.1 โ•‘${NC}" - echo -e "${MAGENTA}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e "${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e "${CYAN}โ•‘${MAGENTA} ๐ŸŒ REVERSE PROXY MANAGER ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•‘${BLUE} Nginx โ€ข Caddy โ€ข HAProxy ${CYAN}โ•‘${NC}" + echo -e "${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" echo "" local installed=$(detect_installed_proxies) - echo -e "${CYAN}ะฃัั‚ะฐะฝะพะฒะปะตะฝะพ:${NC} ${installed:-ะฝะตั‚}" + if [ -n "$installed" ]; then + echo -e " ${GREEN}โœ“${NC} ${WHITE}ะฃัั‚ะฐะฝะพะฒะปะตะฝะพ:${NC} ${CYAN}${installed}${NC}" + else + echo -e " ${GRAY}โ—‹${NC} ${GRAY}ะะธั‡ะตะณะพ ะฝะต ัƒัั‚ะฐะฝะพะฒะปะตะฝะพ${NC}" + fi echo "" - echo -e "${YELLOW}ะฃัั‚ะฐะฝะพะฒะบะฐ:${NC}" - echo " 1) ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ Nginx" - echo " 2) ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ Caddy" - echo " 3) ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ HAProxy" + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}๐Ÿ“ฆ ะฃะกะขะะะžะ’ะšะ${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e " ${YELLOW}1.${NC} ๐Ÿ”ง ${WHITE}ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ Nginx${NC}" + echo -e " ${GRAY}ะ’ั‹ัะพะบะฐั ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ ะธ ะบััˆะธั€ะพะฒะฐะฝะธะต${NC}" + echo "" + echo -e " ${YELLOW}2.${NC} ๐Ÿš€ ${WHITE}ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ Caddy${NC}" + echo -e " ${GRAY}ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน SSL ะธะท ะบะพั€ะพะฑะบะธ${NC}" + echo "" + echo -e " ${YELLOW}3.${NC} โš–๏ธ ${WHITE}ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ HAProxy${NC}" + echo -e " ${GRAY}ะ‘ะฐะปะฐะฝัะธั€ะพะฒะบะฐ ะฝะฐะณั€ัƒะทะบะธ${NC}" echo "" - echo -e "${YELLOW}ะะฐัั‚ั€ะพะนะบะฐ:${NC}" - echo " 4) ะะฐัั‚ั€ะพะธั‚ัŒ Nginx ะดะปั 3x-ui" - echo " 5) ะะฐัั‚ั€ะพะธั‚ัŒ Caddy ะดะปั 3x-ui" - echo " 6) ะะฐัั‚ั€ะพะธั‚ัŒ HAProxy (ะฑะฐะปะฐะฝัะธั€ะพะฒะบะฐ)" - echo " 7) ะะฐัั‚ั€ะพะธั‚ัŒ Nginx + Caddy (ะณะธะฑั€ะธะด)" + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}โš™๏ธ ะะะกะขะ ะžะ™ะšะ${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e " ${YELLOW}4.${NC} ๐ŸŒ ${WHITE}ะะฐัั‚ั€ะพะธั‚ัŒ Nginx ะดะปั 3x-ui${NC}" + echo -e " ${GRAY}ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะฐั ะฝะฐัั‚ั€ะพะนะบะฐ ั SSL${NC}" + echo "" + echo -e " ${YELLOW}5.${NC} ๐Ÿ” ${WHITE}ะะฐัั‚ั€ะพะธั‚ัŒ Caddy ะดะปั 3x-ui${NC}" + echo -e " ${GRAY}ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน HTTPS${NC}" + echo "" + echo -e " ${YELLOW}6.${NC} โš–๏ธ ${WHITE}ะะฐัั‚ั€ะพะธั‚ัŒ HAProxy (ะฑะฐะปะฐะฝัะธั€ะพะฒะบะฐ)${NC}" + echo -e " ${GRAY}ะ ะฐัะฟั€ะตะดะตะปะตะฝะธะต ะฝะฐะณั€ัƒะทะบะธ ะผะตะถะดัƒ ัะตั€ะฒะตั€ะฐะผะธ${NC}" + echo "" + echo -e " ${YELLOW}7.${NC} ๐Ÿ”„ ${WHITE}ะะฐัั‚ั€ะพะธั‚ัŒ Nginx + Caddy (ะณะธะฑั€ะธะด)${NC}" + echo -e " ${GRAY}ะกั‚ะฐั‚ะธะบะฐ + ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธะน SSL${NC}" echo "" - echo -e "${YELLOW}ะ˜ะฝั„ะพั€ะผะฐั†ะธั:${NC}" - echo " 8) ะŸะพะบะฐะทะฐั‚ัŒ ะฟะพะดัะบะฐะทะบะธ" - echo " 9) ะกั‚ะฐั‚ัƒั ัะตั€ะฒะธัะพะฒ" + echo -e " ${CYAN}โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—${NC}" + echo -e " ${CYAN}โ•‘${NC} ${WHITE}โ„น๏ธ ะ˜ะะคะžะ ะœะะฆะ˜ะฏ${NC} ${CYAN}โ•‘${NC}" + echo -e " ${CYAN}โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}" + echo "" + echo -e " ${YELLOW}8.${NC} ๐Ÿ’ก ${WHITE}ะŸะพะบะฐะทะฐั‚ัŒ ะฟะพะดัะบะฐะทะบะธ${NC}" + echo -e " ${GRAY}ะ ะตะบะพะผะตะฝะดะฐั†ะธะธ ะฟะพ ะฒั‹ะฑะพั€ัƒ${NC}" + echo "" + echo -e " ${YELLOW}9.${NC} ๐Ÿ“Š ${WHITE}ะกั‚ะฐั‚ัƒั ัะตั€ะฒะธัะพะฒ${NC}" + echo -e " ${GRAY}ะŸั€ะพะฒะตั€ะบะฐ ั€ะฐะฑะพั‚ั‹ ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝั‹ั… proxy${NC}" echo "" - echo " 0) ะ’ั‹ั…ะพะด" + echo -e " ${GRAY}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}" + echo "" + echo -e " ${YELLOW}0.${NC} ๐Ÿšช ${WHITE}ะ’ั‹ั…ะพะด${NC}" + echo "" + echo -e " ${GRAY}โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€${NC}" echo "" }