Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1c183496ca | |||
| 6dc1afcb2a | |||
| 7e53b6ca34 | |||
| bf0819aea9 | |||
| b844bc4e0e | |||
| 0115fd63e7 | |||
| 1e6bd8611c | |||
| 373c18045b |
+119
@@ -0,0 +1,119 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [2.1.1] - 2026-04-24
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- ✨ **Полная реализация функций установки всех панелей**
|
||||||
|
- `install_wireguard()` - автоматическая установка и настройка WireGuard
|
||||||
|
- `install_3xui()` - установка 3x-ui через официальный скрипт
|
||||||
|
- `install_remnawave()` - установка Remnawave с Docker и генерацией паролей
|
||||||
|
- `install_hysteria2()` - установка Hysteria2 с сертификатами и systemd
|
||||||
|
- Улучшенная `install_mtproxy()` с сохранением конфигурации
|
||||||
|
- 📱 **QR-код для MTProxy** - автоматическая генерация при установке
|
||||||
|
- 💾 **Сохранение конфигурации MTProxy** в `/opt/MTProxy/.config`
|
||||||
|
- 🔄 **Опция "Установить всё"** - последовательная установка всех панелей
|
||||||
|
- 🔁 **Цикл меню в wg-manager.sh** - меню больше не закрывается после действия
|
||||||
|
- 📚 **Общая библиотека функций** `lib/common.sh`:
|
||||||
|
- Функции валидации (порты, имена, IP)
|
||||||
|
- Сетевые утилиты (получение IP, генерация портов)
|
||||||
|
- Системные проверки (root, OS detection)
|
||||||
|
- Утилиты (spinner, confirm, генерация паролей)
|
||||||
|
- 📚 **Библиотека WireGuard** `lib/wireguard.sh` - общие функции для управления клиентами
|
||||||
|
- 📚 **Библиотека логирования** `lib/logging.sh` - централизованное логирование
|
||||||
|
- ⚙️ **Конфигурационный файл** `config/defaults.conf` - настройки по умолчанию
|
||||||
|
- 🔧 **Reverse Proxy Manager** `reverse-proxy-manager.sh`:
|
||||||
|
- Установка и настройка Nginx, Caddy, HAProxy
|
||||||
|
- Автоматическая настройка для 3x-ui
|
||||||
|
- Балансировка нагрузки с HAProxy
|
||||||
|
- Гибридные конфигурации (Nginx + Caddy)
|
||||||
|
- Подсказки и рекомендации по выбору
|
||||||
|
- 📁 **Структура проекта** - добавлены директории `lib/`, `config/`, `tests/`
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- 🐛 **Критический баг**: функции установки панелей не были реализованы (только комментарии)
|
||||||
|
- 🐛 **Критический баг**: MTProxy конфигурация (SECRET и PORT) не сохранялась
|
||||||
|
- 🐛 **Критический баг**: Selfsteal падал с ошибкой если Remnawave не установлен
|
||||||
|
- 🐛 **Баг**: wg-manager.sh закрывался после каждого действия (отсутствовал цикл)
|
||||||
|
- 🐛 **Баг**: устаревшая команда `docker-compose` (заменена на `docker compose`)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- 🔄 **Обновлено на Docker Compose v2** - использование `docker compose` вместо `docker-compose`
|
||||||
|
- 🔍 **Улучшена проверка зависимостей** в Selfsteal - автоопределение reverse proxy
|
||||||
|
- 🎨 **Улучшен UX** - добавлены подтверждения для критических операций
|
||||||
|
- 📝 **Улучшены сообщения об ошибках** - более информативные и понятные
|
||||||
|
|
||||||
|
### Security
|
||||||
|
- 🔒 **Валидация пользовательского ввода** - проверка портов, имён, IP адресов
|
||||||
|
- 🔒 **Безопасная генерация паролей** - использование `openssl rand`
|
||||||
|
- 🔒 **Проверка доступности портов** перед использованием
|
||||||
|
|
||||||
|
## [2.1.0] - 2026-04-22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- 📱 Поддержка MTProxy для Telegram
|
||||||
|
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
|
||||||
|
- 🎭 Selfsteal - маскировка под обычный сайт
|
||||||
|
- 📱 QR-коды для MTProxy
|
||||||
|
- 🎮 Менеджер MTProxy
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Интерактивный выбор компонентов
|
||||||
|
- Улучшенная система меню
|
||||||
|
- Больше опций конфигурации
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Исправлена ошибка создания директории логов
|
||||||
|
|
||||||
|
## [2.0.0] - 2026-04-20
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Поддержка WireGuard VPN
|
||||||
|
- Поддержка 3x-ui Panel
|
||||||
|
- Поддержка Remnawave Panel
|
||||||
|
- Поддержка Hysteria2 Proxy
|
||||||
|
- Автоматическая установка Docker
|
||||||
|
- Настройка firewall (UFW/firewalld)
|
||||||
|
- BBR оптимизация TCP
|
||||||
|
- Автоматическое создание swap
|
||||||
|
- SSL/TLS сертификаты (Let's Encrypt, Cloudflare DNS, Gcore DNS)
|
||||||
|
- Мониторинг сервисов и ресурсов
|
||||||
|
- Резервное копирование и восстановление
|
||||||
|
- Управление клиентами WireGuard
|
||||||
|
- Генерация QR-кодов
|
||||||
|
- Многоязычность (EN/RU)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Полностью переписан установщик
|
||||||
|
- Улучшен интерфейс
|
||||||
|
- Добавлена модульность
|
||||||
|
|
||||||
|
## [1.0.0] - 2026-04-15
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Первый релиз
|
||||||
|
- Базовая установка VPN панелей
|
||||||
|
- Простое меню управления
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Типы изменений
|
||||||
|
|
||||||
|
- `Added` - новые функции
|
||||||
|
- `Changed` - изменения в существующем функционале
|
||||||
|
- `Deprecated` - функции, которые скоро будут удалены
|
||||||
|
- `Removed` - удалённые функции
|
||||||
|
- `Fixed` - исправления багов
|
||||||
|
- `Security` - исправления уязвимостей
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ссылки
|
||||||
|
|
||||||
|
- [GitHub Repository](https://github.com/houseassassin/proxy-core)
|
||||||
|
- [Issues](https://github.com/houseassassin/proxy-core/issues)
|
||||||
|
- [Pull Requests](https://github.com/houseassassin/proxy-core/pulls)
|
||||||
-418
@@ -1,418 +0,0 @@
|
|||||||
# 🚀 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 | Высокоскоростной прокси с маскировкой трафика |
|
|
||||||
| **MTProxy** | MTProxy | Официальный прокси для Telegram |
|
|
||||||
|
|
||||||
### 🔄 Reverse Proxy
|
|
||||||
|
|
||||||
| Сервер | Особенности | Рекомендуется для |
|
|
||||||
|--------|-------------|-------------------|
|
|
||||||
| **Nginx** | Высокая производительность, стабильность | Production, высокие нагрузки |
|
|
||||||
| **Caddy** | Автоматический HTTPS, простая конфигурация | Быстрый старт, малые проекты |
|
|
||||||
|
|
||||||
### 💻 Поддерживаемые ОС
|
|
||||||
|
|
||||||
<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-v2.sh)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Метод 2: Скачать и запустить
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wget https://raw.githubusercontent.com/houseassassin/proxy-core/main/install-advanced-v2.sh
|
|
||||||
chmod +x install-advanced-v2.sh
|
|
||||||
sudo ./install-advanced-v2.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### Метод 3: Клонировать репозиторий
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/houseassassin/proxy-core.git
|
|
||||||
cd proxy-core
|
|
||||||
chmod +x *.sh
|
|
||||||
sudo ./install-advanced-v2.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>
|
|
||||||
|
|
||||||
- 🎭 **Selfsteal** — маскировка под обычный сайт
|
|
||||||
- 🔄 **Выбор Reverse Proxy** — Nginx или Caddy на выбор
|
|
||||||
- 📱 **MTProxy** — официальный прокси для Telegram с QR-кодами
|
|
||||||
- 🌍 **Многоязычность** — English + Русский
|
|
||||||
- 🎨 **Цветной вывод** — красивый и понятный интерфейс
|
|
||||||
- ⚡ **Spinner анимация** — визуализация длительных операций
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📖 Документация
|
|
||||||
|
|
||||||
### 🚀 Быстрый старт
|
|
||||||
|
|
||||||
#### 1. Установка WireGuard
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./install-advanced-v2.sh
|
|
||||||
# Выберите: 1 (Install Panel) → 1 (WireGuard)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. Установка 3x-ui
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./install-advanced-v2.sh
|
|
||||||
# Выберите: 1 (Install Panel) → 2 (3x-ui)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 3. Установка Remnawave с выбором Reverse Proxy
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./install-advanced-v2.sh
|
|
||||||
# Выберите: 1 (Install Panel) → 3 (Remnawave)
|
|
||||||
# Затем выберите: 1 (Nginx) или 2 (Caddy)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 4. Установка Hysteria2
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./install-advanced-v2.sh
|
|
||||||
# Выберите: 1 (Install Panel) → 4 (Hysteria2)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 5. Установка MTProxy для Telegram
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./install-advanced-v2.sh
|
|
||||||
# Выберите: 1 (Install Panel) → 5 (MTProxy)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Результат:**
|
|
||||||
- Прокси для Telegram
|
|
||||||
- Ссылка для подключения: `tg://proxy?server=...`
|
|
||||||
- QR-код для быстрого подключения
|
|
||||||
- Конфигурация: `/opt/MTProxy/`
|
|
||||||
|
|
||||||
**Управление:**
|
|
||||||
```bash
|
|
||||||
sudo ./mtproxy-manager.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🎭 Selfsteal - Маскировка трафика
|
|
||||||
|
|
||||||
Selfsteal позволяет замаскировать ваш прокси-сервер под обычный веб-сайт.
|
|
||||||
|
|
||||||
#### Установка Selfsteal
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./install-advanced-v2.sh
|
|
||||||
# Выберите: 6 (Selfsteal)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Типы Selfsteal:
|
|
||||||
|
|
||||||
**1. Случайный сайт**
|
|
||||||
- Автоматически выбирается популярный сайт
|
|
||||||
- Wikipedia, GitHub, StackOverflow, Reddit, Medium
|
|
||||||
|
|
||||||
**2. Пользовательский URL**
|
|
||||||
- Укажите любой URL
|
|
||||||
- Скрипт скачает и настроит страницу
|
|
||||||
|
|
||||||
**3. Локальный HTML файл**
|
|
||||||
- Используйте свой HTML файл
|
|
||||||
- Полный контроль над содержимым
|
|
||||||
|
|
||||||
#### Как это работает:
|
|
||||||
|
|
||||||
1. При обращении к серверу по HTTP показывается обычный сайт
|
|
||||||
2. Прокси работает на других портах/протоколах
|
|
||||||
3. Для внешнего наблюдателя сервер выглядит как обычный веб-сайт
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🔄 Reverse Proxy - Nginx vs Caddy
|
|
||||||
|
|
||||||
#### Когда использовать Nginx:
|
|
||||||
|
|
||||||
✅ **Production окружение**
|
|
||||||
- Высокие нагрузки (1000+ одновременных подключений)
|
|
||||||
- Требуется максимальная производительность
|
|
||||||
- Нужна гибкая конфигурация
|
|
||||||
- Есть опыт работы с Nginx
|
|
||||||
|
|
||||||
#### Когда использовать Caddy:
|
|
||||||
|
|
||||||
✅ **Быстрый старт**
|
|
||||||
- Автоматический HTTPS из коробки
|
|
||||||
- Простая конфигурация
|
|
||||||
- Малые и средние проекты
|
|
||||||
- Нет опыта с веб-серверами
|
|
||||||
|
|
||||||
#### Сравнение:
|
|
||||||
|
|
||||||
| Функция | Nginx | Caddy |
|
|
||||||
|---------|-------|-------|
|
|
||||||
| Производительность | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
|
|
||||||
| Простота настройки | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
||||||
| Автоматический HTTPS | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
||||||
| Гибкость | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
|
|
||||||
| Документация | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 📱 MTProxy Management
|
|
||||||
|
|
||||||
#### Показать ссылку подключения
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./mtproxy-manager.sh
|
|
||||||
# Выберите: 1 (Показать ссылку подключения)
|
|
||||||
```
|
|
||||||
|
|
||||||
Получите:
|
|
||||||
- Ссылку для Telegram: `tg://proxy?server=...`
|
|
||||||
- QR-код для быстрого подключения
|
|
||||||
- Параметры для ручной настройки
|
|
||||||
|
|
||||||
#### Сгенерировать новый секрет
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./mtproxy-manager.sh
|
|
||||||
# Выберите: 2 (Сгенерировать новый секрет)
|
|
||||||
```
|
|
||||||
|
|
||||||
⚠️ **Внимание:** Все текущие подключения будут разорваны!
|
|
||||||
|
|
||||||
#### Изменить порт
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./mtproxy-manager.sh
|
|
||||||
# Выберите: 3 (Изменить порт)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Обновить конфигурацию Telegram
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./mtproxy-manager.sh
|
|
||||||
# Выберите: 4 (Обновить конфигурацию)
|
|
||||||
```
|
|
||||||
|
|
||||||
Обновляет:
|
|
||||||
- `proxy-secret` - секреты Telegram
|
|
||||||
- `proxy-multi.conf` - конфигурация серверов
|
|
||||||
|
|
||||||
#### Показать статистику
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ./mtproxy-manager.sh
|
|
||||||
# Выберите: 5 (Показать статистику)
|
|
||||||
```
|
|
||||||
|
|
||||||
Показывает:
|
|
||||||
- Статус сервиса
|
|
||||||
- Использование CPU и RAM
|
|
||||||
- Количество активных подключений
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔒 Безопасность
|
|
||||||
|
|
||||||
### ✅ Рекомендации после установки
|
|
||||||
|
|
||||||
1. **Смените пароли по умолчанию**
|
|
||||||
2. **Настройте firewall**
|
|
||||||
3. **Включите автообновления**
|
|
||||||
4. **Установите fail2ban**
|
|
||||||
5. **Настройте регулярные бэкапы**
|
|
||||||
6. **Используйте Selfsteal для маскировки**
|
|
||||||
7. **Мониторинг логов**
|
|
||||||
|
|
||||||
Подробнее в [SECURITY.md](docs/SECURITY.md).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Структура проекта
|
|
||||||
|
|
||||||
```
|
|
||||||
proxy-core/
|
|
||||||
├── 📄 install-advanced-v2.sh # Основной установщик v2.1
|
|
||||||
├── 📄 install-advanced.sh # Установщик v2.0
|
|
||||||
├── 🎮 manage.sh # Менеджер панелей
|
|
||||||
├── 🔧 wg-manager.sh # WireGuard менеджер
|
|
||||||
├── 📱 mtproxy-manager.sh # MTProxy менеджер
|
|
||||||
├── 🔄 update.sh # Обновление
|
|
||||||
├── 🎨 banner.sh # ASCII баннер
|
|
||||||
├── 📖 README.md # Документация
|
|
||||||
├── 📖 CONTRIBUTING.md # Руководство для участников
|
|
||||||
├── 📖 PUBLISH.md # Инструкция по публикации
|
|
||||||
└── 📜 LICENSE # MIT License
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🤝 Благодарности
|
|
||||||
|
|
||||||
Проект основан на лучших практиках из:
|
|
||||||
|
|
||||||
- [3dp-manager](https://github.com/denpiligrim/3dp-manager) - Docker management, Hysteria2
|
|
||||||
- [remnawave-reverse-proxy](https://github.com/eGamesAPI/remnawave-reverse-proxy) - SSL, multi-language
|
|
||||||
- [remnawave-scripts](https://github.com/DigneZzZ/remnawave-scripts) - Backup system
|
|
||||||
- [RemnaSetup](https://github.com/Capybara-z/RemnaSetup) - Beautiful UI, selfsteal
|
|
||||||
|
|
||||||
Огромное спасибо авторам! 🙏
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 Лицензия
|
|
||||||
|
|
||||||
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.1.0 (2026-04-22)
|
|
||||||
|
|
||||||
✨ **Новое:**
|
|
||||||
- 📱 Поддержка MTProxy для Telegram
|
|
||||||
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
|
|
||||||
- 🎭 Selfsteal - маскировка под обычный сайт
|
|
||||||
- 📱 QR-коды для MTProxy
|
|
||||||
- 🎮 Менеджер MTProxy
|
|
||||||
|
|
||||||
🔧 **Улучшения:**
|
|
||||||
- Интерактивный выбор компонентов
|
|
||||||
- Улучшенная система меню
|
|
||||||
- Больше опций конфигурации
|
|
||||||
|
|
||||||
### Version 2.0.0 (2026-04-22)
|
|
||||||
|
|
||||||
✨ **Новое:**
|
|
||||||
- Поддержка Hysteria2
|
|
||||||
- Улучшенное управление SSL (3 метода)
|
|
||||||
- Автоматическая настройка BBR
|
|
||||||
- Многоязычный интерфейс (EN/RU)
|
|
||||||
- Spinner анимация
|
|
||||||
- Система логирования
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
### 💖 Сделано с любовью by [houseassassin](https://github.com/houseassassin)
|
|
||||||
|
|
||||||
**Если проект помог вам, поставьте ⭐ звезду!**
|
|
||||||
|
|
||||||
[⬆ Наверх](#-proxy-core)
|
|
||||||
|
|
||||||
</div>
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# 🚀 Proxy-Core
|
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
|
# 🚀 Proxy-Core
|
||||||
|
|
||||||
```
|
```
|
||||||
╔═══════════════════════════════════════════════════════════════════╗
|
╔═══════════════════════════════════════════════════════════════════╗
|
||||||
║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║
|
║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║
|
||||||
@@ -16,13 +16,13 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](https://opensource.org/licenses/MIT)
|
||||||
[](https://github.com/houseassassin/proxy-core)
|
[](https://github.com/houseassassin/proxy-core)
|
||||||
[](https://www.gnu.org/software/bash/)
|
[](https://www.gnu.org/software/bash/)
|
||||||
[](https://www.docker.com/)
|
[](https://www.docker.com/)
|
||||||
|
|
||||||
**Универсальный установщик и менеджер VPN/Proxy панелей с поддержкой множества протоколов**
|
**Универсальный установщик и менеджер VPN/Proxy панелей с поддержкой множества протоколов**
|
||||||
|
|
||||||
[Установка](#-быстрая-установка) • [Возможности](#-возможности) • [Документация](#-документация) • [Поддержка](#-поддержка)
|
[🚀 Установка](#-быстрая-установка) • [✨ Возможности](#-возможности) • [📖 Документация](#-документация) • [💬 Поддержка](#-поддержка)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -30,23 +30,94 @@
|
|||||||
|
|
||||||
## 📋 О проекте
|
## 📋 О проекте
|
||||||
|
|
||||||
**Proxy-Core** — это мощный инструмент для автоматической установки и управления VPN/Proxy панелями. Объединяет лучшие практики из популярных проектов и предоставляет единый интерфейс для работы с различными протоколами.
|
**Proxy-Core** — мощный инструмент для автоматической установки и управления VPN/Proxy панелями. Объединяет лучшие практики из популярных проектов и предоставляет единый интерфейс для работы с различными протоколами.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
### 🎯 Поддерживаемые панели
|
### 🎯 Поддерживаемые панели
|
||||||
|
|
||||||
| Панель | Протоколы | Особенности |
|
| Панель | Протоколы | Особенности |
|
||||||
|--------|-----------|-------------|
|
|:------:|:---------:|:-----------:|
|
||||||
| **WireGuard** | WireGuard | Быстрый, современный, безопасный VPN |
|
| **WireGuard** | WireGuard | 🚀 Быстрый, современный, безопасный VPN |
|
||||||
| **3x-ui** | VLESS, VMess, Trojan, Shadowsocks, XTLS | Веб-панель Xray с множеством протоколов |
|
| **3x-ui** | VLESS, VMess, Trojan, Shadowsocks | 🌐 Веб-панель Xray с множеством протоколов |
|
||||||
| **Remnawave** | Multi-protocol | Современная панель с Docker и reverse proxy |
|
| **Remnawave** | Multi-protocol | 🐳 Современная панель с Docker |
|
||||||
| **Hysteria2** | Hysteria2 | Высокоскоростной прокси с маскировкой трафика |
|
| **Hysteria2** | Hysteria2 | ⚡ Высокоскоростной прокси с маскировкой |
|
||||||
|
| **MTProxy** | MTProxy | 📱 Официальный прокси для Telegram |
|
||||||
|
|
||||||
### 💻 Поддерживаемые ОС
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ Быстрая установка
|
||||||
|
|
||||||
|
### Одна команда (рекомендуется)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo bash <(curl -Ls https://raw.githubusercontent.com/houseassassin/proxy-core/main/install.sh)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Альтернативный метод
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/houseassassin/proxy-core.git
|
||||||
|
cd proxy-core
|
||||||
|
chmod +x install.sh
|
||||||
|
sudo ./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✨ Возможности
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td width="50%">
|
||||||
|
|
||||||
|
### 🔧 Автоматизация
|
||||||
|
- ✅ Автоопределение ОС и версии
|
||||||
|
- ✅ Установка Docker и зависимостей
|
||||||
|
- ✅ Генерация безопасных паролей
|
||||||
|
- ✅ Настройка firewall (UFW/firewalld)
|
||||||
|
- ✅ BBR оптимизация TCP
|
||||||
|
- ✅ Автоматическое создание swap
|
||||||
|
|
||||||
|
### 🔐 SSL/TLS сертификаты
|
||||||
|
- 🔒 Let's Encrypt (HTTP-01)
|
||||||
|
- 🔒 Cloudflare DNS (DNS-01)
|
||||||
|
- 🔒 Gcore DNS
|
||||||
|
- 🔒 Самоподписанные сертификаты
|
||||||
|
- 🔒 Автообновление через cron
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="50%">
|
||||||
|
|
||||||
|
### 🎮 Управление
|
||||||
|
- 📊 Мониторинг сервисов и ресурсов
|
||||||
|
- 🔄 Простое обновление компонентов
|
||||||
|
- 💾 Резервное копирование
|
||||||
|
- 🔄 Восстановление из бэкапов
|
||||||
|
- 👥 Управление клиентами WireGuard
|
||||||
|
- 📱 Генерация QR-кодов
|
||||||
|
|
||||||
|
### 🎨 Дополнительно
|
||||||
|
- 🎭 Selfsteal маскировка трафика
|
||||||
|
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
|
||||||
|
- 📱 MTProxy с QR-кодами
|
||||||
|
- 🌍 Многоязычность (EN/RU)
|
||||||
|
- 🎨 Красивый интерфейс
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💻 Поддерживаемые ОС
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
| OS | Версии | Статус |
|
| Операционная система | Версии | Статус |
|
||||||
|:--:|:------:|:------:|
|
|:-------------------:|:------:|:------:|
|
||||||
| 🐧 **Ubuntu** | 18.04, 20.04, 22.04, 24.04 | ✅ Полная поддержка |
|
| 🐧 **Ubuntu** | 18.04, 20.04, 22.04, 24.04 | ✅ Полная поддержка |
|
||||||
| 🐧 **Debian** | 10, 11, 12 | ✅ Полная поддержка |
|
| 🐧 **Debian** | 10, 11, 12 | ✅ Полная поддержка |
|
||||||
| 🎩 **CentOS** | 7, 8, 9 | ✅ Полная поддержка |
|
| 🎩 **CentOS** | 7, 8, 9 | ✅ Полная поддержка |
|
||||||
@@ -57,167 +128,159 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ⚡ Быстрая установка
|
|
||||||
|
|
||||||
### Метод 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
|
<details>
|
||||||
|
<summary><b>1️⃣ Установка WireGuard</b></summary>
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ./install-advanced.sh
|
sudo ./install.sh
|
||||||
# Выберите: 1 (Install Panel) → 1 (WireGuard)
|
# Выберите: 1 (Install Panel) → 1 (WireGuard)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Результат:**
|
**Результат:**
|
||||||
- Сервер WireGuard на порту 51820 (или указанном)
|
- Установленный WireGuard сервер
|
||||||
- Конфигурация: `/etc/wireguard/wg0.conf`
|
- Первый клиент с конфигурацией
|
||||||
- Автозапуск при загрузке системы
|
- QR-код для мобильных устройств
|
||||||
|
- Автоматическая настройка firewall
|
||||||
|
|
||||||
#### 2. Установка 3x-ui
|
**Управление клиентами:**
|
||||||
|
```bash
|
||||||
|
sudo ./wg-manager.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>2️⃣ Установка 3x-ui</b></summary>
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ./install-advanced.sh
|
sudo ./install.sh
|
||||||
# Выберите: 1 (Install Panel) → 2 (3x-ui)
|
# Выберите: 1 (Install Panel) → 2 (3x-ui)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Результат:**
|
**Результат:**
|
||||||
- Веб-панель: `http://YOUR_IP:2053`
|
- Веб-панель 3x-ui
|
||||||
- Логин: `admin` | Пароль: `admin` ⚠️ **СМЕНИТЕ!**
|
- Поддержка VLESS, VMess, Trojan, Shadowsocks
|
||||||
|
- SSL сертификаты
|
||||||
|
- Доступ через браузер
|
||||||
|
|
||||||
#### 3. Установка Remnawave
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>3️⃣ Установка Remnawave</b></summary>
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ./install-advanced.sh
|
sudo ./install.sh
|
||||||
# Выберите: 1 (Install Panel) → 3 (Remnawave)
|
# Выберите: 1 (Install Panel) → 3 (Remnawave)
|
||||||
|
# Затем выберите Reverse Proxy: 1 (Nginx) или 2 (Caddy)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Потребуется:**
|
|
||||||
- Домен (например: `vpn.example.com`)
|
|
||||||
- Email для SSL сертификата
|
|
||||||
|
|
||||||
**Результат:**
|
**Результат:**
|
||||||
- Панель: `https://YOUR_DOMAIN`
|
- Remnawave панель с Docker
|
||||||
- Логин и пароль будут показаны после установки
|
- Выбранный reverse proxy (Nginx/Caddy)
|
||||||
|
- SSL сертификаты
|
||||||
|
- Готовая к использованию панель
|
||||||
|
|
||||||
#### 4. Установка Hysteria2
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>4️⃣ Установка Hysteria2</b></summary>
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ./install-advanced.sh
|
sudo ./install.sh
|
||||||
# Выберите: 1 (Install Panel) → 4 (Hysteria2)
|
# Выберите: 1 (Install Panel) → 4 (Hysteria2)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Потребуется:**
|
**Результат:**
|
||||||
- Домен для ACME сертификата
|
- Высокоскоростной Hysteria2 прокси
|
||||||
- Email для Let's Encrypt
|
- Маскировка трафика
|
||||||
|
- Оптимизированная конфигурация
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>5️⃣ Установка MTProxy</b></summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./install.sh
|
||||||
|
# Выберите: 1 (Install Panel) → 5 (MTProxy)
|
||||||
|
```
|
||||||
|
|
||||||
**Результат:**
|
**Результат:**
|
||||||
- Конфигурация: `/etc/hysteria/config.yaml`
|
- Прокси для Telegram
|
||||||
- Пароль и порт будут показаны
|
- Ссылка для подключения: `tg://proxy?server=...`
|
||||||
|
- QR-код для быстрого подключения
|
||||||
|
- Менеджер для управления
|
||||||
|
|
||||||
|
**Управление MTProxy:**
|
||||||
|
```bash
|
||||||
|
sudo ./mtproxy-manager.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Функции менеджера:**
|
||||||
|
- 📱 Показать ссылку подключения и QR-код
|
||||||
|
- 🔑 Сгенерировать новый секрет
|
||||||
|
- 🔧 Изменить порт
|
||||||
|
- 🔄 Обновить конфигурацию Telegram
|
||||||
|
- 📊 Показать статистику
|
||||||
|
- 📋 Просмотр логов
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 🎮 Управление панелями
|
### 🎭 Selfsteal - Маскировка трафика
|
||||||
|
|
||||||
#### Запуск менеджера
|
Selfsteal позволяет замаскировать ваш прокси-сервер под обычный веб-сайт.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo ./manage.sh
|
sudo ./install.sh
|
||||||
|
# Выберите: 6 (Selfsteal)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Меню менеджера
|
**Типы маскировки:**
|
||||||
|
|
||||||
```
|
| Тип | Описание | Использование |
|
||||||
╔════════════════════════════════════════╗
|
|:---:|:--------:|:-------------:|
|
||||||
║ VPN Panel Management ║
|
| 🎲 **Случайный сайт** | Автоматический выбор популярного сайта | Wikipedia, GitHub, StackOverflow |
|
||||||
╚════════════════════════════════════════╝
|
| 🌐 **Пользовательский URL** | Укажите любой URL | Любой сайт на ваш выбор |
|
||||||
|
| 📄 **Локальный HTML** | Используйте свой HTML файл | Полный контроль над содержимым |
|
||||||
|
|
||||||
1. Управление WireGuard
|
**Как это работает:**
|
||||||
2. Управление 3x-ui
|
1. При обращении к серверу по HTTP показывается обычный сайт
|
||||||
3. Управление Remnawave
|
2. Прокси работает на других портах/протоколах
|
||||||
4. Управление Hysteria2
|
3. Для внешнего наблюдателя сервер выглядит как обычный веб-сайт
|
||||||
5. Системная информация
|
|
||||||
0. Выход
|
---
|
||||||
```
|
|
||||||
|
### 🔄 Reverse Proxy - Nginx vs Caddy
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
| Функция | Nginx | Caddy |
|
||||||
|
|:-------:|:-----:|:-----:|
|
||||||
|
| **Производительность** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
|
||||||
|
| **Простота настройки** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
||||||
|
| **Автоматический HTTPS** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
||||||
|
| **Гибкость** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
|
||||||
|
| **Документация** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
**Когда использовать Nginx:**
|
||||||
|
- ✅ Production окружение с высокими нагрузками
|
||||||
|
- ✅ Требуется максимальная производительность
|
||||||
|
- ✅ Нужна гибкая конфигурация
|
||||||
|
- ✅ Есть опыт работы с Nginx
|
||||||
|
|
||||||
|
**Когда использовать Caddy:**
|
||||||
|
- ✅ Быстрый старт без опыта
|
||||||
|
- ✅ Автоматический HTTPS из коробки
|
||||||
|
- ✅ Простая конфигурация
|
||||||
|
- ✅ Малые и средние проекты
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -225,27 +288,69 @@ sudo ./manage.sh
|
|||||||
|
|
||||||
### ✅ Рекомендации после установки
|
### ✅ Рекомендации после установки
|
||||||
|
|
||||||
1. **Смените пароли по умолчанию**
|
<table>
|
||||||
2. **Настройте firewall**
|
<tr>
|
||||||
3. **Включите автообновления**
|
<td width="50%">
|
||||||
4. **Установите fail2ban**
|
|
||||||
5. **Настройте регулярные бэкапы**
|
|
||||||
6. **Мониторинг логов**
|
|
||||||
|
|
||||||
Подробнее в [полной документации](docs/SECURITY.md).
|
**Обязательно:**
|
||||||
|
1. 🔑 Смените пароли по умолчанию
|
||||||
|
2. 🛡️ Настройте firewall
|
||||||
|
3. 🔄 Включите автообновления
|
||||||
|
4. 🚫 Установите fail2ban
|
||||||
|
5. 💾 Настройте регулярные бэкапы
|
||||||
|
|
||||||
|
</td>
|
||||||
|
<td width="50%">
|
||||||
|
|
||||||
|
**Рекомендуется:**
|
||||||
|
6. 🎭 Используйте Selfsteal для маскировки
|
||||||
|
7. 📊 Настройте мониторинг логов
|
||||||
|
8. 🔐 Используйте сильные пароли
|
||||||
|
9. 🔄 Регулярно обновляйте систему
|
||||||
|
10. 📱 Включите 2FA где возможно
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🐛 Troubleshooting
|
## 🎮 Управление
|
||||||
|
|
||||||
### Основные проблемы
|
### Основные команды
|
||||||
|
|
||||||
- **WireGuard не запускается** → Проверьте IP forwarding
|
```bash
|
||||||
- **3x-ui недоступен** → Проверьте firewall и порт 2053
|
# Главный установщик
|
||||||
- **Remnawave не работает** → Проверьте Docker контейнеры
|
sudo ./install.sh
|
||||||
- **SSL сертификаты** → Проверьте DNS и порт 80
|
|
||||||
|
|
||||||
Подробнее в [разделе Troubleshooting](docs/TROUBLESHOOTING.md).
|
# Управление WireGuard
|
||||||
|
sudo ./wg-manager.sh
|
||||||
|
|
||||||
|
# Управление MTProxy
|
||||||
|
sudo ./mtproxy-manager.sh
|
||||||
|
|
||||||
|
# Управление Reverse Proxy (NEW!)
|
||||||
|
sudo ./reverse-proxy-manager.sh
|
||||||
|
|
||||||
|
# Общее управление панелями
|
||||||
|
sudo ./manage.sh
|
||||||
|
|
||||||
|
# Обновление компонентов
|
||||||
|
sudo ./update.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🆕 Новое в версии 2.1.1
|
||||||
|
|
||||||
|
**Reverse Proxy Manager** - мощный инструмент для настройки:
|
||||||
|
- ✅ Nginx - высокая производительность и кэширование
|
||||||
|
- ✅ Caddy - автоматический SSL из коробки
|
||||||
|
- ✅ HAProxy - балансировка нагрузки
|
||||||
|
- ✅ Гибридные конфигурации (Nginx + Caddy)
|
||||||
|
- ✅ Подсказки и рекомендации по выбору
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ./reverse-proxy-manager.sh
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -253,13 +358,25 @@ sudo ./manage.sh
|
|||||||
|
|
||||||
```
|
```
|
||||||
proxy-core/
|
proxy-core/
|
||||||
├── 📄 install-advanced.sh # Основной установщик
|
├── 📄 install.sh # Главный установщик v2.1.1
|
||||||
├── 🎮 manage.sh # Менеджер панелей
|
├── 🎮 manage.sh # Менеджер панелей
|
||||||
├── 🔧 wg-manager.sh # WireGuard менеджер
|
├── 🔧 wg-manager.sh # WireGuard менеджер
|
||||||
├── 🔄 update.sh # Обновление
|
├── 📱 mtproxy-manager.sh # MTProxy менеджер
|
||||||
├── 📄 install.sh # Базовый установщик
|
├── 🔄 update.sh # Обновление компонентов
|
||||||
├── 📖 README.md # Документация
|
├── 🌐 reverse-proxy-manager.sh # Reverse Proxy менеджер (NEW!)
|
||||||
└── 📜 LICENSE # MIT License
|
├── 🎨 banner.sh # ASCII баннер
|
||||||
|
├── 📚 lib/ # Библиотеки (NEW!)
|
||||||
|
│ ├── common.sh # Общие функции
|
||||||
|
│ ├── wireguard.sh # WireGuard функции
|
||||||
|
│ └── logging.sh # Логирование
|
||||||
|
├── ⚙️ config/ # Конфигурация (NEW!)
|
||||||
|
│ └── defaults.conf # Настройки по умолчанию
|
||||||
|
├── 🧪 tests/ # Тесты (NEW!)
|
||||||
|
├── 📖 README.md # Документация
|
||||||
|
├── 📖 CHANGELOG.md # История изменений (NEW!)
|
||||||
|
├── 📖 CONTRIBUTING.md # Руководство для участников
|
||||||
|
├── 📖 PUBLISH.md # Инструкция по публикации
|
||||||
|
└── 📜 LICENSE # MIT License
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -268,44 +385,94 @@ proxy-core/
|
|||||||
|
|
||||||
Проект основан на лучших практиках из:
|
Проект основан на лучших практиках из:
|
||||||
|
|
||||||
- [3dp-manager](https://github.com/denpiligrim/3dp-manager)
|
<div align="center">
|
||||||
- [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)
|
|:------:|:-----:|
|
||||||
|
| [3dp-manager](https://github.com/denpiligrim/3dp-manager) | Docker management, Hysteria2 |
|
||||||
|
| [remnawave-reverse-proxy](https://github.com/eGamesAPI/remnawave-reverse-proxy) | SSL, multi-language |
|
||||||
|
| [remnawave-scripts](https://github.com/DigneZzZ/remnawave-scripts) | Backup system |
|
||||||
|
| [RemnaSetup](https://github.com/Capybara-z/RemnaSetup) | Beautiful UI, selfsteal |
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
Огромное спасибо авторам! 🙏
|
Огромное спасибо авторам! 🙏
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📝 Лицензия
|
## 🔄 Changelog
|
||||||
|
|
||||||
MIT License - свободное использование и модификация
|
### Version 2.1.1 (2026-04-24)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>✨ Новое</b></summary>
|
||||||
|
|
||||||
|
- 🚀 Полная реализация функций установки всех панелей
|
||||||
|
- 📚 Общая библиотека функций (lib/common.sh)
|
||||||
|
- 📚 Библиотека WireGuard (lib/wireguard.sh)
|
||||||
|
- 📚 Библиотека логирования (lib/logging.sh)
|
||||||
|
- ⚙️ Конфигурационный файл (config/defaults.conf)
|
||||||
|
- 🌐 Reverse Proxy Manager с поддержкой Nginx, Caddy, HAProxy
|
||||||
|
- 🔁 Цикл меню в wg-manager.sh
|
||||||
|
- 💾 Сохранение конфигурации MTProxy
|
||||||
|
- 📱 QR-код для MTProxy
|
||||||
|
- ✅ Валидация пользовательского ввода
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>🐛 Исправления</b></summary>
|
||||||
|
|
||||||
|
- Критический баг: функции установки не были реализованы
|
||||||
|
- Критический баг: MTProxy конфигурация не сохранялась
|
||||||
|
- Критический баг: Selfsteal падал без Remnawave
|
||||||
|
- Баг: wg-manager.sh закрывался после действия
|
||||||
|
- Баг: устаревшая команда docker-compose
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><b>🔧 Улучшения</b></summary>
|
||||||
|
|
||||||
|
- Обновлено на Docker Compose v2
|
||||||
|
- Улучшена проверка зависимостей
|
||||||
|
- Улучшен UX с подтверждениями
|
||||||
|
- Более информативные сообщения об ошибках
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
Полный список изменений: [CHANGELOG.md](CHANGELOG.md)
|
||||||
|
|
||||||
|
### Version 2.1.0 (2026-04-22)
|
||||||
|
|
||||||
|
- 📱 Поддержка MTProxy для Telegram
|
||||||
|
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
|
||||||
|
- 🎭 Selfsteal - маскировка под обычный сайт
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 💬 Поддержка
|
## 💬 Поддержка
|
||||||
|
|
||||||
- **GitHub Issues:** [github.com/houseassassin/proxy-core/issues](https://github.com/houseassassin/proxy-core/issues)
|
<div align="center">
|
||||||
- **Telegram:** [@houseassassin](https://t.me/houseassassin)
|
|
||||||
|
**Нужна помощь?**
|
||||||
|
|
||||||
|
[](https://github.com/houseassassin/proxy-core/issues)
|
||||||
|
[](https://t.me/houseassassin)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔄 Changelog
|
## 📝 Лицензия
|
||||||
|
|
||||||
### Version 2.0.0 (2026-04-22)
|
<div align="center">
|
||||||
|
|
||||||
✨ **Новое:**
|
**MIT License** - свободное использование и модификация
|
||||||
- Поддержка Hysteria2
|
|
||||||
- Улучшенное управление SSL (3 метода)
|
|
||||||
- Автоматическая настройка BBR
|
|
||||||
- Многоязычный интерфейс (EN/RU)
|
|
||||||
- Spinner анимация
|
|
||||||
- Система логирования
|
|
||||||
|
|
||||||
🔧 **Улучшения:**
|
[](https://opensource.org/licenses/MIT)
|
||||||
- Оптимизированная установка Docker
|
|
||||||
- Автоопределение Docker Compose v1/v2
|
</div>
|
||||||
- Улучшенная обработка ошибок
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -315,6 +482,8 @@ MIT License - свободное использование и модифика
|
|||||||
|
|
||||||
**Если проект помог вам, поставьте ⭐ звезду!**
|
**Если проект помог вам, поставьте ⭐ звезду!**
|
||||||
|
|
||||||
|
[](https://github.com/houseassassin/proxy-core/stargazers)
|
||||||
|
|
||||||
[⬆ Наверх](#-proxy-core)
|
[⬆ Наверх](#-proxy-core)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,210 @@
|
|||||||
|
# 🚀 Proxy-Core v2.1.0 Release Notes
|
||||||
|
|
||||||
|
**Release Date:** April 22, 2026
|
||||||
|
**Author:** houseassassin
|
||||||
|
**Repository:** https://github.com/houseassassin/proxy-core
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 What's New in v2.1.0
|
||||||
|
|
||||||
|
### ✨ Major Features
|
||||||
|
|
||||||
|
#### 1. MTProxy Support for Telegram
|
||||||
|
- Full MTProxy installation and configuration
|
||||||
|
- Interactive management interface (`mtproxy-manager.sh`)
|
||||||
|
- QR code generation for mobile devices
|
||||||
|
- Connection link generation
|
||||||
|
- Secret regeneration
|
||||||
|
- Port management
|
||||||
|
- Statistics and monitoring
|
||||||
|
- Service logs viewer
|
||||||
|
|
||||||
|
#### 2. Reverse Proxy Selection
|
||||||
|
- Choose between **Nginx** or **Caddy**
|
||||||
|
- Nginx: High performance, production-ready
|
||||||
|
- Caddy: Automatic HTTPS, simple configuration
|
||||||
|
- Interactive selection during installation
|
||||||
|
- Optimized configurations for each
|
||||||
|
|
||||||
|
#### 3. Selfsteal Traffic Masking
|
||||||
|
- Mask proxy server as regular website
|
||||||
|
- Three template options:
|
||||||
|
- Random popular site (Wikipedia, GitHub, etc.)
|
||||||
|
- Custom URL
|
||||||
|
- Local HTML file
|
||||||
|
- Automatic Nginx configuration
|
||||||
|
- Perfect for bypassing censorship
|
||||||
|
|
||||||
|
### 🔧 Improvements
|
||||||
|
|
||||||
|
- **Enhanced Menu System**: Better component selection and navigation
|
||||||
|
- **Multi-language Support**: English and Russian interfaces
|
||||||
|
- **Better Error Handling**: Improved logging and error messages
|
||||||
|
- **SSL Management**: Support for Let's Encrypt, Cloudflare DNS, Gcore DNS
|
||||||
|
- **BBR Optimization**: Automatic TCP BBR configuration
|
||||||
|
- **Swap Management**: Auto-creation for low-memory systems
|
||||||
|
- **Firewall Configuration**: Automatic UFW/firewalld setup
|
||||||
|
|
||||||
|
### 📖 Documentation
|
||||||
|
|
||||||
|
- **README-v2.md**: Comprehensive documentation with:
|
||||||
|
- Beautiful ASCII art header
|
||||||
|
- Installation guides for all panels
|
||||||
|
- MTProxy management instructions
|
||||||
|
- Reverse proxy comparison
|
||||||
|
- Selfsteal setup guide
|
||||||
|
- Security recommendations
|
||||||
|
- Troubleshooting section
|
||||||
|
|
||||||
|
- **CONTRIBUTING.md**: Guidelines for contributors
|
||||||
|
- **PUBLISH.md**: Step-by-step GitHub publication guide
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Supported Panels
|
||||||
|
|
||||||
|
| Panel | Protocols | Status |
|
||||||
|
|-------|-----------|--------|
|
||||||
|
| **WireGuard** | WireGuard | ✅ Full support |
|
||||||
|
| **3x-ui** | VLESS, VMess, Trojan, Shadowsocks, XTLS | ✅ Full support |
|
||||||
|
| **Remnawave** | Multi-protocol | ✅ Full support |
|
||||||
|
| **Hysteria2** | Hysteria2 | ✅ Full support |
|
||||||
|
| **MTProxy** | MTProxy | ✨ NEW in v2.1.0 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💻 Supported Operating Systems
|
||||||
|
|
||||||
|
- Ubuntu 18.04, 20.04, 22.04, 24.04
|
||||||
|
- Debian 10, 11, 12
|
||||||
|
- CentOS 7, 8, 9
|
||||||
|
- RHEL 7, 8, 9
|
||||||
|
- Fedora 35+
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📥 Installation
|
||||||
|
|
||||||
|
### Quick Install (One Command)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash <(curl -Ls https://raw.githubusercontent.com/houseassassin/proxy-core/main/install-advanced-v2.sh)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Install
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/houseassassin/proxy-core.git
|
||||||
|
cd proxy-core
|
||||||
|
chmod +x *.sh
|
||||||
|
sudo ./install-advanced-v2.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔒 Security Features
|
||||||
|
|
||||||
|
- ✅ Automatic firewall configuration (UFW/firewalld)
|
||||||
|
- ✅ SSL/TLS certificates (Let's Encrypt, Cloudflare, Gcore)
|
||||||
|
- ✅ BBR TCP optimization
|
||||||
|
- ✅ Secure password generation
|
||||||
|
- ✅ Selfsteal traffic masking
|
||||||
|
- ✅ Regular security updates support
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Project Statistics
|
||||||
|
|
||||||
|
- **Total Files**: 11 scripts + documentation
|
||||||
|
- **Lines of Code**: ~2,500+ lines of Bash
|
||||||
|
- **Languages**: English, Russian
|
||||||
|
- **License**: MIT
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎮 Management Tools
|
||||||
|
|
||||||
|
### Main Installer
|
||||||
|
```bash
|
||||||
|
sudo ./install-advanced-v2.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### MTProxy Manager
|
||||||
|
```bash
|
||||||
|
sudo ./mtproxy-manager.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### WireGuard Manager
|
||||||
|
```bash
|
||||||
|
sudo ./wg-manager.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### General Panel Manager
|
||||||
|
```bash
|
||||||
|
sudo ./manage.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 Ready to Publish
|
||||||
|
|
||||||
|
### Git Status
|
||||||
|
- ✅ All files committed
|
||||||
|
- ✅ Version tagged (v2.1.0)
|
||||||
|
- ✅ Documentation complete
|
||||||
|
- ✅ License included (MIT)
|
||||||
|
- ✅ .gitignore configured
|
||||||
|
|
||||||
|
### Next Steps
|
||||||
|
|
||||||
|
1. **Push to GitHub**:
|
||||||
|
```bash
|
||||||
|
git push origin main
|
||||||
|
git push origin v2.1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Create GitHub Release**:
|
||||||
|
- Go to: https://github.com/houseassassin/proxy-core/releases/new
|
||||||
|
- Select tag: v2.1.0
|
||||||
|
- Title: "Proxy-Core v2.1.0 - MTProxy, Reverse Proxy, Selfsteal"
|
||||||
|
- Copy description from this file
|
||||||
|
|
||||||
|
3. **Configure Repository**:
|
||||||
|
- Add topics: `vpn`, `proxy`, `wireguard`, `xray`, `3x-ui`, `remnawave`, `hysteria2`, `mtproxy`, `docker`, `bash`, `automation`, `installer`, `linux`
|
||||||
|
- Enable Issues and Wiki
|
||||||
|
- Add description and website URL
|
||||||
|
|
||||||
|
4. **Promote**:
|
||||||
|
- Share on Reddit (r/selfhosted, r/VPN, r/linux)
|
||||||
|
- Post on Telegram channels
|
||||||
|
- Submit to Awesome Lists
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🤝 Credits
|
||||||
|
|
||||||
|
Based on best practices from:
|
||||||
|
- [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)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 License
|
||||||
|
|
||||||
|
MIT License - Free to use and modify
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💬 Support
|
||||||
|
|
||||||
|
- **GitHub Issues**: https://github.com/houseassassin/proxy-core/issues
|
||||||
|
- **Telegram**: [@houseassassin](https://t.me/houseassassin)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Made with ❤️ by houseassassin**
|
||||||
|
|
||||||
|
If this project helped you, please ⭐ star it on GitHub!
|
||||||
@@ -1,30 +1,152 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Proxy-Core Banner
|
# Proxy-Core Beautiful Banner
|
||||||
|
# Version: 2.1.1
|
||||||
# Author: houseassassin
|
# Author: houseassassin
|
||||||
|
|
||||||
show_banner() {
|
# Colors
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
MAGENTA='\033[0;35m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
WHITE='\033[1;37m'
|
||||||
|
GRAY='\033[0;90m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
# Gradient effect
|
||||||
|
show_gradient_banner() {
|
||||||
clear
|
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 ""
|
||||||
echo -e "\033[0;36m────────────────────────────────────────────────────────────────────\033[0m"
|
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${CYAN}║${MAGENTA} ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}║${MAGENTA} ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝ ██╔════╝██╔═══██╗ ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}║${BLUE} ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝█████╗██║ ██║ ██║ ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}║${BLUE} ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝ ╚════╝██║ ██║ ██║ ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}║${CYAN} ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║ ╚██████╗╚██████╔╝ ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}║${CYAN} ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}║ ║${NC}"
|
||||||
|
echo -e "${CYAN}║${WHITE} Advanced VPN & Proxy Panel Auto-Installer ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GREEN}┌─────────────────────────────────────────────────────────────────┐${NC}"
|
||||||
|
echo -e " ${GREEN}│${NC} ${YELLOW}Version:${NC} ${WHITE}2.1.1${NC} ${GREEN}│${NC}"
|
||||||
|
echo -e " ${GREEN}│${NC} ${YELLOW}Author:${NC} ${WHITE}houseassassin${NC} ${GREEN}│${NC}"
|
||||||
|
echo -e " ${GREEN}│${NC} ${YELLOW}GitHub:${NC} ${BLUE}https://github.com/houseassassin/proxy-core${NC} ${GREEN}│${NC}"
|
||||||
|
echo -e " ${GREEN}└─────────────────────────────────────────────────────────────────┘${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
show_banner
|
# Animated loading
|
||||||
|
show_loading() {
|
||||||
|
local text="$1"
|
||||||
|
local duration=${2:-2}
|
||||||
|
local frames=("⠋" "⠙" "⠹" "⠸" "⠼" "⠴" "⠦" "⠧" "⠇" "⠏")
|
||||||
|
local end=$((SECONDS + duration))
|
||||||
|
|
||||||
|
while [ $SECONDS -lt $end ]; do
|
||||||
|
for frame in "${frames[@]}"; do
|
||||||
|
echo -ne "\r ${CYAN}${frame}${NC} ${text}"
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo -ne "\r ${GREEN}✓${NC} ${text}\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Progress bar
|
||||||
|
show_progress() {
|
||||||
|
local current=$1
|
||||||
|
local total=$2
|
||||||
|
local width=50
|
||||||
|
local percentage=$((current * 100 / total))
|
||||||
|
local completed=$((width * current / total))
|
||||||
|
local remaining=$((width - completed))
|
||||||
|
|
||||||
|
echo -ne "\r ${CYAN}["
|
||||||
|
printf "%${completed}s" | tr ' ' '█'
|
||||||
|
printf "%${remaining}s" | tr ' ' '░'
|
||||||
|
echo -ne "]${NC} ${WHITE}${percentage}%${NC}"
|
||||||
|
|
||||||
|
if [ $current -eq $total ]; then
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Success box
|
||||||
|
show_success() {
|
||||||
|
local message="$1"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${GREEN}║${NC} ${WHITE}✓${NC} ${message}${GREEN}"
|
||||||
|
echo -e " ${GREEN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Error box
|
||||||
|
show_error() {
|
||||||
|
local message="$1"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${RED}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${RED}║${NC} ${WHITE}✗${NC} ${message}${RED}"
|
||||||
|
echo -e " ${RED}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Info box
|
||||||
|
show_info() {
|
||||||
|
local message="$1"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${BLUE}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${BLUE}║${NC} ${WHITE}ℹ${NC} ${message}${BLUE}"
|
||||||
|
echo -e " ${BLUE}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Warning box
|
||||||
|
show_warning() {
|
||||||
|
local message="$1"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}⚠${NC} ${message}${YELLOW}"
|
||||||
|
echo -e " ${YELLOW}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Menu header
|
||||||
|
show_menu_header() {
|
||||||
|
local title="$1"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${MAGENTA}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${MAGENTA}║${NC} ${WHITE}${title}${MAGENTA}"
|
||||||
|
echo -e " ${MAGENTA}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Menu item
|
||||||
|
show_menu_item() {
|
||||||
|
local number="$1"
|
||||||
|
local icon="$2"
|
||||||
|
local text="$3"
|
||||||
|
local description="$4"
|
||||||
|
|
||||||
|
echo -e " ${CYAN}${number}.${NC} ${icon} ${WHITE}${text}${NC}"
|
||||||
|
if [ -n "$description" ]; then
|
||||||
|
echo -e " ${GRAY}${description}${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Separator
|
||||||
|
show_separator() {
|
||||||
|
echo -e " ${GRAY}─────────────────────────────────────────────────────────────────${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export functions
|
||||||
|
export -f show_gradient_banner show_loading show_progress
|
||||||
|
export -f show_success show_error show_info show_warning
|
||||||
|
export -f show_menu_header show_menu_item show_separator
|
||||||
|
|
||||||
|
# Run if executed directly
|
||||||
|
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
|
||||||
|
show_gradient_banner
|
||||||
|
fi
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# Proxy-Core Configuration
|
||||||
|
# Version: 2.1.1
|
||||||
|
# Author: houseassassin
|
||||||
|
|
||||||
|
# Directories
|
||||||
|
PROJECT_DIR="/opt/proxy-core"
|
||||||
|
WG_DIR="/etc/wireguard"
|
||||||
|
MTPROXY_DIR="/opt/MTProxy"
|
||||||
|
HYSTERIA_DIR="/etc/hysteria"
|
||||||
|
REMNAWAVE_DIR="/opt/remnawave"
|
||||||
|
NGINX_DIR="/etc/nginx"
|
||||||
|
CADDY_DIR="/etc/caddy"
|
||||||
|
HAPROXY_DIR="/etc/haproxy"
|
||||||
|
|
||||||
|
# Network Configuration
|
||||||
|
WG_SUBNET="10.0.0.0/24"
|
||||||
|
WG_SERVER_IP="10.0.0.1"
|
||||||
|
DNS_SERVERS="8.8.8.8,1.1.1.1"
|
||||||
|
|
||||||
|
# Port Ranges
|
||||||
|
WG_PORT_MIN=51820
|
||||||
|
WG_PORT_MAX=51900
|
||||||
|
MTPROXY_PORT_DEFAULT=8443
|
||||||
|
HYSTERIA_PORT_MIN=36712
|
||||||
|
HYSTERIA_PORT_MAX=36800
|
||||||
|
XRAY_PORT_MIN=10000
|
||||||
|
XRAY_PORT_MAX=10999
|
||||||
|
|
||||||
|
# SSL/TLS
|
||||||
|
SSL_CERT_DIR="/etc/ssl/proxy-core"
|
||||||
|
ACME_EMAIL=""
|
||||||
|
ACME_PROVIDER="letsencrypt"
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
LOG_LEVEL="INFO"
|
||||||
|
LOG_RETENTION_DAYS=30
|
||||||
|
DEBUG=0
|
||||||
|
|
||||||
|
# Backup
|
||||||
|
BACKUP_DIR="/root/proxy-core-backups"
|
||||||
|
BACKUP_RETENTION_DAYS=7
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
DOCKER_COMPOSE_VERSION="v2"
|
||||||
|
|
||||||
|
# Reverse Proxy Defaults
|
||||||
|
DEFAULT_REVERSE_PROXY="nginx"
|
||||||
|
ENABLE_HTTP2=true
|
||||||
|
ENABLE_HTTP3=false
|
||||||
|
ENABLE_BROTLI=true
|
||||||
|
ENABLE_GZIP=true
|
||||||
|
|
||||||
|
# Security
|
||||||
|
ENABLE_FAIL2BAN=true
|
||||||
|
ENABLE_UFW=true
|
||||||
|
SSH_PORT=22
|
||||||
|
|
||||||
|
# Performance
|
||||||
|
ENABLE_BBR=true
|
||||||
|
ENABLE_SWAP=true
|
||||||
|
SWAP_SIZE="2G"
|
||||||
@@ -1,561 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Proxy-Core - Advanced VPN & Proxy Panel Auto-Installer
|
|
||||||
# Version: 2.1.0
|
|
||||||
# Author: houseassassin
|
|
||||||
# GitHub: https://github.com/houseassassin/proxy-core
|
|
||||||
#
|
|
||||||
# Supports: WireGuard, 3x-ui, Remnawave, Hysteria2, MTProxy
|
|
||||||
# Reverse Proxy: Nginx, Caddy
|
|
||||||
# Features: Selfsteal templates
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
SCRIPT_VERSION="2.1.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"
|
|
||||||
[MTPROXY]="MTProxy (Telegram)"
|
|
||||||
[SELECT_REVERSE_PROXY]="Select Reverse Proxy"
|
|
||||||
[NGINX]="Nginx"
|
|
||||||
[CADDY]="Caddy"
|
|
||||||
[SELFSTEAL]="Install Selfsteal Template"
|
|
||||||
[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"
|
|
||||||
[MTPROXY]="MTProxy (Telegram)"
|
|
||||||
[SELECT_REVERSE_PROXY]="Выберите Reverse Proxy"
|
|
||||||
[NGINX]="Nginx"
|
|
||||||
[CADDY]="Caddy"
|
|
||||||
[SELFSTEAL]="Установить Selfsteal шаблон"
|
|
||||||
[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
|
|
||||||
}
|
|
||||||
|
|
||||||
# Docker management
|
|
||||||
install_docker() {
|
|
||||||
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
|
|
||||||
log "Docker уже установлен"
|
|
||||||
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
|
|
||||||
|
|
||||||
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 nginx
|
|
||||||
;;
|
|
||||||
centos|rhel|fedora)
|
|
||||||
yum update -y
|
|
||||||
yum install -y curl wget git sudo firewalld certbot \
|
|
||||||
ca-certificates jq openssl tar net-tools qrencode nginx
|
|
||||||
;;
|
|
||||||
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 "Системные пакеты установлены"
|
|
||||||
}
|
|
||||||
|
|
||||||
# MTProxy installation
|
|
||||||
install_mtproxy() {
|
|
||||||
log "Установка MTProxy для Telegram..."
|
|
||||||
|
|
||||||
# Установка зависимостей
|
|
||||||
case $OS in
|
|
||||||
ubuntu|debian)
|
|
||||||
apt-get install -y git build-essential libssl-dev zlib1g-dev
|
|
||||||
;;
|
|
||||||
centos|rhel|fedora)
|
|
||||||
yum install -y git gcc make openssl-devel zlib-devel
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Клонирование репозитория
|
|
||||||
cd /opt
|
|
||||||
if [ -d "MTProxy" ]; then
|
|
||||||
rm -rf MTProxy
|
|
||||||
fi
|
|
||||||
git clone https://github.com/TelegramMessenger/MTProxy.git
|
|
||||||
cd MTProxy
|
|
||||||
|
|
||||||
# Компиляция
|
|
||||||
make
|
|
||||||
|
|
||||||
# Получение секрета
|
|
||||||
curl -s https://core.telegram.org/getProxySecret -o proxy-secret
|
|
||||||
curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf
|
|
||||||
|
|
||||||
# Генерация секрета для клиентов
|
|
||||||
SECRET=$(head -c 16 /dev/urandom | xxd -ps)
|
|
||||||
|
|
||||||
# Выбор порта
|
|
||||||
read -p "Введите порт для MTProxy (по умолчанию 8443): " MTPROXY_PORT
|
|
||||||
MTPROXY_PORT=${MTPROXY_PORT:-8443}
|
|
||||||
|
|
||||||
# Создание systemd сервиса
|
|
||||||
cat > /etc/systemd/system/mtproxy.service <<EOF
|
|
||||||
[Unit]
|
|
||||||
Description=MTProxy Telegram Proxy
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
WorkingDirectory=/opt/MTProxy
|
|
||||||
ExecStart=/opt/MTProxy/objs/bin/mtproto-proxy -u nobody -p $MTPROXY_PORT -H $MTPROXY_PORT -S $SECRET --aes-pwd proxy-secret proxy-multi.conf -M 1
|
|
||||||
Restart=on-failure
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
EOF
|
|
||||||
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl enable mtproxy
|
|
||||||
systemctl start mtproxy
|
|
||||||
|
|
||||||
# Открыть порт в firewall
|
|
||||||
ufw allow $MTPROXY_PORT/tcp 2>/dev/null || firewall-cmd --permanent --add-port=$MTPROXY_PORT/tcp 2>/dev/null
|
|
||||||
|
|
||||||
SERVER_IP=$(get_server_ip)
|
|
||||||
|
|
||||||
success "MTProxy установлен!"
|
|
||||||
echo ""
|
|
||||||
log "Ссылка для подключения:"
|
|
||||||
echo -e "${CYAN}tg://proxy?server=${SERVER_IP}&port=${MTPROXY_PORT}&secret=${SECRET}${NC}"
|
|
||||||
echo ""
|
|
||||||
log "Или используйте в Telegram:"
|
|
||||||
echo -e "${YELLOW}Server: ${SERVER_IP}${NC}"
|
|
||||||
echo -e "${YELLOW}Port: ${MTPROXY_PORT}${NC}"
|
|
||||||
echo -e "${YELLOW}Secret: ${SECRET}${NC}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Reverse Proxy selection
|
|
||||||
select_reverse_proxy() {
|
|
||||||
echo ""
|
|
||||||
echo -e "${GREEN}$(L SELECT_REVERSE_PROXY)${NC}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${YELLOW}1.${NC} $(L NGINX)"
|
|
||||||
echo -e "${YELLOW}2.${NC} $(L CADDY)"
|
|
||||||
echo ""
|
|
||||||
read -p "Выберите / Select [1-2]: " PROXY_CHOICE
|
|
||||||
|
|
||||||
case $PROXY_CHOICE in
|
|
||||||
1)
|
|
||||||
REVERSE_PROXY="nginx"
|
|
||||||
install_nginx
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
REVERSE_PROXY="caddy"
|
|
||||||
install_caddy
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
warn "Неверный выбор, используется Nginx"
|
|
||||||
REVERSE_PROXY="nginx"
|
|
||||||
install_nginx
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Nginx installation
|
|
||||||
install_nginx() {
|
|
||||||
if command -v nginx >/dev/null 2>&1; then
|
|
||||||
log "Nginx уже установлен"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Установка Nginx..."
|
|
||||||
|
|
||||||
case $OS in
|
|
||||||
ubuntu|debian)
|
|
||||||
apt-get install -y nginx
|
|
||||||
;;
|
|
||||||
centos|rhel|fedora)
|
|
||||||
yum install -y nginx
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
systemctl enable nginx
|
|
||||||
systemctl start nginx
|
|
||||||
|
|
||||||
success "Nginx установлен"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Caddy installation
|
|
||||||
install_caddy() {
|
|
||||||
if command -v caddy >/dev/null 2>&1; then
|
|
||||||
log "Caddy уже установлен"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
log "Установка Caddy..."
|
|
||||||
|
|
||||||
case $OS in
|
|
||||||
ubuntu|debian)
|
|
||||||
apt-get install -y debian-keyring debian-archive-keyring apt-transport-https
|
|
||||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
|
||||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y caddy
|
|
||||||
;;
|
|
||||||
centos|rhel|fedora)
|
|
||||||
yum install -y yum-plugin-copr
|
|
||||||
yum copr enable @caddy/caddy -y
|
|
||||||
yum install -y caddy
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
systemctl enable caddy
|
|
||||||
systemctl start caddy
|
|
||||||
|
|
||||||
success "Caddy установлен"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Selfsteal template installation
|
|
||||||
install_selfsteal() {
|
|
||||||
log "Установка Selfsteal шаблона..."
|
|
||||||
|
|
||||||
if [ ! -d "/opt/remnawave" ] && [ ! -d "/opt/remnanode" ]; then
|
|
||||||
error "Remnawave или Remnanode должны быть установлены для selfsteal"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Определяем директорию
|
|
||||||
if [ -d "/opt/remnawave" ]; then
|
|
||||||
INSTALL_DIR="/opt/remnawave"
|
|
||||||
else
|
|
||||||
INSTALL_DIR="/opt/remnanode"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo -e "${GREEN}Выберите тип selfsteal шаблона:${NC}"
|
|
||||||
echo ""
|
|
||||||
echo -e "${YELLOW}1.${NC} Случайный сайт"
|
|
||||||
echo -e "${YELLOW}2.${NC} Пользовательский URL"
|
|
||||||
echo -e "${YELLOW}3.${NC} Локальный HTML файл"
|
|
||||||
echo ""
|
|
||||||
read -p "Выберите [1-3]: " SELFSTEAL_TYPE
|
|
||||||
|
|
||||||
case $SELFSTEAL_TYPE in
|
|
||||||
1)
|
|
||||||
# Список популярных сайтов
|
|
||||||
SITES=(
|
|
||||||
"https://www.wikipedia.org"
|
|
||||||
"https://www.github.com"
|
|
||||||
"https://www.stackoverflow.com"
|
|
||||||
"https://www.reddit.com"
|
|
||||||
"https://www.medium.com"
|
|
||||||
)
|
|
||||||
RANDOM_SITE=${SITES[$RANDOM % ${#SITES[@]}]}
|
|
||||||
log "Используется случайный сайт: $RANDOM_SITE"
|
|
||||||
|
|
||||||
# Скачиваем страницу
|
|
||||||
curl -sL "$RANDOM_SITE" > "$INSTALL_DIR/selfsteal.html"
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
read -p "Введите URL сайта: " CUSTOM_URL
|
|
||||||
log "Скачивание $CUSTOM_URL..."
|
|
||||||
curl -sL "$CUSTOM_URL" > "$INSTALL_DIR/selfsteal.html"
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
read -p "Введите путь к HTML файлу: " HTML_PATH
|
|
||||||
if [ -f "$HTML_PATH" ]; then
|
|
||||||
cp "$HTML_PATH" "$INSTALL_DIR/selfsteal.html"
|
|
||||||
else
|
|
||||||
error "Файл не найден: $HTML_PATH"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
warn "Неверный выбор"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Настройка Nginx для selfsteal
|
|
||||||
if [ "$REVERSE_PROXY" = "nginx" ]; then
|
|
||||||
cat > /etc/nginx/sites-available/selfsteal <<EOF
|
|
||||||
server {
|
|
||||||
listen 80 default_server;
|
|
||||||
listen [::]:80 default_server;
|
|
||||||
|
|
||||||
root $INSTALL_DIR;
|
|
||||||
index selfsteal.html;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
try_files \$uri \$uri/ /selfsteal.html;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
ln -sf /etc/nginx/sites-available/selfsteal /etc/nginx/sites-enabled/
|
|
||||||
nginx -t && systemctl reload nginx
|
|
||||||
fi
|
|
||||||
|
|
||||||
success "Selfsteal шаблон установлен"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 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}6.${NC} $(L SELFSTEAL)"
|
|
||||||
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 MTPROXY)"
|
|
||||||
echo -e "${YELLOW}6.${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
|
|
||||||
# WireGuard установка из оригинального скрипта
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
install_packages
|
|
||||||
# 3x-ui установка
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
install_packages
|
|
||||||
select_reverse_proxy
|
|
||||||
# Remnawave установка
|
|
||||||
;;
|
|
||||||
4)
|
|
||||||
install_packages
|
|
||||||
# Hysteria2 установка
|
|
||||||
;;
|
|
||||||
5)
|
|
||||||
install_packages
|
|
||||||
install_mtproxy
|
|
||||||
;;
|
|
||||||
6)
|
|
||||||
install_packages
|
|
||||||
select_reverse_proxy
|
|
||||||
# Установка всех компонентов
|
|
||||||
;;
|
|
||||||
0) continue ;;
|
|
||||||
*) warn "Неверный выбор / Invalid choice" ;;
|
|
||||||
esac
|
|
||||||
read -p "Нажмите Enter / Press Enter..."
|
|
||||||
;;
|
|
||||||
6)
|
|
||||||
install_selfsteal
|
|
||||||
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
|
|
||||||
@@ -1,622 +0,0 @@
|
|||||||
#!/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
|
|
||||||
+976
-192
File diff suppressed because it is too large
Load Diff
Executable
+182
@@ -0,0 +1,182 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Common functions library for Proxy-Core
|
||||||
|
# Version: 2.1.1
|
||||||
|
# Author: houseassassin
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
MAGENTA='\033[0;35m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
GRAY='\033[0;90m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
# Logging functions
|
||||||
|
log() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Validation functions
|
||||||
|
validate_port() {
|
||||||
|
local port=$1
|
||||||
|
if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||||
|
error "Неверный порт: $port (должен быть 1-65535)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_name() {
|
||||||
|
local name=$1
|
||||||
|
if [ -z "$name" ]; then
|
||||||
|
error "Имя не может быть пустым"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if ! [[ "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
||||||
|
error "Неверное имя: $name (только буквы, цифры, _ и -)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
check_port_available() {
|
||||||
|
local port=$1
|
||||||
|
if ss -ltun | awk '{print $4}' | grep -q ":$port\$"; then
|
||||||
|
error "Порт $port уже используется"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_ip() {
|
||||||
|
local ip=$1
|
||||||
|
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
error "Неверный IP адрес: $ip"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Network utilities
|
||||||
|
get_server_ip() {
|
||||||
|
curl -s -4 ifconfig.me || curl -s -4 api.ipify.org || curl -s -4 ipinfo.io/ip
|
||||||
|
}
|
||||||
|
|
||||||
|
get_random_port() {
|
||||||
|
local MIN=${1:-3000}
|
||||||
|
local MAX=${2:-6999}
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
PORT=$(shuf -i "$MIN-$MAX" -n 1)
|
||||||
|
if check_port_available "$PORT"; then
|
||||||
|
echo "$PORT"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# System checks
|
||||||
|
check_root() {
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
error "Этот скрипт должен быть запущен с правами root"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
detect_os() {
|
||||||
|
if [ -f /etc/os-release ]; then
|
||||||
|
. /etc/os-release
|
||||||
|
OS=$ID
|
||||||
|
VER=$VERSION_ID
|
||||||
|
else
|
||||||
|
error "Не удалось определить операционную систему"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Spinner animation
|
||||||
|
spinner() {
|
||||||
|
local pid=$1
|
||||||
|
local text=$2
|
||||||
|
local spinstr='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
|
||||||
|
|
||||||
|
while kill -0 "$pid" 2>/dev/null; do
|
||||||
|
for (( i=0; i<${#spinstr}; i++ )); do
|
||||||
|
printf "\r${GREEN}[%s]${NC} %s" "${spinstr:$i:1}" "$text"
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
done
|
||||||
|
printf "\r\033[K"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Confirmation prompt
|
||||||
|
confirm() {
|
||||||
|
local prompt="${1:-Продолжить?}"
|
||||||
|
local default="${2:-n}"
|
||||||
|
|
||||||
|
if [ "$default" = "y" ]; then
|
||||||
|
read -p "$prompt (Y/n): " response
|
||||||
|
response=${response:-y}
|
||||||
|
else
|
||||||
|
read -p "$prompt (y/N): " response
|
||||||
|
response=${response:-n}
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ "$response" =~ ^[Yy]$ ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate random password
|
||||||
|
generate_password() {
|
||||||
|
local length=${1:-16}
|
||||||
|
openssl rand -base64 $length | tr -d "=+/" | cut -c1-$length
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if command exists
|
||||||
|
command_exists() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if service is running
|
||||||
|
service_running() {
|
||||||
|
systemctl is-active --quiet "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Wait for service to start
|
||||||
|
wait_for_service() {
|
||||||
|
local service=$1
|
||||||
|
local timeout=${2:-30}
|
||||||
|
local counter=0
|
||||||
|
|
||||||
|
while [ $counter -lt $timeout ]; do
|
||||||
|
if service_running "$service"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
((counter++))
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export all functions
|
||||||
|
export -f log warn error success
|
||||||
|
export -f validate_port validate_name check_port_available validate_ip
|
||||||
|
export -f get_server_ip get_random_port
|
||||||
|
export -f check_root detect_os spinner confirm
|
||||||
|
export -f generate_password command_exists service_running wait_for_service
|
||||||
Executable
+56
@@ -0,0 +1,56 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Logging library for Proxy-Core
|
||||||
|
# Version: 2.1.1
|
||||||
|
# Author: houseassassin
|
||||||
|
|
||||||
|
LOGDIR="/var/log/proxy-core"
|
||||||
|
mkdir -p "$LOGDIR" 2>/dev/null
|
||||||
|
|
||||||
|
# Source common for colors
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
source "$SCRIPT_DIR/common.sh" 2>/dev/null || true
|
||||||
|
|
||||||
|
log_to_file() {
|
||||||
|
local level=$1
|
||||||
|
local message=$2
|
||||||
|
local script=$(basename "${BASH_SOURCE[2]}" 2>/dev/null || echo "unknown")
|
||||||
|
local logfile="${LOGDIR}/$(date +%Y-%m-%d).log"
|
||||||
|
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$script] [$level] $message" >> "$logfile" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
log_to_file "INFO" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
log_to_file "ERROR" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||||
|
log_to_file "WARN" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
log_to_file "SUCCESS" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
debug() {
|
||||||
|
if [ "${DEBUG:-0}" = "1" ]; then
|
||||||
|
echo -e "${GRAY}[DEBUG]${NC} $1"
|
||||||
|
log_to_file "DEBUG" "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rotate logs older than 30 days
|
||||||
|
rotate_logs() {
|
||||||
|
find "$LOGDIR" -name "*.log" -mtime +30 -delete 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export functions
|
||||||
|
export -f log_to_file log error warn success debug rotate_logs
|
||||||
Executable
+205
@@ -0,0 +1,205 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# WireGuard common functions library
|
||||||
|
# Version: 2.1.1
|
||||||
|
# Author: houseassassin
|
||||||
|
|
||||||
|
# Source common library
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
source "$SCRIPT_DIR/common.sh"
|
||||||
|
|
||||||
|
WG_DIR="${WG_DIR:-/etc/wireguard}"
|
||||||
|
WG_CONF="$WG_DIR/wg0.conf"
|
||||||
|
|
||||||
|
# Get next available IP for WireGuard client
|
||||||
|
get_next_wg_ip() {
|
||||||
|
if [ ! -f "$WG_CONF" ]; then
|
||||||
|
echo "10.0.0.2"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
LAST_IP=$(grep "AllowedIPs" "$WG_CONF" | grep -oE "10\.0\.0\.[0-9]+" | sort -t . -k 4 -n | tail -1)
|
||||||
|
|
||||||
|
if [ -z "$LAST_IP" ]; then
|
||||||
|
echo "10.0.0.2"
|
||||||
|
else
|
||||||
|
LAST_NUM=$(echo "$LAST_IP" | cut -d. -f4)
|
||||||
|
NEXT_NUM=$((LAST_NUM + 1))
|
||||||
|
if [ "$NEXT_NUM" -gt 254 ]; then
|
||||||
|
error "Пул адресов WireGuard исчерпан (10.0.0.2-10.0.0.254)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
echo "10.0.0.$NEXT_NUM"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add WireGuard client
|
||||||
|
add_wireguard_client() {
|
||||||
|
local client_name=$1
|
||||||
|
|
||||||
|
if [ -z "$client_name" ]; then
|
||||||
|
read -p "Введите имя клиента: " client_name
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! validate_name "$client_name"; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local CLIENT_DIR="$WG_DIR/clients/$client_name"
|
||||||
|
|
||||||
|
if [ -d "$CLIENT_DIR" ]; then
|
||||||
|
error "Клиент $client_name уже существует"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$CLIENT_DIR"
|
||||||
|
cd "$CLIENT_DIR"
|
||||||
|
|
||||||
|
# Generate keys
|
||||||
|
wg genkey | tee private.key | wg pubkey > public.key
|
||||||
|
chmod 600 private.key
|
||||||
|
|
||||||
|
CLIENT_PRIVATE_KEY=$(cat private.key)
|
||||||
|
CLIENT_PUBLIC_KEY=$(cat public.key)
|
||||||
|
SERVER_PUBLIC_KEY=$(cat $WG_DIR/server_public.key)
|
||||||
|
SERVER_IP=$(get_server_ip)
|
||||||
|
SERVER_PORT=$(grep ListenPort $WG_CONF | awk '{print $3}')
|
||||||
|
CLIENT_IP=$(get_next_wg_ip)
|
||||||
|
|
||||||
|
# Add peer to server config
|
||||||
|
cat >> $WG_CONF <<EOF
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
# $client_name
|
||||||
|
PublicKey = $CLIENT_PUBLIC_KEY
|
||||||
|
AllowedIPs = $CLIENT_IP/32
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Create client config
|
||||||
|
cat > client.conf <<EOF
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = $CLIENT_PRIVATE_KEY
|
||||||
|
Address = $CLIENT_IP/24
|
||||||
|
DNS = 8.8.8.8, 1.1.1.1
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = $SERVER_PUBLIC_KEY
|
||||||
|
Endpoint = $SERVER_IP:$SERVER_PORT
|
||||||
|
AllowedIPs = 0.0.0.0/0, ::/0
|
||||||
|
PersistentKeepalive = 25
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl restart wg-quick@wg0
|
||||||
|
|
||||||
|
success "Клиент $client_name создан"
|
||||||
|
log "IP адрес: $CLIENT_IP"
|
||||||
|
log "Конфигурация: $CLIENT_DIR/client.conf"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
log "QR-код для мобильных устройств:"
|
||||||
|
if command_exists qrencode; then
|
||||||
|
qrencode -t ansiutf8 < client.conf
|
||||||
|
else
|
||||||
|
warn "qrencode не установлен, QR-код недоступен"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
log "Конфигурация клиента:"
|
||||||
|
cat client.conf
|
||||||
|
}
|
||||||
|
|
||||||
|
# List WireGuard clients
|
||||||
|
list_wireguard_clients() {
|
||||||
|
log "Список клиентов WireGuard:"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ ! -d "$WG_DIR/clients" ]; then
|
||||||
|
warn "Клиенты не найдены"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
for client in $WG_DIR/clients/*; do
|
||||||
|
if [ -d "$client" ]; then
|
||||||
|
CLIENT_NAME=$(basename "$client")
|
||||||
|
CLIENT_IP=$(grep -A 2 "# $CLIENT_NAME" $WG_CONF | grep AllowedIPs | awk '{print $3}' | cut -d/ -f1)
|
||||||
|
echo -e "${GREEN}•${NC} $CLIENT_NAME ${BLUE}($CLIENT_IP)${NC}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove WireGuard client
|
||||||
|
remove_wireguard_client() {
|
||||||
|
local client_name=$1
|
||||||
|
|
||||||
|
if [ -z "$client_name" ]; then
|
||||||
|
read -p "Введите имя клиента для удаления: " client_name
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! validate_name "$client_name"; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local CLIENT_DIR="$WG_DIR/clients/$client_name"
|
||||||
|
|
||||||
|
if [ ! -d "$CLIENT_DIR" ]; then
|
||||||
|
error "Клиент $client_name не найден"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! confirm "Удалить клиента $client_name?"; then
|
||||||
|
log "Отменено"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
local tmp_conf
|
||||||
|
tmp_conf="$(mktemp)"
|
||||||
|
awk -v marker="# ${client_name}" '
|
||||||
|
BEGIN {skip=0}
|
||||||
|
$0 == marker {skip=1; next}
|
||||||
|
skip && /^\[Peer\]/ {skip=0}
|
||||||
|
!skip {print}
|
||||||
|
' "$WG_CONF" > "$tmp_conf"
|
||||||
|
mv "$tmp_conf" "$WG_CONF"
|
||||||
|
rm -rf "$CLIENT_DIR"
|
||||||
|
|
||||||
|
systemctl restart wg-quick@wg0
|
||||||
|
|
||||||
|
success "Клиент $client_name удален"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show WireGuard client QR code
|
||||||
|
show_wireguard_qr() {
|
||||||
|
local client_name=$1
|
||||||
|
|
||||||
|
if [ -z "$client_name" ]; then
|
||||||
|
read -p "Введите имя клиента: " client_name
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! validate_name "$client_name"; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local CLIENT_DIR="$WG_DIR/clients/$client_name"
|
||||||
|
|
||||||
|
if [ ! -d "$CLIENT_DIR" ]; then
|
||||||
|
error "Клиент $client_name не найден"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
log "Конфигурация клиента $client_name:"
|
||||||
|
cat "$CLIENT_DIR/client.conf"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
log "QR-код:"
|
||||||
|
if command_exists qrencode; then
|
||||||
|
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
|
||||||
|
else
|
||||||
|
error "qrencode не установлен"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export functions
|
||||||
|
export -f get_next_wg_ip add_wireguard_client list_wireguard_clients
|
||||||
|
export -f remove_wireguard_client show_wireguard_qr
|
||||||
@@ -19,6 +19,38 @@ warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|||||||
error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
||||||
|
|
||||||
|
get_server_ip() {
|
||||||
|
curl -s -4 ifconfig.me || curl -s -4 api.ipify.org || curl -s -4 ipinfo.io/ip
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_client_name() {
|
||||||
|
local client_name=$1
|
||||||
|
[[ "$client_name" =~ ^[a-zA-Z0-9_-]+$ ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_wg_peer_block() {
|
||||||
|
local client_name=$1
|
||||||
|
local tmp_conf
|
||||||
|
tmp_conf="$(mktemp)"
|
||||||
|
awk -v marker="# ${client_name}" '
|
||||||
|
BEGIN {skip=0}
|
||||||
|
$0 == marker {skip=1; next}
|
||||||
|
skip && /^\[Peer\]/ {skip=0}
|
||||||
|
!skip {print}
|
||||||
|
' /etc/wireguard/wg0.conf > "$tmp_conf"
|
||||||
|
mv "$tmp_conf" /etc/wireguard/wg0.conf
|
||||||
|
}
|
||||||
|
|
||||||
|
run_remote_script() {
|
||||||
|
local url=$1
|
||||||
|
local tmp_script
|
||||||
|
tmp_script="$(mktemp /tmp/proxy-core-remote.XXXXXX.sh)"
|
||||||
|
curl -fsSL "$url" -o "$tmp_script"
|
||||||
|
chmod 700 "$tmp_script"
|
||||||
|
bash "$tmp_script"
|
||||||
|
rm -f "$tmp_script"
|
||||||
|
}
|
||||||
|
|
||||||
# WireGuard Management
|
# WireGuard Management
|
||||||
manage_wireguard() {
|
manage_wireguard() {
|
||||||
if ! systemctl is-active --quiet wg-quick@wg0; then
|
if ! systemctl is-active --quiet wg-quick@wg0; then
|
||||||
@@ -84,6 +116,10 @@ add_wireguard_client() {
|
|||||||
error "Имя не может быть пустым"
|
error "Имя не может быть пустым"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if ! validate_client_name "$CLIENT_NAME"; then
|
||||||
|
error "Неверное имя: только буквы, цифры, _ и -"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
CLIENT_DIR="/etc/wireguard/clients/$CLIENT_NAME"
|
CLIENT_DIR="/etc/wireguard/clients/$CLIENT_NAME"
|
||||||
|
|
||||||
@@ -102,7 +138,7 @@ add_wireguard_client() {
|
|||||||
CLIENT_PRIVATE_KEY=$(cat private.key)
|
CLIENT_PRIVATE_KEY=$(cat private.key)
|
||||||
CLIENT_PUBLIC_KEY=$(cat public.key)
|
CLIENT_PUBLIC_KEY=$(cat public.key)
|
||||||
SERVER_PUBLIC_KEY=$(cat /etc/wireguard/server_public.key)
|
SERVER_PUBLIC_KEY=$(cat /etc/wireguard/server_public.key)
|
||||||
SERVER_IP=$(curl -s ifconfig.me)
|
SERVER_IP=$(get_server_ip)
|
||||||
SERVER_PORT=$(grep ListenPort /etc/wireguard/wg0.conf | awk '{print $3}')
|
SERVER_PORT=$(grep ListenPort /etc/wireguard/wg0.conf | awk '{print $3}')
|
||||||
|
|
||||||
# Get next available IP
|
# Get next available IP
|
||||||
@@ -112,6 +148,10 @@ add_wireguard_client() {
|
|||||||
else
|
else
|
||||||
LAST_NUM=$(echo $LAST_IP | cut -d. -f4)
|
LAST_NUM=$(echo $LAST_IP | cut -d. -f4)
|
||||||
NEXT_NUM=$((LAST_NUM + 1))
|
NEXT_NUM=$((LAST_NUM + 1))
|
||||||
|
if [ "$NEXT_NUM" -gt 254 ]; then
|
||||||
|
error "Пул адресов WireGuard исчерпан (10.0.0.2-10.0.0.254)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
CLIENT_IP="10.0.0.$NEXT_NUM"
|
CLIENT_IP="10.0.0.$NEXT_NUM"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -146,7 +186,11 @@ EOF
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
log "QR-код для мобильных устройств:"
|
log "QR-код для мобильных устройств:"
|
||||||
qrencode -t ansiutf8 < client.conf
|
if command -v qrencode >/dev/null 2>&1; then
|
||||||
|
qrencode -t ansiutf8 < client.conf
|
||||||
|
else
|
||||||
|
warn "qrencode не установлен, пропускаем QR-код"
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
read -p "Нажмите Enter..."
|
read -p "Нажмите Enter..."
|
||||||
@@ -182,6 +226,10 @@ remove_wireguard_client() {
|
|||||||
error "Имя не может быть пустым"
|
error "Имя не может быть пустым"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if ! validate_client_name "$CLIENT_NAME"; then
|
||||||
|
error "Неверное имя: только буквы, цифры, _ и -"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
CLIENT_DIR="/etc/wireguard/clients/$CLIENT_NAME"
|
CLIENT_DIR="/etc/wireguard/clients/$CLIENT_NAME"
|
||||||
|
|
||||||
@@ -190,7 +238,7 @@ remove_wireguard_client() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sed -i "/# $CLIENT_NAME/,+2d" /etc/wireguard/wg0.conf
|
remove_wg_peer_block "$CLIENT_NAME"
|
||||||
rm -rf "$CLIENT_DIR"
|
rm -rf "$CLIENT_DIR"
|
||||||
|
|
||||||
systemctl restart wg-quick@wg0
|
systemctl restart wg-quick@wg0
|
||||||
@@ -206,6 +254,10 @@ show_wireguard_qr() {
|
|||||||
error "Имя не может быть пустым"
|
error "Имя не может быть пустым"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if ! validate_client_name "$CLIENT_NAME"; then
|
||||||
|
error "Неверное имя: только буквы, цифры, _ и -"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
CLIENT_DIR="/etc/wireguard/clients/$CLIENT_NAME"
|
CLIENT_DIR="/etc/wireguard/clients/$CLIENT_NAME"
|
||||||
|
|
||||||
@@ -220,7 +272,11 @@ show_wireguard_qr() {
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
log "QR-код:"
|
log "QR-код:"
|
||||||
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
|
if command -v qrencode >/dev/null 2>&1; then
|
||||||
|
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
|
||||||
|
else
|
||||||
|
warn "qrencode не установлен, пропускаем QR-код"
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
read -p "Нажмите Enter..."
|
read -p "Нажмите Enter..."
|
||||||
@@ -274,7 +330,7 @@ manage_3xui() {
|
|||||||
x-ui log
|
x-ui log
|
||||||
;;
|
;;
|
||||||
6)
|
6)
|
||||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
run_remote_script "https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh"
|
||||||
success "3x-ui обновлен"
|
success "3x-ui обновлен"
|
||||||
sleep 2
|
sleep 2
|
||||||
;;
|
;;
|
||||||
|
|||||||
+59
-6
@@ -3,10 +3,13 @@
|
|||||||
# MTProxy Manager
|
# MTProxy Manager
|
||||||
# Author: houseassassin
|
# Author: houseassassin
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
BLUE='\033[0;34m'
|
BLUE='\033[0;34m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
|
||||||
@@ -16,6 +19,18 @@ success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
|||||||
|
|
||||||
MTPROXY_DIR="/opt/MTProxy"
|
MTPROXY_DIR="/opt/MTProxy"
|
||||||
|
|
||||||
|
get_server_ip() {
|
||||||
|
curl -s -4 ifconfig.me || curl -s -4 api.ipify.org || curl -s -4 ipinfo.io/ip
|
||||||
|
}
|
||||||
|
|
||||||
|
validate_port() {
|
||||||
|
local port=$1
|
||||||
|
if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
check_installed() {
|
check_installed() {
|
||||||
if [ ! -d "$MTPROXY_DIR" ]; then
|
if [ ! -d "$MTPROXY_DIR" ]; then
|
||||||
error "MTProxy не установлен"
|
error "MTProxy не установлен"
|
||||||
@@ -30,7 +45,7 @@ get_connection_link() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
source "$MTPROXY_DIR/.config"
|
source "$MTPROXY_DIR/.config"
|
||||||
SERVER_IP=$(curl -s ifconfig.me)
|
SERVER_IP=$(get_server_ip)
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
log "Ссылка для подключения:"
|
log "Ссылка для подключения:"
|
||||||
@@ -60,12 +75,29 @@ regenerate_secret() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
source "$MTPROXY_DIR/.config"
|
||||||
NEW_SECRET=$(head -c 16 /dev/urandom | xxd -ps)
|
NEW_SECRET=$(head -c 16 /dev/urandom | xxd -ps)
|
||||||
|
|
||||||
# Обновляем конфигурацию
|
# Обновляем конфигурацию
|
||||||
sed -i "s/SECRET=.*/SECRET=$NEW_SECRET/" "$MTPROXY_DIR/.config"
|
sed -i "s/SECRET=.*/SECRET=$NEW_SECRET/" "$MTPROXY_DIR/.config"
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/mtproxy.service <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=MTProxy Telegram Proxy
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=$MTPROXY_DIR
|
||||||
|
ExecStart=$MTPROXY_DIR/objs/bin/mtproto-proxy -u nobody -p $MTPROXY_PORT -H $MTPROXY_PORT -S $NEW_SECRET --aes-pwd proxy-secret proxy-multi.conf -M 1
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
# Перезапускаем сервис
|
# Перезапускаем сервис
|
||||||
|
systemctl daemon-reload
|
||||||
systemctl restart mtproxy
|
systemctl restart mtproxy
|
||||||
|
|
||||||
success "Новый секрет сгенерирован: $NEW_SECRET"
|
success "Новый секрет сгенерирован: $NEW_SECRET"
|
||||||
@@ -81,6 +113,10 @@ change_port() {
|
|||||||
error "Порт не может быть пустым"
|
error "Порт не может быть пустым"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
if ! validate_port "$NEW_PORT"; then
|
||||||
|
error "Неверный порт: $NEW_PORT"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Проверяем, что порт свободен
|
# Проверяем, что порт свободен
|
||||||
if ss -ltun | grep -q ":$NEW_PORT "; then
|
if ss -ltun | grep -q ":$NEW_PORT "; then
|
||||||
@@ -88,6 +124,9 @@ change_port() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
source "$MTPROXY_DIR/.config"
|
||||||
|
local old_port="$MTPROXY_PORT"
|
||||||
|
|
||||||
# Обновляем конфигурацию
|
# Обновляем конфигурацию
|
||||||
sed -i "s/MTPROXY_PORT=.*/MTPROXY_PORT=$NEW_PORT/" "$MTPROXY_DIR/.config"
|
sed -i "s/MTPROXY_PORT=.*/MTPROXY_PORT=$NEW_PORT/" "$MTPROXY_DIR/.config"
|
||||||
|
|
||||||
@@ -113,8 +152,14 @@ EOF
|
|||||||
systemctl restart mtproxy
|
systemctl restart mtproxy
|
||||||
|
|
||||||
# Обновляем firewall
|
# Обновляем firewall
|
||||||
ufw delete allow $MTPROXY_PORT/tcp 2>/dev/null
|
if command -v ufw >/dev/null 2>&1; then
|
||||||
ufw allow $NEW_PORT/tcp 2>/dev/null
|
ufw delete allow $old_port/tcp 2>/dev/null || true
|
||||||
|
ufw allow $NEW_PORT/tcp 2>/dev/null || true
|
||||||
|
elif command -v firewall-cmd >/dev/null 2>&1; then
|
||||||
|
firewall-cmd --permanent --remove-port="${old_port}/tcp" >/dev/null 2>&1 || true
|
||||||
|
firewall-cmd --permanent --add-port="${NEW_PORT}/tcp" >/dev/null 2>&1 || true
|
||||||
|
firewall-cmd --reload >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
|
||||||
success "Порт изменен на $NEW_PORT"
|
success "Порт изменен на $NEW_PORT"
|
||||||
get_connection_link
|
get_connection_link
|
||||||
@@ -156,7 +201,7 @@ show_stats() {
|
|||||||
# Количество подключений
|
# Количество подключений
|
||||||
echo ""
|
echo ""
|
||||||
log "Активные подключения:"
|
log "Активные подключения:"
|
||||||
ss -tn | grep -c ":$(source $MTPROXY_DIR/.config && echo $MTPROXY_PORT) " || echo "0"
|
ss -tn | grep -c ":$MTPROXY_PORT " || echo "0"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
@@ -183,6 +228,9 @@ uninstall_mtproxy() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
source "$MTPROXY_DIR/.config" 2>/dev/null || true
|
||||||
|
local mtproxy_port="${MTPROXY_PORT:-}"
|
||||||
|
|
||||||
# Остановка и удаление сервиса
|
# Остановка и удаление сервиса
|
||||||
systemctl stop mtproxy
|
systemctl stop mtproxy
|
||||||
systemctl disable mtproxy
|
systemctl disable mtproxy
|
||||||
@@ -193,8 +241,12 @@ uninstall_mtproxy() {
|
|||||||
rm -rf "$MTPROXY_DIR"
|
rm -rf "$MTPROXY_DIR"
|
||||||
|
|
||||||
# Удаление правила firewall
|
# Удаление правила firewall
|
||||||
source "$MTPROXY_DIR/.config" 2>/dev/null
|
if [ -n "$mtproxy_port" ] && command -v ufw >/dev/null 2>&1; then
|
||||||
ufw delete allow $MTPROXY_PORT/tcp 2>/dev/null
|
ufw delete allow $mtproxy_port/tcp 2>/dev/null || true
|
||||||
|
elif [ -n "$mtproxy_port" ] && command -v firewall-cmd >/dev/null 2>&1; then
|
||||||
|
firewall-cmd --permanent --remove-port="${mtproxy_port}/tcp" >/dev/null 2>&1 || true
|
||||||
|
firewall-cmd --reload >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
|
||||||
success "MTProxy удален"
|
success "MTProxy удален"
|
||||||
exit 0
|
exit 0
|
||||||
@@ -270,3 +322,4 @@ if [[ $EUID -ne 0 ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
main_menu
|
main_menu
|
||||||
|
source "$MTPROXY_DIR/.config"
|
||||||
|
|||||||
Executable
+582
@@ -0,0 +1,582 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Reverse Proxy Manager for Proxy-Core
|
||||||
|
# Version: 2.1.1
|
||||||
|
# Author: houseassassin
|
||||||
|
# Supports: Nginx, Caddy, HAProxy
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
source "$SCRIPT_DIR/lib/common.sh"
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
MAGENTA='\033[0;35m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
WHITE='\033[1;37m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
NGINX_DIR="/etc/nginx"
|
||||||
|
CADDY_DIR="/etc/caddy"
|
||||||
|
HAPROXY_DIR="/etc/haproxy"
|
||||||
|
|
||||||
|
# Detect installed reverse proxies
|
||||||
|
detect_installed_proxies() {
|
||||||
|
local proxies=()
|
||||||
|
|
||||||
|
if command_exists nginx; then
|
||||||
|
proxies+=("nginx")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command_exists caddy; then
|
||||||
|
proxies+=("caddy")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command_exists haproxy; then
|
||||||
|
proxies+=("haproxy")
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${proxies[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install Nginx
|
||||||
|
install_nginx() {
|
||||||
|
log "Установка Nginx..."
|
||||||
|
|
||||||
|
case $OS in
|
||||||
|
ubuntu|debian)
|
||||||
|
apt-get update -y
|
||||||
|
apt-get install -y nginx nginx-extras certbot python3-certbot-nginx
|
||||||
|
;;
|
||||||
|
centos|rhel|fedora)
|
||||||
|
yum install -y nginx certbot python3-certbot-nginx
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
systemctl enable nginx
|
||||||
|
systemctl start nginx
|
||||||
|
|
||||||
|
success "Nginx установлен"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install Caddy
|
||||||
|
install_caddy() {
|
||||||
|
log "Установка Caddy..."
|
||||||
|
|
||||||
|
case $OS in
|
||||||
|
ubuntu|debian)
|
||||||
|
apt-get install -y debian-keyring debian-archive-keyring apt-transport-https
|
||||||
|
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||||
|
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y caddy
|
||||||
|
;;
|
||||||
|
centos|rhel|fedora)
|
||||||
|
yum install -y yum-plugin-copr
|
||||||
|
yum copr enable @caddy/caddy -y
|
||||||
|
yum install -y caddy
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
systemctl enable caddy
|
||||||
|
systemctl start caddy
|
||||||
|
|
||||||
|
success "Caddy установлен"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install HAProxy
|
||||||
|
install_haproxy() {
|
||||||
|
log "Установка HAProxy..."
|
||||||
|
|
||||||
|
case $OS in
|
||||||
|
ubuntu|debian)
|
||||||
|
apt-get update -y
|
||||||
|
apt-get install -y haproxy certbot
|
||||||
|
;;
|
||||||
|
centos|rhel|fedora)
|
||||||
|
yum install -y haproxy certbot
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
systemctl enable haproxy
|
||||||
|
systemctl start haproxy
|
||||||
|
|
||||||
|
success "HAProxy установлен"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure Nginx for 3x-ui
|
||||||
|
configure_nginx_3xui() {
|
||||||
|
log "Настройка Nginx для 3x-ui..."
|
||||||
|
|
||||||
|
read -p "Введите домен (например, vpn.example.com): " DOMAIN
|
||||||
|
read -p "Введите порт 3x-ui (по умолчанию 2053): " XRAY_PORT
|
||||||
|
XRAY_PORT=${XRAY_PORT:-2053}
|
||||||
|
if ! [[ "$XRAY_PORT" =~ ^[0-9]+$ ]] || [ "$XRAY_PORT" -lt 1 ] || [ "$XRAY_PORT" -gt 65535 ]; then
|
||||||
|
error "Неверный порт: $XRAY_PORT"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > "$NGINX_DIR/sites-available/3xui" <<EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 301 https://\$server_name\$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443;
|
||||||
|
listen [::]:443;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:$XRAY_PORT;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ln -sf "$NGINX_DIR/sites-available/3xui" "$NGINX_DIR/sites-enabled/"
|
||||||
|
nginx -t
|
||||||
|
|
||||||
|
log "Получение SSL сертификата..."
|
||||||
|
certbot certonly --nginx -d $DOMAIN --non-interactive --agree-tos --email admin@$DOMAIN
|
||||||
|
|
||||||
|
cat > "$NGINX_DIR/sites-available/3xui" <<EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
location /.well-known/acme-challenge/ {
|
||||||
|
root /var/www/html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
return 301 https://\$server_name\$request_uri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:$XRAY_PORT;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade \$http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
|
||||||
|
success "Nginx настроен для 3x-ui на домене $DOMAIN"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure Caddy for 3x-ui
|
||||||
|
configure_caddy_3xui() {
|
||||||
|
log "Настройка Caddy для 3x-ui..."
|
||||||
|
|
||||||
|
read -p "Введите домен (например, vpn.example.com): " DOMAIN
|
||||||
|
read -p "Введите порт 3x-ui (по умолчанию 2053): " XRAY_PORT
|
||||||
|
XRAY_PORT=${XRAY_PORT:-2053}
|
||||||
|
|
||||||
|
cat > "$CADDY_DIR/Caddyfile" <<EOF
|
||||||
|
$DOMAIN {
|
||||||
|
reverse_proxy localhost:$XRAY_PORT {
|
||||||
|
header_up Host {host}
|
||||||
|
header_up X-Real-IP {remote}
|
||||||
|
header_up X-Forwarded-For {remote}
|
||||||
|
header_up X-Forwarded-Proto {scheme}
|
||||||
|
}
|
||||||
|
|
||||||
|
encode gzip
|
||||||
|
|
||||||
|
tls {
|
||||||
|
protocols tls1.2 tls1.3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
caddy validate --config "$CADDY_DIR/Caddyfile"
|
||||||
|
systemctl reload caddy
|
||||||
|
|
||||||
|
success "Caddy настроен для 3x-ui на домене $DOMAIN"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure HAProxy for load balancing
|
||||||
|
configure_haproxy_loadbalancer() {
|
||||||
|
log "Настройка HAProxy для балансировки нагрузки..."
|
||||||
|
|
||||||
|
read -p "Введите количество backend серверов: " BACKEND_COUNT
|
||||||
|
if ! [[ "$BACKEND_COUNT" =~ ^[0-9]+$ ]] || [ "$BACKEND_COUNT" -lt 1 ]; then
|
||||||
|
error "Введите число больше 0"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
log "Введите IP адреса backend серверов:"
|
||||||
|
declare -a BACKENDS
|
||||||
|
for ((i=1; i<=BACKEND_COUNT; i++)); do
|
||||||
|
read -p "Backend $i IP:PORT: " backend
|
||||||
|
BACKENDS+=("$backend")
|
||||||
|
done
|
||||||
|
|
||||||
|
cat > "$HAPROXY_DIR/haproxy.cfg" <<EOF
|
||||||
|
global
|
||||||
|
log /dev/log local0
|
||||||
|
log /dev/log local1 notice
|
||||||
|
chroot /var/lib/haproxy
|
||||||
|
stats socket /run/haproxy/admin.sock mode 660 level admin
|
||||||
|
stats timeout 30s
|
||||||
|
user haproxy
|
||||||
|
group haproxy
|
||||||
|
daemon
|
||||||
|
|
||||||
|
defaults
|
||||||
|
log global
|
||||||
|
mode tcp
|
||||||
|
option tcplog
|
||||||
|
option dontlognull
|
||||||
|
timeout connect 5000
|
||||||
|
timeout client 50000
|
||||||
|
timeout server 50000
|
||||||
|
|
||||||
|
frontend vpn_frontend
|
||||||
|
bind *:443
|
||||||
|
mode tcp
|
||||||
|
default_backend vpn_backend
|
||||||
|
|
||||||
|
backend vpn_backend
|
||||||
|
mode tcp
|
||||||
|
balance roundrobin
|
||||||
|
EOF
|
||||||
|
|
||||||
|
for i in "${!BACKENDS[@]}"; do
|
||||||
|
echo " server backend$((i+1)) ${BACKENDS[$i]} check" >> "$HAPROXY_DIR/haproxy.cfg"
|
||||||
|
done
|
||||||
|
|
||||||
|
haproxy -c -f "$HAPROXY_DIR/haproxy.cfg"
|
||||||
|
systemctl reload haproxy
|
||||||
|
|
||||||
|
success "HAProxy настроен для балансировки нагрузки"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure Nginx + Caddy (hybrid)
|
||||||
|
configure_hybrid_nginx_caddy() {
|
||||||
|
log "Настройка гибридной конфигурации Nginx + Caddy..."
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}Гибридная конфигурация:${NC}"
|
||||||
|
echo "• Nginx - обработка статики и кэширование"
|
||||||
|
echo "• Caddy - автоматический SSL и проксирование"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
read -p "Введите домен: " DOMAIN
|
||||||
|
|
||||||
|
# Nginx для статики
|
||||||
|
cat > "$NGINX_DIR/sites-available/hybrid" <<EOF
|
||||||
|
server {
|
||||||
|
listen 8080;
|
||||||
|
server_name $DOMAIN;
|
||||||
|
|
||||||
|
root /var/www/html;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
location /static/ {
|
||||||
|
expires 30d;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:8081;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
ln -sf "$NGINX_DIR/sites-available/hybrid" "$NGINX_DIR/sites-enabled/"
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
|
||||||
|
# Caddy для SSL
|
||||||
|
cat > "$CADDY_DIR/Caddyfile" <<EOF
|
||||||
|
$DOMAIN {
|
||||||
|
reverse_proxy localhost:8080
|
||||||
|
encode gzip
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
caddy validate --config "$CADDY_DIR/Caddyfile"
|
||||||
|
systemctl reload caddy
|
||||||
|
|
||||||
|
success "Гибридная конфигурация настроена"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show configuration tips
|
||||||
|
show_tips() {
|
||||||
|
clear
|
||||||
|
echo ""
|
||||||
|
echo -e "${MAGENTA}╔════════════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${MAGENTA}║${NC} ${WHITE}Подсказки по настройке Reverse Proxy${NC} ${MAGENTA}║${NC}"
|
||||||
|
echo -e "${MAGENTA}╚════════════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} ${WHITE}Nginx${NC} ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo -e " ${GREEN}✓${NC} Лучший выбор для высоких нагрузок"
|
||||||
|
echo -e " ${GREEN}✓${NC} Отличное кэширование и обработка статики"
|
||||||
|
echo -e " ${GREEN}✓${NC} Гибкая конфигурация"
|
||||||
|
echo -e " ${RED}✗${NC} Требует ручной настройки SSL"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} ${WHITE}Caddy${NC} ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo -e " ${GREEN}✓${NC} Автоматический SSL из коробки"
|
||||||
|
echo -e " ${GREEN}✓${NC} Простая конфигурация"
|
||||||
|
echo -e " ${GREEN}✓${NC} HTTP/3 поддержка"
|
||||||
|
echo -e " ${RED}✗${NC} Меньше производительность чем Nginx"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} ${WHITE}HAProxy${NC} ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo -e " ${GREEN}✓${NC} Лучший для балансировки нагрузки"
|
||||||
|
echo -e " ${GREEN}✓${NC} TCP и HTTP режимы"
|
||||||
|
echo -e " ${GREEN}✓${NC} Продвинутые health checks"
|
||||||
|
echo -e " ${RED}✗${NC} Не обрабатывает SSL (нужен Nginx/Caddy)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} ${WHITE}Гибридные решения${NC} ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo -e " ${BLUE}•${NC} Nginx + Caddy: статика + автоSSL"
|
||||||
|
echo -e " ${BLUE}•${NC} HAProxy + Nginx: балансировка + кэш"
|
||||||
|
echo -e " ${BLUE}•${NC} Caddy + HAProxy: автоSSL + балансировка"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${YELLOW}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${YELLOW}║${NC} ${WHITE}Рекомендации${NC} ${YELLOW}║${NC}"
|
||||||
|
echo -e " ${YELLOW}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo -e " ${WHITE}1.${NC} Для простых VPN панелей: ${GREEN}Caddy${NC}"
|
||||||
|
echo -e " ${WHITE}2.${NC} Для высоких нагрузок: ${GREEN}Nginx${NC}"
|
||||||
|
echo -e " ${WHITE}3.${NC} Для кластера серверов: ${GREEN}HAProxy + Nginx${NC}"
|
||||||
|
echo -e " ${WHITE}4.${NC} Для максимальной автоматизации: ${GREEN}Caddy${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
read -p " Нажмите Enter для продолжения..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main menu
|
||||||
|
show_main_menu() {
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
clear
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${CYAN}║${MAGENTA} REVERSE PROXY MANAGER ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}║${BLUE} Nginx • Caddy • HAProxy ${CYAN}║${NC}"
|
||||||
|
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local installed=$(detect_installed_proxies)
|
||||||
|
if [ -n "$installed" ]; then
|
||||||
|
echo -e " ${GREEN}✓${NC} ${WHITE}Установлено:${NC} ${CYAN}${installed}${NC}"
|
||||||
|
else
|
||||||
|
echo -e " ${GRAY}○${NC} ${GRAY}Ничего не установлено${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} ${WHITE}УСТАНОВКА${NC} ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}1.${NC} ${WHITE}Установить Nginx${NC}"
|
||||||
|
echo -e " ${GRAY}Высокая производительность и кэширование${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}2.${NC} ${WHITE}Установить Caddy${NC}"
|
||||||
|
echo -e " ${GRAY}Автоматический SSL из коробки${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}3.${NC} ${WHITE}Установить HAProxy${NC}"
|
||||||
|
echo -e " ${GRAY}Балансировка нагрузки${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} ${WHITE}НАСТРОЙКА${NC} ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}4.${NC} ${WHITE}Настроить Nginx для 3x-ui${NC}"
|
||||||
|
echo -e " ${GRAY}Автоматическая настройка с SSL${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}5.${NC} ${WHITE}Настроить Caddy для 3x-ui${NC}"
|
||||||
|
echo -e " ${GRAY}Автоматический HTTPS${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}6.${NC} ${WHITE}Настроить HAProxy (балансировка)${NC}"
|
||||||
|
echo -e " ${GRAY}Распределение нагрузки между серверами${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}7.${NC} ${WHITE}Настроить Nginx + Caddy (гибрид)${NC}"
|
||||||
|
echo -e " ${GRAY}Статика + автоматический SSL${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} ${WHITE}ИНФОРМАЦИЯ${NC} ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}8.${NC} ${WHITE}Показать подсказки${NC}"
|
||||||
|
echo -e " ${GRAY}Рекомендации по выбору${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}9.${NC} ${WHITE}Статус сервисов${NC}"
|
||||||
|
echo -e " ${GRAY}Проверка работы установленных proxy${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo -e " ${GRAY}─────────────────────────────────────────────────────────────────${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}0.${NC} ${WHITE}Выход${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GRAY}─────────────────────────────────────────────────────────────────${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show services status
|
||||||
|
show_status() {
|
||||||
|
clear
|
||||||
|
echo -e "${CYAN}Статус сервисов:${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if command_exists nginx; then
|
||||||
|
echo -n "Nginx: "
|
||||||
|
if service_running nginx; then
|
||||||
|
echo -e "${GREEN}✓ Работает${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Остановлен${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command_exists caddy; then
|
||||||
|
echo -n "Caddy: "
|
||||||
|
if service_running caddy; then
|
||||||
|
echo -e "${GREEN}✓ Работает${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Остановлен${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command_exists haproxy; then
|
||||||
|
echo -n "HAProxy: "
|
||||||
|
if service_running haproxy; then
|
||||||
|
echo -e "${GREEN}✓ Работает${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Остановлен${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main function
|
||||||
|
main() {
|
||||||
|
check_root
|
||||||
|
detect_os
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
show_main_menu
|
||||||
|
read -p "Выберите опцию: " choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1)
|
||||||
|
install_nginx
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
install_caddy
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
install_haproxy
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
if ! command_exists nginx; then
|
||||||
|
error "Nginx не установлен. Установите сначала (опция 1)"
|
||||||
|
else
|
||||||
|
configure_nginx_3xui
|
||||||
|
fi
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
if ! command_exists caddy; then
|
||||||
|
error "Caddy не установлен. Установите сначала (опция 2)"
|
||||||
|
else
|
||||||
|
configure_caddy_3xui
|
||||||
|
fi
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
;;
|
||||||
|
6)
|
||||||
|
if ! command_exists haproxy; then
|
||||||
|
error "HAProxy не установлен. Установите сначала (опция 3)"
|
||||||
|
else
|
||||||
|
configure_haproxy_loadbalancer
|
||||||
|
fi
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
;;
|
||||||
|
7)
|
||||||
|
if ! command_exists nginx || ! command_exists caddy; then
|
||||||
|
error "Требуются Nginx и Caddy. Установите сначала (опции 1 и 2)"
|
||||||
|
else
|
||||||
|
configure_hybrid_nginx_caddy
|
||||||
|
fi
|
||||||
|
read -p "Нажмите Enter..."
|
||||||
|
;;
|
||||||
|
8)
|
||||||
|
show_tips
|
||||||
|
;;
|
||||||
|
9)
|
||||||
|
show_status
|
||||||
|
;;
|
||||||
|
0)
|
||||||
|
log "Выход"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
warn "Неверный выбор"
|
||||||
|
sleep 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
main
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
# Author: houseassassin
|
# Author: houseassassin
|
||||||
# GitHub: https://github.com/houseassassin/proxy-core
|
# GitHub: https://github.com/houseassassin/proxy-core
|
||||||
|
|
||||||
set -e
|
set -euo pipefail
|
||||||
|
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
@@ -19,6 +19,16 @@ print_error() {
|
|||||||
echo -e "${RED}[ERROR]${NC} $1"
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run_remote_script() {
|
||||||
|
local url=$1
|
||||||
|
local tmp_script
|
||||||
|
tmp_script="$(mktemp /tmp/proxy-core-remote.XXXXXX.sh)"
|
||||||
|
curl -fsSL "$url" -o "$tmp_script"
|
||||||
|
chmod 700 "$tmp_script"
|
||||||
|
bash "$tmp_script"
|
||||||
|
rm -f "$tmp_script"
|
||||||
|
}
|
||||||
|
|
||||||
check_root() {
|
check_root() {
|
||||||
if [[ $EUID -ne 0 ]]; then
|
if [[ $EUID -ne 0 ]]; then
|
||||||
print_error "Требуются права root"
|
print_error "Требуются права root"
|
||||||
@@ -28,7 +38,7 @@ check_root() {
|
|||||||
|
|
||||||
update_3xui() {
|
update_3xui() {
|
||||||
print_msg "Обновление 3x-ui..."
|
print_msg "Обновление 3x-ui..."
|
||||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
run_remote_script "https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh"
|
||||||
print_msg "3x-ui обновлен"
|
print_msg "3x-ui обновлен"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,8 +51,8 @@ update_remnawave() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
cd /opt/remnawave
|
cd /opt/remnawave
|
||||||
docker-compose pull
|
docker compose pull
|
||||||
docker-compose up -d
|
docker compose up -d
|
||||||
docker image prune -f
|
docker image prune -f
|
||||||
|
|
||||||
print_msg "Remnawave обновлен"
|
print_msg "Remnawave обновлен"
|
||||||
|
|||||||
+83
-34
@@ -5,7 +5,7 @@
|
|||||||
# Author: houseassassin
|
# Author: houseassassin
|
||||||
# GitHub: https://github.com/houseassassin/proxy-core
|
# GitHub: https://github.com/houseassassin/proxy-core
|
||||||
|
|
||||||
set -e
|
set -euo pipefail
|
||||||
|
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
@@ -30,6 +30,28 @@ check_root() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
validate_client_name() {
|
||||||
|
local client_name=$1
|
||||||
|
[[ "$client_name" =~ ^[a-zA-Z0-9_-]+$ ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
get_server_ip() {
|
||||||
|
curl -s -4 ifconfig.me || curl -s -4 api.ipify.org || curl -s -4 ipinfo.io/ip
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_peer_block() {
|
||||||
|
local client_name=$1
|
||||||
|
local tmp_conf
|
||||||
|
tmp_conf="$(mktemp)"
|
||||||
|
awk -v marker="# ${client_name}" '
|
||||||
|
BEGIN {skip=0}
|
||||||
|
$0 == marker {skip=1; next}
|
||||||
|
skip && /^\[Peer\]/ {skip=0}
|
||||||
|
!skip {print}
|
||||||
|
' "$WG_CONF" > "$tmp_conf"
|
||||||
|
mv "$tmp_conf" "$WG_CONF"
|
||||||
|
}
|
||||||
|
|
||||||
get_next_ip() {
|
get_next_ip() {
|
||||||
if [ ! -f "$WG_CONF" ]; then
|
if [ ! -f "$WG_CONF" ]; then
|
||||||
echo "10.0.0.2"
|
echo "10.0.0.2"
|
||||||
@@ -41,8 +63,12 @@ get_next_ip() {
|
|||||||
if [ -z "$LAST_IP" ]; then
|
if [ -z "$LAST_IP" ]; then
|
||||||
echo "10.0.0.2"
|
echo "10.0.0.2"
|
||||||
else
|
else
|
||||||
LAST_NUM=$(echo $LAST_IP | cut -d. -f4)
|
LAST_NUM=$(echo "$LAST_IP" | cut -d. -f4)
|
||||||
NEXT_NUM=$((LAST_NUM + 1))
|
NEXT_NUM=$((LAST_NUM + 1))
|
||||||
|
if [ "$NEXT_NUM" -gt 254 ]; then
|
||||||
|
print_error "Пул адресов WireGuard исчерпан (10.0.0.2-10.0.0.254)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
echo "10.0.0.$NEXT_NUM"
|
echo "10.0.0.$NEXT_NUM"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -54,6 +80,10 @@ add_client() {
|
|||||||
print_error "Имя клиента не может быть пустым"
|
print_error "Имя клиента не может быть пустым"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if ! validate_client_name "$CLIENT_NAME"; then
|
||||||
|
print_error "Неверное имя: только буквы, цифры, _ и -"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
CLIENT_DIR="$WG_DIR/clients/$CLIENT_NAME"
|
CLIENT_DIR="$WG_DIR/clients/$CLIENT_NAME"
|
||||||
|
|
||||||
@@ -70,12 +100,12 @@ add_client() {
|
|||||||
|
|
||||||
CLIENT_PRIVATE_KEY=$(cat private.key)
|
CLIENT_PRIVATE_KEY=$(cat private.key)
|
||||||
CLIENT_PUBLIC_KEY=$(cat public.key)
|
CLIENT_PUBLIC_KEY=$(cat public.key)
|
||||||
SERVER_PUBLIC_KEY=$(cat $WG_DIR/server_public.key)
|
SERVER_PUBLIC_KEY=$(cat "$WG_DIR/server_public.key")
|
||||||
SERVER_IP=$(curl -s ifconfig.me)
|
SERVER_IP=$(get_server_ip)
|
||||||
SERVER_PORT=$(grep ListenPort $WG_CONF | awk '{print $3}')
|
SERVER_PORT=$(grep ListenPort "$WG_CONF" | awk '{print $3}')
|
||||||
CLIENT_IP=$(get_next_ip)
|
CLIENT_IP=$(get_next_ip)
|
||||||
|
|
||||||
cat >> $WG_CONF <<EOF
|
cat >> "$WG_CONF" <<EOF
|
||||||
|
|
||||||
[Peer]
|
[Peer]
|
||||||
# $CLIENT_NAME
|
# $CLIENT_NAME
|
||||||
@@ -104,7 +134,11 @@ EOF
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
print_msg "QR-код для мобильных устройств:"
|
print_msg "QR-код для мобильных устройств:"
|
||||||
qrencode -t ansiutf8 < client.conf
|
if command -v qrencode >/dev/null 2>&1; then
|
||||||
|
qrencode -t ansiutf8 < client.conf
|
||||||
|
else
|
||||||
|
print_error "qrencode не установлен, пропускаем QR-код"
|
||||||
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
print_msg "Конфигурация клиента:"
|
print_msg "Конфигурация клиента:"
|
||||||
@@ -120,10 +154,10 @@ list_clients() {
|
|||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for client in $WG_DIR/clients/*; do
|
for client in "$WG_DIR"/clients/*; do
|
||||||
if [ -d "$client" ]; then
|
if [ -d "$client" ]; then
|
||||||
CLIENT_NAME=$(basename "$client")
|
CLIENT_NAME=$(basename "$client")
|
||||||
CLIENT_IP=$(grep -A 2 "# $CLIENT_NAME" $WG_CONF | grep AllowedIPs | awk '{print $3}' | cut -d/ -f1)
|
CLIENT_IP=$(grep -A 2 "# $CLIENT_NAME" "$WG_CONF" | grep AllowedIPs | awk '{print $3}' | cut -d/ -f1)
|
||||||
echo "- $CLIENT_NAME ($CLIENT_IP)"
|
echo "- $CLIENT_NAME ($CLIENT_IP)"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@@ -136,6 +170,10 @@ remove_client() {
|
|||||||
print_error "Имя клиента не может быть пустым"
|
print_error "Имя клиента не может быть пустым"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if ! validate_client_name "$CLIENT_NAME"; then
|
||||||
|
print_error "Неверное имя: только буквы, цифры, _ и -"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
CLIENT_DIR="$WG_DIR/clients/$CLIENT_NAME"
|
CLIENT_DIR="$WG_DIR/clients/$CLIENT_NAME"
|
||||||
|
|
||||||
@@ -144,7 +182,7 @@ remove_client() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sed -i "/# $CLIENT_NAME/,+2d" $WG_CONF
|
remove_peer_block "$CLIENT_NAME"
|
||||||
rm -rf "$CLIENT_DIR"
|
rm -rf "$CLIENT_DIR"
|
||||||
|
|
||||||
systemctl restart wg-quick@wg0
|
systemctl restart wg-quick@wg0
|
||||||
@@ -159,6 +197,10 @@ show_client() {
|
|||||||
print_error "Имя клиента не может быть пустым"
|
print_error "Имя клиента не может быть пустым"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if ! validate_client_name "$CLIENT_NAME"; then
|
||||||
|
print_error "Неверное имя: только буквы, цифры, _ и -"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
CLIENT_DIR="$WG_DIR/clients/$CLIENT_NAME"
|
CLIENT_DIR="$WG_DIR/clients/$CLIENT_NAME"
|
||||||
|
|
||||||
@@ -172,7 +214,11 @@ show_client() {
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
print_msg "QR-код:"
|
print_msg "QR-код:"
|
||||||
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
|
if command -v qrencode >/dev/null 2>&1; then
|
||||||
|
qrencode -t ansiutf8 < "$CLIENT_DIR/client.conf"
|
||||||
|
else
|
||||||
|
print_error "qrencode не установлен, пропускаем QR-код"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
show_menu() {
|
show_menu() {
|
||||||
@@ -198,30 +244,33 @@ main() {
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
show_menu
|
while true; do
|
||||||
|
show_menu
|
||||||
|
|
||||||
case $choice in
|
case $choice in
|
||||||
1)
|
1)
|
||||||
add_client
|
add_client
|
||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
list_clients
|
list_clients
|
||||||
;;
|
read -p "Нажмите Enter..."
|
||||||
3)
|
;;
|
||||||
show_client
|
3)
|
||||||
;;
|
show_client
|
||||||
4)
|
;;
|
||||||
remove_client
|
4)
|
||||||
;;
|
remove_client
|
||||||
5)
|
;;
|
||||||
print_msg "Выход..."
|
5)
|
||||||
exit 0
|
print_msg "Выход..."
|
||||||
;;
|
exit 0
|
||||||
*)
|
;;
|
||||||
print_error "Неверный выбор"
|
*)
|
||||||
exit 1
|
print_error "Неверный выбор"
|
||||||
;;
|
sleep 1
|
||||||
esac
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
main
|
main
|
||||||
|
|||||||
Reference in New Issue
Block a user