feat: initialize proxy-core repository with management scripts, documentation, and licensing
This commit is contained in:
+48
@@ -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
@@ -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! 🚀
|
||||
@@ -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
@@ -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
|
||||
- 🔄 Регулярно обновлять проект
|
||||
- 💬 Общаться с сообществом
|
||||
|
||||
Удачи! 🚀
|
||||
@@ -0,0 +1,320 @@
|
||||
# 🚀 Proxy-Core
|
||||
|
||||
<div align="center">
|
||||
|
||||
```
|
||||
╔═══════════════════════════════════════════════════════════════════╗
|
||||
║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║
|
||||
║ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝ ██╔════╝██╔═══██╗║
|
||||
║ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝█████╗██║ ██║ ██║║
|
||||
║ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝ ╚════╝██║ ██║ ██║║
|
||||
║ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║ ╚██████╗╚██████╔╝║
|
||||
║ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ║
|
||||
║ ║
|
||||
║ Advanced VPN & Proxy Panel Auto-Installer ║
|
||||
╚═══════════════════════════════════════════════════════════════════╝
|
||||
```
|
||||
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://github.com/houseassassin/proxy-core)
|
||||
[](https://www.gnu.org/software/bash/)
|
||||
[](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>
|
||||
@@ -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
|
||||
Executable
+622
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
@@ -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
|
||||
Reference in New Issue
Block a user