7e53b6ca34
✨ 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>
540 lines
21 KiB
Bash
Executable File
540 lines
21 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Reverse Proxy Manager for Proxy-Core
|
||
# Version: 2.1.1
|
||
# Author: houseassassin
|
||
# Supports: Nginx, Caddy, HAProxy
|
||
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
source "$SCRIPT_DIR/lib/common.sh"
|
||
|
||
# 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'
|
||
NC='\033[0m'
|
||
|
||
# Configuration
|
||
NGINX_DIR="/etc/nginx"
|
||
CADDY_DIR="/etc/caddy"
|
||
HAPROXY_DIR="/etc/haproxy"
|
||
|
||
# Detect installed reverse proxies
|
||
detect_installed_proxies() {
|
||
local proxies=()
|
||
|
||
if command_exists nginx; then
|
||
proxies+=("nginx")
|
||
fi
|
||
|
||
if command_exists caddy; then
|
||
proxies+=("caddy")
|
||
fi
|
||
|
||
if command_exists haproxy; then
|
||
proxies+=("haproxy")
|
||
fi
|
||
|
||
echo "${proxies[@]}"
|
||
}
|
||
|
||
# Install Nginx
|
||
install_nginx() {
|
||
log "Установка Nginx..."
|
||
|
||
case $OS in
|
||
ubuntu|debian)
|
||
apt-get update -y
|
||
apt-get install -y nginx nginx-extras certbot python3-certbot-nginx
|
||
;;
|
||
centos|rhel|fedora)
|
||
yum install -y nginx certbot python3-certbot-nginx
|
||
;;
|
||
esac
|
||
|
||
systemctl enable nginx
|
||
systemctl start nginx
|
||
|
||
success "Nginx установлен"
|
||
}
|
||
|
||
# Install Caddy
|
||
install_caddy() {
|
||
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 установлен"
|
||
}
|
||
|
||
# Install HAProxy
|
||
install_haproxy() {
|
||
log "Установка HAProxy..."
|
||
|
||
case $OS in
|
||
ubuntu|debian)
|
||
apt-get update -y
|
||
apt-get install -y haproxy certbot
|
||
;;
|
||
centos|rhel|fedora)
|
||
yum install -y haproxy certbot
|
||
;;
|
||
esac
|
||
|
||
systemctl enable haproxy
|
||
systemctl start haproxy
|
||
|
||
success "HAProxy установлен"
|
||
}
|
||
|
||
# Configure Nginx for 3x-ui
|
||
configure_nginx_3xui() {
|
||
log "Настройка Nginx для 3x-ui..."
|
||
|
||
read -p "Введите домен (например, vpn.example.com): " DOMAIN
|
||
read -p "Введите порт 3x-ui (по умолчанию 2053): " XRAY_PORT
|
||
XRAY_PORT=${XRAY_PORT:-2053}
|
||
|
||
cat > "$NGINX_DIR/sites-available/3xui" <<EOF
|
||
server {
|
||
listen 80;
|
||
listen [::]:80;
|
||
server_name $DOMAIN;
|
||
|
||
location /.well-known/acme-challenge/ {
|
||
root /var/www/html;
|
||
}
|
||
|
||
location / {
|
||
return 301 https://\$server_name\$request_uri;
|
||
}
|
||
}
|
||
|
||
server {
|
||
listen 443 ssl http2;
|
||
listen [::]:443 ssl http2;
|
||
server_name $DOMAIN;
|
||
|
||
ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
|
||
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
|
||
ssl_protocols TLSv1.2 TLSv1.3;
|
||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||
ssl_prefer_server_ciphers on;
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:$XRAY_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_set_header X-Forwarded-Proto \$scheme;
|
||
}
|
||
}
|
||
EOF
|
||
|
||
ln -sf "$NGINX_DIR/sites-available/3xui" "$NGINX_DIR/sites-enabled/"
|
||
|
||
log "Получение SSL сертификата..."
|
||
certbot certonly --nginx -d $DOMAIN --non-interactive --agree-tos --email admin@$DOMAIN
|
||
|
||
nginx -t && systemctl reload nginx
|
||
|
||
success "Nginx настроен для 3x-ui на домене $DOMAIN"
|
||
}
|
||
|
||
# Configure Caddy for 3x-ui
|
||
configure_caddy_3xui() {
|
||
log "Настройка Caddy для 3x-ui..."
|
||
|
||
read -p "Введите домен (например, vpn.example.com): " DOMAIN
|
||
read -p "Введите порт 3x-ui (по умолчанию 2053): " XRAY_PORT
|
||
XRAY_PORT=${XRAY_PORT:-2053}
|
||
|
||
cat > "$CADDY_DIR/Caddyfile" <<EOF
|
||
$DOMAIN {
|
||
reverse_proxy localhost:$XRAY_PORT {
|
||
header_up Host {host}
|
||
header_up X-Real-IP {remote}
|
||
header_up X-Forwarded-For {remote}
|
||
header_up X-Forwarded-Proto {scheme}
|
||
}
|
||
|
||
encode gzip
|
||
|
||
tls {
|
||
protocols tls1.2 tls1.3
|
||
}
|
||
}
|
||
EOF
|
||
|
||
caddy validate --config "$CADDY_DIR/Caddyfile"
|
||
systemctl reload caddy
|
||
|
||
success "Caddy настроен для 3x-ui на домене $DOMAIN"
|
||
}
|
||
|
||
# Configure HAProxy for load balancing
|
||
configure_haproxy_loadbalancer() {
|
||
log "Настройка HAProxy для балансировки нагрузки..."
|
||
|
||
read -p "Введите количество backend серверов: " BACKEND_COUNT
|
||
|
||
echo ""
|
||
log "Введите IP адреса backend серверов:"
|
||
declare -a BACKENDS
|
||
for ((i=1; i<=BACKEND_COUNT; i++)); do
|
||
read -p "Backend $i IP:PORT: " backend
|
||
BACKENDS+=("$backend")
|
||
done
|
||
|
||
cat > "$HAPROXY_DIR/haproxy.cfg" <<EOF
|
||
global
|
||
log /dev/log local0
|
||
log /dev/log local1 notice
|
||
chroot /var/lib/haproxy
|
||
stats socket /run/haproxy/admin.sock mode 660 level admin
|
||
stats timeout 30s
|
||
user haproxy
|
||
group haproxy
|
||
daemon
|
||
|
||
defaults
|
||
log global
|
||
mode tcp
|
||
option tcplog
|
||
option dontlognull
|
||
timeout connect 5000
|
||
timeout client 50000
|
||
timeout server 50000
|
||
|
||
frontend vpn_frontend
|
||
bind *:443
|
||
mode tcp
|
||
default_backend vpn_backend
|
||
|
||
backend vpn_backend
|
||
mode tcp
|
||
balance roundrobin
|
||
EOF
|
||
|
||
for i in "${!BACKENDS[@]}"; do
|
||
echo " server backend$((i+1)) ${BACKENDS[$i]} check" >> "$HAPROXY_DIR/haproxy.cfg"
|
||
done
|
||
|
||
haproxy -c -f "$HAPROXY_DIR/haproxy.cfg"
|
||
systemctl reload haproxy
|
||
|
||
success "HAProxy настроен для балансировки нагрузки"
|
||
}
|
||
|
||
# Configure Nginx + Caddy (hybrid)
|
||
configure_hybrid_nginx_caddy() {
|
||
log "Настройка гибридной конфигурации Nginx + Caddy..."
|
||
|
||
echo ""
|
||
echo -e "${CYAN}Гибридная конфигурация:${NC}"
|
||
echo "• Nginx - обработка статики и кэширование"
|
||
echo "• Caddy - автоматический SSL и проксирование"
|
||
echo ""
|
||
|
||
read -p "Введите домен: " DOMAIN
|
||
|
||
# Nginx для статики
|
||
cat > "$NGINX_DIR/sites-available/hybrid" <<EOF
|
||
server {
|
||
listen 8080;
|
||
server_name $DOMAIN;
|
||
|
||
root /var/www/html;
|
||
index index.html;
|
||
|
||
location /static/ {
|
||
expires 30d;
|
||
add_header Cache-Control "public, immutable";
|
||
}
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:8081;
|
||
proxy_http_version 1.1;
|
||
proxy_set_header Host \$host;
|
||
}
|
||
}
|
||
EOF
|
||
|
||
ln -sf "$NGINX_DIR/sites-available/hybrid" "$NGINX_DIR/sites-enabled/"
|
||
nginx -t && systemctl reload nginx
|
||
|
||
# Caddy для SSL
|
||
cat > "$CADDY_DIR/Caddyfile" <<EOF
|
||
$DOMAIN {
|
||
reverse_proxy localhost:8080
|
||
encode gzip
|
||
}
|
||
EOF
|
||
|
||
caddy validate --config "$CADDY_DIR/Caddyfile"
|
||
systemctl reload caddy
|
||
|
||
success "Гибридная конфигурация настроена"
|
||
}
|
||
|
||
# Show configuration tips
|
||
show_tips() {
|
||
clear
|
||
echo ""
|
||
echo -e "${MAGENTA}╔════════════════════════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${MAGENTA}║${NC} ${WHITE}💡 Подсказки по настройке Reverse Proxy${NC} ${MAGENTA}║${NC}"
|
||
echo -e "${MAGENTA}╚════════════════════════════════════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
|
||
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}╔═══════════════════════════════════════════════════════════════╗${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}╔═══════════════════════════════════════════════════════════════╗${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 -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 -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 для продолжения..."
|
||
}
|
||
|
||
# Main menu
|
||
show_main_menu() {
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
||
clear
|
||
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)
|
||
if [ -n "$installed" ]; then
|
||
echo -e " ${GREEN}✓${NC} ${WHITE}Установлено:${NC} ${CYAN}${installed}${NC}"
|
||
else
|
||
echo -e " ${GRAY}○${NC} ${GRAY}Ничего не установлено${NC}"
|
||
fi
|
||
echo ""
|
||
|
||
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 " ${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 " ${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 -e " ${GRAY}─────────────────────────────────────────────────────────────────${NC}"
|
||
echo ""
|
||
echo -e " ${YELLOW}0.${NC} 🚪 ${WHITE}Выход${NC}"
|
||
echo ""
|
||
echo -e " ${GRAY}─────────────────────────────────────────────────────────────────${NC}"
|
||
echo ""
|
||
}
|
||
|
||
# Show services status
|
||
show_status() {
|
||
clear
|
||
echo -e "${CYAN}Статус сервисов:${NC}"
|
||
echo ""
|
||
|
||
if command_exists nginx; then
|
||
echo -n "Nginx: "
|
||
if service_running nginx; then
|
||
echo -e "${GREEN}✓ Работает${NC}"
|
||
else
|
||
echo -e "${RED}✗ Остановлен${NC}"
|
||
fi
|
||
fi
|
||
|
||
if command_exists caddy; then
|
||
echo -n "Caddy: "
|
||
if service_running caddy; then
|
||
echo -e "${GREEN}✓ Работает${NC}"
|
||
else
|
||
echo -e "${RED}✗ Остановлен${NC}"
|
||
fi
|
||
fi
|
||
|
||
if command_exists haproxy; then
|
||
echo -n "HAProxy: "
|
||
if service_running haproxy; then
|
||
echo -e "${GREEN}✓ Работает${NC}"
|
||
else
|
||
echo -e "${RED}✗ Остановлен${NC}"
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
read -p "Нажмите Enter..."
|
||
}
|
||
|
||
# Main function
|
||
main() {
|
||
check_root
|
||
detect_os
|
||
|
||
while true; do
|
||
show_main_menu
|
||
read -p "Выберите опцию: " choice
|
||
|
||
case $choice in
|
||
1)
|
||
install_nginx
|
||
read -p "Нажмите Enter..."
|
||
;;
|
||
2)
|
||
install_caddy
|
||
read -p "Нажмите Enter..."
|
||
;;
|
||
3)
|
||
install_haproxy
|
||
read -p "Нажмите Enter..."
|
||
;;
|
||
4)
|
||
if ! command_exists nginx; then
|
||
error "Nginx не установлен. Установите сначала (опция 1)"
|
||
else
|
||
configure_nginx_3xui
|
||
fi
|
||
read -p "Нажмите Enter..."
|
||
;;
|
||
5)
|
||
if ! command_exists caddy; then
|
||
error "Caddy не установлен. Установите сначала (опция 2)"
|
||
else
|
||
configure_caddy_3xui
|
||
fi
|
||
read -p "Нажмите Enter..."
|
||
;;
|
||
6)
|
||
if ! command_exists haproxy; then
|
||
error "HAProxy не установлен. Установите сначала (опция 3)"
|
||
else
|
||
configure_haproxy_loadbalancer
|
||
fi
|
||
read -p "Нажмите Enter..."
|
||
;;
|
||
7)
|
||
if ! command_exists nginx || ! command_exists caddy; then
|
||
error "Требуются Nginx и Caddy. Установите сначала (опции 1 и 2)"
|
||
else
|
||
configure_hybrid_nginx_caddy
|
||
fi
|
||
read -p "Нажмите Enter..."
|
||
;;
|
||
8)
|
||
show_tips
|
||
;;
|
||
9)
|
||
show_status
|
||
;;
|
||
0)
|
||
log "Выход"
|
||
exit 0
|
||
;;
|
||
*)
|
||
warn "Неверный выбор"
|
||
sleep 1
|
||
;;
|
||
esac
|
||
done
|
||
}
|
||
|
||
main
|