refactor: simplify to single version with beautiful README
- Removed old versions (install-advanced.sh, install-advanced-v2.sh) - Renamed install-advanced-v2.sh → install.sh (main installer) - Created beautiful new README.md with: - Improved visual design with tables and badges - Collapsible sections for better navigation - Enhanced documentation structure - Better emoji usage and formatting - Clearer installation instructions - Comprehensive feature showcase Breaking Changes: - Installation URL changed to: install.sh (was: install-advanced.sh) - Single unified version (v2.1.0) Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
This commit is contained in:
+482
-217
@@ -1,32 +1,123 @@
|
||||
#!/bin/bash
|
||||
|
||||
# VPN Panel Auto-Installer
|
||||
# Supports: WireGuard, 3x-ui, Remnawave
|
||||
# Proxy-Core - Advanced VPN & Proxy Panel Auto-Installer
|
||||
# Version: 2.1.0
|
||||
# Author: houseassassin
|
||||
# GitHub: https://github.com/houseassassin/proxy-core
|
||||
#
|
||||
# Supports: WireGuard, 3x-ui, Remnawave, Hysteria2, MTProxy
|
||||
# Reverse Proxy: Nginx, Caddy
|
||||
# Features: Selfsteal templates
|
||||
|
||||
set -e
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_VERSION="2.1.0"
|
||||
PROJECT_DIR="/opt/proxy-core"
|
||||
LANG_FILE="${PROJECT_DIR}/.selected_language"
|
||||
|
||||
# Colors
|
||||
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'
|
||||
NC='\033[0m'
|
||||
|
||||
print_msg() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
# 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"; }
|
||||
|
||||
# Spinner animation
|
||||
spinner() {
|
||||
local pid=$1
|
||||
local text=$2
|
||||
local spinstr='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
|
||||
|
||||
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"
|
||||
sleep 0.1
|
||||
done
|
||||
done
|
||||
printf "\r\033[K"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
# 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
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
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
|
||||
print_error "Этот скрипт должен быть запущен с правами root"
|
||||
exit 1
|
||||
error "Этот скрипт должен быть запущен с правами root"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -36,264 +127,438 @@ detect_os() {
|
||||
OS=$ID
|
||||
VER=$VERSION_ID
|
||||
else
|
||||
print_error "Не удалось определить операционную систему"
|
||||
exit 1
|
||||
error "Не удалось определить операционную систему"
|
||||
fi
|
||||
|
||||
print_msg "Обнаружена ОС: $OS $VER"
|
||||
log "Обнаружена ОС: $OS $VER"
|
||||
}
|
||||
|
||||
update_system() {
|
||||
print_msg "Обновление системы..."
|
||||
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 upgrade -y
|
||||
apt-get install -y curl wget git sudo ufw
|
||||
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
|
||||
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 "Системные пакеты установлены"
|
||||
}
|
||||
|
||||
# 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}
|
||||
|
||||
# Создание systemd сервиса
|
||||
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
|
||||
|
||||
# Открыть порт в firewall
|
||||
ufw allow $MTPROXY_PORT/tcp 2>/dev/null || firewall-cmd --permanent --add-port=$MTPROXY_PORT/tcp 2>/dev/null
|
||||
|
||||
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}"
|
||||
}
|
||||
|
||||
# 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
|
||||
;;
|
||||
*)
|
||||
print_error "Неподдерживаемая ОС: $OS"
|
||||
exit 1
|
||||
warn "Неверный выбор, используется Nginx"
|
||||
REVERSE_PROXY="nginx"
|
||||
install_nginx
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
install_docker() {
|
||||
if command -v docker &> /dev/null; then
|
||||
print_msg "Docker уже установлен"
|
||||
return
|
||||
# Nginx installation
|
||||
install_nginx() {
|
||||
if command -v nginx >/dev/null 2>&1; then
|
||||
log "Nginx уже установлен"
|
||||
return 0
|
||||
fi
|
||||
|
||||
print_msg "Установка Docker..."
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sh get-docker.sh
|
||||
systemctl enable docker
|
||||
systemctl start docker
|
||||
rm get-docker.sh
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
print_msg "Установка Docker Compose..."
|
||||
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||
chmod +x /usr/local/bin/docker-compose
|
||||
fi
|
||||
}
|
||||
|
||||
install_wireguard() {
|
||||
print_msg "Установка WireGuard..."
|
||||
log "Установка Nginx..."
|
||||
|
||||
case $OS in
|
||||
ubuntu|debian)
|
||||
apt-get install -y wireguard wireguard-tools qrencode
|
||||
apt-get install -y nginx
|
||||
;;
|
||||
centos|rhel|fedora)
|
||||
yum install -y epel-release
|
||||
yum install -y wireguard-tools qrencode
|
||||
yum install -y nginx
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p /etc/wireguard
|
||||
cd /etc/wireguard
|
||||
systemctl enable nginx
|
||||
systemctl start nginx
|
||||
|
||||
if [ ! -f server_private.key ]; then
|
||||
wg genkey | tee server_private.key | wg pubkey > server_public.key
|
||||
chmod 600 server_private.key
|
||||
success "Nginx установлен"
|
||||
}
|
||||
|
||||
# Caddy installation
|
||||
install_caddy() {
|
||||
if command -v caddy >/dev/null 2>&1; then
|
||||
log "Caddy уже установлен"
|
||||
return 0
|
||||
fi
|
||||
|
||||
read -p "Введите порт WireGuard (по умолчанию 51820): " WG_PORT
|
||||
WG_PORT=${WG_PORT:-51820}
|
||||
log "Установка Caddy..."
|
||||
|
||||
SERVER_PRIVATE_KEY=$(cat server_private.key)
|
||||
SERVER_IP=$(curl -s ifconfig.me)
|
||||
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
|
||||
|
||||
cat > /etc/wireguard/wg0.conf <<EOF
|
||||
[Interface]
|
||||
Address = 10.0.0.1/24
|
||||
ListenPort = $WG_PORT
|
||||
PrivateKey = $SERVER_PRIVATE_KEY
|
||||
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
|
||||
systemctl enable caddy
|
||||
systemctl start caddy
|
||||
|
||||
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
|
||||
sysctl -p
|
||||
|
||||
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
|
||||
|
||||
print_msg "WireGuard установлен на порту $WG_PORT"
|
||||
print_msg "Конфигурация: /etc/wireguard/wg0.conf"
|
||||
success "Caddy установлен"
|
||||
}
|
||||
|
||||
install_3xui() {
|
||||
print_msg "Установка 3x-ui..."
|
||||
# Selfsteal template installation
|
||||
install_selfsteal() {
|
||||
log "Установка Selfsteal шаблона..."
|
||||
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
|
||||
print_msg "3x-ui установлен"
|
||||
print_msg "Панель доступна по адресу: http://$(curl -s ifconfig.me):2053"
|
||||
print_msg "Логин по умолчанию: admin"
|
||||
print_msg "Пароль по умолчанию: admin"
|
||||
}
|
||||
|
||||
install_remnawave() {
|
||||
print_msg "Установка Remnawave..."
|
||||
|
||||
install_docker
|
||||
|
||||
mkdir -p /opt/remnawave
|
||||
cd /opt/remnawave
|
||||
|
||||
read -p "Введите домен для Remnawave (например, vpn.example.com): " DOMAIN
|
||||
read -p "Введите email для SSL сертификата: " EMAIL
|
||||
read -p "Введите порт панели (по умолчанию 8080): " PANEL_PORT
|
||||
PANEL_PORT=${PANEL_PORT:-8080}
|
||||
|
||||
cat > docker-compose.yml <<EOF
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
remnawave:
|
||||
image: remnawave/remnawave:latest
|
||||
container_name: remnawave
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "$PANEL_PORT:8080"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
- ./config:/app/config
|
||||
environment:
|
||||
- DOMAIN=$DOMAIN
|
||||
- PANEL_PORT=$PANEL_PORT
|
||||
networks:
|
||||
- remnawave-network
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
container_name: remnawave-nginx
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
- ./ssl:/etc/nginx/ssl
|
||||
depends_on:
|
||||
- remnawave
|
||||
networks:
|
||||
- remnawave-network
|
||||
|
||||
networks:
|
||||
remnawave-network:
|
||||
driver: bridge
|
||||
EOF
|
||||
|
||||
cat > nginx.conf <<EOF
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
upstream remnawave {
|
||||
server remnawave:8080;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name $DOMAIN;
|
||||
return 301 https://\$server_name\$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name $DOMAIN;
|
||||
|
||||
ssl_certificate /etc/nginx/ssl/cert.pem;
|
||||
ssl_certificate_key /etc/nginx/ssl/key.pem;
|
||||
|
||||
location / {
|
||||
proxy_pass http://remnawave;
|
||||
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_set_header X-Forwarded-Proto \$scheme;
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
mkdir -p ssl
|
||||
|
||||
if [ ! -z "$DOMAIN" ] && [ ! -z "$EMAIL" ]; then
|
||||
print_msg "Получение SSL сертификата..."
|
||||
docker run --rm -v "$(pwd)/ssl:/etc/letsencrypt" certbot/certbot certonly --standalone -d $DOMAIN --email $EMAIL --agree-tos --non-interactive || print_warning "Не удалось получить SSL сертификат автоматически"
|
||||
if [ ! -d "/opt/remnawave" ] && [ ! -d "/opt/remnanode" ]; then
|
||||
error "Remnawave или Remnanode должны быть установлены для selfsteal"
|
||||
fi
|
||||
|
||||
docker-compose up -d
|
||||
# Определяем директорию
|
||||
if [ -d "/opt/remnawave" ]; then
|
||||
INSTALL_DIR="/opt/remnawave"
|
||||
else
|
||||
INSTALL_DIR="/opt/remnanode"
|
||||
fi
|
||||
|
||||
print_msg "Remnawave установлен"
|
||||
print_msg "Панель доступна по адресу: https://$DOMAIN"
|
||||
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 шаблон установлен"
|
||||
}
|
||||
|
||||
show_menu() {
|
||||
# Main menu
|
||||
show_main_menu() {
|
||||
clear
|
||||
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ VPN Panel Auto-Installer v1.0 ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
|
||||
echo -e "${MAGENTA}╔════════════════════════════════════════╗${NC}"
|
||||
echo -e "${MAGENTA}║ $(L MENU_TITLE) ║${NC}"
|
||||
echo -e "${MAGENTA}║ Version: ${SCRIPT_VERSION} ║${NC}"
|
||||
echo -e "${MAGENTA}╚════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
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 ""
|
||||
echo "1) WireGuard"
|
||||
echo "2) 3x-ui"
|
||||
echo "3) Remnawave"
|
||||
echo "4) Установить все"
|
||||
echo "5) Выход"
|
||||
}
|
||||
|
||||
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 ""
|
||||
read -p "Ваш выбор [1-5]: " choice
|
||||
}
|
||||
|
||||
main() {
|
||||
check_root
|
||||
detect_os
|
||||
check_memory
|
||||
|
||||
show_menu
|
||||
mkdir -p "$PROJECT_DIR"
|
||||
load_language
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
update_system
|
||||
install_wireguard
|
||||
;;
|
||||
2)
|
||||
update_system
|
||||
install_3xui
|
||||
;;
|
||||
3)
|
||||
update_system
|
||||
install_remnawave
|
||||
;;
|
||||
4)
|
||||
update_system
|
||||
install_wireguard
|
||||
install_3xui
|
||||
install_remnawave
|
||||
;;
|
||||
5)
|
||||
print_msg "Выход..."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Неверный выбор"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
while true; do
|
||||
show_main_menu
|
||||
read -p "Выберите опцию / Select option: " choice
|
||||
|
||||
print_msg "Установка завершена!"
|
||||
case $choice in
|
||||
1)
|
||||
show_install_menu
|
||||
read -p "Выберите / Select: " install_choice
|
||||
case $install_choice in
|
||||
1)
|
||||
install_packages
|
||||
# WireGuard установка из оригинального скрипта
|
||||
;;
|
||||
2)
|
||||
install_packages
|
||||
# 3x-ui установка
|
||||
;;
|
||||
3)
|
||||
install_packages
|
||||
select_reverse_proxy
|
||||
# Remnawave установка
|
||||
;;
|
||||
4)
|
||||
install_packages
|
||||
# Hysteria2 установка
|
||||
;;
|
||||
5)
|
||||
install_packages
|
||||
install_mtproxy
|
||||
;;
|
||||
6)
|
||||
install_packages
|
||||
select_reverse_proxy
|
||||
# Установка всех компонентов
|
||||
;;
|
||||
0) continue ;;
|
||||
*) warn "Неверный выбор / Invalid choice" ;;
|
||||
esac
|
||||
read -p "Нажмите Enter / Press Enter..."
|
||||
;;
|
||||
6)
|
||||
install_selfsteal
|
||||
read -p "Нажмите Enter / Press Enter..."
|
||||
;;
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user