diff --git a/UPDATE_SERVER_README.md b/UPDATE_SERVER_README.md new file mode 100644 index 00000000..94be677c --- /dev/null +++ b/UPDATE_SERVER_README.md @@ -0,0 +1,335 @@ +# 🚀 Umbrix Update Server - Инструкция + +## 📋 Обзор + +Umbrix использует систему автообновлений через **Sparkle Appcast XML**. Приложение проверяет файл `appcast.xml` на вашем сервере и уведомляет пользователей о новых версиях. + +## 🏗️ Структура системы обновлений + +### 1. **appcast.xml** - Манифест обновлений +Находится: `/home/vodorod/dorod/hiddify-umbrix-v1.7.0/appcast.xml` + +```xml + + Umbrix 2.5.8 + 🚀 Новые функции... + Sat, 18 Jan 2026 06:00:00 +0000 + 2.5.8 + + + + +``` + +### 2. **Настройки в коде** +Файл: `lib/core/model/constants.dart` + +```dart +// URL вашего сервера appcast.xml +static const appCastUrl = "http://localhost:8000/api/appcast.xml"; + +// Для публичного домена: +// static const appCastUrl = "https://updates.umbrix.net/appcast.xml"; +``` + +## 📂 Структура веб-сервера + +``` +/home/vodorod/update-server/ +├── api/ +│ └── appcast.xml # Копия из проекта +├── downloads/ # Файлы обновлений +│ ├── umbrix-2.5.8-linux.deb +│ ├── umbrix-2.5.8-linux.rpm +│ ├── umbrix-2.5.8-linux.AppImage +│ └── umbrix-2.5.8-windows.exe +└── admin/ # Ваш Update Manager (localhost:8000/admin/) + └── index.html +``` + +## 🔄 Процесс публикации обновления + +### Шаг 1: Собрать новую версию +```bash +cd ~/dorod/hiddify-umbrix-v1.7.0 +./build-all-packages.sh +``` + +### Шаг 2: Скопировать файлы на сервер +```bash +# Создать папку для версии +mkdir -p /home/vodorod/update-server/downloads/ + +# Скопировать пакеты +cp dist/2.5.8+258/umbrix-2.5.8+258-linux.deb \ + /home/vodorod/update-server/downloads/umbrix-2.5.8-linux.deb + +cp dist/2.5.8+258/umbrix-2.5.8+258-linux.rpm \ + /home/vodorod/update-server/downloads/umbrix-2.5.8-linux.rpm + +cp dist/2.5.8+258/umbrix-2.5.8+258-linux.AppImage \ + /home/vodorod/update-server/downloads/umbrix-2.5.8-linux.AppImage +``` + +### Шаг 3: Обновить appcast.xml + +Раскомментируйте и измените секцию в `appcast.xml`: + +```xml + + Umbrix 2.5.8 + 🚀 Новые функции: +- Улучшена стабильность +- Исправлены ошибки + Sat, 18 Jan 2026 06:00:00 +0000 + 2.5.8 + 2.5.8 + 2.0.0 + + + + + + + + + + +``` + +### Шаг 4: Скопировать appcast.xml на сервер +```bash +cp appcast.xml /home/vodorod/update-server/api/appcast.xml +``` + +## 🌐 Запуск локального сервера + +### Вариант 1: Python HTTP сервер (простой) +```bash +cd /home/vodorod/update-server +python3 -m http.server 8000 +``` + +Доступ: +- Appcast: `http://localhost:8000/api/appcast.xml` +- Скачивания: `http://localhost:8000/downloads/` +- Admin: `http://localhost:8000/admin/` + +### Вариант 2: Nginx (продакшн) +```nginx +server { + listen 8000; + server_name localhost; + root /home/vodorod/update-server; + + location /api/appcast.xml { + add_header Content-Type application/xml; + add_header Access-Control-Allow-Origin *; + } + + location /downloads/ { + autoindex on; + } +} +``` + +## 📱 Про поле "URL для скачивания APK" в веб-интерфейсе + +**ВАЖНО**: Это поле осталось от оригинального Hiddify (Android приложение). Для **Umbrix Linux десктоп** оно **НЕ используется**. + +Umbrix для Linux использует: +- ✅ **DEB пакеты** (Debian/Ubuntu) +- ✅ **RPM пакеты** (Fedora/CentOS) +- ✅ **AppImage** (универсальный формат) + +Поле "APK" в веб-интерфейсе можно: +1. **Игнорировать** (оставить пустым) +2. **Переименовать** в "URL для скачивания DEB/RPM/AppImage" +3. **Удалить** из веб-интерфейса + +## 🔐 Безопасность + +### Для продакшн (публичный домен): + +1. **HTTPS обязателен**: +```dart +static const appCastUrl = "https://updates.umbrix.net/appcast.xml"; +``` + +2. **Подписывание обновлений** (Sparkle поддерживает): +```bash +# Генерация ключей +openssl genrsa -out private_key.pem 2048 +openssl rsa -in private_key.pem -pubout > public_key.pem + +# Подпись файла +openssl dgst -sha256 -sign private_key.pem \ + umbrix-2.5.8-linux.deb > signature.txt +``` + +3. **Добавить signature в appcast.xml**: +```xml + +``` + +## 🧪 Тестирование + +### 1. Проверить доступность appcast.xml +```bash +curl http://localhost:8000/api/appcast.xml +``` + +### 2. Проверить в приложении +- Запустить Umbrix +- Зайти в Настройки → Проверить обновления +- Приложение скачает appcast.xml и покажет уведомление о новой версии + +### 3. Логи отладки +В коде установлен `_debugUpgrader = true`, логи будут в консоли: +``` +[UPGRADER] Checking appcast: http://localhost:8000/api/appcast.xml +[UPGRADER] Current version: 1.7.0 +[UPGRADER] Latest version: 2.5.8 +[UPGRADER] Update available! +``` + +## 📊 Мониторинг скачиваний + +### Вариант 1: Nginx access.log +```bash +tail -f /var/log/nginx/access.log | grep "/downloads/" +``` + +### Вариант 2: Python скрипт с логированием +```python +from http.server import HTTPServer, SimpleHTTPRequestHandler +import datetime + +class LoggingHandler(SimpleHTTPRequestHandler): + def log_message(self, format, *args): + print(f"[{datetime.datetime.now()}] {args[0]}") + +HTTPServer(('', 8000), LoggingHandler).serve_forever() +``` + +## 🚀 Миграция на публичный домен + +Когда будете готовы к продакшну: + +1. **Купить домен**: `updates.umbrix.net` + +2. **Настроить DNS**: +``` +A updates.umbrix.net → 123.45.67.89 +``` + +3. **Изменить в коде**: +```dart +static const appCastUrl = "https://updates.umbrix.net/appcast.xml"; +``` + +4. **Пересобрать и выпустить обновление**: +```bash +./build-all-packages.sh +``` + +5. **Все последующие версии** будут проверять новый домен + +## ❓ FAQ + +### Q: Как часто приложение проверяет обновления? +A: Раз в 12 часов (настройка `durationUntilAlertAgain`) + +### Q: Можно ли принудительно проверить обновления? +A: Да, через меню "Настройки → Проверить обновления" + +### Q: Что делать, если обновление не находится? +A: Проверьте: +1. Доступен ли `appcast.xml` по URL +2. Версия в `` больше текущей +3. Логи отладки в консоли приложения + +### Q: Как откатить обновление? +A: Удалите или закомментируйте `` новой версии в `appcast.xml` + +## 📝 Пример полного appcast.xml + +```xml + + + + Umbrix Updates + Umbrix VPN автообновления + http://localhost:8000 + ru + + + + Umbrix 2.5.8 + 🚀 Новые функции: +- Улучшена стабильность +- Исправлены ошибки +- Добавлена поддержка новых протоколов + Sat, 18 Jan 2026 06:00:00 +0000 + 2.5.8 + 2.5.8 + 2.0.0 + + + + + + + + + + + Umbrix 1.7.0 + Стабильный релиз + Fri, 17 Jan 2026 08:49:07 +0000 + 1.7.0 + 1.7.0 + + + +``` + +## 🎯 Готово! + +Теперь система обновлений полностью настроена и готова к использованию! diff --git a/appcast.xml b/appcast.xml index 7057b1de..83b5da3c 100644 --- a/appcast.xml +++ b/appcast.xml @@ -2,6 +2,64 @@ Umbrix Updates - + Umbrix VPN автообновления + http://localhost:8000 + ru + + + + + + + + + + + + + + + + --> + + + + Umbrix 1.7.0 + Стабильный релиз + Fri, 17 Jan 2026 08:49:07 +0000 + 1.7.0 + 1.7.0 + diff --git a/lib/core/model/constants.dart b/lib/core/model/constants.dart index ccdac6cd..ea217a17 100644 --- a/lib/core/model/constants.dart +++ b/lib/core/model/constants.dart @@ -3,7 +3,7 @@ abstract class Constants { static const githubUrl = "https://github.com/umbrix-app/umbrix"; static const githubReleasesApiUrl = "https://api.github.com/repos/umbrix-app/umbrix/releases"; static const githubLatestReleaseUrl = "https://github.com/umbrix-app/umbrix/releases/latest"; - static const appCastUrl = "https://raw.githubusercontent.com/umbrix-app/umbrix/main/appcast.xml"; + static const appCastUrl = "http://localhost:8000/api/appcast.xml"; static const telegramChannelUrl = "https://t.me/umbrix_app"; static const privacyPolicyUrl = "https://umbrix.net/privacy.html"; static const termsAndConditionsUrl = "https://umbrix.net/terms.html"; @@ -15,9 +15,10 @@ abstract class Constants { // Собственный сервер обновлений (для приватного репозитория) // 📝 ИНСТРУКЦИЯ: Замените на URL вашего API сервера // Пример: "https://api.umbrix.net/api/latest" - // 🧪 Для тестирования в эмуляторе используйте: "http://10.0.2.2:8000/api.php" + // 🖥️ Для Linux десктопа используйте: "http://localhost:8000/api/appcast.xml" + // 📱 Для Android эмулятора используйте: "http://10.0.2.2:8000/api/appcast.xml" // См. документацию в папке: update-server/README.md - static const customUpdateServerUrl = "http://10.0.2.2:8000/api.php"; + static const customUpdateServerUrl = "http://localhost:8000/api/appcast.xml"; // Использовать собственный сервер обновлений вместо GitHub // true = использовать customUpdateServerUrl (для приватного репозитория) diff --git a/lib/features/app_update/notifier/app_update_notifier.dart b/lib/features/app_update/notifier/app_update_notifier.dart index e256084e..ae2fb685 100644 --- a/lib/features/app_update/notifier/app_update_notifier.dart +++ b/lib/features/app_update/notifier/app_update_notifier.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:umbrix/core/app_info/app_info_provider.dart'; import 'package:umbrix/core/localization/locale_preferences.dart'; +import 'package:umbrix/core/model/constants.dart'; import 'package:umbrix/core/preferences/preferences_provider.dart'; import 'package:umbrix/core/utils/preferences_utils.dart'; import 'package:umbrix/features/app_update/data/app_update_data_providers.dart'; @@ -18,7 +19,7 @@ const _debugUpgrader = true; @riverpod Upgrader upgrader(UpgraderRef ref) => Upgrader( - // Removed appcastConfig - no updates for Umbrix + appcastConfig: AppcastConfiguration(url: Constants.appCastUrl), debugLogging: _debugUpgrader && kDebugMode, durationUntilAlertAgain: const Duration(hours: 12), messages: UpgraderMessages(