# 🐳 Хранение APK файлов в Docker контейнере ## 📋 Проблема При размещении update-server в Docker контейнере, нужно решить где хранить APK файлы (обычно 50-100 MB каждый). ## ✅ Решение: Docker Volume ### Вариант 1: Named Volume (Рекомендуется) **docker-compose.yml:** ```yaml version: '3.8' services: update-server: image: php:8.3-cli container_name: umbrix-update-server working_dir: /var/www command: php -S 0.0.0.0:8000 ports: - "8000:8000" volumes: # Код сервера (read-only) - ./update-server:/var/www:ro # Файлы обновлений (read-write) - umbrix-downloads:/var/www/downloads # Логи (read-write) - umbrix-logs:/var/www/logs restart: unless-stopped volumes: umbrix-downloads: driver: local umbrix-logs: driver: local ``` **Преимущества:** - ✅ Файлы сохраняются при пересоздании контейнера - ✅ Легко делать backup: `docker cp` - ✅ Данные изолированы от кода **Как загружать APK:** ```bash # 1. Соберите APK flutter build apk --release # 2. Скопируйте в volume docker cp build/app/outputs/flutter-apk/app-release.apk \ umbrix-update-server:/var/www/downloads/android/umbrix-1.7.1.apk # 3. Обновите latest.json через веб-панель # http://your-server:8000/admin/ ``` --- ### Вариант 2: Bind Mount (Для разработки) **docker-compose.yml:** ```yaml services: update-server: volumes: - ./update-server:/var/www # Downloads доступны локально - ./downloads:/var/www/downloads ``` **Преимущества:** - ✅ Прямой доступ с хоста - ✅ Удобно для разработки - ✅ Можно редактировать напрямую **Недостатки:** - ⚠️ Нужно следить за правами доступа - ⚠️ Файлы привязаны к хосту **Загрузка:** ```bash # Просто скопируйте файл cp build/app/outputs/flutter-apk/app-release.apk \ downloads/android/umbrix-1.7.1.apk ``` --- ### Вариант 3: Внешнее хранилище (Продакшен) Для продакшена лучше использовать CDN или объектное хранилище: **Примеры:** - 🌐 **CloudFlare R2** (S3-совместимый, бесплатный) - 🌐 **AWS S3** + CloudFront - 🌐 **DigitalOcean Spaces** - 🌐 **Azure Blob Storage** - 🌐 **Backblaze B2** **docker-compose.yml с S3:** ```yaml services: update-server: environment: - STORAGE_TYPE=s3 - S3_BUCKET=umbrix-updates - S3_REGION=eu-central-1 - AWS_ACCESS_KEY_ID=${AWS_KEY} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET} ``` **latest.json:** ```json { "download_url": "https://cdn.umbrix.net/downloads/android/umbrix-1.7.1.apk" } ``` **Преимущества:** - ✅ Быстрая доставка (CDN) - ✅ Неограниченное место - ✅ Автоматический backup - ✅ Не нагружает ваш сервер --- ## 📊 Сравнение вариантов | Вариант | Разработка | Продакшен | Сложность | Стоимость | |---------|-----------|-----------|-----------|-----------| | Named Volume | ⭐⭐⭐ | ⭐⭐⭐ | Низкая | Бесплатно | | Bind Mount | ⭐⭐⭐⭐⭐ | ⭐⭐ | Низкая | Бесплатно | | S3/CDN | ⭐⭐ | ⭐⭐⭐⭐⭐ | Средняя | $5-20/мес | --- ## 🚀 Быстрый старт (Named Volume) **1. Создайте docker-compose.yml:** ```bash cd /home/vodorod/dorod/hiddify-umbrix-v1.7.0 cat > docker-compose.yml << 'EOF' version: '3.8' services: update-server: image: php:8.3-cli container_name: umbrix-update-server working_dir: /var/www command: php -S 0.0.0.0:8000 ports: - "8000:8000" volumes: - ./update-server:/var/www:ro - umbrix-downloads:/var/www/downloads - umbrix-logs:/var/www/logs restart: unless-stopped volumes: umbrix-downloads: umbrix-logs: EOF ``` **2. Запустите:** ```bash docker-compose up -d ``` **3. Загрузите APK:** ```bash # Соберите flutter build apk --release # Загрузите в контейнер docker cp build/app/outputs/flutter-apk/app-release.apk \ umbrix-update-server:/var/www/downloads/android/umbrix-1.7.1.apk # Проверьте docker exec umbrix-update-server ls -lh /var/www/downloads/android/ ``` **4. Обновите latest.json через веб-панель:** ``` http://localhost:8000/admin/ ``` --- ## 🔒 Защита от конфликта с оригинальным Hiddify ### ✅ Убедитесь что настроено: **lib/core/model/constants.dart:** ```dart // Ваш сервер обновлений static const useCustomUpdateServer = true; // ← ДОЛЖНО БЫТЬ true // URL вашего сервера static const customUpdateServerUrl = "https://api.umbrix.net/api.php"; ``` **Что проверить:** ```bash # 1. Проверьте константы grep "useCustomUpdateServer" lib/core/model/constants.dart # 2. Должно вывести: # static const useCustomUpdateServer = true; ``` ### ⚠️ Если false - приложение будет проверять GitHub! **При `useCustomUpdateServer = false`:** - ❌ Обращается к https://api.github.com/repos/hiddify/hiddify-app/releases - ❌ Увидит оригинальные обновления Hiddify - ❌ Предложит скачать оригинальную версию **При `useCustomUpdateServer = true`:** - ✅ Обращается к вашему серверу - ✅ Видит только ваши обновления - ✅ Полный контроль --- ## 🎯 Рекомендации ### Для локальной разработки: ```bash # Используйте PHP встроенный сервер cd update-server && php -S localhost:8000 ``` ### Для тестирования в Docker: ```bash # Named Volume docker-compose up -d ``` ### Для продакшена: ```yaml # docker-compose.yml services: update-server: image: php:8.3-fpm volumes: - ./update-server:/var/www - umbrix-downloads:/var/www/downloads nginx: image: nginx:alpine ports: - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - umbrix-downloads:/var/www/downloads:ro - ./ssl:/etc/nginx/ssl ``` --- ## 📦 Backup файлов обновлений ### Из Named Volume: ```bash # Backup docker run --rm \ -v umbrix-downloads:/data \ -v $(pwd):/backup \ alpine tar czf /backup/downloads-backup.tar.gz /data # Restore docker run --rm \ -v umbrix-downloads:/data \ -v $(pwd):/backup \ alpine tar xzf /backup/downloads-backup.tar.gz -C / ``` ### Из Bind Mount: ```bash # Просто архивируйте tar czf downloads-backup.tar.gz downloads/ ``` --- ## 💡 Итого **Для вас (Umbrix):** 1. ✅ Используйте **Named Volume** в Docker 2. ✅ `useCustomUpdateServer = true` уже установлено 3. ✅ Загружайте APK через `docker cp` 4. ✅ Управляйте через веб-панель http://localhost:8000/admin/ 5. ✅ **НЕ будет** конфликта с оригинальным Hiddify! **Версии теперь логичные:** - Текущая: **1.7.0 dev** - Доступна: **1.7.1** - Следующая: **1.7.2**, **1.8.0**, и т.д.