feat: initialize proxy-core repository with management scripts, documentation, and licensing

This commit is contained in:
houseassassin
2026-04-22 11:53:12 +03:00
commit 1a43435f5f
11 changed files with 2589 additions and 0 deletions
+48
View File
@@ -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/
+122
View File
@@ -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! 🚀
+21
View File
@@ -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.
+226
View File
@@ -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
- 🔄 Регулярно обновлять проект
- 💬 Общаться с сообществом
Удачи! 🚀
+320
View File
@@ -0,0 +1,320 @@
# 🚀 Proxy-Core
<div align="center">
```
╔═══════════════════════════════════════════════════════════════════╗
║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║
║ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝ ██╔════╝██╔═══██╗║
║ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝█████╗██║ ██║ ██║║
║ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝ ╚════╝██║ ██║ ██║║
║ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║ ╚██████╗╚██████╔╝║
║ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ║
║ ║
║ 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 панелей с поддержкой множества протоколов**
[Установка](#-быстрая-установка) • [Возможности](#-возможности) • [Документация](#-документация) • [Поддержка](#-поддержка)
</div>
---
## 📋 О проекте
**Proxy-Core** — это мощный инструмент для автоматической установки и управления VPN/Proxy панелями. Объединяет лучшие практики из популярных проектов и предоставляет единый интерфейс для работы с различными протоколами.
### 🎯 Поддерживаемые панели
| Панель | Протоколы | Особенности |
|--------|-----------|-------------|
| **WireGuard** | WireGuard | Быстрый, современный, безопасный VPN |
| **3x-ui** | VLESS, VMess, Trojan, Shadowsocks, XTLS | Веб-панель Xray с множеством протоколов |
| **Remnawave** | Multi-protocol | Современная панель с Docker и reverse proxy |
| **Hysteria2** | Hysteria2 | Высокоскоростной прокси с маскировкой трафика |
### 💻 Поддерживаемые ОС
<div align="center">
| OS | Версии | Статус |
|:--:|:------:|:------:|
| 🐧 **Ubuntu** | 18.04, 20.04, 22.04, 24.04 | ✅ Полная поддержка |
| 🐧 **Debian** | 10, 11, 12 | ✅ Полная поддержка |
| 🎩 **CentOS** | 7, 8, 9 | ✅ Полная поддержка |
| 🎩 **RHEL** | 7, 8, 9 | ✅ Полная поддержка |
| 🎩 **Fedora** | 35+ | ✅ Полная поддержка |
</div>
---
## ⚡ Быстрая установка
### Метод 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
```
---
## 🌟 Возможности
<div align="center">
### 🔧 Автоматизация
</div>
-**Автоопределение ОС** — автоматическое определение дистрибутива и версии
-**Установка зависимостей** — Docker, Docker Compose, certbot и все необходимое
-**Генерация паролей** — автоматическая генерация безопасных паролей и ключей
-**Настройка firewall** — автоматическая конфигурация UFW/firewalld
-**BBR оптимизация** — включение BBR для улучшения производительности TCP
-**Swap управление** — автоматическое создание swap при нехватке RAM
<div align="center">
### 🔐 SSL/TLS сертификаты
</div>
- 🔒 **Let's Encrypt** — HTTP-01 challenge для обычных доменов
- 🔒 **Cloudflare DNS** — DNS-01 challenge с поддержкой wildcard сертификатов
- 🔒 **Gcore DNS** — альтернативный DNS провайдер
- 🔒 **Самоподписанные** — для тестирования и локальных сетей
- 🔒 **Автообновление** — автоматическое обновление сертификатов через cron
<div align="center">
### 🎮 Управление
</div>
- 📊 **Мониторинг** — статус сервисов, использование ресурсов, логи
- 🔄 **Обновления** — простое обновление всех компонентов
- 💾 **Резервное копирование** — ручное и автоматическое создание бэкапов
- 🔄 **Восстановление** — быстрое восстановление из резервных копий
- 👥 **Управление клиентами** — добавление, удаление, просмотр клиентов WireGuard
- 📱 **QR-коды** — генерация QR-кодов для мобильных устройств
<div align="center">
### 🌍 Интерфейс
</div>
- 🇬🇧 **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
- Улучшенная обработка ошибок
---
<div align="center">
### 💖 Сделано с любовью by [houseassassin](https://github.com/houseassassin)
**Если проект помог вам, поставьте ⭐ звезду!**
[⬆ Наверх](#-proxy-core)
</div>
+30
View File
@@ -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
+622
View File
@@ -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 <<EOL
dns_cloudflare_api_token = $CLOUDFLARE_API_KEY
EOL
chmod 600 ~/.secrets/certbot/cloudflare.ini
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
--dns-cloudflare-propagation-seconds 60 \
-d "$domain" \
-d "*.$domain" \
--email "$email" \
--agree-tos \
--non-interactive \
--key-type ecdsa \
--elliptic-curve secp384r1
;;
esac
if [ -d "/etc/letsencrypt/live/$domain" ]; then
success "SSL сертификат получен для $domain"
return 0
else
error "Не удалось получить SSL сертификат"
fi
}
# 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 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=$(get_server_ip)
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.0.0.1/24
ListenPort = $WG_PORT
PrivateKey = $SERVER_PRIVATE_KEY
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
ufw allow $WG_PORT/udp 2>/dev/null || firewall-cmd --permanent --add-port=$WG_PORT/udp 2>/dev/null
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 <<EOF
listen: :$HY2_PORT
acme:
domains:
- $HY2_DOMAIN
email: $HY2_EMAIL
auth:
type: password
password: $HY2_PASSWORD
obfs:
type: salamander
salamander:
password: $HY2_OBFS
masquerade:
type: proxy
proxy:
url: https://www.google.com/
rewriteHost: true
EOF
systemctl daemon-reload
systemctl enable --now hysteria-server.service
systemctl restart hysteria-server.service
success "Hysteria2 установлен на порту $HY2_PORT"
log "Пароль: $HY2_PASSWORD"
log "Obfs: $HY2_OBFS"
}
# Remnawave installation
install_remnawave() {
log "Установка Remnawave..."
install_docker
mkdir -p /opt/remnawave
cd /opt/remnawave
read -p "Введите домен для Remnawave: " REMNA_DOMAIN
read -p "Введите email для SSL: " REMNA_EMAIL
local DB_PASS=$(openssl rand -base64 12)
local JWT_SECRET=$(openssl rand -base64 32)
local ADMIN_USER=$(openssl rand -base64 8)
local ADMIN_PASS=$(openssl rand -base64 12)
cat > .env <<EOF
DB_HOST=postgres
DB_PORT=5432
DB_USERNAME=admin
DB_PASSWORD=${DB_PASS}
DB_NAME=remnawave
JWT_SECRET=${JWT_SECRET}
ADMIN_LOGIN=${ADMIN_USER}
ADMIN_PASSWORD=${ADMIN_PASS}
PORT=3100
EOF
get_ssl_certificate "$REMNA_DOMAIN" "$REMNA_EMAIL" "standalone"
cat > docker-compose.yml <<EOF
version: '3.8'
services:
postgres:
image: postgres:16-alpine
container_name: remnawave-postgres
restart: always
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: ${DB_PASS}
POSTGRES_DB: remnawave
volumes:
- pg_data:/var/lib/postgresql/data
networks:
- remnawave-network
backend:
image: ghcr.io/remnawave/backend:latest
container_name: remnawave-backend
restart: always
depends_on:
- postgres
env_file:
- .env
networks:
- remnawave-network
frontend:
image: nginx:alpine
container_name: remnawave-frontend
restart: always
depends_on:
- backend
ports:
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/letsencrypt/live/${REMNA_DOMAIN}/fullchain.pem:/etc/nginx/ssl/fullchain.pem:ro
- /etc/letsencrypt/live/${REMNA_DOMAIN}/privkey.pem:/etc/nginx/ssl/privkey.pem:ro
networks:
- remnawave-network
volumes:
pg_data:
networks:
remnawave-network:
driver: bridge
EOF
cat > nginx.conf <<EOF
events {
worker_connections 1024;
}
http {
upstream backend {
server backend:3100;
}
server {
listen 443 ssl http2;
server_name ${REMNA_DOMAIN};
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location / {
proxy_pass http://backend;
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
"${COMPOSE_CMD[@]}" up -d
success "Remnawave установлен"
log "Панель: https://${REMNA_DOMAIN}"
log "Логин: ${ADMIN_USER}"
log "Пароль: ${ADMIN_PASS}"
}
# Main menu
show_main_menu() {
clear
echo -e "${MAGENTA}╔════════════════════════════════════════╗${NC}"
echo -e "${MAGENTA}$(L MENU_TITLE)${NC}"
echo -e "${MAGENTA}║ Version: ${SCRIPT_VERSION}${NC}"
echo -e "${MAGENTA}╚════════════════════════════════════════╝${NC}"
echo ""
echo -e "${YELLOW}1.${NC} $(L MENU_INSTALL)"
echo -e "${YELLOW}2.${NC} $(L MENU_MANAGE)"
echo -e "${YELLOW}3.${NC} $(L MENU_BACKUP)"
echo -e "${YELLOW}4.${NC} $(L MENU_UPDATE)"
echo -e "${YELLOW}5.${NC} $(L MENU_UNINSTALL)"
echo -e "${YELLOW}9.${NC} Сменить язык / Change language"
echo -e "${YELLOW}0.${NC} $(L MENU_EXIT)"
echo ""
}
show_install_menu() {
clear
echo -e "${GREEN}$(L SELECT_PANEL)${NC}"
echo ""
echo -e "${YELLOW}1.${NC} $(L WIREGUARD)"
echo -e "${YELLOW}2.${NC} $(L 3XUI)"
echo -e "${YELLOW}3.${NC} $(L REMNAWAVE)"
echo -e "${YELLOW}4.${NC} $(L HYSTERIA2)"
echo -e "${YELLOW}5.${NC} $(L ALL)"
echo -e "${YELLOW}0.${NC} Назад / Back"
echo ""
}
main() {
check_root
detect_os
check_memory
mkdir -p "$PROJECT_DIR"
load_language
while true; do
show_main_menu
read -p "Выберите опцию / Select option: " choice
case $choice in
1)
show_install_menu
read -p "Выберите / Select: " install_choice
case $install_choice in
1) install_packages; install_wireguard ;;
2) install_packages; install_3xui ;;
3) install_packages; install_remnawave ;;
4) install_packages; install_hysteria2 ;;
5)
install_packages
install_wireguard
install_3xui
install_hysteria2
;;
0) continue ;;
*) warn "Неверный выбор / Invalid choice" ;;
esac
read -p "Нажмите Enter / Press Enter..."
;;
9)
if [ "$MENU_LANG" = "en" ]; then
save_language "ru"
else
save_language "en"
fi
;;
0)
log "Выход / Exit"
exit 0
;;
*)
warn "Неверный выбор / Invalid choice"
sleep 1
;;
esac
done
}
main
Executable
+299
View File
@@ -0,0 +1,299 @@
#!/bin/bash
# VPN Panel Auto-Installer
# Supports: WireGuard, 3x-ui, Remnawave
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
print_msg() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
check_root() {
if [[ $EUID -ne 0 ]]; then
print_error "Этот скрипт должен быть запущен с правами root"
exit 1
fi
}
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
VER=$VERSION_ID
else
print_error "Не удалось определить операционную систему"
exit 1
fi
print_msg "Обнаружена ОС: $OS $VER"
}
update_system() {
print_msg "Обновление системы..."
case $OS in
ubuntu|debian)
apt-get update -y
apt-get upgrade -y
apt-get install -y curl wget git sudo ufw
;;
centos|rhel|fedora)
yum update -y
yum install -y curl wget git sudo firewalld
;;
*)
print_error "Неподдерживаемая ОС: $OS"
exit 1
;;
esac
}
install_docker() {
if command -v docker &> /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 <<EOF
[Interface]
Address = 10.0.0.1/24
ListenPort = $WG_PORT
PrivateKey = $SERVER_PRIVATE_KEY
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
ufw allow $WG_PORT/udp 2>/dev/null || firewall-cmd --permanent --add-port=$WG_PORT/udp 2>/dev/null
print_msg "WireGuard установлен на порту $WG_PORT"
print_msg "Конфигурация: /etc/wireguard/wg0.conf"
}
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 <<EOF
version: '3.8'
services:
remnawave:
image: remnawave/remnawave:latest
container_name: remnawave
restart: unless-stopped
ports:
- "$PANEL_PORT:8080"
volumes:
- ./data:/app/data
- ./config:/app/config
environment:
- DOMAIN=$DOMAIN
- PANEL_PORT=$PANEL_PORT
networks:
- remnawave-network
nginx:
image: nginx:alpine
container_name: remnawave-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl
depends_on:
- remnawave
networks:
- remnawave-network
networks:
remnawave-network:
driver: bridge
EOF
cat > nginx.conf <<EOF
events {
worker_connections 1024;
}
http {
upstream remnawave {
server remnawave:8080;
}
server {
listen 80;
server_name $DOMAIN;
return 301 https://\$server_name\$request_uri;
}
server {
listen 443 ssl http2;
server_name $DOMAIN;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://remnawave;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
}
EOF
mkdir -p ssl
if [ ! -z "$DOMAIN" ] && [ ! -z "$EMAIL" ]; then
print_msg "Получение SSL сертификата..."
docker run --rm -v "$(pwd)/ssl:/etc/letsencrypt" certbot/certbot certonly --standalone -d $DOMAIN --email $EMAIL --agree-tos --non-interactive || print_warning "Не удалось получить SSL сертификат автоматически"
fi
docker-compose up -d
print_msg "Remnawave установлен"
print_msg "Панель доступна по адресу: https://$DOMAIN"
}
show_menu() {
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ VPN Panel Auto-Installer v1.0 ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════╝${NC}"
echo ""
echo "Выберите панель для установки:"
echo ""
echo "1) WireGuard"
echo "2) 3x-ui"
echo "3) Remnawave"
echo "4) Установить все"
echo "5) Выход"
echo ""
read -p "Ваш выбор [1-5]: " choice
}
main() {
check_root
detect_os
show_menu
case $choice in
1)
update_system
install_wireguard
;;
2)
update_system
install_3xui
;;
3)
update_system
install_remnawave
;;
4)
update_system
install_wireguard
install_3xui
install_remnawave
;;
5)
print_msg "Выход..."
exit 0
;;
*)
print_error "Неверный выбор"
exit 1
;;
esac
print_msg "Установка завершена!"
}
main
Executable
+566
View File
@@ -0,0 +1,566 @@
#!/bin/bash
# VPN Panel Management Script
# Version: 2.0.0
# Author: houseassassin
# GitHub: https://github.com/houseassassin/proxy-core
# Управление установленными панелями
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
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"; }
# WireGuard Management
manage_wireguard() {
if ! systemctl is-active --quiet wg-quick@wg0; then
error "WireGuard не установлен или не запущен"
return 1
fi
while true; do
clear
echo -e "${BLUE}╔════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ WireGuard 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} Показать QR-код"
echo -e "${YELLOW}6.${NC} Перезапустить сервис"
echo -e "${YELLOW}0.${NC} Назад"
echo ""
read -p "Выберите опцию: " choice
case $choice in
1)
echo ""
systemctl status wg-quick@wg0 --no-pager
wg show
read -p "Нажмите Enter..."
;;
2)
add_wireguard_client
;;
3)
list_wireguard_clients
;;
4)
remove_wireguard_client
;;
5)
show_wireguard_qr
;;
6)
systemctl restart wg-quick@wg0
success "WireGuard перезапущен"
sleep 2
;;
0)
return 0
;;
*)
warn "Неверный выбор"
sleep 1
;;
esac
done
}
add_wireguard_client() {
read -p "Введите имя клиента: " CLIENT_NAME
if [ -z "$CLIENT_NAME" ]; then
error "Имя не может быть пустым"
return 1
fi
CLIENT_DIR="/etc/wireguard/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 /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 <<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-код для мобильных устройств:"
qrencode -t ansiutf8 < client.conf
echo ""
read -p "Нажмите Enter..."
}
list_wireguard_clients() {
echo ""
log "Список клиентов WireGuard:"
echo ""
if [ ! -d "/etc/wireguard/clients" ]; then
warn "Клиенты не найдены"
read -p "Нажмите Enter..."
return
fi
for client in /etc/wireguard/clients/*; do
if [ -d "$client" ]; then
CLIENT_NAME=$(basename "$client")
CLIENT_IP=$(grep -A 2 "# $CLIENT_NAME" /etc/wireguard/wg0.conf | grep AllowedIPs | awk '{print $3}' | cut -d/ -f1)
echo -e "${GREEN}${NC} $CLIENT_NAME ${BLUE}($CLIENT_IP)${NC}"
fi
done
echo ""
read -p "Нажмите Enter..."
}
remove_wireguard_client() {
read -p "Введите имя клиента для удаления: " CLIENT_NAME
if [ -z "$CLIENT_NAME" ]; then
error "Имя не может быть пустым"
return 1
fi
CLIENT_DIR="/etc/wireguard/clients/$CLIENT_NAME"
if [ ! -d "$CLIENT_DIR" ]; then
error "Клиент $CLIENT_NAME не найден"
return 1
fi
sed -i "/# $CLIENT_NAME/,+2d" /etc/wireguard/wg0.conf
rm -rf "$CLIENT_DIR"
systemctl restart wg-quick@wg0
success "Клиент $CLIENT_NAME удален"
sleep 2
}
show_wireguard_qr() {
read -p "Введите имя клиента: " CLIENT_NAME
if [ -z "$CLIENT_NAME" ]; then
error "Имя не может быть пустым"
return 1
fi
CLIENT_DIR="/etc/wireguard/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-код:"
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
echo ""
read -p "Нажмите Enter..."
}
# 3x-ui Management
manage_3xui() {
if ! command -v x-ui &> /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
Executable
+108
View File
@@ -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
Executable
+227
View File
@@ -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 <<EOF
[Peer]
# $CLIENT_NAME
PublicKey = $CLIENT_PUBLIC_KEY
AllowedIPs = $CLIENT_IP/32
EOF
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
print_msg "Клиент $CLIENT_NAME создан"
print_msg "IP адрес: $CLIENT_IP"
print_msg "Конфигурация: $CLIENT_DIR/client.conf"
echo ""
print_msg "QR-код для мобильных устройств:"
qrencode -t ansiutf8 < client.conf
echo ""
print_msg "Конфигурация клиента:"
cat client.conf
}
list_clients() {
print_msg "Список клиентов WireGuard:"
echo ""
if [ ! -d "$WG_DIR/clients" ]; then
print_msg "Клиенты не найдены"
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 "- $CLIENT_NAME ($CLIENT_IP)"
fi
done
}
remove_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
sed -i "/# $CLIENT_NAME/,+2d" $WG_CONF
rm -rf "$CLIENT_DIR"
systemctl restart wg-quick@wg0
print_msg "Клиент $CLIENT_NAME удален"
}
show_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
print_msg "Конфигурация клиента $CLIENT_NAME:"
cat "$CLIENT_DIR/client.conf"
echo ""
print_msg "QR-код:"
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
}
show_menu() {
clear
echo "╔════════════════════════════════════════╗"
echo "║ WireGuard Client Manager ║"
echo "╚════════════════════════════════════════╝"
echo ""
echo "1) Добавить клиента"
echo "2) Список клиентов"
echo "3) Показать конфигурацию клиента"
echo "4) Удалить клиента"
echo "5) Выход"
echo ""
read -p "Ваш выбор [1-5]: " choice
}
main() {
check_root
if [ ! -f "$WG_CONF" ]; then
print_error "WireGuard не установлен или не настроен"
exit 1
fi
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
}
main