Refactor proxy routing and installer flows

This commit is contained in:
2026-07-08 11:05:52 +03:00
parent e745633d91
commit 88d5b94133
14 changed files with 1899 additions and 487 deletions

225
README.md
View File

@@ -1,55 +1,127 @@
# ProxyWarden
ProxyWarden - это Windows-приложение для маршрутизации выбранных программ через прокси или VPN-сервер. Оно не меняет глобальные настройки прокси в Windows: вы сами выбираете, какие приложения должны идти через маршрут, например Discord, Telegram, браузер, игру или конкретный `.exe`.
ProxyWarden - это standalone Windows desktop-приложение для маршрутизации выбранных программ через SOCKS5-прокси. По сути это удобная оболочка управления над внешними компонентами: обязательным маршрутизатором приложений ProxiFyre и, опционально, локальным runtime `sing-box`.
## Что умеет приложение
ProxyWarden сам не является VPN-драйвером, прокси-сервером или отдельным gateway/server. Он хранит настройки, показывает состояние компонентов, генерирует конфиги и запускает только явные действия пользователя: установить, запустить, остановить, удалить или применить конфиг.
- добавлять приложения по имени процесса, папке или конкретному EXE-файлу;
- отправлять выбранные приложения через внешний SOCKS5-прокси;
- при необходимости поднимать локальный `sing-box` и использовать сервер из подписки;
- показывать состояние компонентов: установлен ли ProxiFyre, запущены ли службы, выбран ли сервер;
- генерировать конфиги для ProxiFyre и `sing-box` из сохраненных настроек;
- не устанавливать скрыто лишние компоненты при применении профиля.
## Главное
## Из чего состоит ProxyWarden
- Работает как Windows-клиент: Tauri 2 + React/TypeScript UI + Rust backend.
- Маршрутизирует не всю систему, а выбранные приложения: процесс, папку или конкретный `.exe`.
- Не меняет глобальный proxy в Windows.
- Для per-app routing нужен ProxiFyre.
- Local sing-box нужен только для сценария с подпиской и локальным SOCKS5 endpoint.
- Внешний SOCKS5-прокси работает без Local sing-box.
- Применение профиля не устанавливает и не чинит компоненты скрыто.
ProxyWarden разделен на три независимые части.
## Из чего состоит
**Control App** - само desktop-приложение. В нем вы настраиваете маршрут, выбираете приложения, смотрите статус и запускаете явные действия.
| Компонент | Что это | Нужен когда | Откуда берется |
| --- | --- | --- | --- |
| ProxyWarden Control App | Окно управления, настройки, status/readiness, генерация конфигов | Всегда | Этот репозиторий |
| [ProxiFyre](https://github.com/wiresock/proxifyre) | Windows-приложение/служба для перехвата трафика выбранных процессов и отправки его в SOCKS5 | Всегда для маршрутизации приложений | GitHub releases `wiresock/proxifyre` |
| [Windows Packet Filter / NDISAPI](https://github.com/wiresock/ndisapi) | Сетевой драйвер, который нужен ProxiFyre | Устанавливается вместе с ProxiFyre, если отсутствует | GitHub releases `wiresock/ndisapi` |
| [Microsoft Visual C++ Redistributable](https://learn.microsoft.com/cpp/windows/latest-supported-vc-redist) | Runtime-зависимость для `ProxiFyre.exe` | Устанавливается вместе с ProxiFyre, если отсутствует | Официальный `vc_redist` Microsoft |
| [sing-box](https://github.com/SagerNet/sing-box) | Локальный proxy/VPN runtime, который слушает `127.0.0.1:1080` | Только для маршрута через subscription/выбранный сервер | GitHub releases `SagerNet/sing-box` |
| [WinSW](https://github.com/winsw/winsw) | Wrapper, который запускает Local sing-box как Windows-службу | Только для Local sing-box | GitHub releases `winsw/winsw` |
**ProxiFyre** - обязательный слой для маршрутизации отдельных Windows-приложений. Он заставляет выбранные программы ходить через SOCKS5-прокси даже тогда, когда сами программы не умеют работать с прокси.
В UI и коде компонент ProxiFyre иногда проходит через внутренний id `proxyfier`. Это не отдельный продукт Proxifier; текущий backend adapter работает именно с ProxiFyre.
**Local sing-box** - необязательный локальный VPN/proxy runtime. Он нужен только если вы хотите вставить subscription URL, выбрать сервер и получить локальный SOCKS5 endpoint `127.0.0.1:1080`. Если у вас уже есть внешний SOCKS5-прокси, `sing-box` можно не устанавливать.
## Как идут маршруты
## Типичный сценарий с внешним прокси
1. Запустите ProxyWarden.
2. Установите или проверьте ProxiFyre.
3. На вкладке `VPN / Прокси` выберите `Внешний прокси`.
4. Введите адрес в формате `host:port` или `socks5://host:port`.
5. На вкладке `ProxiFyre` добавьте приложения, которые нужно маршрутизировать.
6. Нажмите `Применить в ProxiFyre`.
Результат: выбранные приложения идут через внешний SOCKS5-прокси. Local sing-box для этого сценария не нужен.
## Типичный сценарий с Local sing-box
1. Запустите ProxyWarden.
2. Установите ProxiFyre.
3. Установите Local sing-box.
4. Вставьте subscription URL, загрузите список серверов и выберите сервер.
5. Добавьте приложения для маршрутизации.
6. Примените маршрут.
Результат: выбранные приложения идут по цепочке:
Внешний SOCKS5-прокси:
```text
Приложения -> ProxiFyre -> Local sing-box 127.0.0.1:1080 -> выбранный сервер
выбранные приложения -> ProxiFyre -> внешний SOCKS5 proxy
```
## Где хранятся настройки
Local sing-box:
Пользовательские настройки хранятся в `C:\ProgramData\ProxyWarden`:
```text
выбранные приложения -> ProxiFyre -> Local sing-box 127.0.0.1:1080 -> выбранный сервер из подписки
```
Во втором сценарии ProxiFyre все равно обязателен: именно он делает маршрутизацию конкретных Windows-приложений. Local sing-box только дает локальный SOCKS5 endpoint и ходит дальше к выбранному серверу.
## Что устанавливается
### Control App
Обычная сборка Tauri создает desktop-приложение ProxyWarden. Отдельный скрипт `scripts/install-control-app.ps1` сейчас подготавливает стандартные директории:
```text
C:\Program Files\ProxyWarden\ControlApp
C:\ProgramData\ProxyWarden\config
C:\ProgramData\ProxyWarden\state
C:\ProgramData\ProxyWarden\generated
```
### ProxiFyre
Явная установка ProxiFyre из приложения выполняется через elevated PowerShell и ставит/обновляет:
```text
C:\Tools\ProxiFyre
C:\Tools\ProxiFyre\ProxiFyre.exe
C:\Tools\ProxiFyre\app-config.json
Windows service: ProxiFyreService
```
Если на машине не найдены зависимости, установщик также скачивает и ставит Microsoft Visual C++ Redistributable и Windows Packet Filter / NDISAPI.
### Local sing-box
Явная установка Local sing-box ставит:
```text
C:\Program Files\ProxyWarden\sing-box\sing-box.exe
C:\Program Files\ProxyWarden\sing-box\ProxyWardenSingBox.exe
C:\Program Files\ProxyWarden\sing-box\ProxyWardenSingBox.xml
C:\Program Files\ProxyWarden\sing-box\config.json
Windows service: ProxyWardenSingBox
```
`ProxyWardenSingBox.exe` - это WinSW wrapper. Он нужен только чтобы запускать `sing-box.exe` как Windows-службу.
## Права администратора
Без прав администратора можно открыть приложение, редактировать настройки, добавлять приложения, вводить внешний proxy, загружать/выбирать подписку и смотреть состояние.
Права администратора или UAC confirmation нужны для операций, которые меняют систему:
- установка или удаление ProxiFyre;
- установка Windows Packet Filter / NDISAPI;
- установка Microsoft Visual C++ Redistributable, если его нет;
- установка или удаление Local sing-box;
- создание, запуск и остановка Windows-служб;
- удаление install folder для managed-компонентов.
Применение профиля не запускает установку. Оно генерирует derived config и пытается записать его в найденную установку ProxiFyre. Если прав на запись в папку установки не хватает, операция должна завершиться ошибкой, а не устанавливать что-то скрыто.
## Поддержанная среда
Подтверждено вручную сейчас:
```text
Windows 11
PowerShell 7 как пользовательская shell для запуска команд разработки
```
Важно: Rust backend и elevated-операции сейчас запускают именно `powershell.exe` с `-NoProfile` и `-ExecutionPolicy Bypass`. На Windows это обычно Windows PowerShell 5.1. Скрипты используют стандартные команды вроде `Get-CimInstance`, `Invoke-WebRequest`, `Expand-Archive`, `Get-FileHash`, `Start-Service`, `Stop-Service`, `ConvertTo-Json`, поэтому должны быть близки к Windows PowerShell 5.1, но полный ручной тест пока был только на Windows 11 с PowerShell 7 в окружении разработки.
Ожидаемая, но не полностью подтвержденная область:
- Windows 10/11 desktop;
- x64 как основной сценарий;
- x86 и ARM64 частично учтены в installer-логике через выбор release assets, но не считаются проверенными;
- обычный desktop/laptop без специальных требований к GPU;
- доступ в интернет к GitHub releases и Microsoft download endpoints для установки компонентов.
Linux/macOS не являются целевой платформой для этого клиента.
## Где лежат настройки
Source of truth лежит в JSON под `C:\ProgramData\ProxyWarden`:
```text
C:\ProgramData\ProxyWarden\config\profiles.json
@@ -67,19 +139,45 @@ C:\ProgramData\ProxyWarden\generated\proxifyre-app-config.json
C:\ProgramData\ProxyWarden\generated\sing-box-config.json
```
Важно: редактировать вручную лучше исходные настройки, а не generated-файлы. При записи настроек приложение создает backup рядом с исходным JSON.
Не редактируйте generated-файлы как основной источник правды. При следующей генерации они могут быть перезаписаны.
## Установка из исходников
Subscription URL считается секретом. UI и diagnostics должны показывать только редактированную/сокращенную версию ссылки.
## Типовые сценарии
### Внешний SOCKS5
1. Запустите ProxyWarden.
2. Установите или проверьте ProxiFyre.
3. На вкладке `VPN / Прокси` выберите внешний proxy.
4. Введите `host:port` или `socks5://host:port`.
5. На вкладке `ProxiFyre` добавьте приложения.
6. Нажмите `Применить в ProxiFyre`.
Local sing-box для этого сценария не нужен.
### Local sing-box с подпиской
1. Запустите ProxyWarden.
2. Установите ProxiFyre.
3. Установите Local sing-box.
4. Вставьте subscription URL.
5. Загрузите список серверов и выберите сервер.
6. Добавьте приложения.
7. Сгенерируйте/примените маршрут.
## Установка и запуск из исходников
Нужны:
- Windows 10/11;
- Windows 11 для подтвержденного пути разработки;
- Node.js и npm;
- Rust через rustup;
- Visual Studio Build Tools с MSVC и Windows SDK;
- Microsoft Edge WebView2 Runtime.
- Microsoft Edge WebView2 Runtime;
- PowerShell 7 удобно использовать как shell разработки, но elevated runtime-команды приложения запускаются через `powershell.exe`.
Команды:
Установка зависимостей и запуск:
```powershell
cd D:\repos\ProxyWarden
@@ -87,7 +185,13 @@ npm install
npm run tauri -- dev
```
Собрать установочный пакет:
Собрать frontend:
```powershell
npm run build
```
Собрать установочный пакет Tauri:
```powershell
npm run tauri -- build
@@ -99,11 +203,11 @@ npm run tauri -- build
npm run dev -- --host 127.0.0.1
```
В browser-preview можно проверить интерфейс, но нельзя управлять Windows-службами и нативными компонентами.
Browser-preview годится для проверки интерфейса, но не доказывает работу Windows-служб, elevated-операций и Tauri command handlers.
## Явные installer-скрипты
## Installer-скрипты
В репозитории есть отдельные entrypoint-скрипты:
В репозитории есть явные entrypoint-скрипты:
```powershell
& .\scripts\install-control-app.ps1 -PlanOnly
@@ -111,32 +215,45 @@ npm run dev -- --host 127.0.0.1
& .\scripts\install-singbox.ps1 -PlanOnly
```
`-PlanOnly` показывает план в JSON и ничего не устанавливает. Реальная установка требует прав администратора. Компоненты устанавливаются отдельно: применение профиля не должно незаметно устанавливать Control App, ProxiFyre или Local sing-box.
`-PlanOnly` возвращает structured JSON и не должен иметь side effects.
Реальная установка через эти скрипты требует прав администратора. `scripts/install-proxyfier.ps1` как standalone boundary сейчас ожидает локальный `-PackagePath`; путь установки из UI/backend использует отдельный elevated-скрипт, который скачивает ProxiFyre, Windows Packet Filter и runtime-зависимости сам.
## Проверка для разработчика
Frontend:
Frontend/UI:
```powershell
npm run build
```
Rust-тесты:
Rust/backend:
```powershell
cd D:\repos\ProxyWarden\src-tauri
cargo test
```
Информация Tauri:
Tauri/toolchain:
```powershell
npm run tauri -- info
npm run tauri -- dev
npm run tauri -- build
```
Installer boundaries:
```powershell
& .\scripts\install-control-app.ps1 -PlanOnly
& .\scripts\install-proxyfier.ps1 -PlanOnly
& .\scripts\install-singbox.ps1 -PlanOnly
```
## Ограничения текущей версии
- Поддерживается основной путь через SOCKS5.
- ProxiFyre является текущим backend-слоем маршрутизации; архитектура оставляет место для другого proxy-router adapter.
- Local sing-box остается опциональным и не требуется для внешнего SOCKS5-прокси.
- Реальные elevated-операции установки, удаления и управления Windows-службами нужно проверять на Windows с правами администратора.
- Основной поддержанный маршрут - SOCKS5.
- ProxiFyre является текущим backend-слоем для per-app routing.
- Local sing-box остается опциональным и не требуется для внешнего SOCKS5.
- Elevated install/start/stop/uninstall операции считаются реализованными, но требуют дополнительной проверки на реальной Windows-машине с UAC/admin confirmation.
- Windows 10, Windows PowerShell 5.1, ARM64 и x86 нужно отдельно подтвердить перед тем, как называть их официально поддержанными.