8 Commits

Author SHA1 Message Date
houseassassin 1c183496ca fix: stabilize installer flows, managers, and terminal output 2026-05-17 14:46:56 +03:00
houseassassin 6dc1afcb2a fix: add reverse proxy manager menu handler
- Added case 7 handler to launch reverse-proxy-manager.sh
- Menu item was visible but not functional
- Now clicking option 7 opens Reverse Proxy Manager

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-04-25 10:49:40 +03:00
houseassassin 7e53b6ca34 feat: beautiful UI redesign with icons, colors, and improved UX
 Added:
- Beautiful gradient banner with colors
- Icons for all menu items (🔧 🚀 ⚖️ 🌐 etc)
- Improved color scheme with better contrast
- Enhanced logging with icons (✓ ✗ ⚠ ℹ)
- Better spinner animation
- Structured menu sections with boxes
- Descriptions for all menu items

🎨 Changed:
- Redesigned main menu with sections
- Redesigned install menu with icons
- Redesigned reverse-proxy-manager menu
- Updated banner.sh with gradient effects
- Enhanced visual hierarchy

💅 Improved:
- Better readability with spacing
- Consistent icon usage
- Professional look and feel
- User-friendly interface

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-04-25 10:45:08 +03:00
houseassassin bf0819aea9 chore: bump version to 2.1.1
Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-04-25 09:07:55 +03:00
houseassassin b844bc4e0e feat: modularize project structure with new helper libraries, centralized configuration, and reverse proxy management 2026-04-24 16:45:26 +03:00
houseassassin 0115fd63e7 refactor: simplify to single version with beautiful README
- Removed old versions (install-advanced.sh, install-advanced-v2.sh)
- Renamed install-advanced-v2.sh → install.sh (main installer)
- Created beautiful new README.md with:
  - Improved visual design with tables and badges
  - Collapsible sections for better navigation
  - Enhanced documentation structure
  - Better emoji usage and formatting
  - Clearer installation instructions
  - Comprehensive feature showcase

Breaking Changes:
- Installation URL changed to: install.sh (was: install-advanced.sh)
- Single unified version (v2.1.0)

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-04-22 12:54:38 +03:00
houseassassin 1e6bd8611c fix: create project directory before logging
- Fix 'No such file or directory' error on first run
- Create /opt/proxy-core directory before attempting to write logs
- Affects both install-advanced.sh and install-advanced-v2.sh

Co-Authored-By: Claude Sonnet 4 <noreply@anthropic.com>
2026-04-22 12:50:44 +03:00
houseassassin 373c18045b feat: add release notes for v2.1.0 including MTProxy support, reverse proxy selection, and traffic masking features 2026-04-22 12:48:03 +03:00
17 changed files with 3094 additions and 2037 deletions
+119
View File
@@ -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
View File
@@ -1,418 +0,0 @@
# 🚀 Proxy-Core
<div align="center">
```
╔═══════════════════════════════════════════════════════════════════╗
║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║
║ ██╔══██╗██╔══██╗██╔═══██╗╚██╗██╔╝╚██╗ ██╔╝ ██╔════╝██╔═══██╗║
║ ██████╔╝██████╔╝██║ ██║ ╚███╔╝ ╚████╔╝█████╗██║ ██║ ██║║
║ ██╔═══╝ ██╔══██╗██║ ██║ ██╔██╗ ╚██╔╝ ╚════╝██║ ██║ ██║║
║ ██║ ██║ ██║╚██████╔╝██╔╝ ██╗ ██║ ╚██████╗╚██████╔╝║
║ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ║
║ ║
║ Advanced VPN & Proxy Panel Auto-Installer ║
╚═══════════════════════════════════════════════════════════════════╝
```
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Version](https://img.shields.io/badge/version-2.1.0-blue.svg)](https://github.com/houseassassin/proxy-core)
[![Bash](https://img.shields.io/badge/bash-5.0+-green.svg)](https://www.gnu.org/software/bash/)
[![Docker](https://img.shields.io/badge/docker-20.10+-blue.svg)](https://www.docker.com/)
**Универсальный установщик и менеджер VPN/Proxy панелей с поддержкой множества протоколов**
[Установка](#-быстрая-установка) • [Возможности](#-возможности) • [Документация](#-документация) • [Поддержка](#-поддержка)
</div>
---
## 📋 О проекте
**Proxy-Core** — это мощный инструмент для автоматической установки и управления VPN/Proxy панелями. Объединяет лучшие практики из популярных проектов и предоставляет единый интерфейс для работы с различными протоколами.
### 🎯 Поддерживаемые панели
| Панель | Протоколы | Особенности |
|--------|-----------|-------------|
| **WireGuard** | WireGuard | Быстрый, современный, безопасный VPN |
| **3x-ui** | VLESS, VMess, Trojan, Shadowsocks, XTLS | Веб-панель Xray с множеством протоколов |
| **Remnawave** | Multi-protocol | Современная панель с Docker и reverse proxy |
| **Hysteria2** | Hysteria2 | Высокоскоростной прокси с маскировкой трафика |
| **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>
+343 -174
View File
@@ -1,7 +1,7 @@
# 🚀 Proxy-Core
<div align="center"> <div align="center">
# 🚀 Proxy-Core
``` ```
╔═══════════════════════════════════════════════════════════════════╗ ╔═══════════════════════════════════════════════════════════════════╗
║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║ ║ ██████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗ ██████╗ ██████╗ ║
@@ -16,13 +16,13 @@
``` ```
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Version](https://img.shields.io/badge/version-2.0.0-blue.svg)](https://github.com/houseassassin/proxy-core) [![Version](https://img.shields.io/badge/version-2.1.1-blue.svg)](https://github.com/houseassassin/proxy-core)
[![Bash](https://img.shields.io/badge/bash-5.0+-green.svg)](https://www.gnu.org/software/bash/) [![Bash](https://img.shields.io/badge/bash-5.0+-green.svg)](https://www.gnu.org/software/bash/)
[![Docker](https://img.shields.io/badge/docker-20.10+-blue.svg)](https://www.docker.com/) [![Docker](https://img.shields.io/badge/docker-20.10+-blue.svg)](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)
**Нужна помощь?**
[![GitHub Issues](https://img.shields.io/badge/GitHub-Issues-red?style=for-the-badge&logo=github)](https://github.com/houseassassin/proxy-core/issues)
[![Telegram](https://img.shields.io/badge/Telegram-@houseassassin-blue?style=for-the-badge&logo=telegram)](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 анимация
- Система логирования
🔧 **Улучшения:** [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://opensource.org/licenses/MIT)
- Оптимизированная установка Docker
- Автоопределение Docker Compose v1/v2 </div>
- Улучшенная обработка ошибок
--- ---
@@ -315,6 +482,8 @@ MIT License - свободное использование и модифика
**Если проект помог вам, поставьте ⭐ звезду!** **Если проект помог вам, поставьте ⭐ звезду!**
[![Star History](https://img.shields.io/github/stars/houseassassin/proxy-core?style=social)](https://github.com/houseassassin/proxy-core/stargazers)
[⬆ Наверх](#-proxy-core) [⬆ Наверх](#-proxy-core)
</div> </div>
+210
View File
@@ -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!
Regular → Executable
+143 -21
View File
@@ -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
+61
View File
@@ -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"
-561
View File
@@ -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
-622
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
Executable
+182
View File
@@ -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
View File
@@ -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
+205
View File
@@ -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
+61 -5
View File
@@ -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
View File
@@ -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"
+582
View File
@@ -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
+14 -4
View File
@@ -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
View File
@@ -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