164 lines
6.4 KiB
Markdown
164 lines
6.4 KiB
Markdown
# Montana iOS Distribution — Без App Store
|
||
|
||
## Модель LazyShop
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ install.efir.org │
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ Wallet.ipa │ │ Junona.ipa │ │Contracts.ipa│ │
|
||
│ │ (unsigned) │ │ (unsigned) │ │ (unsigned) │ │
|
||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
||
│ │ │ │ │
|
||
│ └──────────────────┼──────────────────┘ │
|
||
│ │ │
|
||
│ ┌───────▼───────┐ │
|
||
│ │ zsign │ │
|
||
│ │ (server-side) │ │
|
||
│ └───────┬───────┘ │
|
||
│ │ │
|
||
│ ┌───────▼───────┐ │
|
||
│ │ Signed .ipa │ │
|
||
│ │ per UDID │ │
|
||
│ └───────┬───────┘ │
|
||
│ │ │
|
||
└────────────────────────────┼────────────────────────────────┘
|
||
│
|
||
┌────────▼────────┐
|
||
│ iPhone │
|
||
│ (itms-services) │
|
||
└─────────────────┘
|
||
```
|
||
|
||
## Процесс установки
|
||
|
||
### 1. Пользователь заходит на install.efir.org
|
||
|
||
### 2. Получает свой UDID
|
||
- Настройки → Основные → Об этом устройстве
|
||
- Или через get.udid.io
|
||
|
||
### 3. Регистрирует устройство
|
||
```
|
||
POST /api/register
|
||
{ "udid": "00000000-0000000000000000" }
|
||
```
|
||
|
||
### 4. Выбирает приложение и нажимает "Установить"
|
||
```
|
||
itms-services://?action=download-manifest&url=.../manifest.plist
|
||
```
|
||
|
||
### 5. iOS скачивает подписанный IPA
|
||
```
|
||
GET /api/download/wallet?udid=00000000-...
|
||
```
|
||
|
||
### 6. Доверяет сертификату
|
||
Настройки → Основные → VPN и управление устройством → Доверять
|
||
|
||
---
|
||
|
||
## Типы сертификатов
|
||
|
||
| Тип | Лимит | Срок | Контроль Apple |
|
||
|-----|-------|------|----------------|
|
||
| **Ad-Hoc** | 100 UDID/год | 1 год | Да (dev portal) |
|
||
| **Enterprise** | Безлимит | 1 год | Да (могут отозвать) |
|
||
| **Sideload** | 1 устройство | 7 дней | Нет |
|
||
|
||
### Рекомендация для Montana:
|
||
|
||
**Уровень 1: Enterprise Certificate**
|
||
- Один сертификат для всех
|
||
- Не нужен UDID каждого
|
||
- Риск: Apple может отозвать
|
||
|
||
**Уровень 2: Ad-Hoc + Rotation**
|
||
- 100 устройств на сертификат
|
||
- Несколько dev accounts = больше слотов
|
||
- Ротация сертификатов
|
||
|
||
**Уровень 3: Self-sign Guide**
|
||
- Учим пользователей подписывать самим
|
||
- AltStore / Sideloadly
|
||
- Полная независимость
|
||
|
||
---
|
||
|
||
## Структура сервера
|
||
|
||
```
|
||
/var/montana/
|
||
├── ipa/ # Оригинальные .ipa (без подписи)
|
||
│ ├── MontanaWallet.ipa
|
||
│ ├── JunonaAI.ipa
|
||
│ └── MontanaContracts.ipa
|
||
│
|
||
├── signed/ # Подписанные (по UDID)
|
||
│ ├── 00000000-xxx/
|
||
│ │ ├── MontanaWallet.ipa
|
||
│ │ └── ...
|
||
│ └── 11111111-yyy/
|
||
│ └── ...
|
||
│
|
||
├── certs/ # Сертификаты
|
||
│ ├── montana.p12 # Enterprise/Dev cert
|
||
│ └── *.mobileprovision # Provisioning profiles
|
||
│
|
||
├── static/ # Иконки
|
||
│ └── icons/
|
||
│
|
||
├── server.py # Flask app
|
||
└── montanasign.db # SQLite
|
||
```
|
||
|
||
---
|
||
|
||
## API Endpoints
|
||
|
||
```
|
||
GET / # Landing page
|
||
POST /api/register # Регистрация UDID
|
||
GET /api/manifest/{app} # manifest.plist для установки
|
||
GET /api/download/{app} # Скачать подписанный IPA
|
||
GET /api/apps # Список приложений
|
||
GET /api/stats # Статистика
|
||
```
|
||
|
||
---
|
||
|
||
## Fallback при блокировке
|
||
|
||
1. **Домен заблокирован** → Новый домен + DNS over HTTPS
|
||
2. **IP заблокирован** → Cloudflare / CDN
|
||
3. **Сертификат отозван** → Новый Enterprise account
|
||
4. **Всё заблокировано** → PWA + Android + Sideload guide
|
||
|
||
---
|
||
|
||
## Безопасность
|
||
|
||
- HTTPS обязателен (itms-services требует)
|
||
- Rate limiting на регистрацию
|
||
- UDID валидация
|
||
- Логирование всех установок
|
||
- Backup сертификатов
|
||
|
||
---
|
||
|
||
## Сравнение с LazyShop
|
||
|
||
| Функция | LazyShop | Montana |
|
||
|---------|----------|---------|
|
||
| Регистрация UDID | ✅ | ✅ |
|
||
| Онлайн подпись | ✅ | ✅ |
|
||
| Каталог приложений | Много | 3 (наши) |
|
||
| Монетизация | Платно | Бесплатно |
|
||
| Цель | Пиратство | Независимость |
|
||
|
||
---
|
||
|
||
*Apple не контролирует. Время — единственная реальная валюта. Ɉ*
|