diff --git a/README.md b/README.md index 12a33f2..b58d086 100644 --- a/README.md +++ b/README.md @@ -40,16 +40,19 @@ ## 📦 Что внутри? -| Файл | Описание простыми словами | -| ----------------------- | ------------------------------------------------------------------ | -| `web/server.py` | Веб-интерфейс для управления через браузер | -| `web/index.html` | Страница с красивым интерфейсом | -| `docker/entrypoint.sh` | Главный скрипт запуска контейнера | -| `docker/Dockerfile` | Инструкция для создания изолированного VPN-приложения (контейнера) | -| `docker-compose.yml` | Файл для удобного запуска одной командой | +| Файл | Описание простыми словами | +| --------------------------- | ------------------------------------------------------------------ | +| `install-docker-proxy.ps1` | 🚀 **Автоустановщик** — скачайте и запустите, всё сделает сам | +| `discord-windows-hack.ps1` | 🎮 Установка ProxiFyre для Discord/Vesktop | +| `web/server.py` | Веб-интерфейс для управления через браузер | +| `web/index.html` | Страница с красивым интерфейсом | +| `docker/entrypoint.sh` | Главный скрипт запуска контейнера | +| `docker/Dockerfile.singbox` | Инструкция для создания изолированного VPN-приложения (контейнера) | +| `docker-compose.yml` | Файл для удобного запуска одной командой | --- + ## 🚀 Быстрый старт ### Что вам понадобится @@ -64,9 +67,36 @@ --- -## 📥 Первый запуск (установка с нуля) +## 📥 Установка (Windows — самый простой способ) -Откройте терминал (Терминал на Mac, PowerShell на Windows) и выполните: +Откройте **PowerShell** и выполните: + +```powershell +# Перейдите в папку с проектом +cd путь\к\папке\vpn-proxy + +# Запустите установщик (проверит Docker, соберёт и запустит) +.\install-docker-proxy.ps1 +``` + +> 💡 **Что делает скрипт:** +> +> - Проверяет установлен ли Docker и Docker Compose +> - Если Docker не установлен — показывает ссылку на скачивание +> - Если уже установлено — показывает статус и меню управления +> - Собирает и запускает контейнер +> - Предлагает установить ProxiFyre для Discord/Vesktop + +### Если уже установлено + +При повторном запуске скрипт покажет: +- Статус контейнера (работает/остановлен) +- Адреса подключения +- Меню с действиями (запуск, перезапуск, логи, переустановка) + +--- + +## 📥 Ручная установка (Mac/Linux) ```bash # 1. Перейдите в папку с проектом @@ -172,6 +202,27 @@ http.proxy: http://127.0.0.1:8082 - **Адрес**: `127.0.0.1` - **Порт**: `8082` +### Для Discord / Vesktop (Windows) + +Discord не поддерживает системные настройки прокси, поэтому нужен ProxiFyre: + +```powershell +# Запустите от имени Администратора +.\discord-windows-hack.ps1 +``` + +**Что делает скрипт:** +- Устанавливает драйвер Windows Packet Filter +- Устанавливает ProxiFyre как службу Windows +- Настраивает перехват трафика для Discord/Vesktop +- Направляет его через прокси `127.0.0.1:8082` + +**Если ProxiFyre уже установлен:** +При повторном запуске скрипт покажет: +- Текущий статус службы +- Настроенные приложения и прокси +- Меню управления (запуск, остановка, логи, переустановка) + --- diff --git a/discord-windows-hack.ps1 b/discord-windows-hack.ps1 new file mode 100644 index 0000000..94e3327 --- /dev/null +++ b/discord-windows-hack.ps1 @@ -0,0 +1,269 @@ +# ========================================== +# �️ PROXIFYRE INSTALLER ДЛЯ DISCORD/VESKTOP +# ========================================== +param( + [switch]$Force, # Принудительная переустановка + [string]$Proxy = "", # Адрес прокси (для неинтерактивного режима), например "127.0.0.1:8082" + [string[]]$Apps = @(), # Приложения (для неинтерактивного режима), например @("Discord", "Vesktop") + [switch]$Silent # Тихий режим (без лишнего вывода, для вызова из других скриптов) +) + +# ========================================== +# 🛠️ ПРЯМЫЕ ССЫЛКИ (Hardcoded) +# ========================================== +$InstallPath = "C:\Tools\ProxiFyre" +$DriverUrl = "https://github.com/wiresock/ndisapi/releases/download/v3.6.2/Windows.Packet.Filter.3.6.2.1.x64.msi" +$AppUrl = "https://github.com/wiresock/proxifyre/releases/download/v2.1.4/ProxiFyre-v2.1.4-x64-signed.zip" +# ========================================== + +# 0. Проверка прав +if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { + Write-Host "⛔ Запусти от имени АДМИНИСТРАТОРА!" -ForegroundColor Red + Start-Sleep -s 3; Exit +} + +Clear-Host +Write-Host "==========================================" -ForegroundColor Cyan +Write-Host " 🚀 PROXIFYRE SERVICE INSTALLER " -ForegroundColor Cyan +Write-Host "==========================================" -ForegroundColor Cyan + +# ========================================== +# ПРОВЕРКА СУЩЕСТВУЮЩЕЙ УСТАНОВКИ +# ========================================== +$proxifyreExists = Test-Path "$InstallPath\ProxiFyre.exe" +$proxifyreService = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue + +if ($proxifyreExists -and -not $Force) { + Write-Host "" + Write-Host "==========================================" -ForegroundColor Green + Write-Host " ✅ PROXIFYRE УЖЕ УСТАНОВЛЕН! " -ForegroundColor Green + Write-Host "==========================================" -ForegroundColor Green + Write-Host "" + + # Статус службы + Write-Host "📊 Статус службы: " -NoNewline -ForegroundColor Yellow + if ($proxifyreService -and $proxifyreService.Status -eq 'Running') { + Write-Host "РАБОТАЕТ" -ForegroundColor Green + } elseif ($proxifyreService) { + Write-Host "$($proxifyreService.Status)" -ForegroundColor Red + } else { + Write-Host "НЕ ЗАРЕГИСТРИРОВАНА" -ForegroundColor Red + } + + Write-Host "" + Write-Host "📁 Расположение:" -ForegroundColor Yellow + Write-Host " Путь: $InstallPath" -ForegroundColor White + Write-Host " Конфиг: $InstallPath\app-config.json" -ForegroundColor White + Write-Host " Логи: $InstallPath\logs\" -ForegroundColor White + Write-Host "" + + # Показываем текущий конфиг + $configPath = "$InstallPath\app-config.json" + if (Test-Path $configPath) { + try { + $config = Get-Content $configPath -Raw | ConvertFrom-Json + $apps = $config.proxies[0].appNames -join ", " + $proxy = $config.proxies[0].socks5ProxyEndpoint + Write-Host "⚙️ Текущие настройки:" -ForegroundColor Yellow + Write-Host " Прокси: $proxy" -ForegroundColor White + Write-Host " Приложения: $apps" -ForegroundColor White + Write-Host "" + } catch { + Write-Host " ⚠️ Не удалось прочитать конфиг" -ForegroundColor Yellow + } + } + + Write-Host "==========================================" -ForegroundColor Cyan + Write-Host "" + Write-Host "Что вы хотите сделать?" -ForegroundColor Yellow + Write-Host " [1] Запустить службу" -ForegroundColor White + Write-Host " [2] Остановить службу" -ForegroundColor White + Write-Host " [3] Перезапустить службу" -ForegroundColor White + Write-Host " [4] Изменить настройки (прокси/приложения)" -ForegroundColor White + Write-Host " [5] Показать логи" -ForegroundColor White + Write-Host " [6] Показать конфиг" -ForegroundColor White + Write-Host " [7] Переустановить (полная переустановка)" -ForegroundColor White + Write-Host " [q] Выход" -ForegroundColor White + Write-Host "" + $choice = Read-Host "👉 Выбор (1-7/q)" + + switch ($choice) { + "1" { + Write-Host "`n🚀 Запуск службы..." -ForegroundColor Cyan + Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "start" -Wait -NoNewWindow + Start-Sleep -s 2 + $svc = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue + Write-Host " Статус: $($svc.Status)" -ForegroundColor Green + exit 0 + } + "2" { + Write-Host "`n⏹️ Остановка службы..." -ForegroundColor Cyan + Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "stop" -Wait -NoNewWindow + Write-Host " ✅ Служба остановлена" -ForegroundColor Green + exit 0 + } + "3" { + Write-Host "`n🔄 Перезапуск службы..." -ForegroundColor Cyan + Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "stop" -Wait -NoNewWindow + Start-Sleep -s 1 + Start-Process -FilePath "$InstallPath\ProxiFyre.exe" -ArgumentList "start" -Wait -NoNewWindow + Start-Sleep -s 2 + $svc = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue + Write-Host " Статус: $($svc.Status)" -ForegroundColor Green + exit 0 + } + "4" { + Write-Host "`n⚙️ Изменение настроек..." -ForegroundColor Cyan + # Продолжаем выполнение скрипта для настройки + } + "5" { + Write-Host "`n📋 Логи ProxiFyre:" -ForegroundColor Cyan + $logFiles = Get-ChildItem "$InstallPath\logs\*.log" -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 1 + if ($logFiles) { + Get-Content $logFiles.FullName -Tail 50 + } else { + Write-Host " Лог-файлы не найдены" -ForegroundColor Yellow + } + exit 0 + } + "6" { + Write-Host "`n📄 Конфиг ProxiFyre:" -ForegroundColor Cyan + if (Test-Path $configPath) { + Get-Content $configPath + } else { + Write-Host " Конфиг не найден" -ForegroundColor Yellow + } + exit 0 + } + "7" { + Write-Host "`n🔧 Переустановка..." -ForegroundColor Cyan + # Продолжаем выполнение скрипта + } + default { + Write-Host "`n ℹ️ Выход" -ForegroundColor Gray + exit 0 + } + } +} + + +# --- ШАГ 1: КОНФИГУРАЦИЯ --- +# Если параметры переданы — используем их (неинтерактивный режим) +if ($Proxy -and $Apps.Count -gt 0) { + $UserProxy = $Proxy + $TargetApps = $Apps + if (-not $Silent) { + Write-Host "`n⚙️ Неинтерактивный режим:" -ForegroundColor Cyan + Write-Host " Прокси: $UserProxy" -ForegroundColor White + Write-Host " Приложения: $($TargetApps -join ', ')" -ForegroundColor White + } +} else { + # Интерактивный режим + Write-Host "`n🌐 SOCKS5 Прокси (IP:PORT):" -ForegroundColor Yellow + $UserProxy = Read-Host " [Enter] для 127.0.0.1:1080" + if ([string]::IsNullOrWhiteSpace($UserProxy)) { $UserProxy = "127.0.0.1:1080" } + + Write-Host "`n🎮 Что проксируем?" -ForegroundColor Yellow + Write-Host " [1] Vesktop" + Write-Host " [2] Discord" + Write-Host " [3] Vesktop + Discord" + $AppChoice = Read-Host "👉 Выбор (1-3)" + + switch ($AppChoice) { + "2" { $TargetApps = @("Discord") } + "3" { $TargetApps = @("Vesktop", "Discord") } + Default { $TargetApps = @("Vesktop") } + } +} + +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +# --- ШАГ 2: ПОДГОТОВКА (ОЧИСТКА) --- +Write-Host "`n🧹 [0/3] Очистка процессов..." -ForegroundColor Magenta +# Убиваем любые старые процессы, чтобы они не держали драйвер +Stop-Process -Name "ProxiFyre" -Force -ErrorAction SilentlyContinue +Start-Sleep -s 1 + +# --- ШАГ 3: ДРАЙВЕР --- +Write-Host "⚙️ [1/3] Ставим драйвер (Packet Filter)..." -ForegroundColor Magenta +$MsiFile = "$env:TEMP\WinpkFilter.msi" + +try { + Invoke-WebRequest -Uri $DriverUrl -OutFile $MsiFile -ErrorAction Stop + $Proc = Start-Process -FilePath "msiexec.exe" -ArgumentList "/i `"$MsiFile`" /qn /norestart" -Wait -PassThru + if ($Proc.ExitCode -eq 0) { Write-Host " ✅ Успешно." -ForegroundColor Green } + elseif ($Proc.ExitCode -eq 1603) { Write-Host " ⚠️ Уже установлен." -ForegroundColor Yellow } +} catch { + Write-Error "❌ Ошибка скачивания драйвера: $_"; Exit +} + +# --- ШАГ 4: PROXIFYRE --- +Write-Host "`n⬇️ [2/3] Ставим ProxiFyre..." -ForegroundColor Magenta + +# Если папка есть, чистим всё, кроме конфига (если вдруг хотим сохранить), но проще пересоздать +if (Test-Path $InstallPath) { Remove-Item $InstallPath -Recurse -Force -ErrorAction SilentlyContinue } +New-Item -ItemType Directory -Force -Path $InstallPath | Out-Null + +try { + $ZipFile = "$env:TEMP\ProxiFyre.zip" + Invoke-WebRequest -Uri $AppUrl -OutFile $ZipFile -ErrorAction Stop + Expand-Archive -Path $ZipFile -DestinationPath $InstallPath -Force + Write-Host " ✅ Распаковано." -ForegroundColor Green +} catch { + Write-Error "❌ Ошибка скачивания ProxiFyre: $_"; Exit +} + +# Вытаскиваем из подпапки если надо +$ExeItem = Get-ChildItem -Path $InstallPath -Filter "ProxiFyre.exe" -Recurse | Select-Object -First 1 +if ($ExeItem.DirectoryName -ne $InstallPath) { + Copy-Item -Path "$($ExeItem.DirectoryName)\*" -Destination $InstallPath -Recurse -Force +} + +# --- ШАГ 5: КОНФИГ --- +Write-Host "`n📝 [3/3] Генерируем конфиг..." -ForegroundColor Cyan +$ConfigPath = Join-Path -Path $InstallPath -ChildPath "app-config.json" +$ConfigData = @{ + logLevel = "Info" + proxies = @( + @{ + appNames = $TargetApps + socks5ProxyEndpoint = $UserProxy + username = "" + password = "" + supportedProtocols = @("TCP", "UDP") + } + ) + excludes = @() +} | ConvertTo-Json -Depth 4 +Set-Content -Path $ConfigPath -Value $ConfigData -Encoding UTF8 + +# --- ШАГ 6: УСТАНОВКА СЛУЖБЫ --- +Write-Host "`n🛡️ [4/3] Регистрация службы Windows..." -ForegroundColor Cyan +$ExePath = Join-Path -Path $InstallPath -ChildPath "ProxiFyre.exe" + +# 1. Удаляем старую службу если была +Start-Process -FilePath $ExePath -ArgumentList "uninstall" -Wait -NoNewWindow +Start-Sleep -s 1 + +# 2. Инсталлируем службу +Start-Process -FilePath $ExePath -ArgumentList "install" -Wait -NoNewWindow +Start-Sleep -s 1 + +# 3. Запускаем службу +Write-Host " 🚀 Запускаем службу..." -ForegroundColor Yellow +Start-Process -FilePath $ExePath -ArgumentList "start" -Wait -NoNewWindow +Start-Sleep -s 3 + +# 4. Проверка +# Важно: имя службы в системе именно "ProxiFyreService" (судя по твоим логам) +$Service = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue + +if ($Service -and $Service.Status -eq 'Running') { + Write-Host "`n==========================================" -ForegroundColor Green + Write-Host "🎉 УСПЕХ! Служба работает в фоне." -ForegroundColor Green + Write-Host "📁 Логи тут: $InstallPath\logs" + Write-Host "==========================================" +} else { + Write-Host "`n⚠️ Служба установлена, но статус: $($Service.Status). Проверь логи." -ForegroundColor Red + Write-Host "Попробуй вручную: net start ProxiFyreService" +} \ No newline at end of file diff --git a/install-docker-proxy.ps1 b/install-docker-proxy.ps1 new file mode 100644 index 0000000..55cda54 --- /dev/null +++ b/install-docker-proxy.ps1 @@ -0,0 +1,431 @@ +# ========================================== +# 🐳 VPN-PROXY DOCKER INSTALLER ДЛЯ WINDOWS +# ========================================== +# Устанавливает VPN-прокси через Docker Compose +# и опционально настраивает Discord/Vesktop +# ========================================== + +param( + [switch]$SkipDockerCheck, + [switch]$SkipDiscord, + [switch]$Force # Принудительная переустановка +) + +# Цвета для красивого вывода +function Write-Step { param($msg) Write-Host "`n📦 $msg" -ForegroundColor Cyan } +function Write-Success { param($msg) Write-Host " ✅ $msg" -ForegroundColor Green } +function Write-Warning { param($msg) Write-Host " ⚠️ $msg" -ForegroundColor Yellow } +function Write-Error { param($msg) Write-Host " ❌ $msg" -ForegroundColor Red } +function Write-Info { param($msg) Write-Host " ℹ️ $msg" -ForegroundColor Gray } + +Clear-Host +Write-Host "==========================================" -ForegroundColor Cyan +Write-Host " 🐳 VPN-PROXY DOCKER INSTALLER " -ForegroundColor Cyan +Write-Host "==========================================" -ForegroundColor Cyan + +# Определяем директорию скрипта +$ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path } +if (-not $ScriptDir) { $ScriptDir = Get-Location } + +Write-Info "Директория проекта: $ScriptDir" + +# ========================================== +# ШАГ 0: ПРОВЕРКА СУЩЕСТВУЮЩЕЙ УСТАНОВКИ +# ========================================== +Write-Step "Проверка существующей установки..." + +$existingContainer = docker ps -a --filter "name=sing-proxy" --format "{{.Names}}" 2>$null +$containerRunning = docker ps --filter "name=sing-proxy" --format "{{.Status}}" 2>$null + +if ($existingContainer -and -not $Force) { + Write-Host "" + Write-Host "==========================================" -ForegroundColor Green + Write-Host " ✅ VPN-PROXY УЖЕ УСТАНОВЛЕН! " -ForegroundColor Green + Write-Host "==========================================" -ForegroundColor Green + Write-Host "" + + # Статус контейнера + if ($containerRunning -match "Up") { + Write-Host "📊 Статус: " -NoNewline -ForegroundColor Yellow + Write-Host "РАБОТАЕТ" -ForegroundColor Green + Write-Host " Контейнер: sing-proxy" -ForegroundColor Gray + Write-Host " Uptime: $containerRunning" -ForegroundColor Gray + } else { + Write-Host "📊 Статус: " -NoNewline -ForegroundColor Yellow + Write-Host "ОСТАНОВЛЕН" -ForegroundColor Red + $containerStatus = docker ps -a --filter "name=sing-proxy" --format "{{.Status}}" 2>$null + Write-Host " Контейнер: sing-proxy ($containerStatus)" -ForegroundColor Gray + } + + Write-Host "" + Write-Host "📡 Адреса подключения:" -ForegroundColor Yellow + Write-Host " Веб-интерфейс: http://localhost:3456" -ForegroundColor White + Write-Host " HTTP/SOCKS Прокси: 127.0.0.1:8082" -ForegroundColor White + Write-Host "" + Write-Host "📁 Расположение:" -ForegroundColor Yellow + Write-Host " Проект: $ScriptDir" -ForegroundColor White + Write-Host " Данные: $ScriptDir\data" -ForegroundColor White + Write-Host "" + + # Проверяем ProxiFyre + $proxifyreInstalled = Test-Path "C:\Tools\ProxiFyre\ProxiFyre.exe" + if ($proxifyreInstalled) { + $proxifyreService = Get-Service -Name "ProxiFyreService" -ErrorAction SilentlyContinue + Write-Host "🛡️ ProxiFyre:" -ForegroundColor Yellow + Write-Host " Путь: C:\Tools\ProxiFyre" -ForegroundColor White + Write-Host " Статус: $($proxifyreService.Status)" -ForegroundColor White + + # Показываем настроенные приложения из конфига + $configPath = "C:\Tools\ProxiFyre\app-config.json" + if (Test-Path $configPath) { + try { + $config = Get-Content $configPath -Raw | ConvertFrom-Json + $apps = $config.proxies[0].appNames -join ", " + $proxy = $config.proxies[0].socks5ProxyEndpoint + Write-Host " Прокси: $proxy" -ForegroundColor White + Write-Host " Приложения: $apps" -ForegroundColor White + } catch {} + } + Write-Host "" + } + + Write-Host "==========================================" -ForegroundColor Cyan + Write-Host "" + Write-Host "Что вы хотите сделать?" -ForegroundColor Yellow + Write-Host " [1] Запустить контейнер (если остановлен)" -ForegroundColor White + Write-Host " [2] Перезапустить контейнер" -ForegroundColor White + Write-Host " [3] Переустановить (пересобрать)" -ForegroundColor White + Write-Host " [4] Показать логи" -ForegroundColor White + Write-Host " [5] Открыть веб-интерфейс" -ForegroundColor White + Write-Host " [q] Выход" -ForegroundColor White + Write-Host "" + $choice = Read-Host "👉 Выбор (1-5/q)" + + switch ($choice) { + "1" { + Write-Step "Запуск контейнера..." + Push-Location $ScriptDir + docker compose start + Pop-Location + Write-Success "Контейнер запущен!" + Write-Host " Веб-интерфейс: http://localhost:3456" -ForegroundColor Green + exit 0 + } + "2" { + Write-Step "Перезапуск контейнера..." + Push-Location $ScriptDir + docker compose restart + Pop-Location + Write-Success "Контейнер перезапущен!" + exit 0 + } + "3" { + Write-Info "Переустановка..." + # Продолжаем выполнение скрипта + } + "4" { + Write-Step "Логи контейнера (последние 50 строк):" + docker logs --tail 50 sing-proxy + exit 0 + } + "5" { + Start-Process "http://localhost:3456" + exit 0 + } + default { + Write-Info "Выход" + exit 0 + } + } +} + +# ========================================== +# ШАГ 1: ПРОВЕРКА DOCKER +# ========================================== +Write-Step "Проверка Docker..." + +$DockerInstalled = $false +$DockerRunning = $false +$DockerComposeAvailable = $false + +# Проверяем, установлен ли Docker +try { + $dockerVersion = docker --version 2>&1 + if ($LASTEXITCODE -eq 0 -and $dockerVersion -match "Docker version") { + Write-Success "Docker установлен: $dockerVersion" + $DockerInstalled = $true + } +} catch { + $DockerInstalled = $false +} + +if (-not $DockerInstalled -and -not $SkipDockerCheck) { + Write-Error "Docker не найден!" + Write-Host "" + Write-Host "📥 Установите Docker Desktop:" -ForegroundColor Yellow + Write-Host " https://www.docker.com/products/docker-desktop/" -ForegroundColor White + Write-Host "" + Write-Host "После установки:" -ForegroundColor Yellow + Write-Host " 1. Запустите Docker Desktop" -ForegroundColor White + Write-Host " 2. Дождитесь, пока появится зелёная иконка 🐳 в трее" -ForegroundColor White + Write-Host " 3. Запустите этот скрипт заново" -ForegroundColor White + Write-Host "" + + $openUrl = Read-Host "Открыть страницу загрузки Docker? (y/n)" + if ($openUrl -eq "y" -or $openUrl -eq "Y") { + Start-Process "https://www.docker.com/products/docker-desktop/" + } + exit 1 +} + +# Проверяем, запущен ли Docker +if ($DockerInstalled) { + try { + $dockerInfo = docker info 2>&1 + if ($LASTEXITCODE -eq 0) { + Write-Success "Docker daemon запущен" + $DockerRunning = $true + } + } catch { + $DockerRunning = $false + } + + if (-not $DockerRunning -and -not $SkipDockerCheck) { + Write-Warning "Docker установлен, но не запущен!" + Write-Host "" + Write-Host "🚀 Запустите Docker Desktop и дождитесь, пока:" -ForegroundColor Yellow + Write-Host " - Появится зелёная иконка 🐳 в трее" -ForegroundColor White + Write-Host " - Или надпись 'Docker Desktop is running'" -ForegroundColor White + Write-Host "" + + $waitForDocker = Read-Host "Ожидать запуска Docker? (y/n)" + if ($waitForDocker -eq "y" -or $waitForDocker -eq "Y") { + Write-Info "Ожидание запуска Docker..." + $attempts = 0 + $maxAttempts = 60 # 5 минут макс + + while (-not $DockerRunning -and $attempts -lt $maxAttempts) { + Start-Sleep -Seconds 5 + $attempts++ + Write-Host "." -NoNewline + + try { + $dockerInfo = docker info 2>&1 + if ($LASTEXITCODE -eq 0) { + $DockerRunning = $true + } + } catch {} + } + Write-Host "" + + if ($DockerRunning) { + Write-Success "Docker запустился!" + } else { + Write-Error "Таймаут ожидания Docker. Запустите Docker Desktop вручную." + exit 1 + } + } else { + exit 1 + } + } +} + +# Проверяем Docker Compose +if ($DockerRunning) { + try { + $composeVersion = docker compose version 2>&1 + if ($LASTEXITCODE -eq 0) { + Write-Success "Docker Compose доступен: $composeVersion" + $DockerComposeAvailable = $true + } + } catch {} + + if (-not $DockerComposeAvailable) { + # Пробуем старый формат docker-compose + try { + $composeVersion = docker-compose --version 2>&1 + if ($LASTEXITCODE -eq 0) { + Write-Success "Docker Compose (legacy) доступен: $composeVersion" + $DockerComposeAvailable = $true + } + } catch {} + } + + if (-not $DockerComposeAvailable -and -not $SkipDockerCheck) { + Write-Error "Docker Compose не найден!" + Write-Host "" + Write-Host "Docker Compose обычно входит в Docker Desktop." -ForegroundColor Yellow + Write-Host "Попробуйте переустановить Docker Desktop." -ForegroundColor Yellow + exit 1 + } +} + +# ========================================== +# ШАГ 2: ПРОВЕРКА ФАЙЛОВ ПРОЕКТА +# ========================================== +Write-Step "Проверка файлов проекта..." + +$dockerComposeFile = Join-Path $ScriptDir "docker-compose.yml" +$dockerDir = Join-Path $ScriptDir "docker" +$dockerFile = Join-Path $dockerDir "Dockerfile.singbox" + +if (-not (Test-Path $dockerComposeFile)) { + Write-Error "Не найден docker-compose.yml в $ScriptDir" + exit 1 +} +Write-Success "docker-compose.yml найден" + +if (-not (Test-Path $dockerFile)) { + Write-Error "Не найден docker/Dockerfile.singbox" + exit 1 +} +Write-Success "Dockerfile.singbox найден" + +# ========================================== +# ШАГ 3: СБОРКА И ЗАПУСК +# ========================================== +Write-Step "Сборка Docker-контейнера..." + +# Переходим в директорию проекта +Push-Location $ScriptDir + +try { + # Останавливаем старый контейнер если есть + Write-Info "Останавливаем старый контейнер (если есть)..." + docker compose down 2>&1 | Out-Null + + # Собираем образ + Write-Info "Сборка образа (может занять 1-2 минуты)..." + $buildOutput = docker compose build 2>&1 + if ($LASTEXITCODE -ne 0) { + Write-Error "Ошибка сборки Docker образа!" + Write-Host $buildOutput -ForegroundColor Red + Pop-Location + exit 1 + } + Write-Success "Образ собран" + + # Запускаем контейнер + Write-Info "Запуск контейнера..." + $upOutput = docker compose up -d 2>&1 + if ($LASTEXITCODE -ne 0) { + Write-Error "Ошибка запуска контейнера!" + Write-Host $upOutput -ForegroundColor Red + Pop-Location + exit 1 + } + Write-Success "Контейнер запущен" + +} finally { + Pop-Location +} + +# Ждём немного, чтобы контейнер инициализировался +Start-Sleep -Seconds 3 + +# Проверяем статус +Write-Step "Проверка статуса..." +$containerStatus = docker ps --filter "name=sing-proxy" --format "{{.Status}}" 2>&1 +if ($containerStatus -match "Up") { + Write-Success "Контейнер sing-proxy работает: $containerStatus" +} else { + Write-Warning "Контейнер может ещё запускаться. Проверьте через: docker ps" +} + +# ========================================== +# ШАГ 4: ИНФОРМАЦИЯ О ПОДКЛЮЧЕНИИ +# ========================================== +Write-Host "" +Write-Host "==========================================" -ForegroundColor Green +Write-Host " 🎉 УСТАНОВКА ЗАВЕРШЕНА! " -ForegroundColor Green +Write-Host "==========================================" -ForegroundColor Green +Write-Host "" +Write-Host "📡 Адреса подключения:" -ForegroundColor Yellow +Write-Host " Веб-интерфейс: http://localhost:3456" -ForegroundColor White +Write-Host " HTTP/SOCKS Прокси: 127.0.0.1:8082" -ForegroundColor White +Write-Host "" +Write-Host "📋 Следующие шаги:" -ForegroundColor Yellow +Write-Host " 1. Откройте http://localhost:3456 в браузере" -ForegroundColor White +Write-Host " 2. Вставьте VLESS ссылку или URL подписки" -ForegroundColor White +Write-Host " 3. Нажмите 'Применить'" -ForegroundColor White +Write-Host "" + +# ========================================== +# ШАГ 5: УСТАНОВКА СКРИПТА ДЛЯ DISCORD +# ========================================== +if (-not $SkipDiscord) { + Write-Host "==========================================" -ForegroundColor Cyan + Write-Host "" + Write-Host "🎮 Хотите установить ProxiFyre для Discord/Vesktop?" -ForegroundColor Yellow + Write-Host " Это позволит направить трафик Discord через прокси" -ForegroundColor Gray + Write-Host "" + Write-Host " [1] Да, установить для Discord" -ForegroundColor White + Write-Host " [2] Да, установить для Vesktop" -ForegroundColor White + Write-Host " [3] Да, установить для Discord + Vesktop" -ForegroundColor White + Write-Host " [n] Нет, пропустить" -ForegroundColor White + Write-Host "" + $discordChoice = Read-Host "👉 Выбор (1-3/n)" + + if ($discordChoice -match "^[123]$") { + # Проверяем права администратора + $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") + + if (-not $isAdmin) { + Write-Warning "Для установки ProxiFyre нужны права администратора!" + Write-Host "" + Write-Host "Запустите этот скрипт от имени администратора," -ForegroundColor Yellow + Write-Host "или запустите discord-windows-hack.ps1 отдельно:" -ForegroundColor Yellow + Write-Host "" + Write-Host " 1. Откройте PowerShell от имени Администратора" -ForegroundColor White + Write-Host " 2. Выполните:" -ForegroundColor White + Write-Host " cd `"$ScriptDir`"" -ForegroundColor Cyan + Write-Host " .\discord-windows-hack.ps1" -ForegroundColor Cyan + Write-Host "" + } else { + # Запускаем скрипт с параметрами для неинтерактивного режима + $discordScript = Join-Path $ScriptDir "discord-windows-hack.ps1" + + if (Test-Path $discordScript) { + Write-Step "Запуск установки ProxiFyre для Discord..." + + # Определяем целевые приложения + $targetApps = switch ($discordChoice) { + "1" { @("Discord") } + "2" { @("Vesktop") } + "3" { @("Vesktop", "Discord") } + } + + # Вызываем discord-windows-hack.ps1 с параметрами (без дублирования кода) + & $discordScript -Proxy "127.0.0.1:8082" -Apps $targetApps -Force + + } else { + Write-Warning "Скрипт discord-windows-hack.ps1 не найден" + Write-Info "Скачайте его или создайте вручную" + } + } + } else { + Write-Info "Установка Discord прокси пропущена" + } +} + +# ========================================== +# ФИНАЛЬНЫЕ ИНСТРУКЦИИ +# ========================================== +Write-Host "" +Write-Host "==========================================" -ForegroundColor Cyan +Write-Host " 📋 ПОЛЕЗНЫЕ КОМАНДЫ " -ForegroundColor Cyan +Write-Host "==========================================" -ForegroundColor Cyan +Write-Host "" +Write-Host "🐳 Docker:" -ForegroundColor Yellow +Write-Host " docker ps - статус контейнера" -ForegroundColor Gray +Write-Host " docker logs --tail 50 sing-proxy - логи VPN-прокси" -ForegroundColor Gray +Write-Host " docker compose restart - перезапуск" -ForegroundColor Gray +Write-Host " docker compose down - остановка" -ForegroundColor Gray +Write-Host "" +Write-Host "🛡️ ProxiFyre (если установлен):" -ForegroundColor Yellow +Write-Host " Get-Content C:\Tools\ProxiFyre\app-config.json - конфиг" -ForegroundColor Gray +Write-Host " Get-ChildItem C:\Tools\ProxiFyre\logs - список логов" -ForegroundColor Gray +Write-Host " Get-Content C:\Tools\ProxiFyre\logs\*.log -Tail 50 - последние логи" -ForegroundColor Gray +Write-Host " Get-Service ProxiFyreService - статус службы" -ForegroundColor Gray +Write-Host " Restart-Service ProxiFyreService - перезапуск службы" -ForegroundColor Gray +Write-Host ""