# Деплой ButtonTask по ADB (offline, RK3566, хост — Windows) Голое устройство по USB → adb → один прогон → ребут → работает. Пакеты ставятся офлайн; зависимости берутся с референс-устройства. Хост — Windows, PowerShell, **без WSL и без docker**. `adb.exe` (и `AdbWinApi.dll`, `AdbWinUsbApi.dll` рядом с ним) лежит в `.\bin\`. Скрипты сами его оттуда подхватывают — ничего в PATH прописывать не нужно. --- ## Раскладка папки ``` deploy\ bin\ adb.exe AdbWinApi.dll AdbWinUsbApi.dll packages.list collect-on-device.sh device-install.sh collect-debs.ps1 make-adb-bundle.ps1 deploy-adb.ps1 deploy.cmd <- двойной клик для не-специалиста (шаг 4) ``` --- ## Подготовка (один раз, делаете ВЫ) Нужно: ваш собранный бинарник `ButtonTask` под **arm64** (собранный на том же релизе Debian, что и устройства), репозиторий ButtonTask, и два устройства — **target** (голое) и **reference** (на столе, с интернетом). ### Шаг 1 — снять список пакетов с голого устройства Подключите по USB **только target**. В папке `deploy` откройте PowerShell (Shift+ПКМ по папке → «Открыть окно PowerShell здесь») и выполните: ``` powershell -ExecutionPolicy Bypass -File collect-debs.ps1 -Step target ``` → появится `target-installed.txt`. ### Шаг 2 — скачать недостающие пакеты на референсе Отключите target. Подключите **только reference** (с интернетом): ``` powershell -ExecutionPolicy Bypass -File collect-debs.ps1 -Step fetch ``` → скачает нужные `.deb` в `.\debs`. Если оба устройства — один и тот же чистый образ, шаг 1 можно пропустить. ### Шаг 3 — собрать бандл ``` powershell -ExecutionPolicy Bypass -File make-adb-bundle.ps1 -Version 2.5 -MasterPassword 'ваш-аварийный-секрет' ``` → появится `buttontask-deploy-2.5.tgz` (бинарник + webconfig + пакеты + device-install.sh, все скрипты уже в LF). Бинарник по умолчанию берётся из `.\software\ButtonTask` (иначе задайте `-BinPath`). Перед сборкой обновите `.\software\`: свежий `ButtonTask` (arm64) и актуальный `webconfig\` из репозитория (OTA теперь синхронизирует `/opt/buttontask/scripts/` и sudoers из пакета при staging). PNG/JPG/SVG/GIF из `.\software\` и `.\software\icons\` попадут в `/opt/buttontask/icons/`. Дефолтный конфиг уже содержит кнопку `Вызов клининга` с иконкой `cleaner1Crop.png`. Сеть: отредактируйте `.\software\config\network.json` перед сборкой (по умолчанию `eth0` static `192.168.1.60/24`). --- ## Развёртывание на устройства (шаг 4) Это можно отдавать **не специалисту**. Достаточно отдать папку с: `bin\`, `deploy-adb.ps1`, `deploy.cmd` и одним файлом `buttontask-deploy-2.1.tgz`. Инструкция для него — три строчки: 1. Подключи устройство к ноутбуку USB-кабелем. 2. Двойной клик по **deploy.cmd**. 3. Дождись зелёного «ГОТОВО», отключи устройство. Следующее — так же. `deploy.cmd` сам найдёт единственный `.tgz` рядом, дождётся появления устройства (до 60 c), зальёт, поставит офлайн, перезагрузит и проверит, что сервисы поднялись. Если что-то не так — покажет понятную ошибку и не закроется сразу. --- ## Что делает device-install.sh на устройстве 1. `dpkg -i debs/*.deb` офлайн (два прохода), `ldconfig`. 2. Создаёт пользователя `buttontask`, группы `video render input`. 3. Раскладывает `/opt/buttontask/{versions/,config,icons,run,scripts}`, симлинк `current`. Существующий `config.json` **по умолчанию не трогает** (upgrade-safe). Для полного сброса: `BUTTONTASK_RESET_CONFIG=1` или `deploy-adb.ps1 -ResetConfig`, либо галочка в sshDeploy GUI. 4. Хелперы `bt-*` + `sudoers` (+`visudo -c`). 5. `/tmp/runtime-buttontask` через `tmpfiles.d` (переживает ребут). 6. Авто-детект тачскрина → `override.conf` с нужным `eventN`. 7. Выключает `display-manager` (eglfs забирает KMS/DRM). 8. `systemctl enable buttontask buttontask-web buttontask-network`; старт — после ребута. UI (`buttontask`) не ждёт поднятия IP — сеть настраивается параллельно с коротким таймаутом. 9. Если в бандле есть `config/.master` — кладёт аварийный мастер-пароль (web + Qt). Идемпотентен: повторный прогон безопасен. --- ## Грабли - **Версия Qt.** Бинарник и пакеты — одного релиза Debian, иначе рантайм-Qt не совпадёт с линковкой. Собирайте бинарник на том же релизе, что устройства. - **reference без интернета.** Шаг 2 требует интернет на референсе. - **adb не root.** На Rockchip обычно root. Если нет — скрипт идёт через `sudo` (нужен пассвордлесс-sudo для adb-пользователя). - **Драйвер ADB на Windows.** Для первого подключения может понадобиться установить USB-драйвер (Google USB Driver / производителя платы), иначе устройство в `adb devices` не появится. ## Диагностика (если зелёного «ГОТОВО» нет) ``` bin\adb.exe shell systemctl status buttontask buttontask-web bin\adb.exe shell journalctl -u buttontask -b --no-pager bin\adb.exe shell ls -l /opt/buttontask/current ``` Веб-конфигуратор: `http://:8080`, логин `admin` / пароль `admin` (из `settings.password`, смените в вебе). Аварийный мастер-пароль — из `-MasterPassword` при сборке бандла или `sudo /opt/buttontask/scripts/bt-set-master`.