feat: modularize project structure with new helper libraries, centralized configuration, and reverse proxy management

This commit is contained in:
houseassassin
2026-04-24 16:45:26 +03:00
parent 0115fd63e7
commit b844bc4e0e
10 changed files with 1404 additions and 66 deletions
+119
View File
@@ -0,0 +1,119 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [2.1.1] - 2026-04-24
### Added
-**Полная реализация функций установки всех панелей**
- `install_wireguard()` - автоматическая установка и настройка WireGuard
- `install_3xui()` - установка 3x-ui через официальный скрипт
- `install_remnawave()` - установка Remnawave с Docker и генерацией паролей
- `install_hysteria2()` - установка Hysteria2 с сертификатами и systemd
- Улучшенная `install_mtproxy()` с сохранением конфигурации
- 📱 **QR-код для MTProxy** - автоматическая генерация при установке
- 💾 **Сохранение конфигурации MTProxy** в `/opt/MTProxy/.config`
- 🔄 **Опция "Установить всё"** - последовательная установка всех панелей
- 🔁 **Цикл меню в wg-manager.sh** - меню больше не закрывается после действия
- 📚 **Общая библиотека функций** `lib/common.sh`:
- Функции валидации (порты, имена, IP)
- Сетевые утилиты (получение IP, генерация портов)
- Системные проверки (root, OS detection)
- Утилиты (spinner, confirm, генерация паролей)
- 📚 **Библиотека WireGuard** `lib/wireguard.sh` - общие функции для управления клиентами
- 📚 **Библиотека логирования** `lib/logging.sh` - централизованное логирование
- ⚙️ **Конфигурационный файл** `config/defaults.conf` - настройки по умолчанию
- 🔧 **Reverse Proxy Manager** `reverse-proxy-manager.sh`:
- Установка и настройка Nginx, Caddy, HAProxy
- Автоматическая настройка для 3x-ui
- Балансировка нагрузки с HAProxy
- Гибридные конфигурации (Nginx + Caddy)
- Подсказки и рекомендации по выбору
- 📁 **Структура проекта** - добавлены директории `lib/`, `config/`, `tests/`
### Fixed
- 🐛 **Критический баг**: функции установки панелей не были реализованы (только комментарии)
- 🐛 **Критический баг**: MTProxy конфигурация (SECRET и PORT) не сохранялась
- 🐛 **Критический баг**: Selfsteal падал с ошибкой если Remnawave не установлен
- 🐛 **Баг**: wg-manager.sh закрывался после каждого действия (отсутствовал цикл)
- 🐛 **Баг**: устаревшая команда `docker-compose` (заменена на `docker compose`)
### Changed
- 🔄 **Обновлено на Docker Compose v2** - использование `docker compose` вместо `docker-compose`
- 🔍 **Улучшена проверка зависимостей** в Selfsteal - автоопределение reverse proxy
- 🎨 **Улучшен UX** - добавлены подтверждения для критических операций
- 📝 **Улучшены сообщения об ошибках** - более информативные и понятные
### Security
- 🔒 **Валидация пользовательского ввода** - проверка портов, имён, IP адресов
- 🔒 **Безопасная генерация паролей** - использование `openssl rand`
- 🔒 **Проверка доступности портов** перед использованием
## [2.1.0] - 2026-04-22
### Added
- 📱 Поддержка MTProxy для Telegram
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
- 🎭 Selfsteal - маскировка под обычный сайт
- 📱 QR-коды для MTProxy
- 🎮 Менеджер MTProxy
### Changed
- Интерактивный выбор компонентов
- Улучшенная система меню
- Больше опций конфигурации
### Fixed
- Исправлена ошибка создания директории логов
## [2.0.0] - 2026-04-20
### Added
- Поддержка WireGuard VPN
- Поддержка 3x-ui Panel
- Поддержка Remnawave Panel
- Поддержка Hysteria2 Proxy
- Автоматическая установка Docker
- Настройка firewall (UFW/firewalld)
- BBR оптимизация TCP
- Автоматическое создание swap
- SSL/TLS сертификаты (Let's Encrypt, Cloudflare DNS, Gcore DNS)
- Мониторинг сервисов и ресурсов
- Резервное копирование и восстановление
- Управление клиентами WireGuard
- Генерация QR-кодов
- Многоязычность (EN/RU)
### Changed
- Полностью переписан установщик
- Улучшен интерфейс
- Добавлена модульность
## [1.0.0] - 2026-04-15
### Added
- Первый релиз
- Базовая установка VPN панелей
- Простое меню управления
---
## Типы изменений
- `Added` - новые функции
- `Changed` - изменения в существующем функционале
- `Deprecated` - функции, которые скоро будут удалены
- `Removed` - удалённые функции
- `Fixed` - исправления багов
- `Security` - исправления уязвимостей
---
## Ссылки
- [GitHub Repository](https://github.com/houseassassin/proxy-core)
- [Issues](https://github.com/houseassassin/proxy-core/issues)
- [Pull Requests](https://github.com/houseassassin/proxy-core/pulls)
+70 -21
View File
@@ -16,7 +16,7 @@
```
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Version](https://img.shields.io/badge/version-2.1.0-blue.svg)](https://github.com/houseassassin/proxy-core)
[![Version](https://img.shields.io/badge/version-2.1.1-blue.svg)](https://github.com/houseassassin/proxy-core)
[![Bash](https://img.shields.io/badge/bash-5.0+-green.svg)](https://www.gnu.org/software/bash/)
[![Docker](https://img.shields.io/badge/docker-20.10+-blue.svg)](https://www.docker.com/)
@@ -329,6 +329,9 @@ sudo ./wg-manager.sh
# Управление MTProxy
sudo ./mtproxy-manager.sh
# Управление Reverse Proxy (NEW!)
sudo ./reverse-proxy-manager.sh
# Общее управление панелями
sudo ./manage.sh
@@ -336,22 +339,44 @@ sudo ./manage.sh
sudo ./update.sh
```
### 🆕 Новое в версии 2.1.1
**Reverse Proxy Manager** - мощный инструмент для настройки:
- ✅ Nginx - высокая производительность и кэширование
- ✅ Caddy - автоматический SSL из коробки
- ✅ HAProxy - балансировка нагрузки
- ✅ Гибридные конфигурации (Nginx + Caddy)
- ✅ Подсказки и рекомендации по выбору
```bash
sudo ./reverse-proxy-manager.sh
```
---
## 📊 Структура проекта
```
proxy-core/
├── 📄 install.sh # Главный установщик v2.1.0
├── 🎮 manage.sh # Менеджер панелей
├── 🔧 wg-manager.sh # WireGuard менеджер
├── 📱 mtproxy-manager.sh # MTProxy менеджер
├── 🔄 update.sh # Обновление компонентов
├── 🎨 banner.sh # ASCII баннер
├── 📖 README.md # Документация
├── 📖 CONTRIBUTING.md # Руководство для участников
├── 📖 PUBLISH.md # Инструкция по публикации
└── 📜 LICENSE # MIT License
├── 📄 install.sh # Главный установщик v2.1.1
├── 🎮 manage.sh # Менеджер панелей
├── 🔧 wg-manager.sh # WireGuard менеджер
├── 📱 mtproxy-manager.sh # MTProxy менеджер
├── 🔄 update.sh # Обновление компонентов
├── 🌐 reverse-proxy-manager.sh # Reverse Proxy менеджер (NEW!)
├── 🎨 banner.sh # ASCII баннер
├── 📚 lib/ # Библиотеки (NEW!)
│ ├── common.sh # Общие функции
│ ├── wireguard.sh # WireGuard функции
│ └── logging.sh # Логирование
├── ⚙️ config/ # Конфигурация (NEW!)
│ └── defaults.conf # Настройки по умолчанию
├── 🧪 tests/ # Тесты (NEW!)
├── 📖 README.md # Документация
├── 📖 CHANGELOG.md # История изменений (NEW!)
├── 📖 CONTRIBUTING.md # Руководство для участников
├── 📖 PUBLISH.md # Инструкция по публикации
└── 📜 LICENSE # MIT License
```
---
@@ -377,29 +402,53 @@ proxy-core/
## 🔄 Changelog
### Version 2.1.0 (2026-04-22)
### Version 2.1.1 (2026-04-24)
<details>
<summary><b>✨ Новое</b></summary>
- 📱 Поддержка MTProxy для Telegram
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
- 🎭 Selfsteal - маскировка под обычный сайт
- 📱 QR-коды для MTProxy
- 🎮 Менеджер MTProxy
- 🚀 Полная реализация функций установки всех панелей
- 📚 Общая библиотека функций (lib/common.sh)
- 📚 Библиотека WireGuard (lib/wireguard.sh)
- 📚 Библиотека логирования (lib/logging.sh)
- ⚙️ Конфигурационный файл (config/defaults.conf)
- 🌐 Reverse Proxy Manager с поддержкой Nginx, Caddy, HAProxy
- 🔁 Цикл меню в wg-manager.sh
- 💾 Сохранение конфигурации MTProxy
- 📱 QR-код для MTProxy
- ✅ Валидация пользовательского ввода
</details>
<details>
<summary><b>🐛 Исправления</b></summary>
- Критический баг: функции установки не были реализованы
- Критический баг: MTProxy конфигурация не сохранялась
- Критический баг: Selfsteal падал без Remnawave
- Баг: wg-manager.sh закрывался после действия
- Баг: устаревшая команда docker-compose
</details>
<details>
<summary><b>🔧 Улучшения</b></summary>
- Интерактивный выбор компонентов
- Улучшенная система меню
- Больше опций конфигурации
- Исправлена ошибка создания директории логов
- Обновлено на Docker Compose v2
- Улучшена проверка зависимостей
- Улучшен UX с подтверждениями
- Более информативные сообщения об ошибках
</details>
Полный список изменений: [CHANGELOG.md](CHANGELOG.md)
### Version 2.1.0 (2026-04-22)
- 📱 Поддержка MTProxy для Telegram
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
- 🎭 Selfsteal - маскировка под обычный сайт
---
## 💬 Поддержка
+61
View File
@@ -0,0 +1,61 @@
# Proxy-Core Configuration
# Version: 2.1.1
# Author: houseassassin
# Directories
PROJECT_DIR="/opt/proxy-core"
WG_DIR="/etc/wireguard"
MTPROXY_DIR="/opt/MTProxy"
HYSTERIA_DIR="/etc/hysteria"
REMNAWAVE_DIR="/opt/remnawave"
NGINX_DIR="/etc/nginx"
CADDY_DIR="/etc/caddy"
HAPROXY_DIR="/etc/haproxy"
# Network Configuration
WG_SUBNET="10.0.0.0/24"
WG_SERVER_IP="10.0.0.1"
DNS_SERVERS="8.8.8.8,1.1.1.1"
# Port Ranges
WG_PORT_MIN=51820
WG_PORT_MAX=51900
MTPROXY_PORT_DEFAULT=8443
HYSTERIA_PORT_MIN=36712
HYSTERIA_PORT_MAX=36800
XRAY_PORT_MIN=10000
XRAY_PORT_MAX=10999
# SSL/TLS
SSL_CERT_DIR="/etc/ssl/proxy-core"
ACME_EMAIL=""
ACME_PROVIDER="letsencrypt"
# Logging
LOG_LEVEL="INFO"
LOG_RETENTION_DAYS=30
DEBUG=0
# Backup
BACKUP_DIR="/root/proxy-core-backups"
BACKUP_RETENTION_DAYS=7
# Docker
DOCKER_COMPOSE_VERSION="v2"
# Reverse Proxy Defaults
DEFAULT_REVERSE_PROXY="nginx"
ENABLE_HTTP2=true
ENABLE_HTTP3=false
ENABLE_BROTLI=true
ENABLE_GZIP=true
# Security
ENABLE_FAIL2BAN=true
ENABLE_UFW=true
SSH_PORT=22
# Performance
ENABLE_BBR=true
ENABLE_SWAP=true
SWAP_SIZE="2G"
+202 -20
View File
@@ -223,11 +223,164 @@ install_packages() {
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
@@ -237,7 +390,6 @@ install_mtproxy() {
;;
esac
# Клонирование репозитория
cd /opt
if [ -d "MTProxy" ]; then
rm -rf MTProxy
@@ -245,21 +397,16 @@ install_mtproxy() {
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
@@ -279,9 +426,14 @@ EOF
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
cat > /opt/MTProxy/.config <<EOF
MTPROXY_PORT=$MTPROXY_PORT
SECRET=$SECRET
EOF
chmod 600 /opt/MTProxy/.config
SERVER_IP=$(get_server_ip)
success "MTProxy установлен!"
@@ -293,6 +445,12 @@ EOF
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
@@ -380,15 +538,29 @@ install_caddy() {
install_selfsteal() {
log "Установка Selfsteal шаблона..."
if [ ! -d "/opt/remnawave" ] && [ ! -d "/opt/remnanode" ]; then
error "Remnawave или Remnanode должны быть установлены для selfsteal"
fi
# Определяем директорию
if [ -d "/opt/remnawave" ]; then
INSTALL_DIR="/opt/remnawave"
else
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 ""
@@ -509,20 +681,20 @@ main() {
case $install_choice in
1)
install_packages
# WireGuard установка из оригинального скрипта
install_wireguard
;;
2)
install_packages
# 3x-ui установка
install_3xui
;;
3)
install_packages
select_reverse_proxy
# Remnawave установка
install_remnawave
;;
4)
install_packages
# Hysteria2 установка
install_hysteria2
;;
5)
install_packages
@@ -531,7 +703,11 @@ main() {
6)
install_packages
select_reverse_proxy
# Установка всех компонентов
install_wireguard
install_3xui
install_remnawave
install_hysteria2
install_mtproxy
;;
0) continue ;;
*) warn "Неверный выбор / Invalid choice" ;;
@@ -539,8 +715,14 @@ main() {
read -p "Нажмите Enter / Press Enter..."
;;
6)
install_selfsteal
read -p "Нажмите Enter / Press Enter..."
# Проверка перед вызовом
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
Executable
+182
View File
@@ -0,0 +1,182 @@
#!/bin/bash
# Common functions library for Proxy-Core
# Version: 2.1.1
# Author: houseassassin
# 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'
# Logging functions
log() {
echo -e "${GREEN}[INFO]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
}
success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
# Validation functions
validate_port() {
local port=$1
if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
error "Неверный порт: $port (должен быть 1-65535)"
return 1
fi
return 0
}
validate_name() {
local name=$1
if [ -z "$name" ]; then
error "Имя не может быть пустым"
return 1
fi
if ! [[ "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
error "Неверное имя: $name (только буквы, цифры, _ и -)"
return 1
fi
return 0
}
check_port_available() {
local port=$1
if ss -ltun | awk '{print $4}' | grep -q ":$port\$"; then
error "Порт $port уже используется"
return 1
fi
return 0
}
validate_ip() {
local ip=$1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
return 0
else
error "Неверный IP адрес: $ip"
return 1
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 check_port_available "$PORT"; then
echo "$PORT"
return
fi
done
}
# System checks
check_root() {
if [[ $EUID -ne 0 ]]; then
error "Этот скрипт должен быть запущен с правами root"
exit 1
fi
}
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VER=$VERSION_ID
else
error "Не удалось определить операционную систему"
exit 1
fi
}
# 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"
}
# Confirmation prompt
confirm() {
local prompt="${1:-Продолжить?}"
local default="${2:-n}"
if [ "$default" = "y" ]; then
read -p "$prompt (Y/n): " response
response=${response:-y}
else
read -p "$prompt (y/N): " response
response=${response:-n}
fi
[[ "$response" =~ ^[Yy]$ ]]
}
# Generate random password
generate_password() {
local length=${1:-16}
openssl rand -base64 $length | tr -d "=+/" | cut -c1-$length
}
# Check if command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Check if service is running
service_running() {
systemctl is-active --quiet "$1"
}
# Wait for service to start
wait_for_service() {
local service=$1
local timeout=${2:-30}
local counter=0
while [ $counter -lt $timeout ]; do
if service_running "$service"; then
return 0
fi
sleep 1
((counter++))
done
return 1
}
# Export all functions
export -f log warn error success
export -f validate_port validate_name check_port_available validate_ip
export -f get_server_ip get_random_port
export -f check_root detect_os spinner confirm
export -f generate_password command_exists service_running wait_for_service
Executable
+56
View File
@@ -0,0 +1,56 @@
#!/bin/bash
# Logging library for Proxy-Core
# Version: 2.1.1
# Author: houseassassin
LOGDIR="/var/log/proxy-core"
mkdir -p "$LOGDIR" 2>/dev/null
# Source common for colors
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/common.sh" 2>/dev/null || true
log_to_file() {
local level=$1
local message=$2
local script=$(basename "${BASH_SOURCE[2]}" 2>/dev/null || echo "unknown")
local logfile="${LOGDIR}/$(date +%Y-%m-%d).log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$script] [$level] $message" >> "$logfile" 2>/dev/null
}
log() {
echo -e "${GREEN}[INFO]${NC} $1"
log_to_file "INFO" "$1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
log_to_file "ERROR" "$1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
log_to_file "WARN" "$1"
}
success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
log_to_file "SUCCESS" "$1"
}
debug() {
if [ "${DEBUG:-0}" = "1" ]; then
echo -e "${GRAY}[DEBUG]${NC} $1"
log_to_file "DEBUG" "$1"
fi
}
# Rotate logs older than 30 days
rotate_logs() {
find "$LOGDIR" -name "*.log" -mtime +30 -delete 2>/dev/null
}
# Export functions
export -f log_to_file log error warn success debug rotate_logs
+193
View File
@@ -0,0 +1,193 @@
#!/bin/bash
# WireGuard common functions library
# Version: 2.1.1
# Author: houseassassin
# Source common library
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/common.sh"
WG_DIR="${WG_DIR:-/etc/wireguard}"
WG_CONF="$WG_DIR/wg0.conf"
# Get next available IP for WireGuard client
get_next_wg_ip() {
if [ ! -f "$WG_CONF" ]; then
echo "10.0.0.2"
return
fi
LAST_IP=$(grep "AllowedIPs" "$WG_CONF" | grep -oE "10\.0\.0\.[0-9]+" | sort -t . -k 4 -n | tail -1)
if [ -z "$LAST_IP" ]; then
echo "10.0.0.2"
else
LAST_NUM=$(echo $LAST_IP | cut -d. -f4)
NEXT_NUM=$((LAST_NUM + 1))
echo "10.0.0.$NEXT_NUM"
fi
}
# Add WireGuard client
add_wireguard_client() {
local client_name=$1
if [ -z "$client_name" ]; then
read -p "Введите имя клиента: " client_name
fi
if ! validate_name "$client_name"; then
return 1
fi
local CLIENT_DIR="$WG_DIR/clients/$client_name"
if [ -d "$CLIENT_DIR" ]; then
error "Клиент $client_name уже существует"
return 1
fi
mkdir -p "$CLIENT_DIR"
cd "$CLIENT_DIR"
# Generate keys
wg genkey | tee private.key | wg pubkey > public.key
chmod 600 private.key
CLIENT_PRIVATE_KEY=$(cat private.key)
CLIENT_PUBLIC_KEY=$(cat public.key)
SERVER_PUBLIC_KEY=$(cat $WG_DIR/server_public.key)
SERVER_IP=$(get_server_ip)
SERVER_PORT=$(grep ListenPort $WG_CONF | awk '{print $3}')
CLIENT_IP=$(get_next_wg_ip)
# Add peer to server config
cat >> $WG_CONF <<EOF
[Peer]
# $client_name
PublicKey = $CLIENT_PUBLIC_KEY
AllowedIPs = $CLIENT_IP/32
EOF
# Create client config
cat > client.conf <<EOF
[Interface]
PrivateKey = $CLIENT_PRIVATE_KEY
Address = $CLIENT_IP/24
DNS = 8.8.8.8, 1.1.1.1
[Peer]
PublicKey = $SERVER_PUBLIC_KEY
Endpoint = $SERVER_IP:$SERVER_PORT
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
systemctl restart wg-quick@wg0
success "Клиент $client_name создан"
log "IP адрес: $CLIENT_IP"
log "Конфигурация: $CLIENT_DIR/client.conf"
echo ""
log "QR-код для мобильных устройств:"
if command_exists qrencode; then
qrencode -t ansiutf8 < client.conf
else
warn "qrencode не установлен, QR-код недоступен"
fi
echo ""
log "Конфигурация клиента:"
cat client.conf
}
# List WireGuard clients
list_wireguard_clients() {
log "Список клиентов WireGuard:"
echo ""
if [ ! -d "$WG_DIR/clients" ]; then
warn "Клиенты не найдены"
return
fi
for client in $WG_DIR/clients/*; do
if [ -d "$client" ]; then
CLIENT_NAME=$(basename "$client")
CLIENT_IP=$(grep -A 2 "# $CLIENT_NAME" $WG_CONF | grep AllowedIPs | awk '{print $3}' | cut -d/ -f1)
echo -e "${GREEN}${NC} $CLIENT_NAME ${BLUE}($CLIENT_IP)${NC}"
fi
done
}
# Remove WireGuard client
remove_wireguard_client() {
local client_name=$1
if [ -z "$client_name" ]; then
read -p "Введите имя клиента для удаления: " client_name
fi
if ! validate_name "$client_name"; then
return 1
fi
local CLIENT_DIR="$WG_DIR/clients/$client_name"
if [ ! -d "$CLIENT_DIR" ]; then
error "Клиент $client_name не найден"
return 1
fi
if ! confirm "Удалить клиента $client_name?"; then
log "Отменено"
return 0
fi
sed -i "/# $client_name/,+2d" $WG_CONF
rm -rf "$CLIENT_DIR"
systemctl restart wg-quick@wg0
success "Клиент $client_name удален"
}
# Show WireGuard client QR code
show_wireguard_qr() {
local client_name=$1
if [ -z "$client_name" ]; then
read -p "Введите имя клиента: " client_name
fi
if ! validate_name "$client_name"; then
return 1
fi
local CLIENT_DIR="$WG_DIR/clients/$client_name"
if [ ! -d "$CLIENT_DIR" ]; then
error "Клиент $client_name не найден"
return 1
fi
echo ""
log "Конфигурация клиента $client_name:"
cat "$CLIENT_DIR/client.conf"
echo ""
log "QR-код:"
if command_exists qrencode; then
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
else
error "qrencode не установлен"
return 1
fi
}
# Export functions
export -f get_next_wg_ip add_wireguard_client list_wireguard_clients
export -f remove_wireguard_client show_wireguard_qr
+493
View File
@@ -0,0 +1,493 @@
#!/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 -e "${MAGENTA}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${MAGENTA}║ Подсказки по настройке Reverse Proxy ║${NC}"
echo -e "${MAGENTA}╚════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${CYAN}📌 Nginx${NC}"
echo " ✓ Лучший выбор для высоких нагрузок"
echo " ✓ Отличное кэширование и обработка статики"
echo " ✓ Гибкая конфигурация"
echo " ✗ Требует ручной настройки SSL"
echo ""
echo -e "${CYAN}📌 Caddy${NC}"
echo " ✓ Автоматический SSL из коробки"
echo " ✓ Простая конфигурация"
echo " ✓ HTTP/3 поддержка"
echo " ✗ Меньше производительность чем Nginx"
echo ""
echo -e "${CYAN}📌 HAProxy${NC}"
echo " ✓ Лучший для балансировки нагрузки"
echo " ✓ TCP и HTTP режимы"
echo " ✓ Продвинутые health checks"
echo " ✗ Не обрабатывает SSL (нужен Nginx/Caddy)"
echo ""
echo -e "${CYAN}📌 Гибридные решения${NC}"
echo " • Nginx + Caddy: статика + автоSSL"
echo " • HAProxy + Nginx: балансировка + кэш"
echo " • Caddy + HAProxy: автоSSL + балансировка"
echo ""
echo -e "${YELLOW}Рекомендации:${NC}"
echo " 1. Для простых VPN панелей: Caddy"
echo " 2. Для высоких нагрузок: Nginx"
echo " 3. Для кластера серверов: HAProxy + Nginx"
echo " 4. Для максимальной автоматизации: Caddy"
echo ""
read -p "Нажмите Enter для продолжения..."
}
# Main menu
show_main_menu() {
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 ""
local installed=$(detect_installed_proxies)
echo -e "${CYAN}Установлено:${NC} ${installed:-нет}"
echo ""
echo -e "${YELLOW}Установка:${NC}"
echo " 1) Установить Nginx"
echo " 2) Установить Caddy"
echo " 3) Установить HAProxy"
echo ""
echo -e "${YELLOW}Настройка:${NC}"
echo " 4) Настроить Nginx для 3x-ui"
echo " 5) Настроить Caddy для 3x-ui"
echo " 6) Настроить HAProxy (балансировка)"
echo " 7) Настроить Nginx + Caddy (гибрид)"
echo ""
echo -e "${YELLOW}Информация:${NC}"
echo " 8) Показать подсказки"
echo " 9) Статус сервисов"
echo ""
echo " 0) Выход"
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
+2 -2
View File
@@ -41,8 +41,8 @@ update_remnawave() {
fi
cd /opt/remnawave
docker-compose pull
docker-compose up -d
docker compose pull
docker compose up -d
docker image prune -f
print_msg "Remnawave обновлен"
+26 -23
View File
@@ -198,30 +198,33 @@ main() {
exit 1
fi
show_menu
while true; do
show_menu
case $choice in
1)
add_client
;;
2)
list_clients
;;
3)
show_client
;;
4)
remove_client
;;
5)
print_msg "Выход..."
exit 0
;;
*)
print_error "Неверный выбор"
exit 1
;;
esac
case $choice in
1)
add_client
;;
2)
list_clients
read -p "Нажмите Enter..."
;;
3)
show_client
;;
4)
remove_client
;;
5)
print_msg "Выход..."
exit 0
;;
*)
print_error "Неверный выбор"
sleep 1
;;
esac
done
}
main