Files
proxy-core/install.sh
T
houseassassin 7e53b6ca34 feat: beautiful UI redesign with icons, colors, and improved UX
 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 <noreply@anthropic.com>
2026-04-25 10:45:08 +03:00

836 lines
27 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Proxy-Core - Advanced VPN & Proxy Panel Auto-Installer
# Version: 2.1.1
# Author: houseassassin
# GitHub: https://github.com/houseassassin/proxy-core
#
# Supports: WireGuard, 3x-ui, Remnawave, Hysteria2, MTProxy
# Reverse Proxy: Nginx, Caddy
# Features: Selfsteal templates
set -euo pipefail
SCRIPT_VERSION="2.1.1"
PROJECT_DIR="/opt/proxy-core"
LANG_FILE="${PROJECT_DIR}/.selected_language"
# Colors and styles
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
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 " ${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 frames=("⠋" "⠙" "⠹" "⠸" "⠼" "⠴" "⠦" "⠧" "⠇" "⠏")
while kill -0 "$pid" 2>/dev/null; do
for frame in "${frames[@]}"; do
printf "\r ${CYAN}${frame}${NC} ${WHITE}%s${NC}" "$text"
sleep 0.1
done
done
printf "\r ${GREEN}${NC} ${WHITE}%s${NC}\n" "$text"
}
# Language support
declare -A LANG_EN=(
[MENU_TITLE]="VPN Panel Installer"
[MENU_INSTALL]="Install Panel"
[MENU_MANAGE]="Manage Services"
[MENU_BACKUP]="Backup & Restore"
[MENU_UPDATE]="Update Components"
[MENU_UNINSTALL]="Uninstall"
[MENU_EXIT]="Exit"
[SELECT_PANEL]="Select panel to install"
[WIREGUARD]="WireGuard VPN"
[3XUI]="3x-ui Panel"
[REMNAWAVE]="Remnawave Panel"
[HYSTERIA2]="Hysteria2 Proxy"
[MTPROXY]="MTProxy (Telegram)"
[SELECT_REVERSE_PROXY]="Select Reverse Proxy"
[NGINX]="Nginx"
[CADDY]="Caddy"
[SELFSTEAL]="Install Selfsteal Template"
[ALL]="Install All"
)
declare -A LANG_RU=(
[MENU_TITLE]="Установщик VPN панелей"
[MENU_INSTALL]="Установить панель"
[MENU_MANAGE]="Управление сервисами"
[MENU_BACKUP]="Резервное копирование"
[MENU_UPDATE]="Обновить компоненты"
[MENU_UNINSTALL]="Удалить"
[MENU_EXIT]="Выход"
[SELECT_PANEL]="Выберите панель для установки"
[WIREGUARD]="WireGuard VPN"
[3XUI]="Панель 3x-ui"
[REMNAWAVE]="Панель Remnawave"
[HYSTERIA2]="Прокси Hysteria2"
[MTPROXY]="MTProxy (Telegram)"
[SELECT_REVERSE_PROXY]="Выберите Reverse Proxy"
[NGINX]="Nginx"
[CADDY]="Caddy"
[SELFSTEAL]="Установить Selfsteal шаблон"
[ALL]="Установить всё"
)
MENU_LANG="en"
load_language() {
if [ -f "$LANG_FILE" ]; then
MENU_LANG=$(cat "$LANG_FILE" 2>/dev/null | tr -d '[:space:]')
fi
}
save_language() {
mkdir -p "$(dirname "$LANG_FILE")"
echo "$1" > "$LANG_FILE"
MENU_LANG="$1"
}
L() {
local key="$1"
local var_name="LANG_${MENU_LANG^^}_${key}"
echo "${!var_name:-$key}"
}
# System checks
check_root() {
if [[ $EUID -ne 0 ]]; then
error "Этот скрипт должен быть запущен с правами root"
fi
}
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VER=$VERSION_ID
else
error "Не удалось определить операционную систему"
fi
log "Обнаружена ОС: $OS $VER"
}
check_memory() {
local mem_mb=$(free -m | grep Mem: | awk '{print $2}')
if [ $mem_mb -lt 2000 ]; then
local swap_mb=$(free -m | grep Swap: | awk '{print $2}')
if [ $swap_mb -eq 0 ]; then
warn "Мало RAM ($mem_mb MB), создаём swap 2GB..."
fallocate -l 2G /swapfile || dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
success "Swap создан"
fi
fi
}
# Network utilities
get_server_ip() {
curl -s -4 ifconfig.me || curl -s -4 api.ipify.org || curl -s -4 ipinfo.io/ip
}
get_random_port() {
local MIN=${1:-3000}
local MAX=${2:-6999}
while :; do
PORT=$(shuf -i "$MIN-$MAX" -n 1)
if ! ss -ltun | awk '{print $4}' | grep -q ":$PORT\$"; then
echo "$PORT"
return
fi
done
}
# Docker management
install_docker() {
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
log "Docker уже установлен"
return 0
fi
log "Установка Docker..."
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
sh /tmp/get-docker.sh
rm /tmp/get-docker.sh
systemctl enable docker
systemctl start docker
success "Docker установлен"
}
# System packages
install_packages() {
log "Установка системных пакетов..."
case $OS in
ubuntu|debian)
apt-get update -y
apt-get install -y curl wget git sudo ufw certbot \
ca-certificates jq openssl tar net-tools \
qrencode python3-certbot-dns-cloudflare \
unattended-upgrades locales dnsutils coreutils \
grep gawk python3-pip cron nginx
;;
centos|rhel|fedora)
yum update -y
yum install -y curl wget git sudo firewalld certbot \
ca-certificates jq openssl tar net-tools qrencode nginx
;;
esac
# BBR
if ! grep -q "net.core.default_qdisc = fq" /etc/sysctl.conf; then
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
fi
if ! grep -q "net.ipv4.tcp_congestion_control = bbr" /etc/sysctl.conf; then
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
fi
sysctl -p >/dev/null
# UFW
if command -v ufw >/dev/null 2>&1; then
ufw allow 22/tcp comment 'SSH' >/dev/null 2>&1
ufw allow 443/tcp comment 'HTTPS' >/dev/null 2>&1
ufw --force enable >/dev/null 2>&1
fi
success "Системные пакеты установлены"
}
# WireGuard installation
install_wireguard() {
log "Установка WireGuard..."
case $OS in
ubuntu|debian)
apt-get install -y wireguard wireguard-tools qrencode
;;
centos|rhel|fedora)
yum install -y wireguard-tools qrencode
;;
esac
mkdir -p /etc/wireguard
cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key
chmod 600 server_private.key
SERVER_PRIVATE_KEY=$(cat server_private.key)
SERVER_PUBLIC_KEY=$(cat server_public.key)
SERVER_IP=$(get_server_ip)
WG_PORT=$(get_random_port 51820 51900)
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
PrivateKey = $SERVER_PRIVATE_KEY
Address = 10.0.0.1/24
ListenPort = $WG_PORT
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p >/dev/null 2>&1
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
ufw allow $WG_PORT/udp 2>/dev/null || firewall-cmd --permanent --add-port=$WG_PORT/udp 2>/dev/null
success "WireGuard установлен на порту $WG_PORT"
read -p "Создать первого клиента? (Y/n): " create_client
if [[ "$create_client" != "n" && "$create_client" != "N" ]]; then
bash "$PROJECT_DIR/wg-manager.sh" 2>/dev/null || log "Запустите wg-manager.sh для создания клиентов"
fi
}
# 3x-ui installation
install_3xui() {
log "Установка 3x-ui..."
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
success "3x-ui установлен"
}
# Remnawave installation
install_remnawave() {
log "Установка Remnawave..."
install_docker
cd /opt
if [ -d "remnawave" ]; then
warn "Remnawave уже установлен, обновляем..."
cd remnawave
docker compose down
cd /opt
rm -rf remnawave
fi
git clone https://github.com/remnawave/backend.git remnawave
cd remnawave
DB_PASSWORD=$(openssl rand -base64 32)
ADMIN_PASSWORD=$(openssl rand -base64 16)
cat > .env <<EOF
DATABASE_URL="postgresql://remnawave:${DB_PASSWORD}@postgres:5432/remnawave"
ADMIN_USERNAME=admin
ADMIN_PASSWORD=${ADMIN_PASSWORD}
JWT_SECRET=$(openssl rand -base64 32)
EOF
docker compose up -d
success "Remnawave установлен"
echo ""
log "Админ логин: admin"
log "Админ пароль: $ADMIN_PASSWORD"
warn "Сохраните эти данные!"
}
# Hysteria2 installation
install_hysteria2() {
log "Установка Hysteria2..."
HYSTERIA_VERSION=$(curl -s https://api.github.com/repos/apernet/hysteria/releases/latest | grep tag_name | cut -d '"' -f 4)
wget -O /tmp/hysteria "https://github.com/apernet/hysteria/releases/download/${HYSTERIA_VERSION}/hysteria-linux-amd64"
chmod +x /tmp/hysteria
mv /tmp/hysteria /usr/local/bin/hysteria
mkdir -p /etc/hysteria
HYSTERIA_PASSWORD=$(openssl rand -base64 32)
HYSTERIA_PORT=$(get_random_port 36712 36800)
cat > /etc/hysteria/config.yaml <<EOF
listen: :$HYSTERIA_PORT
tls:
cert: /etc/hysteria/cert.pem
key: /etc/hysteria/key.pem
auth:
type: password
password: $HYSTERIA_PASSWORD
masquerade:
type: proxy
proxy:
url: https://www.bing.com
rewriteHost: true
EOF
openssl req -x509 -nodes -newkey rsa:4096 -keyout /etc/hysteria/key.pem \
-out /etc/hysteria/cert.pem -days 365 -subj "/CN=www.example.com" 2>/dev/null
cat > /etc/systemd/system/hysteria-server.service <<EOF
[Unit]
Description=Hysteria Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/hysteria server -c /etc/hysteria/config.yaml
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable hysteria-server
systemctl start hysteria-server
ufw allow $HYSTERIA_PORT/udp 2>/dev/null || firewall-cmd --permanent --add-port=$HYSTERIA_PORT/udp 2>/dev/null
success "Hysteria2 установлен"
echo ""
log "Порт: $HYSTERIA_PORT"
log "Пароль: $HYSTERIA_PASSWORD"
warn "Сохраните эти данные!"
}
# MTProxy installation
install_mtproxy() {
log "Установка MTProxy для Telegram..."
case $OS in
ubuntu|debian)
apt-get install -y git build-essential libssl-dev zlib1g-dev
;;
centos|rhel|fedora)
yum install -y git gcc make openssl-devel zlib-devel
;;
esac
cd /opt
if [ -d "MTProxy" ]; then
rm -rf MTProxy
fi
git clone https://github.com/TelegramMessenger/MTProxy.git
cd MTProxy
make
curl -s https://core.telegram.org/getProxySecret -o proxy-secret
curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf
SECRET=$(head -c 16 /dev/urandom | xxd -ps)
read -p "Введите порт для MTProxy (по умолчанию 8443): " MTPROXY_PORT
MTPROXY_PORT=${MTPROXY_PORT:-8443}
cat > /etc/systemd/system/mtproxy.service <<EOF
[Unit]
Description=MTProxy Telegram Proxy
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/MTProxy
ExecStart=/opt/MTProxy/objs/bin/mtproto-proxy -u nobody -p $MTPROXY_PORT -H $MTPROXY_PORT -S $SECRET --aes-pwd proxy-secret proxy-multi.conf -M 1
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable mtproxy
systemctl start mtproxy
ufw allow $MTPROXY_PORT/tcp 2>/dev/null || firewall-cmd --permanent --add-port=$MTPROXY_PORT/tcp 2>/dev/null
cat > /opt/MTProxy/.config <<EOF
MTPROXY_PORT=$MTPROXY_PORT
SECRET=$SECRET
EOF
chmod 600 /opt/MTProxy/.config
SERVER_IP=$(get_server_ip)
success "MTProxy установлен!"
echo ""
log "Ссылка для подключения:"
echo -e "${CYAN}tg://proxy?server=${SERVER_IP}&port=${MTPROXY_PORT}&secret=${SECRET}${NC}"
echo ""
log "Или используйте в Telegram:"
echo -e "${YELLOW}Server: ${SERVER_IP}${NC}"
echo -e "${YELLOW}Port: ${MTPROXY_PORT}${NC}"
echo -e "${YELLOW}Secret: ${SECRET}${NC}"
if command -v qrencode &> /dev/null; then
echo ""
log "QR-код для быстрого подключения:"
qrencode -t ansiutf8 "tg://proxy?server=${SERVER_IP}&port=${MTPROXY_PORT}&secret=${SECRET}"
fi
}
# Reverse Proxy selection
select_reverse_proxy() {
echo ""
echo -e "${GREEN}$(L SELECT_REVERSE_PROXY)${NC}"
echo ""
echo -e "${YELLOW}1.${NC} $(L NGINX)"
echo -e "${YELLOW}2.${NC} $(L CADDY)"
echo ""
read -p "Выберите / Select [1-2]: " PROXY_CHOICE
case $PROXY_CHOICE in
1)
REVERSE_PROXY="nginx"
install_nginx
;;
2)
REVERSE_PROXY="caddy"
install_caddy
;;
*)
warn "Неверный выбор, используется Nginx"
REVERSE_PROXY="nginx"
install_nginx
;;
esac
}
# Nginx installation
install_nginx() {
if command -v nginx >/dev/null 2>&1; then
log "Nginx уже установлен"
return 0
fi
log "Установка Nginx..."
case $OS in
ubuntu|debian)
apt-get install -y nginx
;;
centos|rhel|fedora)
yum install -y nginx
;;
esac
systemctl enable nginx
systemctl start nginx
success "Nginx установлен"
}
# Caddy installation
install_caddy() {
if command -v caddy >/dev/null 2>&1; then
log "Caddy уже установлен"
return 0
fi
log "Установка Caddy..."
case $OS in
ubuntu|debian)
apt-get install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt-get update
apt-get install -y caddy
;;
centos|rhel|fedora)
yum install -y yum-plugin-copr
yum copr enable @caddy/caddy -y
yum install -y caddy
;;
esac
systemctl enable caddy
systemctl start caddy
success "Caddy установлен"
}
# Selfsteal template installation
install_selfsteal() {
log "Установка Selfsteal шаблона..."
# Определяем директорию
if [ -d "/opt/remnawave" ]; then
INSTALL_DIR="/opt/remnawave"
elif [ -d "/opt/remnanode" ]; then
INSTALL_DIR="/opt/remnanode"
else
error "Remnawave или Remnanode должны быть установлены для selfsteal"
return 1
fi
# Устанавливаем REVERSE_PROXY если не задан
if [ -z "${REVERSE_PROXY:-}" ]; then
if command -v nginx >/dev/null 2>&1; then
REVERSE_PROXY="nginx"
log "Используется установленный Nginx"
elif command -v caddy >/dev/null 2>&1; then
REVERSE_PROXY="caddy"
log "Используется установленный Caddy"
else
warn "Reverse proxy не найден, устанавливаем Nginx..."
install_nginx
REVERSE_PROXY="nginx"
fi
fi
echo ""
echo -e "${GREEN}Выберите тип selfsteal шаблона:${NC}"
echo ""
echo -e "${YELLOW}1.${NC} Случайный сайт"
echo -e "${YELLOW}2.${NC} Пользовательский URL"
echo -e "${YELLOW}3.${NC} Локальный HTML файл"
echo ""
read -p "Выберите [1-3]: " SELFSTEAL_TYPE
case $SELFSTEAL_TYPE in
1)
# Список популярных сайтов
SITES=(
"https://www.wikipedia.org"
"https://www.github.com"
"https://www.stackoverflow.com"
"https://www.reddit.com"
"https://www.medium.com"
)
RANDOM_SITE=${SITES[$RANDOM % ${#SITES[@]}]}
log "Используется случайный сайт: $RANDOM_SITE"
# Скачиваем страницу
curl -sL "$RANDOM_SITE" > "$INSTALL_DIR/selfsteal.html"
;;
2)
read -p "Введите URL сайта: " CUSTOM_URL
log "Скачивание $CUSTOM_URL..."
curl -sL "$CUSTOM_URL" > "$INSTALL_DIR/selfsteal.html"
;;
3)
read -p "Введите путь к HTML файлу: " HTML_PATH
if [ -f "$HTML_PATH" ]; then
cp "$HTML_PATH" "$INSTALL_DIR/selfsteal.html"
else
error "Файл не найден: $HTML_PATH"
fi
;;
*)
warn "Неверный выбор"
return 1
;;
esac
# Настройка Nginx для selfsteal
if [ "$REVERSE_PROXY" = "nginx" ]; then
cat > /etc/nginx/sites-available/selfsteal <<EOF
server {
listen 80 default_server;
listen [::]:80 default_server;
root $INSTALL_DIR;
index selfsteal.html;
location / {
try_files \$uri \$uri/ /selfsteal.html;
}
}
EOF
ln -sf /etc/nginx/sites-available/selfsteal /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
fi
success "Selfsteal шаблон установлен"
}
# Main menu
show_main_menu() {
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} 🔧 ${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 ""
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 ""
}
main() {
check_root
detect_os
check_memory
mkdir -p "$PROJECT_DIR"
load_language
while true; do
show_main_menu
read -p "Выберите опцию / Select option: " choice
case $choice in
1)
show_install_menu
read -p "Выберите / Select: " install_choice
case $install_choice in
1)
install_packages
install_wireguard
;;
2)
install_packages
install_3xui
;;
3)
install_packages
select_reverse_proxy
install_remnawave
;;
4)
install_packages
install_hysteria2
;;
5)
install_packages
install_mtproxy
;;
6)
install_packages
select_reverse_proxy
install_wireguard
install_3xui
install_remnawave
install_hysteria2
install_mtproxy
;;
0) continue ;;
*) warn "Неверный выбор / Invalid choice" ;;
esac
read -p "Нажмите Enter / Press Enter..."
;;
6)
# Проверка перед вызовом
if [ ! -d "/opt/remnawave" ] && [ ! -d "/opt/remnanode" ]; then
error "Сначала установите Remnawave (опция 1 -> 3)"
read -p "Нажмите Enter / Press Enter..."
else
install_selfsteal
read -p "Нажмите Enter / Press Enter..."
fi
;;
9)
if [ "$MENU_LANG" = "en" ]; then
save_language "ru"
else
save_language "en"
fi
;;
0)
log "Выход / Exit"
exit 0
;;
*)
warn "Неверный выбор / Invalid choice"
sleep 1
;;
esac
done
}
main