commit 1a43435f5fbb801ac2de37d9c03e0d41633ecdef Author: houseassassin <3976100+houseassassin@users.noreply.github.com> Date: Wed Apr 22 11:53:12 2026 +0300 feat: initialize proxy-core repository with management scripts, documentation, and licensing diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1faa023 --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +# Logs +*.log +logs/ + +# Temporary files +*.tmp +*.bak +*.swp +*~ + +# OS files +.DS_Store +Thumbs.db + +# IDE +.vscode/ +.idea/ +*.sublime-* + +# Backup files +*.backup +backup-*/ + +# Environment files +.env +.env.local +.env.*.local + +# Installation directories (on server) +/opt/remnawave/ +/opt/remnanode/ +/etc/wireguard/clients/ +/etc/hysteria/ + +# Certificates +*.pem +*.crt +*.key +*.csr + +# Archives +*.tar.gz +*.zip +*.rar + +# Test files +test/ +testing/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6412dec --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,122 @@ +# Contributing to Proxy-Core + +Спасибо за интерес к проекту! Мы рады любому вкладу. + +## 🤝 Как внести вклад + +### Сообщить об ошибке + +1. Проверьте, что проблема еще не была описана в [Issues](https://github.com/houseassassin/proxy-core/issues) +2. Создайте новый Issue с подробным описанием: + - Версия ОС + - Версия скрипта + - Шаги для воспроизведения + - Ожидаемое поведение + - Фактическое поведение + - Логи ошибок + +### Предложить улучшение + +1. Создайте Issue с описанием предложения +2. Объясните, почему это улучшение будет полезно +3. Приведите примеры использования + +### Отправить Pull Request + +1. Fork репозитория +2. Создайте ветку для вашей функции (`git checkout -b feature/amazing-feature`) +3. Внесите изменения +4. Протестируйте на чистой системе +5. Commit изменений (`git commit -m 'Add amazing feature'`) +6. Push в ветку (`git push origin feature/amazing-feature`) +7. Откройте Pull Request + +## 📝 Стандарты кода + +### Bash скрипты + +- Используйте `set -euo pipefail` в начале скриптов +- Добавляйте комментарии к сложным участкам +- Используйте функции для повторяющегося кода +- Проверяйте код с помощью `shellcheck` +- Используйте понятные имена переменных + +### Форматирование + +```bash +# Хорошо +function install_package() { + local package_name="$1" + log "Installing $package_name..." + apt-get install -y "$package_name" +} + +# Плохо +function inst() { + apt-get install -y $1 +} +``` + +### Обработка ошибок + +```bash +# Всегда проверяйте результат выполнения +if ! command -v docker &> /dev/null; then + error "Docker not found" + return 1 +fi + +# Используйте trap для очистки +trap cleanup EXIT +``` + +## 🧪 Тестирование + +Перед отправкой PR протестируйте на: +- Ubuntu 22.04 +- Debian 12 +- CentOS 9 (если возможно) + +Проверьте: +- Установку с нуля +- Обновление существующей установки +- Удаление компонентов +- Работу всех функций меню + +## 📚 Документация + +При добавлении новых функций: +- Обновите README.md +- Добавьте примеры использования +- Опишите требования +- Добавьте раздел в Troubleshooting (если нужно) + +## 🎨 Стиль коммитов + +Используйте понятные сообщения коммитов: + +``` +feat: добавлена поддержка Shadowsocks +fix: исправлена ошибка установки Docker +docs: обновлена документация по WireGuard +refactor: улучшена функция генерации паролей +test: добавлены тесты для SSL сертификатов +``` + +## 🔍 Code Review + +Все PR проходят review. Будьте готовы: +- Ответить на вопросы +- Внести изменения по замечаниям +- Обновить документацию + +## 📜 Лицензия + +Отправляя PR, вы соглашаетесь с лицензией MIT проекта. + +## 💬 Вопросы? + +- Создайте Issue +- Напишите в Telegram: [@houseassassin](https://t.me/houseassassin) + +Спасибо за вклад в Proxy-Core! 🚀 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..697864a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 VPN Panel Installer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PUBLISH.md b/PUBLISH.md new file mode 100644 index 0000000..7c86ee8 --- /dev/null +++ b/PUBLISH.md @@ -0,0 +1,226 @@ +# 🚀 Инструкция по публикации Proxy-Core на GitHub + +## Шаг 1: Инициализация Git репозитория + +```bash +cd "/Users/houseassassin/My Projects/proxy-core" + +# Инициализация репозитория +git init + +# Добавление всех файлов +git add . + +# Первый коммит +git commit -m "Initial commit: Proxy-Core v2.0.0 + +- Advanced VPN & Proxy Panel Auto-Installer +- Support for WireGuard, 3x-ui, Remnawave, Hysteria2 +- Multi-language interface (EN/RU) +- SSL certificates management (3 methods) +- Backup & restore functionality +- Interactive management interface" +``` + +## Шаг 2: Создание репозитория на GitHub + +1. Перейдите на https://github.com/new +2. Заполните форму: + - **Repository name:** `proxy-core` + - **Description:** `🚀 Advanced VPN & Proxy Panel Auto-Installer | WireGuard, 3x-ui, Remnawave, Hysteria2` + - **Public** ✅ + - **Add README:** ❌ (уже есть) + - **Add .gitignore:** ❌ (уже есть) + - **Choose a license:** ❌ (уже есть MIT) + +3. Нажмите **Create repository** + +## Шаг 3: Подключение к GitHub + +```bash +# Добавление remote +git remote add origin https://github.com/houseassassin/proxy-core.git + +# Или через SSH (если настроен) +git remote add origin git@github.com:houseassassin/proxy-core.git + +# Проверка +git remote -v +``` + +## Шаг 4: Отправка кода + +```bash +# Отправка в main ветку +git branch -M main +git push -u origin main +``` + +## Шаг 5: Настройка репозитория на GitHub + +### Topics (теги) + +Добавьте следующие topics в настройках репозитория: + +``` +vpn, proxy, wireguard, xray, 3x-ui, remnawave, hysteria2, +docker, bash, automation, installer, linux, ubuntu, debian, +centos, ssl, letsencrypt, cloudflare, reverse-proxy +``` + +### About + +``` +🚀 Advanced VPN & Proxy Panel Auto-Installer with support for WireGuard, 3x-ui, Remnawave, and Hysteria2. Multi-language interface, SSL management, backup/restore functionality. +``` + +### Website + +``` +https://github.com/houseassassin/proxy-core +``` + +## Шаг 6: Создание Release + +```bash +# Создание тега +git tag -a v2.0.0 -m "Release v2.0.0 + +Features: +- WireGuard support with client management +- 3x-ui panel integration +- Remnawave with Docker +- Hysteria2 proxy +- Multi-language interface (EN/RU) +- SSL certificates (Let's Encrypt, Cloudflare, Gcore) +- Backup & restore +- Interactive management interface +- BBR optimization +- Automatic swap creation" + +# Отправка тега +git push origin v2.0.0 +``` + +Затем на GitHub: +1. Перейдите в **Releases** → **Create a new release** +2. Выберите тег `v2.0.0` +3. Release title: `Proxy-Core v2.0.0 - Initial Release` +4. Описание: скопируйте из CHANGELOG в README.md +5. Нажмите **Publish release** + +## Шаг 7: Настройка GitHub Actions (опционально) + +Создайте `.github/workflows/shellcheck.yml`: + +```yaml +name: ShellCheck + +on: [push, pull_request] + +jobs: + shellcheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Run ShellCheck + uses: ludeeus/action-shellcheck@master + with: + scandir: '.' + severity: warning +``` + +## Шаг 8: Добавление бейджей в README + +Бейджи уже добавлены в README.md: +- License: MIT +- Version: 2.0.0 +- Bash: 5.0+ +- Docker: 20.10+ + +## Шаг 9: Создание Wiki (опционально) + +1. Перейдите в **Settings** → **Features** → включите **Wikis** +2. Создайте страницы: + - Home (главная) + - Installation Guide + - Configuration + - Troubleshooting + - FAQ + +## Шаг 10: Настройка Issues + +1. Перейдите в **Settings** → **Features** → включите **Issues** +2. Создайте Issue Templates: + - Bug Report + - Feature Request + - Question + +## Шаг 11: Продвижение + +### Поделитесь в: +- Reddit: r/selfhosted, r/VPN, r/linux +- Telegram: каналы про VPN и Linux +- Twitter/X: с хештегами #VPN #Linux #OpenSource +- Habr: статья о проекте + +### Добавьте в списки: +- Awesome Lists на GitHub +- AlternativeTo +- Product Hunt + +## Полезные команды Git + +```bash +# Проверка статуса +git status + +# Добавление изменений +git add . + +# Коммит +git commit -m "feat: добавлена новая функция" + +# Отправка +git push + +# Создание новой ветки +git checkout -b feature/new-feature + +# Слияние веток +git checkout main +git merge feature/new-feature + +# Просмотр истории +git log --oneline --graph + +# Откат изменений +git reset --hard HEAD~1 +``` + +## Структура коммитов + +Используйте Conventional Commits: + +- `feat:` - новая функция +- `fix:` - исправление бага +- `docs:` - изменения в документации +- `style:` - форматирование кода +- `refactor:` - рефакторинг +- `test:` - добавление тестов +- `chore:` - обновление зависимостей + +## Готово! 🎉 + +Ваш проект опубликован на GitHub! + +**URL:** https://github.com/houseassassin/proxy-core + +Не забудьте: +- ⭐ Попросить друзей поставить звезду +- 📢 Поделиться в соцсетях +- 📝 Отвечать на Issues +- 🔄 Регулярно обновлять проект +- 💬 Общаться с сообществом + +Удачи! 🚀 diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed8fbf7 --- /dev/null +++ b/README.md @@ -0,0 +1,320 @@ +# 🚀 Proxy-Core + +
+ +``` +╔═══════════════════════════════════════════════════════════════════╗ +║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║ +║ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝ ██╔════╝██╔═══██╗║ +║ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝█████╗██║ ██║ ██║║ +║ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝ ╚════╝██║ ██║ ██║║ +║ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║ ╚██████╗╚██████╔╝║ +║ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ║ +║ ║ +║ Advanced VPN & Proxy Panel Auto-Installer ║ +╚═══════════════════════════════════════════════════════════════════╝ +``` + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Version](https://img.shields.io/badge/version-2.0.0-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/) + +**Универсальный установщик и менеджер VPN/Proxy панелей с поддержкой множества протоколов** + +[Установка](#-быстрая-установка) • [Возможности](#-возможности) • [Документация](#-документация) • [Поддержка](#-поддержка) + +
+ +--- + +## 📋 О проекте + +**Proxy-Core** — это мощный инструмент для автоматической установки и управления VPN/Proxy панелями. Объединяет лучшие практики из популярных проектов и предоставляет единый интерфейс для работы с различными протоколами. + +### 🎯 Поддерживаемые панели + +| Панель | Протоколы | Особенности | +|--------|-----------|-------------| +| **WireGuard** | WireGuard | Быстрый, современный, безопасный VPN | +| **3x-ui** | VLESS, VMess, Trojan, Shadowsocks, XTLS | Веб-панель Xray с множеством протоколов | +| **Remnawave** | Multi-protocol | Современная панель с Docker и reverse proxy | +| **Hysteria2** | Hysteria2 | Высокоскоростной прокси с маскировкой трафика | + +### 💻 Поддерживаемые ОС + +
+ +| OS | Версии | Статус | +|:--:|:------:|:------:| +| 🐧 **Ubuntu** | 18.04, 20.04, 22.04, 24.04 | ✅ Полная поддержка | +| 🐧 **Debian** | 10, 11, 12 | ✅ Полная поддержка | +| 🎩 **CentOS** | 7, 8, 9 | ✅ Полная поддержка | +| 🎩 **RHEL** | 7, 8, 9 | ✅ Полная поддержка | +| 🎩 **Fedora** | 35+ | ✅ Полная поддержка | + +
+ +--- + +## ⚡ Быстрая установка + +### Метод 1: Одна команда (рекомендуется) + +```bash +bash <(curl -Ls https://raw.githubusercontent.com/houseassassin/proxy-core/main/install-advanced.sh) +``` + +### Метод 2: Скачать и запустить + +```bash +wget https://raw.githubusercontent.com/houseassassin/proxy-core/main/install-advanced.sh +chmod +x install-advanced.sh +sudo ./install-advanced.sh +``` + +### Метод 3: Клонировать репозиторий + +```bash +git clone https://github.com/houseassassin/proxy-core.git +cd proxy-core +chmod +x *.sh +sudo ./install-advanced.sh +``` + +--- + +## 🌟 Возможности + +
+ +### 🔧 Автоматизация + +
+ +- ✅ **Автоопределение ОС** — автоматическое определение дистрибутива и версии +- ✅ **Установка зависимостей** — Docker, Docker Compose, certbot и все необходимое +- ✅ **Генерация паролей** — автоматическая генерация безопасных паролей и ключей +- ✅ **Настройка firewall** — автоматическая конфигурация UFW/firewalld +- ✅ **BBR оптимизация** — включение BBR для улучшения производительности TCP +- ✅ **Swap управление** — автоматическое создание swap при нехватке RAM + +
+ +### 🔐 SSL/TLS сертификаты + +
+ +- 🔒 **Let's Encrypt** — HTTP-01 challenge для обычных доменов +- 🔒 **Cloudflare DNS** — DNS-01 challenge с поддержкой wildcard сертификатов +- 🔒 **Gcore DNS** — альтернативный DNS провайдер +- 🔒 **Самоподписанные** — для тестирования и локальных сетей +- 🔒 **Автообновление** — автоматическое обновление сертификатов через cron + +
+ +### 🎮 Управление + +
+ +- 📊 **Мониторинг** — статус сервисов, использование ресурсов, логи +- 🔄 **Обновления** — простое обновление всех компонентов +- 💾 **Резервное копирование** — ручное и автоматическое создание бэкапов +- 🔄 **Восстановление** — быстрое восстановление из резервных копий +- 👥 **Управление клиентами** — добавление, удаление, просмотр клиентов WireGuard +- 📱 **QR-коды** — генерация QR-кодов для мобильных устройств + +
+ +### 🌍 Интерфейс + +
+ +- 🇬🇧 **English** — полная поддержка английского языка +- 🇷🇺 **Русский** — полная поддержка русского языка +- 🎨 **Цветной вывод** — красивый и понятный интерфейс +- ⚡ **Spinner анимация** — визуализация длительных операций + +--- + +## 📖 Документация + +### 🚀 Быстрый старт + +#### 1. Установка WireGuard + +```bash +sudo ./install-advanced.sh +# Выберите: 1 (Install Panel) → 1 (WireGuard) +``` + +**Результат:** +- Сервер WireGuard на порту 51820 (или указанном) +- Конфигурация: `/etc/wireguard/wg0.conf` +- Автозапуск при загрузке системы + +#### 2. Установка 3x-ui + +```bash +sudo ./install-advanced.sh +# Выберите: 1 (Install Panel) → 2 (3x-ui) +``` + +**Результат:** +- Веб-панель: `http://YOUR_IP:2053` +- Логин: `admin` | Пароль: `admin` ⚠️ **СМЕНИТЕ!** + +#### 3. Установка Remnawave + +```bash +sudo ./install-advanced.sh +# Выберите: 1 (Install Panel) → 3 (Remnawave) +``` + +**Потребуется:** +- Домен (например: `vpn.example.com`) +- Email для SSL сертификата + +**Результат:** +- Панель: `https://YOUR_DOMAIN` +- Логин и пароль будут показаны после установки + +#### 4. Установка Hysteria2 + +```bash +sudo ./install-advanced.sh +# Выберите: 1 (Install Panel) → 4 (Hysteria2) +``` + +**Потребуется:** +- Домен для ACME сертификата +- Email для Let's Encrypt + +**Результат:** +- Конфигурация: `/etc/hysteria/config.yaml` +- Пароль и порт будут показаны + +--- + +### 🎮 Управление панелями + +#### Запуск менеджера + +```bash +sudo ./manage.sh +``` + +#### Меню менеджера + +``` +╔════════════════════════════════════════╗ +║ VPN Panel Management ║ +╚════════════════════════════════════════╝ + +1. Управление WireGuard +2. Управление 3x-ui +3. Управление Remnawave +4. Управление Hysteria2 +5. Системная информация +0. Выход +``` + +--- + +## 🔒 Безопасность + +### ✅ Рекомендации после установки + +1. **Смените пароли по умолчанию** +2. **Настройте firewall** +3. **Включите автообновления** +4. **Установите fail2ban** +5. **Настройте регулярные бэкапы** +6. **Мониторинг логов** + +Подробнее в [полной документации](docs/SECURITY.md). + +--- + +## 🐛 Troubleshooting + +### Основные проблемы + +- **WireGuard не запускается** → Проверьте IP forwarding +- **3x-ui недоступен** → Проверьте firewall и порт 2053 +- **Remnawave не работает** → Проверьте Docker контейнеры +- **SSL сертификаты** → Проверьте DNS и порт 80 + +Подробнее в [разделе Troubleshooting](docs/TROUBLESHOOTING.md). + +--- + +## 📊 Структура проекта + +``` +proxy-core/ +├── 📄 install-advanced.sh # Основной установщик +├── 🎮 manage.sh # Менеджер панелей +├── 🔧 wg-manager.sh # WireGuard менеджер +├── 🔄 update.sh # Обновление +├── 📄 install.sh # Базовый установщик +├── 📖 README.md # Документация +└── 📜 LICENSE # MIT License +``` + +--- + +## 🤝 Благодарности + +Проект основан на лучших практиках из: + +- [3dp-manager](https://github.com/denpiligrim/3dp-manager) +- [remnawave-reverse-proxy](https://github.com/eGamesAPI/remnawave-reverse-proxy) +- [remnawave-scripts](https://github.com/DigneZzZ/remnawave-scripts) +- [RemnaSetup](https://github.com/Capybara-z/RemnaSetup) + +Огромное спасибо авторам! 🙏 + +--- + +## 📝 Лицензия + +MIT License - свободное использование и модификация + +--- + +## 💬 Поддержка + +- **GitHub Issues:** [github.com/houseassassin/proxy-core/issues](https://github.com/houseassassin/proxy-core/issues) +- **Telegram:** [@houseassassin](https://t.me/houseassassin) + +--- + +## 🔄 Changelog + +### Version 2.0.0 (2026-04-22) + +✨ **Новое:** +- Поддержка Hysteria2 +- Улучшенное управление SSL (3 метода) +- Автоматическая настройка BBR +- Многоязычный интерфейс (EN/RU) +- Spinner анимация +- Система логирования + +🔧 **Улучшения:** +- Оптимизированная установка Docker +- Автоопределение Docker Compose v1/v2 +- Улучшенная обработка ошибок + +--- + +
+ +### 💖 Сделано с любовью by [houseassassin](https://github.com/houseassassin) + +**Если проект помог вам, поставьте ⭐ звезду!** + +[⬆ Наверх](#-proxy-core) + +
diff --git a/banner.sh b/banner.sh new file mode 100644 index 0000000..86b3658 --- /dev/null +++ b/banner.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Proxy-Core Banner +# Author: houseassassin + +show_banner() { + clear + echo -e "\033[1;36m" + cat << "EOF" +╔═══════════════════════════════════════════════════════════════════╗ +║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║ +║ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝ ██╔════╝██╔═══██╗║ +║ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝█████╗██║ ██║ ██║║ +║ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝ ╚════╝██║ ██║ ██║║ +║ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║ ╚██████╗╚██████╔╝║ +║ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ║ +║ ║ +║ Advanced VPN & Proxy Panel Auto-Installer ║ +╚═══════════════════════════════════════════════════════════════════╝ +EOF + echo -e "\033[0m" + echo -e "\033[1;32mVersion: 2.0.0\033[0m" + echo -e "\033[1;33mAuthor: houseassassin\033[0m" + echo -e "\033[1;34mGitHub: https://github.com/houseassassin/proxy-core\033[0m" + echo "" + echo -e "\033[0;36m────────────────────────────────────────────────────────────────────\033[0m" + echo "" +} + +show_banner diff --git a/install-advanced.sh b/install-advanced.sh new file mode 100755 index 0000000..6db80bb --- /dev/null +++ b/install-advanced.sh @@ -0,0 +1,622 @@ +#!/bin/bash + +# Proxy-Core - Advanced VPN & Proxy Panel Auto-Installer +# Version: 2.0.0 +# Author: houseassassin +# GitHub: https://github.com/houseassassin/proxy-core +# Supports: WireGuard, 3x-ui, Remnawave, Hysteria2 +# Based on: 3dp-manager, remnawave-reverse-proxy, remnawave-scripts, RemnaSetup + +set -euo pipefail + +SCRIPT_VERSION="2.0.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' + +# 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" +} + +# 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" + [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" + [ALL]="Установить всё" +) + +MENU_LANG="en" + +load_language() { + if [ -f "$LANG_FILE" ]; then + MENU_LANG=$(cat "$LANG_FILE" 2>/dev/null | tr -d '[:space:]') + fi +} + +save_language() { + mkdir -p "$(dirname "$LANG_FILE")" + echo "$1" > "$LANG_FILE" + MENU_LANG="$1" +} + +L() { + local key="$1" + local var_name="LANG_${MENU_LANG^^}_${key}" + echo "${!var_name:-$key}" +} + +# System checks +check_root() { + if [[ $EUID -ne 0 ]]; then + error "Этот скрипт должен быть запущен с правами root" + fi +} + +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + VER=$VERSION_ID + else + error "Не удалось определить операционную систему" + fi + log "Обнаружена ОС: $OS $VER" +} + +check_memory() { + local mem_mb=$(free -m | grep Mem: | awk '{print $2}') + if [ $mem_mb -lt 2000 ]; then + local swap_mb=$(free -m | grep Swap: | awk '{print $2}') + if [ $swap_mb -eq 0 ]; then + warn "Мало RAM ($mem_mb MB), создаём swap 2GB..." + fallocate -l 2G /swapfile || dd if=/dev/zero of=/swapfile bs=1M count=2048 + chmod 600 /swapfile + mkswap /swapfile + swapon /swapfile + echo '/swapfile none swap sw 0 0' >> /etc/fstab + success "Swap создан" + fi + fi +} + +# Network utilities +get_server_ip() { + curl -s -4 ifconfig.me || curl -s -4 api.ipify.org || curl -s -4 ipinfo.io/ip +} + +get_random_port() { + local MIN=${1:-3000} + local MAX=${2:-6999} + + while :; do + PORT=$(shuf -i "$MIN-$MAX" -n 1) + if ! ss -ltun | awk '{print $4}' | grep -q ":$PORT\$"; then + echo "$PORT" + return + fi + done +} + +check_domain() { + local domain="$1" + local domain_ip=$(dig +short A "$domain" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -n 1) + local server_ip=$(get_server_ip) + + if [ -z "$domain_ip" ] || [ -z "$server_ip" ]; then + warn "Не удалось проверить DNS домена $domain" + return 1 + fi + + if [ "$domain_ip" = "$server_ip" ]; then + return 0 + fi + + warn "IP домена ($domain_ip) не совпадает с IP сервера ($server_ip)" + return 1 +} + +# Docker management +resolve_compose_cmd() { + if docker compose version >/dev/null 2>&1; then + COMPOSE_CMD=("docker" "compose") + return 0 + fi + + if command -v docker-compose >/dev/null 2>&1; then + COMPOSE_CMD=("docker-compose") + return 0 + fi + + warn "Docker Compose не найден, устанавливаем..." + apt-get update + apt-get install -y docker-compose-plugin || apt-get install -y docker-compose + + if docker compose version >/dev/null 2>&1; then + COMPOSE_CMD=("docker" "compose") + return 0 + fi + + error "Не удалось установить Docker Compose" +} + +install_docker() { + if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then + log "Docker уже установлен" + resolve_compose_cmd + 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 + + resolve_compose_cmd + success "Docker установлен" +} + +# System packages +install_packages() { + log "Установка системных пакетов..." + + case $OS in + ubuntu|debian) + apt-get update -y + apt-get install -y curl wget git sudo ufw certbot \ + ca-certificates jq openssl tar net-tools \ + qrencode python3-certbot-dns-cloudflare \ + unattended-upgrades locales dnsutils coreutils \ + grep gawk python3-pip cron + ;; + centos|rhel|fedora) + yum update -y + yum install -y curl wget git sudo firewalld certbot \ + ca-certificates jq openssl tar net-tools qrencode + ;; + *) + error "Неподдерживаемая ОС: $OS" + ;; + 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 "Системные пакеты установлены" +} + +# SSL Certificates +get_ssl_certificate() { + local domain="$1" + local email="$2" + local method="${3:-standalone}" + + log "Получение SSL сертификата для $domain..." + + case $method in + standalone) + ufw allow 80/tcp >/dev/null 2>&1 + certbot certonly --standalone \ + -d "$domain" \ + --email "$email" \ + --agree-tos \ + --non-interactive \ + --http-01-port 80 \ + --key-type ecdsa \ + --elliptic-curve secp384r1 + ufw delete allow 80/tcp >/dev/null 2>&1 + ;; + cloudflare) + if [ -z "$CLOUDFLARE_API_KEY" ]; then + read -p "Введите Cloudflare API Token: " CLOUDFLARE_API_KEY + fi + + mkdir -p ~/.secrets/certbot + cat > ~/.secrets/certbot/cloudflare.ini < server_public.key + chmod 600 server_private.key + fi + + read -p "Введите порт WireGuard (по умолчанию 51820): " WG_PORT + WG_PORT=${WG_PORT:-51820} + + SERVER_PRIVATE_KEY=$(cat server_private.key) + SERVER_IP=$(get_server_ip) + + cat > /etc/wireguard/wg0.conf <> /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 + + success "WireGuard установлен на порту $WG_PORT" + log "Конфигурация: /etc/wireguard/wg0.conf" +} + +# 3x-ui installation +install_3xui() { + log "Установка 3x-ui..." + + bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) + + success "3x-ui установлен" + log "Панель доступна: http://$(get_server_ip):2053" + log "Логин: admin | Пароль: admin (СМЕНИТЕ!)" +} + +# Hysteria2 installation +install_hysteria2() { + log "Установка Hysteria2..." + + if systemctl cat hysteria-server.service &> /dev/null; then + log "Hysteria2 уже установлен" + return 0 + fi + + bash <(curl -fsSL https://get.hy2.sh/) + + local HY2_PORT=$(get_random_port 10000 20000) + local HY2_PASSWORD=$(openssl rand -base64 16 | tr -dc 'A-Za-z0-9' | cut -c1-16) + local HY2_OBFS=$(openssl rand -base64 16 | tr -dc 'A-Za-z0-9' | cut -c1-16) + + read -p "Введите домен для Hysteria2: " HY2_DOMAIN + read -p "Введите email для Let's Encrypt: " HY2_EMAIL + + cat > /etc/hysteria/config.yaml < .env < docker-compose.yml < nginx.conf < /dev/null; then + print_msg "Docker уже установлен" + return + 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..." + + case $OS in + ubuntu|debian) + apt-get install -y wireguard wireguard-tools qrencode + ;; + centos|rhel|fedora) + yum install -y epel-release + yum install -y wireguard-tools qrencode + ;; + esac + + mkdir -p /etc/wireguard + cd /etc/wireguard + + if [ ! -f server_private.key ]; then + wg genkey | tee server_private.key | wg pubkey > server_public.key + chmod 600 server_private.key + fi + + read -p "Введите порт WireGuard (по умолчанию 51820): " WG_PORT + WG_PORT=${WG_PORT:-51820} + + SERVER_PRIVATE_KEY=$(cat server_private.key) + SERVER_IP=$(curl -s ifconfig.me) + + cat > /etc/wireguard/wg0.conf <> /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" +} + +install_3xui() { + print_msg "Установка 3x-ui..." + + 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 < nginx.conf < public.key + chmod 600 private.key + + CLIENT_PRIVATE_KEY=$(cat private.key) + CLIENT_PUBLIC_KEY=$(cat public.key) + SERVER_PUBLIC_KEY=$(cat /etc/wireguard/server_public.key) + SERVER_IP=$(curl -s ifconfig.me) + SERVER_PORT=$(grep ListenPort /etc/wireguard/wg0.conf | awk '{print $3}') + + # Get next available IP + LAST_IP=$(grep "AllowedIPs" /etc/wireguard/wg0.conf | grep -oE "10\.0\.0\.[0-9]+" | sort -t . -k 4 -n | tail -1) + if [ -z "$LAST_IP" ]; then + CLIENT_IP="10.0.0.2" + else + LAST_NUM=$(echo $LAST_IP | cut -d. -f4) + NEXT_NUM=$((LAST_NUM + 1)) + CLIENT_IP="10.0.0.$NEXT_NUM" + fi + + # Add peer to server config + cat >> /etc/wireguard/wg0.conf < client.conf < /dev/null; then + error "3x-ui не установлен" + return 1 + fi + + while true; do + clear + echo -e "${BLUE}╔════════════════════════════════════════╗${NC}" + echo -e "${BLUE}║ 3x-ui Management ║${NC}" + echo -e "${BLUE}╚════════════════════════════════════════╝${NC}" + echo "" + echo -e "${YELLOW}1.${NC} Показать статус" + echo -e "${YELLOW}2.${NC} Запустить" + echo -e "${YELLOW}3.${NC} Остановить" + echo -e "${YELLOW}4.${NC} Перезапустить" + echo -e "${YELLOW}5.${NC} Показать логи" + echo -e "${YELLOW}6.${NC} Обновить" + echo -e "${YELLOW}7.${NC} Сбросить пароль" + echo -e "${YELLOW}0.${NC} Назад" + echo "" + read -p "Выберите опцию: " choice + + case $choice in + 1) + x-ui status + read -p "Нажмите Enter..." + ;; + 2) + x-ui start + success "3x-ui запущен" + sleep 2 + ;; + 3) + x-ui stop + success "3x-ui остановлен" + sleep 2 + ;; + 4) + x-ui restart + success "3x-ui перезапущен" + sleep 2 + ;; + 5) + x-ui log + ;; + 6) + bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) + success "3x-ui обновлен" + sleep 2 + ;; + 7) + x-ui reset + ;; + 0) + return 0 + ;; + *) + warn "Неверный выбор" + sleep 1 + ;; + esac + done +} + +# Remnawave Management +manage_remnawave() { + if [ ! -d "/opt/remnawave" ]; then + error "Remnawave не установлен" + return 1 + fi + + while true; do + clear + echo -e "${BLUE}╔════════════════════════════════════════╗${NC}" + echo -e "${BLUE}║ Remnawave Management ║${NC}" + echo -e "${BLUE}╚════════════════════════════════════════╝${NC}" + echo "" + echo -e "${YELLOW}1.${NC} Показать статус" + echo -e "${YELLOW}2.${NC} Запустить все сервисы" + echo -e "${YELLOW}3.${NC} Остановить все сервисы" + echo -e "${YELLOW}4.${NC} Перезапустить все сервисы" + echo -e "${YELLOW}5.${NC} Показать логи" + echo -e "${YELLOW}6.${NC} Обновить" + echo -e "${YELLOW}7.${NC} Резервное копирование" + echo -e "${YELLOW}8.${NC} Восстановить из бэкапа" + echo -e "${YELLOW}0.${NC} Назад" + echo "" + read -p "Выберите опцию: " choice + + case $choice in + 1) + cd /opt/remnawave + docker compose ps + read -p "Нажмите Enter..." + ;; + 2) + cd /opt/remnawave + docker compose up -d + success "Сервисы запущены" + sleep 2 + ;; + 3) + cd /opt/remnawave + docker compose down + success "Сервисы остановлены" + sleep 2 + ;; + 4) + cd /opt/remnawave + docker compose restart + success "Сервисы перезапущены" + sleep 2 + ;; + 5) + cd /opt/remnawave + docker compose logs -f + ;; + 6) + cd /opt/remnawave + docker compose pull + docker compose up -d + success "Remnawave обновлен" + sleep 2 + ;; + 7) + backup_remnawave + ;; + 8) + restore_remnawave + ;; + 0) + return 0 + ;; + *) + warn "Неверный выбор" + sleep 1 + ;; + esac + done +} + +backup_remnawave() { + local BACKUP_DIR="/root/remnawave-backups" + local TIMESTAMP=$(date +%Y%m%d_%H%M%S) + local BACKUP_FILE="$BACKUP_DIR/remnawave_backup_$TIMESTAMP.tar.gz" + + mkdir -p "$BACKUP_DIR" + + log "Создание резервной копии..." + + cd /opt/remnawave + docker compose down + + tar -czf "$BACKUP_FILE" \ + -C /opt remnawave \ + --exclude='remnawave/logs' \ + --exclude='remnawave/node_modules' + + docker compose up -d + + success "Резервная копия создана: $BACKUP_FILE" + read -p "Нажмите Enter..." +} + +restore_remnawave() { + local BACKUP_DIR="/root/remnawave-backups" + + if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A $BACKUP_DIR)" ]; then + error "Резервные копии не найдены" + read -p "Нажмите Enter..." + return 1 + fi + + echo "" + log "Доступные резервные копии:" + echo "" + + local i=1 + declare -A backups + for backup in "$BACKUP_DIR"/*.tar.gz; do + echo -e "${YELLOW}$i.${NC} $(basename $backup)" + backups[$i]="$backup" + ((i++)) + done + + echo "" + read -p "Выберите номер резервной копии: " choice + + if [ -z "${backups[$choice]}" ]; then + error "Неверный выбор" + return 1 + fi + + local BACKUP_FILE="${backups[$choice]}" + + warn "Это удалит текущую установку Remnawave!" + read -p "Продолжить? (y/N): " confirm + + if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then + log "Отменено" + return 0 + fi + + log "Восстановление из резервной копии..." + + cd /opt/remnawave + docker compose down + + rm -rf /opt/remnawave + tar -xzf "$BACKUP_FILE" -C /opt + + cd /opt/remnawave + docker compose up -d + + success "Восстановление завершено" + read -p "Нажмите Enter..." +} + +# Hysteria2 Management +manage_hysteria2() { + if ! systemctl cat hysteria-server.service &> /dev/null; then + error "Hysteria2 не установлен" + return 1 + fi + + while true; do + clear + echo -e "${BLUE}╔════════════════════════════════════════╗${NC}" + echo -e "${BLUE}║ Hysteria2 Management ║${NC}" + echo -e "${BLUE}╚════════════════════════════════════════╝${NC}" + echo "" + echo -e "${YELLOW}1.${NC} Показать статус" + echo -e "${YELLOW}2.${NC} Запустить" + echo -e "${YELLOW}3.${NC} Остановить" + echo -e "${YELLOW}4.${NC} Перезапустить" + echo -e "${YELLOW}5.${NC} Показать конфигурацию" + echo -e "${YELLOW}6.${NC} Редактировать конфигурацию" + echo -e "${YELLOW}0.${NC} Назад" + echo "" + read -p "Выберите опцию: " choice + + case $choice in + 1) + systemctl status hysteria-server.service --no-pager + read -p "Нажмите Enter..." + ;; + 2) + systemctl start hysteria-server.service + success "Hysteria2 запущен" + sleep 2 + ;; + 3) + systemctl stop hysteria-server.service + success "Hysteria2 остановлен" + sleep 2 + ;; + 4) + systemctl restart hysteria-server.service + success "Hysteria2 перезапущен" + sleep 2 + ;; + 5) + cat /etc/hysteria/config.yaml + read -p "Нажмите Enter..." + ;; + 6) + ${EDITOR:-nano} /etc/hysteria/config.yaml + systemctl restart hysteria-server.service + success "Конфигурация обновлена" + sleep 2 + ;; + 0) + return 0 + ;; + *) + warn "Неверный выбор" + sleep 1 + ;; + esac + done +} + +# Main menu +main_menu() { + while true; do + clear + echo -e "${BLUE}╔════════════════════════════════════════╗${NC}" + echo -e "${BLUE}║ VPN Panel Management ║${NC}" + echo -e "${BLUE}╚════════════════════════════════════════╝${NC}" + echo "" + echo -e "${YELLOW}1.${NC} Управление WireGuard" + echo -e "${YELLOW}2.${NC} Управление 3x-ui" + echo -e "${YELLOW}3.${NC} Управление Remnawave" + echo -e "${YELLOW}4.${NC} Управление Hysteria2" + echo -e "${YELLOW}5.${NC} Системная информация" + echo -e "${YELLOW}0.${NC} Выход" + echo "" + read -p "Выберите опцию: " choice + + case $choice in + 1) manage_wireguard ;; + 2) manage_3xui ;; + 3) manage_remnawave ;; + 4) manage_hysteria2 ;; + 5) + clear + echo -e "${GREEN}Системная информация:${NC}" + echo "" + echo -e "${BLUE}IP адрес:${NC} $(curl -s ifconfig.me)" + echo -e "${BLUE}ОС:${NC} $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)" + echo -e "${BLUE}Ядро:${NC} $(uname -r)" + echo -e "${BLUE}Uptime:${NC} $(uptime -p)" + echo -e "${BLUE}RAM:${NC} $(free -h | grep Mem: | awk '{print $3 "/" $2}')" + echo -e "${BLUE}Disk:${NC} $(df -h / | tail -1 | awk '{print $3 "/" $2 " (" $5 ")"}')" + echo "" + read -p "Нажмите Enter..." + ;; + 0) + log "Выход" + exit 0 + ;; + *) + warn "Неверный выбор" + sleep 1 + ;; + esac + done +} + +# Check root +if [[ $EUID -ne 0 ]]; then + error "Этот скрипт должен быть запущен с правами root" + exit 1 +fi + +main_menu diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..8d2260f --- /dev/null +++ b/update.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# Скрипт обновления панелей +# Version: 2.0.0 +# Author: houseassassin +# GitHub: https://github.com/houseassassin/proxy-core + +set -e + +GREEN='\033[0;32m' +RED='\033[0;31m' +NC='\033[0m' + +print_msg() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +check_root() { + if [[ $EUID -ne 0 ]]; then + print_error "Требуются права root" + exit 1 + fi +} + +update_3xui() { + print_msg "Обновление 3x-ui..." + bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) + print_msg "3x-ui обновлен" +} + +update_remnawave() { + print_msg "Обновление Remnawave..." + + if [ ! -d "/opt/remnawave" ]; then + print_error "Remnawave не установлен" + return + fi + + cd /opt/remnawave + docker-compose pull + docker-compose up -d + docker image prune -f + + print_msg "Remnawave обновлен" +} + +backup_configs() { + print_msg "Создание резервной копии конфигураций..." + + BACKUP_DIR="/root/vpn-backup-$(date +%Y%m%d-%H%M%S)" + mkdir -p "$BACKUP_DIR" + + [ -d "/etc/wireguard" ] && cp -r /etc/wireguard "$BACKUP_DIR/" + [ -d "/opt/remnawave" ] && cp -r /opt/remnawave/config "$BACKUP_DIR/remnawave-config" + [ -d "/usr/local/x-ui" ] && cp -r /usr/local/x-ui "$BACKUP_DIR/" + + print_msg "Резервная копия создана: $BACKUP_DIR" +} + +show_menu() { + clear + echo "╔════════════════════════════════════════╗" + echo "║ VPN Panel Updater ║" + echo "╚════════════════════════════════════════╝" + echo "" + echo "1) Обновить 3x-ui" + echo "2) Обновить Remnawave" + echo "3) Обновить все" + echo "4) Создать резервную копию" + echo "5) Выход" + echo "" + read -p "Ваш выбор [1-5]: " choice +} + +main() { + check_root + show_menu + + case $choice in + 1) + update_3xui + ;; + 2) + update_remnawave + ;; + 3) + update_3xui + update_remnawave + ;; + 4) + backup_configs + ;; + 5) + print_msg "Выход..." + exit 0 + ;; + *) + print_error "Неверный выбор" + exit 1 + ;; + esac +} + +main diff --git a/wg-manager.sh b/wg-manager.sh new file mode 100755 index 0000000..82852c1 --- /dev/null +++ b/wg-manager.sh @@ -0,0 +1,227 @@ +#!/bin/bash + +# Утилита для управления клиентами WireGuard +# Version: 2.0.0 +# Author: houseassassin +# GitHub: https://github.com/houseassassin/proxy-core + +set -e + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +WG_DIR="/etc/wireguard" +WG_CONF="$WG_DIR/wg0.conf" + +print_msg() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +check_root() { + if [[ $EUID -ne 0 ]]; then + print_error "Требуются права root" + exit 1 + fi +} + +get_next_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_client() { + read -p "Введите имя клиента: " CLIENT_NAME + + if [ -z "$CLIENT_NAME" ]; then + print_error "Имя клиента не может быть пустым" + exit 1 + fi + + CLIENT_DIR="$WG_DIR/clients/$CLIENT_NAME" + + if [ -d "$CLIENT_DIR" ]; then + print_error "Клиент $CLIENT_NAME уже существует" + exit 1 + fi + + mkdir -p "$CLIENT_DIR" + cd "$CLIENT_DIR" + + 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=$(curl -s ifconfig.me) + SERVER_PORT=$(grep ListenPort $WG_CONF | awk '{print $3}') + CLIENT_IP=$(get_next_ip) + + cat >> $WG_CONF < client.conf <