feat: modularize project structure with new helper libraries, centralized configuration, and reverse proxy management
This commit is contained in:
+119
@@ -0,0 +1,119 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [2.1.1] - 2026-04-24
|
||||
|
||||
### Added
|
||||
- ✨ **Полная реализация функций установки всех панелей**
|
||||
- `install_wireguard()` - автоматическая установка и настройка WireGuard
|
||||
- `install_3xui()` - установка 3x-ui через официальный скрипт
|
||||
- `install_remnawave()` - установка Remnawave с Docker и генерацией паролей
|
||||
- `install_hysteria2()` - установка Hysteria2 с сертификатами и systemd
|
||||
- Улучшенная `install_mtproxy()` с сохранением конфигурации
|
||||
- 📱 **QR-код для MTProxy** - автоматическая генерация при установке
|
||||
- 💾 **Сохранение конфигурации MTProxy** в `/opt/MTProxy/.config`
|
||||
- 🔄 **Опция "Установить всё"** - последовательная установка всех панелей
|
||||
- 🔁 **Цикл меню в wg-manager.sh** - меню больше не закрывается после действия
|
||||
- 📚 **Общая библиотека функций** `lib/common.sh`:
|
||||
- Функции валидации (порты, имена, IP)
|
||||
- Сетевые утилиты (получение IP, генерация портов)
|
||||
- Системные проверки (root, OS detection)
|
||||
- Утилиты (spinner, confirm, генерация паролей)
|
||||
- 📚 **Библиотека WireGuard** `lib/wireguard.sh` - общие функции для управления клиентами
|
||||
- 📚 **Библиотека логирования** `lib/logging.sh` - централизованное логирование
|
||||
- ⚙️ **Конфигурационный файл** `config/defaults.conf` - настройки по умолчанию
|
||||
- 🔧 **Reverse Proxy Manager** `reverse-proxy-manager.sh`:
|
||||
- Установка и настройка Nginx, Caddy, HAProxy
|
||||
- Автоматическая настройка для 3x-ui
|
||||
- Балансировка нагрузки с HAProxy
|
||||
- Гибридные конфигурации (Nginx + Caddy)
|
||||
- Подсказки и рекомендации по выбору
|
||||
- 📁 **Структура проекта** - добавлены директории `lib/`, `config/`, `tests/`
|
||||
|
||||
### Fixed
|
||||
- 🐛 **Критический баг**: функции установки панелей не были реализованы (только комментарии)
|
||||
- 🐛 **Критический баг**: MTProxy конфигурация (SECRET и PORT) не сохранялась
|
||||
- 🐛 **Критический баг**: Selfsteal падал с ошибкой если Remnawave не установлен
|
||||
- 🐛 **Баг**: wg-manager.sh закрывался после каждого действия (отсутствовал цикл)
|
||||
- 🐛 **Баг**: устаревшая команда `docker-compose` (заменена на `docker compose`)
|
||||
|
||||
### Changed
|
||||
- 🔄 **Обновлено на Docker Compose v2** - использование `docker compose` вместо `docker-compose`
|
||||
- 🔍 **Улучшена проверка зависимостей** в Selfsteal - автоопределение reverse proxy
|
||||
- 🎨 **Улучшен UX** - добавлены подтверждения для критических операций
|
||||
- 📝 **Улучшены сообщения об ошибках** - более информативные и понятные
|
||||
|
||||
### Security
|
||||
- 🔒 **Валидация пользовательского ввода** - проверка портов, имён, IP адресов
|
||||
- 🔒 **Безопасная генерация паролей** - использование `openssl rand`
|
||||
- 🔒 **Проверка доступности портов** перед использованием
|
||||
|
||||
## [2.1.0] - 2026-04-22
|
||||
|
||||
### Added
|
||||
- 📱 Поддержка MTProxy для Telegram
|
||||
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
|
||||
- 🎭 Selfsteal - маскировка под обычный сайт
|
||||
- 📱 QR-коды для MTProxy
|
||||
- 🎮 Менеджер MTProxy
|
||||
|
||||
### Changed
|
||||
- Интерактивный выбор компонентов
|
||||
- Улучшенная система меню
|
||||
- Больше опций конфигурации
|
||||
|
||||
### Fixed
|
||||
- Исправлена ошибка создания директории логов
|
||||
|
||||
## [2.0.0] - 2026-04-20
|
||||
|
||||
### Added
|
||||
- Поддержка WireGuard VPN
|
||||
- Поддержка 3x-ui Panel
|
||||
- Поддержка Remnawave Panel
|
||||
- Поддержка Hysteria2 Proxy
|
||||
- Автоматическая установка Docker
|
||||
- Настройка firewall (UFW/firewalld)
|
||||
- BBR оптимизация TCP
|
||||
- Автоматическое создание swap
|
||||
- SSL/TLS сертификаты (Let's Encrypt, Cloudflare DNS, Gcore DNS)
|
||||
- Мониторинг сервисов и ресурсов
|
||||
- Резервное копирование и восстановление
|
||||
- Управление клиентами WireGuard
|
||||
- Генерация QR-кодов
|
||||
- Многоязычность (EN/RU)
|
||||
|
||||
### Changed
|
||||
- Полностью переписан установщик
|
||||
- Улучшен интерфейс
|
||||
- Добавлена модульность
|
||||
|
||||
## [1.0.0] - 2026-04-15
|
||||
|
||||
### Added
|
||||
- Первый релиз
|
||||
- Базовая установка VPN панелей
|
||||
- Простое меню управления
|
||||
|
||||
---
|
||||
|
||||
## Типы изменений
|
||||
|
||||
- `Added` - новые функции
|
||||
- `Changed` - изменения в существующем функционале
|
||||
- `Deprecated` - функции, которые скоро будут удалены
|
||||
- `Removed` - удалённые функции
|
||||
- `Fixed` - исправления багов
|
||||
- `Security` - исправления уязвимостей
|
||||
|
||||
---
|
||||
|
||||
## Ссылки
|
||||
|
||||
- [GitHub Repository](https://github.com/houseassassin/proxy-core)
|
||||
- [Issues](https://github.com/houseassassin/proxy-core/issues)
|
||||
- [Pull Requests](https://github.com/houseassassin/proxy-core/pulls)
|
||||
@@ -16,7 +16,7 @@
|
||||
```
|
||||
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://github.com/houseassassin/proxy-core)
|
||||
[](https://github.com/houseassassin/proxy-core)
|
||||
[](https://www.gnu.org/software/bash/)
|
||||
[](https://www.docker.com/)
|
||||
|
||||
@@ -329,6 +329,9 @@ sudo ./wg-manager.sh
|
||||
# Управление MTProxy
|
||||
sudo ./mtproxy-manager.sh
|
||||
|
||||
# Управление Reverse Proxy (NEW!)
|
||||
sudo ./reverse-proxy-manager.sh
|
||||
|
||||
# Общее управление панелями
|
||||
sudo ./manage.sh
|
||||
|
||||
@@ -336,22 +339,44 @@ sudo ./manage.sh
|
||||
sudo ./update.sh
|
||||
```
|
||||
|
||||
### 🆕 Новое в версии 2.1.1
|
||||
|
||||
**Reverse Proxy Manager** - мощный инструмент для настройки:
|
||||
- ✅ Nginx - высокая производительность и кэширование
|
||||
- ✅ Caddy - автоматический SSL из коробки
|
||||
- ✅ HAProxy - балансировка нагрузки
|
||||
- ✅ Гибридные конфигурации (Nginx + Caddy)
|
||||
- ✅ Подсказки и рекомендации по выбору
|
||||
|
||||
```bash
|
||||
sudo ./reverse-proxy-manager.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Структура проекта
|
||||
|
||||
```
|
||||
proxy-core/
|
||||
├── 📄 install.sh # Главный установщик v2.1.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
|
||||
├── 📄 install.sh # Главный установщик v2.1.1
|
||||
├── 🎮 manage.sh # Менеджер панелей
|
||||
├── 🔧 wg-manager.sh # WireGuard менеджер
|
||||
├── 📱 mtproxy-manager.sh # MTProxy менеджер
|
||||
├── 🔄 update.sh # Обновление компонентов
|
||||
├── 🌐 reverse-proxy-manager.sh # Reverse Proxy менеджер (NEW!)
|
||||
├── 🎨 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
|
||||
```
|
||||
|
||||
---
|
||||
@@ -377,29 +402,53 @@ proxy-core/
|
||||
|
||||
## 🔄 Changelog
|
||||
|
||||
### Version 2.1.0 (2026-04-22)
|
||||
### Version 2.1.1 (2026-04-24)
|
||||
|
||||
<details>
|
||||
<summary><b>✨ Новое</b></summary>
|
||||
|
||||
- 📱 Поддержка MTProxy для Telegram
|
||||
- 🔄 Выбор Reverse Proxy (Nginx/Caddy)
|
||||
- 🎭 Selfsteal - маскировка под обычный сайт
|
||||
- 📱 QR-коды для MTProxy
|
||||
- 🎮 Менеджер MTProxy
|
||||
- 🚀 Полная реализация функций установки всех панелей
|
||||
- 📚 Общая библиотека функций (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 - маскировка под обычный сайт
|
||||
|
||||
---
|
||||
|
||||
## 💬 Поддержка
|
||||
|
||||
@@ -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"
|
||||
+202
-20
@@ -223,11 +223,164 @@ install_packages() {
|
||||
success "Системные пакеты установлены"
|
||||
}
|
||||
|
||||
# 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 wireguard-tools qrencode
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p /etc/wireguard
|
||||
cd /etc/wireguard
|
||||
wg genkey | tee server_private.key | wg pubkey > server_public.key
|
||||
chmod 600 server_private.key
|
||||
|
||||
SERVER_PRIVATE_KEY=$(cat server_private.key)
|
||||
SERVER_PUBLIC_KEY=$(cat server_public.key)
|
||||
SERVER_IP=$(get_server_ip)
|
||||
WG_PORT=$(get_random_port 51820 51900)
|
||||
|
||||
cat > /etc/wireguard/wg0.conf <<EOF
|
||||
[Interface]
|
||||
PrivateKey = $SERVER_PRIVATE_KEY
|
||||
Address = 10.0.0.1/24
|
||||
ListenPort = $WG_PORT
|
||||
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 >/dev/null 2>&1
|
||||
|
||||
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"
|
||||
|
||||
read -p "Создать первого клиента? (Y/n): " create_client
|
||||
if [[ "$create_client" != "n" && "$create_client" != "N" ]]; then
|
||||
bash "$PROJECT_DIR/wg-manager.sh" 2>/dev/null || log "Запустите wg-manager.sh для создания клиентов"
|
||||
fi
|
||||
}
|
||||
|
||||
# 3x-ui installation
|
||||
install_3xui() {
|
||||
log "Установка 3x-ui..."
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
success "3x-ui установлен"
|
||||
}
|
||||
|
||||
# Remnawave installation
|
||||
install_remnawave() {
|
||||
log "Установка Remnawave..."
|
||||
|
||||
install_docker
|
||||
|
||||
cd /opt
|
||||
if [ -d "remnawave" ]; then
|
||||
warn "Remnawave уже установлен, обновляем..."
|
||||
cd remnawave
|
||||
docker compose down
|
||||
cd /opt
|
||||
rm -rf remnawave
|
||||
fi
|
||||
|
||||
git clone https://github.com/remnawave/backend.git remnawave
|
||||
cd remnawave
|
||||
|
||||
DB_PASSWORD=$(openssl rand -base64 32)
|
||||
ADMIN_PASSWORD=$(openssl rand -base64 16)
|
||||
|
||||
cat > .env <<EOF
|
||||
DATABASE_URL="postgresql://remnawave:${DB_PASSWORD}@postgres:5432/remnawave"
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=${ADMIN_PASSWORD}
|
||||
JWT_SECRET=$(openssl rand -base64 32)
|
||||
EOF
|
||||
|
||||
docker compose up -d
|
||||
|
||||
success "Remnawave установлен"
|
||||
echo ""
|
||||
log "Админ логин: admin"
|
||||
log "Админ пароль: $ADMIN_PASSWORD"
|
||||
warn "Сохраните эти данные!"
|
||||
}
|
||||
|
||||
# Hysteria2 installation
|
||||
install_hysteria2() {
|
||||
log "Установка Hysteria2..."
|
||||
|
||||
HYSTERIA_VERSION=$(curl -s https://api.github.com/repos/apernet/hysteria/releases/latest | grep tag_name | cut -d '"' -f 4)
|
||||
wget -O /tmp/hysteria "https://github.com/apernet/hysteria/releases/download/${HYSTERIA_VERSION}/hysteria-linux-amd64"
|
||||
chmod +x /tmp/hysteria
|
||||
mv /tmp/hysteria /usr/local/bin/hysteria
|
||||
|
||||
mkdir -p /etc/hysteria
|
||||
|
||||
HYSTERIA_PASSWORD=$(openssl rand -base64 32)
|
||||
HYSTERIA_PORT=$(get_random_port 36712 36800)
|
||||
|
||||
cat > /etc/hysteria/config.yaml <<EOF
|
||||
listen: :$HYSTERIA_PORT
|
||||
|
||||
tls:
|
||||
cert: /etc/hysteria/cert.pem
|
||||
key: /etc/hysteria/key.pem
|
||||
|
||||
auth:
|
||||
type: password
|
||||
password: $HYSTERIA_PASSWORD
|
||||
|
||||
masquerade:
|
||||
type: proxy
|
||||
proxy:
|
||||
url: https://www.bing.com
|
||||
rewriteHost: true
|
||||
EOF
|
||||
|
||||
openssl req -x509 -nodes -newkey rsa:4096 -keyout /etc/hysteria/key.pem \
|
||||
-out /etc/hysteria/cert.pem -days 365 -subj "/CN=www.example.com" 2>/dev/null
|
||||
|
||||
cat > /etc/systemd/system/hysteria-server.service <<EOF
|
||||
[Unit]
|
||||
Description=Hysteria Server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/local/bin/hysteria server -c /etc/hysteria/config.yaml
|
||||
Restart=on-failure
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable hysteria-server
|
||||
systemctl start hysteria-server
|
||||
|
||||
ufw allow $HYSTERIA_PORT/udp 2>/dev/null || firewall-cmd --permanent --add-port=$HYSTERIA_PORT/udp 2>/dev/null
|
||||
|
||||
success "Hysteria2 установлен"
|
||||
echo ""
|
||||
log "Порт: $HYSTERIA_PORT"
|
||||
log "Пароль: $HYSTERIA_PASSWORD"
|
||||
warn "Сохраните эти данные!"
|
||||
}
|
||||
|
||||
# MTProxy installation
|
||||
install_mtproxy() {
|
||||
log "Установка MTProxy для Telegram..."
|
||||
|
||||
# Установка зависимостей
|
||||
case $OS in
|
||||
ubuntu|debian)
|
||||
apt-get install -y git build-essential libssl-dev zlib1g-dev
|
||||
@@ -237,7 +390,6 @@ install_mtproxy() {
|
||||
;;
|
||||
esac
|
||||
|
||||
# Клонирование репозитория
|
||||
cd /opt
|
||||
if [ -d "MTProxy" ]; then
|
||||
rm -rf MTProxy
|
||||
@@ -245,21 +397,16 @@ install_mtproxy() {
|
||||
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
|
||||
@@ -279,9 +426,14 @@ EOF
|
||||
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
|
||||
|
||||
cat > /opt/MTProxy/.config <<EOF
|
||||
MTPROXY_PORT=$MTPROXY_PORT
|
||||
SECRET=$SECRET
|
||||
EOF
|
||||
chmod 600 /opt/MTProxy/.config
|
||||
|
||||
SERVER_IP=$(get_server_ip)
|
||||
|
||||
success "MTProxy установлен!"
|
||||
@@ -293,6 +445,12 @@ EOF
|
||||
echo -e "${YELLOW}Server: ${SERVER_IP}${NC}"
|
||||
echo -e "${YELLOW}Port: ${MTPROXY_PORT}${NC}"
|
||||
echo -e "${YELLOW}Secret: ${SECRET}${NC}"
|
||||
|
||||
if command -v qrencode &> /dev/null; then
|
||||
echo ""
|
||||
log "QR-код для быстрого подключения:"
|
||||
qrencode -t ansiutf8 "tg://proxy?server=${SERVER_IP}&port=${MTPROXY_PORT}&secret=${SECRET}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Reverse Proxy selection
|
||||
@@ -380,15 +538,29 @@ install_caddy() {
|
||||
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
|
||||
elif [ -d "/opt/remnanode" ]; then
|
||||
INSTALL_DIR="/opt/remnanode"
|
||||
else
|
||||
error "Remnawave или Remnanode должны быть установлены для selfsteal"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Устанавливаем REVERSE_PROXY если не задан
|
||||
if [ -z "${REVERSE_PROXY:-}" ]; then
|
||||
if command -v nginx >/dev/null 2>&1; then
|
||||
REVERSE_PROXY="nginx"
|
||||
log "Используется установленный Nginx"
|
||||
elif command -v caddy >/dev/null 2>&1; then
|
||||
REVERSE_PROXY="caddy"
|
||||
log "Используется установленный Caddy"
|
||||
else
|
||||
warn "Reverse proxy не найден, устанавливаем Nginx..."
|
||||
install_nginx
|
||||
REVERSE_PROXY="nginx"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
@@ -509,20 +681,20 @@ main() {
|
||||
case $install_choice in
|
||||
1)
|
||||
install_packages
|
||||
# WireGuard установка из оригинального скрипта
|
||||
install_wireguard
|
||||
;;
|
||||
2)
|
||||
install_packages
|
||||
# 3x-ui установка
|
||||
install_3xui
|
||||
;;
|
||||
3)
|
||||
install_packages
|
||||
select_reverse_proxy
|
||||
# Remnawave установка
|
||||
install_remnawave
|
||||
;;
|
||||
4)
|
||||
install_packages
|
||||
# Hysteria2 установка
|
||||
install_hysteria2
|
||||
;;
|
||||
5)
|
||||
install_packages
|
||||
@@ -531,7 +703,11 @@ main() {
|
||||
6)
|
||||
install_packages
|
||||
select_reverse_proxy
|
||||
# Установка всех компонентов
|
||||
install_wireguard
|
||||
install_3xui
|
||||
install_remnawave
|
||||
install_hysteria2
|
||||
install_mtproxy
|
||||
;;
|
||||
0) continue ;;
|
||||
*) warn "Неверный выбор / Invalid choice" ;;
|
||||
@@ -539,8 +715,14 @@ main() {
|
||||
read -p "Нажмите Enter / Press Enter..."
|
||||
;;
|
||||
6)
|
||||
install_selfsteal
|
||||
read -p "Нажмите Enter / Press Enter..."
|
||||
# Проверка перед вызовом
|
||||
if [ ! -d "/opt/remnawave" ] && [ ! -d "/opt/remnanode" ]; then
|
||||
error "Сначала установите Remnawave (опция 1 -> 3)"
|
||||
read -p "Нажмите Enter / Press Enter..."
|
||||
else
|
||||
install_selfsteal
|
||||
read -p "Нажмите Enter / Press Enter..."
|
||||
fi
|
||||
;;
|
||||
9)
|
||||
if [ "$MENU_LANG" = "en" ]; then
|
||||
|
||||
Executable
+182
@@ -0,0 +1,182 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Common functions library for Proxy-Core
|
||||
# Version: 2.1.1
|
||||
# Author: houseassassin
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
MAGENTA='\033[0;35m'
|
||||
CYAN='\033[0;36m'
|
||||
GRAY='\033[0;90m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Logging functions
|
||||
log() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
# Validation functions
|
||||
validate_port() {
|
||||
local port=$1
|
||||
if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
||||
error "Неверный порт: $port (должен быть 1-65535)"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
validate_name() {
|
||||
local name=$1
|
||||
if [ -z "$name" ]; then
|
||||
error "Имя не может быть пустым"
|
||||
return 1
|
||||
fi
|
||||
if ! [[ "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
||||
error "Неверное имя: $name (только буквы, цифры, _ и -)"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
check_port_available() {
|
||||
local port=$1
|
||||
if ss -ltun | awk '{print $4}' | grep -q ":$port\$"; then
|
||||
error "Порт $port уже используется"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
validate_ip() {
|
||||
local ip=$1
|
||||
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||
return 0
|
||||
else
|
||||
error "Неверный IP адрес: $ip"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Network utilities
|
||||
get_server_ip() {
|
||||
curl -s -4 ifconfig.me || curl -s -4 api.ipify.org || curl -s -4 ipinfo.io/ip
|
||||
}
|
||||
|
||||
get_random_port() {
|
||||
local MIN=${1:-3000}
|
||||
local MAX=${2:-6999}
|
||||
|
||||
while :; do
|
||||
PORT=$(shuf -i "$MIN-$MAX" -n 1)
|
||||
if check_port_available "$PORT"; then
|
||||
echo "$PORT"
|
||||
return
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# System checks
|
||||
check_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
error "Этот скрипт должен быть запущен с правами root"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
detect_os() {
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
VER=$VERSION_ID
|
||||
else
|
||||
error "Не удалось определить операционную систему"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Spinner animation
|
||||
spinner() {
|
||||
local pid=$1
|
||||
local text=$2
|
||||
local spinstr='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
|
||||
|
||||
while kill -0 "$pid" 2>/dev/null; do
|
||||
for (( i=0; i<${#spinstr}; i++ )); do
|
||||
printf "\r${GREEN}[%s]${NC} %s" "${spinstr:$i:1}" "$text"
|
||||
sleep 0.1
|
||||
done
|
||||
done
|
||||
printf "\r\033[K"
|
||||
}
|
||||
|
||||
# Confirmation prompt
|
||||
confirm() {
|
||||
local prompt="${1:-Продолжить?}"
|
||||
local default="${2:-n}"
|
||||
|
||||
if [ "$default" = "y" ]; then
|
||||
read -p "$prompt (Y/n): " response
|
||||
response=${response:-y}
|
||||
else
|
||||
read -p "$prompt (y/N): " response
|
||||
response=${response:-n}
|
||||
fi
|
||||
|
||||
[[ "$response" =~ ^[Yy]$ ]]
|
||||
}
|
||||
|
||||
# Generate random password
|
||||
generate_password() {
|
||||
local length=${1:-16}
|
||||
openssl rand -base64 $length | tr -d "=+/" | cut -c1-$length
|
||||
}
|
||||
|
||||
# Check if command exists
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Check if service is running
|
||||
service_running() {
|
||||
systemctl is-active --quiet "$1"
|
||||
}
|
||||
|
||||
# Wait for service to start
|
||||
wait_for_service() {
|
||||
local service=$1
|
||||
local timeout=${2:-30}
|
||||
local counter=0
|
||||
|
||||
while [ $counter -lt $timeout ]; do
|
||||
if service_running "$service"; then
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
((counter++))
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Export all functions
|
||||
export -f log warn error success
|
||||
export -f validate_port validate_name check_port_available validate_ip
|
||||
export -f get_server_ip get_random_port
|
||||
export -f check_root detect_os spinner confirm
|
||||
export -f generate_password command_exists service_running wait_for_service
|
||||
Executable
+56
@@ -0,0 +1,56 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Logging library for Proxy-Core
|
||||
# Version: 2.1.1
|
||||
# Author: houseassassin
|
||||
|
||||
LOGDIR="/var/log/proxy-core"
|
||||
mkdir -p "$LOGDIR" 2>/dev/null
|
||||
|
||||
# Source common for colors
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "$SCRIPT_DIR/common.sh" 2>/dev/null || true
|
||||
|
||||
log_to_file() {
|
||||
local level=$1
|
||||
local message=$2
|
||||
local script=$(basename "${BASH_SOURCE[2]}" 2>/dev/null || echo "unknown")
|
||||
local logfile="${LOGDIR}/$(date +%Y-%m-%d).log"
|
||||
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$script] [$level] $message" >> "$logfile" 2>/dev/null
|
||||
}
|
||||
|
||||
log() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
log_to_file "INFO" "$1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
log_to_file "ERROR" "$1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
log_to_file "WARN" "$1"
|
||||
}
|
||||
|
||||
success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
log_to_file "SUCCESS" "$1"
|
||||
}
|
||||
|
||||
debug() {
|
||||
if [ "${DEBUG:-0}" = "1" ]; then
|
||||
echo -e "${GRAY}[DEBUG]${NC} $1"
|
||||
log_to_file "DEBUG" "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
# Rotate logs older than 30 days
|
||||
rotate_logs() {
|
||||
find "$LOGDIR" -name "*.log" -mtime +30 -delete 2>/dev/null
|
||||
}
|
||||
|
||||
# Export functions
|
||||
export -f log_to_file log error warn success debug rotate_logs
|
||||
Executable
+193
@@ -0,0 +1,193 @@
|
||||
#!/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))
|
||||
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
|
||||
|
||||
sed -i "/# $client_name/,+2d" $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
|
||||
Executable
+493
@@ -0,0 +1,493 @@
|
||||
#!/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'
|
||||
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}
|
||||
|
||||
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
|
||||
|
||||
ln -sf "$NGINX_DIR/sites-available/3xui" "$NGINX_DIR/sites-enabled/"
|
||||
|
||||
log "Получение SSL сертификата..."
|
||||
certbot certonly --nginx -d $DOMAIN --non-interactive --agree-tos --email admin@$DOMAIN
|
||||
|
||||
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
|
||||
|
||||
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 -e "${MAGENTA}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${MAGENTA}║ Подсказки по настройке Reverse Proxy ║${NC}"
|
||||
echo -e "${MAGENTA}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}📌 Nginx${NC}"
|
||||
echo " ✓ Лучший выбор для высоких нагрузок"
|
||||
echo " ✓ Отличное кэширование и обработка статики"
|
||||
echo " ✓ Гибкая конфигурация"
|
||||
echo " ✗ Требует ручной настройки SSL"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}📌 Caddy${NC}"
|
||||
echo " ✓ Автоматический SSL из коробки"
|
||||
echo " ✓ Простая конфигурация"
|
||||
echo " ✓ HTTP/3 поддержка"
|
||||
echo " ✗ Меньше производительность чем Nginx"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}📌 HAProxy${NC}"
|
||||
echo " ✓ Лучший для балансировки нагрузки"
|
||||
echo " ✓ TCP и HTTP режимы"
|
||||
echo " ✓ Продвинутые health checks"
|
||||
echo " ✗ Не обрабатывает SSL (нужен Nginx/Caddy)"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}📌 Гибридные решения${NC}"
|
||||
echo " • Nginx + Caddy: статика + автоSSL"
|
||||
echo " • HAProxy + Nginx: балансировка + кэш"
|
||||
echo " • Caddy + HAProxy: автоSSL + балансировка"
|
||||
echo ""
|
||||
|
||||
echo -e "${YELLOW}Рекомендации:${NC}"
|
||||
echo " 1. Для простых VPN панелей: Caddy"
|
||||
echo " 2. Для высоких нагрузок: Nginx"
|
||||
echo " 3. Для кластера серверов: HAProxy + Nginx"
|
||||
echo " 4. Для максимальной автоматизации: Caddy"
|
||||
echo ""
|
||||
|
||||
read -p "Нажмите Enter для продолжения..."
|
||||
}
|
||||
|
||||
# Main menu
|
||||
show_main_menu() {
|
||||
clear
|
||||
echo -e "${MAGENTA}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${MAGENTA}║ Reverse Proxy Manager ║${NC}"
|
||||
echo -e "${MAGENTA}║ Version: 2.1.1 ║${NC}"
|
||||
echo -e "${MAGENTA}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
local installed=$(detect_installed_proxies)
|
||||
echo -e "${CYAN}Установлено:${NC} ${installed:-нет}"
|
||||
echo ""
|
||||
|
||||
echo -e "${YELLOW}Установка:${NC}"
|
||||
echo " 1) Установить Nginx"
|
||||
echo " 2) Установить Caddy"
|
||||
echo " 3) Установить HAProxy"
|
||||
echo ""
|
||||
|
||||
echo -e "${YELLOW}Настройка:${NC}"
|
||||
echo " 4) Настроить Nginx для 3x-ui"
|
||||
echo " 5) Настроить Caddy для 3x-ui"
|
||||
echo " 6) Настроить HAProxy (балансировка)"
|
||||
echo " 7) Настроить Nginx + Caddy (гибрид)"
|
||||
echo ""
|
||||
|
||||
echo -e "${YELLOW}Информация:${NC}"
|
||||
echo " 8) Показать подсказки"
|
||||
echo " 9) Статус сервисов"
|
||||
echo ""
|
||||
|
||||
echo " 0) Выход"
|
||||
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
|
||||
@@ -41,8 +41,8 @@ update_remnawave() {
|
||||
fi
|
||||
|
||||
cd /opt/remnawave
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
docker image prune -f
|
||||
|
||||
print_msg "Remnawave обновлен"
|
||||
|
||||
+26
-23
@@ -198,30 +198,33 @@ main() {
|
||||
exit 1
|
||||
fi
|
||||
|
||||
show_menu
|
||||
while true; do
|
||||
show_menu
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
add_client
|
||||
;;
|
||||
2)
|
||||
list_clients
|
||||
;;
|
||||
3)
|
||||
show_client
|
||||
;;
|
||||
4)
|
||||
remove_client
|
||||
;;
|
||||
5)
|
||||
print_msg "Выход..."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Неверный выбор"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
case $choice in
|
||||
1)
|
||||
add_client
|
||||
;;
|
||||
2)
|
||||
list_clients
|
||||
read -p "Нажмите Enter..."
|
||||
;;
|
||||
3)
|
||||
show_client
|
||||
;;
|
||||
4)
|
||||
remove_client
|
||||
;;
|
||||
5)
|
||||
print_msg "Выход..."
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
print_error "Неверный выбор"
|
||||
sleep 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
main
|
||||
|
||||
Reference in New Issue
Block a user