diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..94828cc --- /dev/null +++ b/CHANGELOG.md @@ -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) diff --git a/README.md b/README.md index d0813c4..c0db062 100644 --- a/README.md +++ b/README.md @@ -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)
✨ Новое -- 📱 Поддержка 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 +- ✅ Валидация пользовательского ввода + +
+ +
+🐛 Исправления + +- Критический баг: функции установки не были реализованы +- Критический баг: MTProxy конфигурация не сохранялась +- Критический баг: Selfsteal падал без Remnawave +- Баг: wg-manager.sh закрывался после действия +- Баг: устаревшая команда docker-compose
🔧 Улучшения -- Интерактивный выбор компонентов -- Улучшенная система меню -- Больше опций конфигурации -- Исправлена ошибка создания директории логов +- Обновлено на Docker Compose v2 +- Улучшена проверка зависимостей +- Улучшен UX с подтверждениями +- Более информативные сообщения об ошибках
+Полный список изменений: [CHANGELOG.md](CHANGELOG.md) + +### Version 2.1.0 (2026-04-22) + +- 📱 Поддержка MTProxy для Telegram +- 🔄 Выбор Reverse Proxy (Nginx/Caddy) +- 🎭 Selfsteal - маскировка под обычный сайт + --- ## 💬 Поддержка diff --git a/config/defaults.conf b/config/defaults.conf new file mode 100644 index 0000000..bc1a3ae --- /dev/null +++ b/config/defaults.conf @@ -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" diff --git a/install.sh b/install.sh index d5e284e..ce91e05 100755 --- a/install.sh +++ b/install.sh @@ -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 <> /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 < /etc/hysteria/config.yaml </dev/null + + cat > /etc/systemd/system/hysteria-server.service </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 </dev/null || firewall-cmd --permanent --add-port=$MTPROXY_PORT/tcp 2>/dev/null + cat > /opt/MTProxy/.config < /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 diff --git a/lib/common.sh b/lib/common.sh new file mode 100755 index 0000000..c16d605 --- /dev/null +++ b/lib/common.sh @@ -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 diff --git a/lib/logging.sh b/lib/logging.sh new file mode 100755 index 0000000..3c4aa95 --- /dev/null +++ b/lib/logging.sh @@ -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 diff --git a/lib/wireguard.sh b/lib/wireguard.sh new file mode 100755 index 0000000..cf6e3e4 --- /dev/null +++ b/lib/wireguard.sh @@ -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 < client.conf < "$NGINX_DIR/sites-available/3xui" < "$CADDY_DIR/Caddyfile" < "$HAPROXY_DIR/haproxy.cfg" <> "$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" < "$CADDY_DIR/Caddyfile" <