Мобильное приложение — сборка и установка#
🌐 English · 简体中文 · فارسی · Español · Português · 日本語 · 한국어 · Français · Deutsch · Русский
Мобильное приложение opendray (app/mobile/) — это клиент управления, а
не второй шлюз. Оно выполняет ту же работу, что и веб-админка по адресу
/admin/: запускает и ведёт сессии, управляет каналами и интеграциями,
просматривает память, читает git-хосты. Сами агенты продолжают работать на
вашем хосте-шлюзе — телефон лишь подключается к ним.
Поэтому само по себе приложение бесполезно: оно подключается к работающему шлюзу opendray по HTTPS. Сначала поднимите шлюз (getting-started), затем соберите приложение и укажите ему URL вашего шлюза.
Почему нет загрузки из App Store / Play Store? opendray — это self-hosted, однотенантное ПО. Сборка для магазина была бы вынуждена зашить в себя чей-то бэкенд, а это ровно то, чем opendray не является. Поэтому вы собираете приложение сами, подписанное вашей собственной учётной записью, и оно общается только с вашим шлюзом. Два поддерживаемых пути ниже — (A) Android APK, который вы устанавливаете вручную (sideload), и (B) iOS-сборка, которую вы ставите через Xcode.
Шаг 0 — сделайте шлюз доступным с телефона#
Приложение общается со шлюзом по сети, поэтому телефон должен иметь возможность достучаться до него.
| Сценарий | Что вводить как Gateway URL |
|---|---|
| Телефон в той же LAN, что и шлюз | http://<gateway-lan-ip>:8770 (например, http://192.168.1.50:8770) |
| Шлюз за reverse-proxy с TLS | https://opendray.yourdomain.com |
| Доступ вне LAN (сотовая связь, в дороге) | Публичный HTTPS-эндпоинт — Cloudflare Tunnel, Tailscale или reverse-proxy на nginx/Caddy |
Не выставляйте
:8770голым в интернет. Поставьте перед ним TLS и ingress. Cloudflare Tunnel — вариант с наименьшим трением (без проброса портов, без публичного IP). Сниппеты для nginx / Caddy — включая заголовки WebSocket upgrade, которые нужны терминалу сессий, — приведены в operator-guide §Topology.
Проверьте доступность с телефона до сборки — например, откройте Gateway URL в браузере телефона: вы должны увидеть страницу входа веб-админки.
Шаг 1 — установите тулчейн Flutter#
Приложение собирается с помощью Flutter. Он нужен на машине, которая делает сборку (не на телефоне).
[object Promise]flutter doctor — это контрольная точка: он точно сообщает, чего не хватает
для Android (Android SDK + устройство/эмулятор) или iOS (Xcode + CocoaPods).
Исправьте строки с ✗ для вашей целевой платформы, прежде чем продолжить.
Один раз получите зависимости:
[object Promise]Шаг 2A — Android: соберите APK и установите его вручную#
Это самый простой путь — без аккаунта разработчика, без магазина.
Соберите APK#
[object Promise]Результат окажется в:
[object Promise]Замечание о подписи. По умолчанию release-сборка подписывается debug-keystore (см.
TODOвandroid/app/build.gradle.kts). Для личной установки вручную этого достаточно. Если вам нужен полноценный upload-ключ (обязателен для Play Store и хорош как гигиена для сборки, которую вы будете обновлять), следуйте Flutter — Sign the app и добавьтеsigningConfigдляrelease.
Перенесите APK на телефон#
Выберите, что удобнее:
[object Promise]Либо перенесите файл .apk на телефон (аналог AirDrop, файловая шара, ссылка
для скачивания, письмо самому себе) и нажмите на него. Android попросит
разрешить «Установка неизвестных приложений» для того приложения, которое
открывает файл (Files, Chrome и т. д.) — выдайте разрешение, затем подтвердите
установку.
Приложение появляется как Opendray (io.opendray.opendray).
Шаг 2B — iOS: сборка и установка через Xcode#
В iOS нет аналога установки APK вручную — каждая установка подписана кодом. Вам нужен Mac с Xcode и Apple ID. Бесплатный Apple ID подойдёт (приложение переподписывается каждые 7 дней; вы переустанавливаете его, когда provisioning-профиль истекает). Платный аккаунт Apple Developer (99 долл. США в год) даёт профили на год и TestFlight.
Однократная настройка подписи#
[object Promise]В Xcode:
- Выберите таргет Runner → вкладка Signing & Capabilities.
- Отметьте Automatically manage signing.
- Team: выберите команду вашего Apple ID (добавьте Apple ID в Xcode → Settings → Accounts, если его нет в списке).
- Bundle Identifier: поставляется как
io.opendray.opendray. С бесплатным Apple ID этот точный ID может быть уже занят на стороне Apple — если Xcode показывает ошибку provisioning, измените его на что-то уникальное, напримерio.opendray.opendray.<yourname>.
Сборка и установка на iPhone#
- Подключите iPhone по USB; доверьте компьютеру по запросу.
- Включите Developer Mode на телефоне: Settings → Privacy & Security → Developer Mode → включить → перезагрузка.
- В выпадающем списке устройств Xcode (верхняя панель) выберите ваш iPhone.
- Нажмите ▶ Run (или
⌘R). Xcode соберёт, подпишет и установит.
Либо управляйте этим из CLI, доверив подпись Xcode:
[object Promise]Первый запуск на устройстве#
iOS не запустит приложение, подписанное персональной командой, пока вы не доверите профиль разработчика:
- На телефоне: Settings → General → VPN & Device Management → ваш Apple ID → Trust.
Приложение появляется на домашнем экране как Opendray.
Истечение бесплатного Apple ID. Примерно через 7 дней приложение перестаёт запускаться («could not verify app»). Перезапустите сборку из Xcode, чтобы обновить профиль. Платный аккаунт избавляет от этого.
Шаг 3 — подключите приложение к вашему шлюзу#
Первый запуск показывает экран онбординга:
- Gateway URL — введите URL из Шага 0
(например,
https://opendray.yourdomain.com). Нажмите Continue. - Вход —
admin+ ваш пароль администратора (тот, что вы задали в[admin].password, или сменили позже).
Вот и всё — вы попадаете на те же поверхности, что и в веб-админке: Sessions, Channels, Integrations, Memory, Git, Settings.
Чтобы позже направить приложение на другой шлюз, нажмите Change на экране входа (или Settings → server) и заново введите URL.
Обновление приложения#
Авто-обновления нет — вы переустанавливаете приложение после получения нового кода:
[object Promise]Собственная строка версии приложения находится в app/mobile/pubspec.yaml
(version: <semver>+<build>).
Устранение неполадок#
| Симптом | Причина | Решение |
|---|---|---|
| Онбординг «could not connect» | Телефон не может достучаться до Gateway URL | Откройте URL в браузере телефона; сначала исправьте LAN IP / туннель / TLS (Шаг 0) |
| Вход работает, но терминал сессий не подключается | Reverse-proxy отбрасывает WebSocket upgrade | Добавьте WS-заголовки — operator-guide §Topology |
| Android блокирует установку | Не выдано «Установка неизвестных приложений» | Разрешите её для приложения, открывающего .apk (Files / Chrome) |
| iOS «Untrusted Developer» при запуске | Профиль персональной команды ещё не доверен | Settings → General → VPN & Device Management → Trust |
| iOS «Unable to install / signing» в Xcode | Конфликт Bundle ID с бесплатным Apple ID | Измените Bundle Identifier на io.opendray.opendray.<yourname> |
| iOS-приложение перестаёт открываться через неделю | Профиль бесплатного Apple ID истёк (7 дней) | Перезапустите из Xcode или используйте платный аккаунт |
flutter doctor показывает ✗ для вашей платформы |
Отсутствует Android SDK / Xcode / CocoaPods | Следуйте точной строке, которую печатает flutter doctor |
См. также#
- getting-started.md — поднимите шлюз, к которому подключается приложение
- operator-guide.md — топология reverse-proxy / туннеля для доступа вне LAN
- Flutter — build & release Android
- Flutter — build & release iOS