diff --git a/update-server/WINDOWS_DISTRIBUTOR_BUILD.md b/update-server/WINDOWS_DISTRIBUTOR_BUILD.md new file mode 100644 index 00000000..6f7d4e37 --- /dev/null +++ b/update-server/WINDOWS_DISTRIBUTOR_BUILD.md @@ -0,0 +1,271 @@ +# Сборка Windows установщика через flutter_distributor + +## ✅ РЕШЕНИЕ: Один .exe файл со всеми зависимостями + +Hiddify использует **flutter_distributor** с **target: exe**, который: +1. Собирает Flutter приложение +2. Упаковывает ВСЕ файлы (exe + dll + data + libcore.dll) +3. Создает **Inno Setup** установщик +4. Результат: **ОДИН .exe файл** (~50-60MB) + +## Требования + +1. **Windows машина** (или VM) +2. **Flutter SDK** 3.24.0+ +3. **Visual Studio 2022** с C++ компонентами +4. **Inno Setup** 6.x+ (скачать: https://jrsoftware.org/isdl.php) + +## Шаг 1: Клонирование репозитория на Windows + +```powershell +# Клонировать с Gitea +git clone --recursive https://update.umbrix.net/vodorod/umbrix.git +cd umbrix + +# Или обновить submodules если уже клонировано +git submodule update --init --recursive +``` + +## Шаг 2: Замена libcore.dll + +```powershell +# Скачать libcore с Gitea +curl -L -o libcore-windows.tar.gz "https://update.umbrix.net/vodorod/umbrix-libcore/releases/download/v1.7.0-umbrix/libcore-windows-amd64-umbrix.tar.gz" + +# Распаковать +tar -xzf libcore-windows.tar.gz + +# Заменить в проекте +Copy-Item libcore.dll -Destination libcore\bin\libcore.dll -Force +Copy-Item HiddifyCli.exe -Destination libcore\bin\HiddifyCli.exe -Force +Copy-Item -Path webui -Destination libcore\bin\ -Recurse -Force +``` + +## Шаг 3: Установка flutter_distributor + +```powershell +# Активировать плагин +dart pub global activate flutter_distributor + +# Добавить в PATH (если еще нет) +# C:\Users\YOUR_USERNAME\AppData\Local\Pub\Cache\bin +``` + +## Шаг 4: Сборка установщика + +```powershell +# Собрать Windows .exe установщик +dart run flutter_distributor:main package --platform windows --targets exe --skip-clean + +# Процесс: +# 1. flutter build windows --release (5-10 минут) +# 2. Копирование файлов в temp директорию +# 3. Запуск Inno Setup для создания установщика (1-2 минуты) +# 4. Результат: dist\1.7.3+173\umbrix-setup-x64.exe (~50-60MB) +``` + +## Что происходит внутри? + +### 1. Flutter Build +``` +build/windows/x64/runner/Release/ +├── umbrix.exe (основной исполняемый файл) +├── data/ (ресурсы Flutter) +│ ├── app.so +│ ├── icudtl.dat +│ └── flutter_assets/ +├── flutter_windows.dll (Flutter engine) +├── libcore.dll (VPN ядро, 45MB) +└── другие .dll +``` + +### 2. Inno Setup упаковывает +- Все файлы из `build/windows/x64/runner/Release/` +- Создает установщик с GUI на русском/английском +- Добавляет ярлыки (рабочий стол + меню Пуск) +- Регистрирует в "Установка и удаление программ" +- Поддерживает тихую установку `/VERYSILENT` + +### 3. Результат +``` +dist/1.7.3+173/umbrix-setup-x64.exe (~50-60MB) +``` + +**Этот файл содержит ВСЁ:** +- umbrix.exe +- Flutter runtime +- libcore.dll (45MB) +- WebUI +- Все зависимости + +## Шаг 5: Тестирование + +```powershell +# Запустить установщик +.\dist\1.7.3+173\umbrix-setup-x64.exe + +# Или тихая установка (для тестирования автообновлений) +.\umbrix-setup-x64.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART + +# Проверить установку +dir "C:\Program Files\Umbrix" +``` + +## Шаг 6: Загрузка в Gitea + +```powershell +# Переименовать для релиза +$version = "1.7.3" +$file = "dist\$version+173\umbrix-setup-x64.exe" +$newName = "umbrix-$version-windows-setup-x64.exe" +Copy-Item $file $newName + +# Загрузить через API +$token = "YOUR_GITEA_TOKEN" +$releaseId = 1 # ID релиза v1.7.3 + +curl -X POST "https://update.umbrix.net/api/v1/repos/vodorod/umbrix/releases/$releaseId/assets?name=$newName" ` + -H "Authorization: token $token" ` + -H "Content-Type: application/octet-stream" ` + --data-binary "@$newName" +``` + +## Автоматизация (GitHub Actions) + +Создайте `.github/workflows/build-windows.yml`: + +```yaml +name: Build Windows +on: + push: + tags: ['v*'] + +jobs: + build: + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.24.0' + + - name: Download libcore + run: | + curl -L -o libcore.tar.gz "https://update.umbrix.net/vodorod/umbrix-libcore/releases/download/v1.7.0-umbrix/libcore-windows-amd64-umbrix.tar.gz" + tar -xzf libcore.tar.gz + Copy-Item libcore.dll -Destination libcore\bin\libcore.dll -Force + + - name: Install flutter_distributor + run: dart pub global activate flutter_distributor + + - name: Build Windows EXE + run: dart run flutter_distributor:main package --platform windows --targets exe --skip-clean + + - name: Upload to Gitea + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + $file = Get-ChildItem dist\*\umbrix-setup-x64.exe | Select-Object -First 1 + curl -X POST "https://update.umbrix.net/api/v1/repos/vodorod/umbrix/releases/assets" ` + -H "Authorization: token $env:GITEA_TOKEN" ` + --data-binary "@$($file.FullName)" +``` + +## Конфигурация (уже настроено) + +**windows/packaging/exe/make_config.yaml:** +```yaml +app_id: 7U904649-52C2-5607-H590-CK880G32B76E +publisher: Umbrix Team +publisher_url: https://umbrix.net +display_name: Umbrix +executable_name: umbrix.exe +output_base_file_name: umbrix-setup-x64.exe +create_desktop_icon: true +install_dir_name: "{autopf64}\\Umbrix" +setup_icon_file: ..\..\windows\runner\resources\app_icon.ico +locales: + - en + - ru +``` + +**windows/packaging/exe/inno_setup.sas:** +- Шаблон Inno Setup с поддержкой тихой установки +- Автоматически закрывает старую версию перед установкой +- Создает ярлыки на рабочем столе и в меню Пуск + +## Альтернатива: Ручная сборка через Inno Setup + +Если flutter_distributor не работает: + +```powershell +# 1. Собрать Flutter +flutter build windows --release + +# 2. Создать installer.iss (см. WINDOWS_BUILD_INSTRUCTIONS.md) + +# 3. Скомпилировать через Inno Setup GUI +# Или через командную строку: +"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer.iss +``` + +## Troubleshooting + +**Ошибка: "Inno Setup not found"** +```powershell +# Установить Inno Setup +# Добавить в PATH: C:\Program Files (x86)\Inno Setup 6 +``` + +**Ошибка: "flutter_distributor command not found"** +```powershell +# Переустановить +dart pub global activate flutter_distributor + +# Проверить PATH +echo $env:PATH | Select-String "Pub\\Cache\\bin" +``` + +**Ошибка: "Failed to lookup symbol 'changeHiddifyOptions'"** +```powershell +# Убедитесь, что используете libcore.dll из umbrix-libcore репозитория +# НЕ используйте оригинальный Hiddify libcore! +``` + +**Большой размер файла (~60MB)** +- Это нормально! Включает: + - Flutter runtime (~10MB) + - libcore.dll (45MB) + - WebUI (~600KB) + - Инсталлятор Inno Setup (~5MB) + +## Сравнение с Linux сборкой + +| Платформа | Команда | Результат | Размер | +|-----------|---------|-----------|--------| +| **Linux** | `dart run flutter_distributor package --platform linux --targets deb` | umbrix-1.7.3-linux.deb | 29MB | +| **Windows** | `dart run flutter_distributor package --platform windows --targets exe` | umbrix-setup-x64.exe | 60MB | + +**Почему Windows больше?** +- libcore.dll (45MB) vs libcore.so (45MB) - одинаково +- Inno Setup упаковщик добавляет ~5MB +- Windows DLL зависимости больше чем Linux .so + +## Итого + +✅ **flutter_distributor решает все проблемы:** +- Один .exe файл вместо папки с множеством файлов +- Автоматическая упаковка через Inno Setup +- Поддержка тихой установки `/VERYSILENT` +- Совместимость с системой автообновлений +- Та же команда, что и для Linux (deb/rpm/appimage) + +🎯 **На Windows машине выполнить одну команду:** +```powershell +dart run flutter_distributor:main package --platform windows --targets exe --skip-clean +``` + +**Результат:** `dist/1.7.3+173/umbrix-setup-x64.exe` - готов к загрузке в Gitea! diff --git a/windows/packaging/exe/inno_setup.sas b/windows/packaging/exe/inno_setup.sas index 1017c728..ab988350 100644 --- a/windows/packaging/exe/inno_setup.sas +++ b/windows/packaging/exe/inno_setup.sas @@ -68,8 +68,8 @@ function InitializeSetup(): Boolean; var ResultCode: Integer; begin - Exec('taskkill', '/F /IM hiddify.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) - Exec('net', 'stop "HiddifyTunnelService"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) - Exec('sc.exe', 'delete "HiddifyTunnelService"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) + Exec('taskkill', '/F /IM umbrix.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) + Exec('net', 'stop "UmbrixTunnelService"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) + Exec('sc.exe', 'delete "UmbrixTunnelService"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode) Result := True; end; \ No newline at end of file diff --git a/windows/packaging/exe/make_config.yaml b/windows/packaging/exe/make_config.yaml index ebdbe187..2531f99a 100644 --- a/windows/packaging/exe/make_config.yaml +++ b/windows/packaging/exe/make_config.yaml @@ -1,17 +1,13 @@ -app_id: 6L903538-42B1-4596-G479-BJ779F21A65D -publisher: Hiddify -publisher_url: https://github.com/hiddify/hiddify-next -display_name: Hiddify -executable_name: Hiddify.exe -output_base_file_name: Hiddify.exe +app_id: 7U904649-52C2-5607-H590-CK880G32B76E +publisher: Umbrix Team +publisher_url: https://umbrix.net +display_name: Umbrix +executable_name: umbrix.exe +output_base_file_name: umbrix-setup-x64.exe create_desktop_icon: true -install_dir_name: "{autopf64}\\Hiddify" +install_dir_name: "{autopf64}\\Umbrix" setup_icon_file: ..\..\windows\runner\resources\app_icon.ico locales: - - ar - en - - fa - ru - - pt - - tr script_template: inno_setup.sas