300 lines
7.7 KiB
Markdown
300 lines
7.7 KiB
Markdown
|
|
# 🐳 Хранение 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**, и т.д.
|