154 lines
8.8 KiB
Markdown
154 lines
8.8 KiB
Markdown
# Массовый деплой ButtonTask по SSH (без adb)
|
||
|
||
Заменяет `deploy-adb.ps1` там, где adb на устройстве отключён. Вместо USB
|
||
использует Ethernet: инструмент сам выдаёт устройствам IP (мини-DHCP-сервер)
|
||
и заливает бандл по SSH. Можно подключать сразу несколько устройств через
|
||
свитч — каждое обрабатывается параллельно.
|
||
|
||
После установки в конфиг устройства пишется static `final_ip` (по умолчанию
|
||
`192.168.1.60`), затем устройство **выключается (`halt`)**, чтобы на свитче
|
||
не поднималось несколько девайсов с одним и тем же IP.
|
||
|
||
## Важно про сеть
|
||
|
||
Инструмент работает только в **изолированной сети**.
|
||
|
||
Используйте отдельный свитч, к которому подключены:
|
||
- один сетевой адаптер компьютера;
|
||
- пустые устройства ButtonTask.
|
||
|
||
На этом сегменте не должно быть других устройств и внешних аплинков.
|
||
|
||
## Что нужно один раз настроить
|
||
|
||
1. **Python 3** — установить с [python.org](https://www.python.org/downloads/)
|
||
(обычная установка, ничего дополнительно ставить не нужно — скрипт не
|
||
использует сторонние библиотеки).
|
||
|
||
2. Если в `config.json` стоит `"auth": "password"` — скачайте
|
||
`plink.exe` и `pscp.exe` с [putty.org](https://www.putty.org/) и положите
|
||
их в эту же папку, рядом с `mass_deploy.py`.
|
||
Если `"auth": "key"` — ничего докачивать не нужно, используется
|
||
встроенный в Windows 10/11 `ssh.exe`/`scp.exe`.
|
||
|
||
3. На сетевом адаптере, подключённом к выделенному свитчу, задать
|
||
**статический IP** (Панель управления -> Сеть -> Свойства адаптера ->
|
||
IPv4): например `192.168.1.201`, маска `255.255.255.0`, без шлюза.
|
||
Этот адрес должен совпадать с `server_ip` / `bind_ip` в `config.json`.
|
||
|
||
4. Если на этом адаптере когда-либо включали "Общий доступ к подключению к
|
||
интернету" (Internet Connection Sharing) — отключить. Он тоже слушает
|
||
DHCP-порт и будет конфликтовать с нашим сервером.
|
||
|
||
5. Скопировать `config.example.json` в `config.json` и заполнить:
|
||
- `bundle_path` — путь к `.tgz` бандлу (можно относительно этой папки,
|
||
например `../winDeployScripts/buttontask-deploy-2.33.tgz`);
|
||
- `device_user` / `device_password` (на голых платах обычно `linaro`/`linaro`);
|
||
- `use_sudo` — `true` (root не настроен, install идёт через `sudo -S`);
|
||
- `final_ip` — static IP, который останется в `network.json` после установки
|
||
(по умолчанию `192.168.1.60`);
|
||
- `after_install` — `halt` (рекомендуется) или `reboot`;
|
||
- `reset_config` — `false` (сохранить config на устройстве) или `true`
|
||
(перезаписать `config.json` и `.master` из бандла — для переустановки);
|
||
- при необходимости — диапазон `pool_start`/`pool_end` (адрес `final_ip`
|
||
из пула исключается автоматически).
|
||
|
||
## Запуск
|
||
|
||
### Вариант 1 — GUI для оператора
|
||
|
||
Дважды кликнуть `run-gui.bat`.
|
||
|
||
Порядок работы:
|
||
|
||
1. Настроить сетевой адаптер компьютера.
|
||
2. Включить GUI.
|
||
3. Выбрать сетевой интерфейс.
|
||
4. Выбрать `.tgz` бандл.
|
||
5. При переустановке на уже настроенное устройство — включить «Полный сброс конфига».
|
||
6. Нажать `Start`.
|
||
6. Вставить устройство в изолированную сеть.
|
||
7. Дождаться статуса `ГОТОВО`.
|
||
8. Вынуть устройство и повторить для следующего.
|
||
|
||
Windows спросит права администратора — нужно согласиться.
|
||
|
||
### Вариант 2 — старый CLI
|
||
|
||
Дважды кликнуть `run.bat`.
|
||
|
||
- Windows спросит права администратора — нужно согласиться (иначе DHCP-порт
|
||
может быть занят системными службами).
|
||
- Windows Firewall может спросить "разрешить программе доступ к сети" —
|
||
разрешить.
|
||
- Появится таблица статусов, обновляющаяся раз в секунду.
|
||
|
||
Подключайте устройства к свитчу — по одному или сразу все. Каждое появится
|
||
в таблице (по MAC-адресу) и пройдёт стадии:
|
||
|
||
```
|
||
discover -> acked -> ждём ssh -> заливаю -> устанавливаю -> сеть -> halt -> ГОТОВО
|
||
```
|
||
|
||
Общий алгоритм деплоя:
|
||
|
||
1. Устройство получает IP по DHCP.
|
||
2. Бандл копируется по SSH.
|
||
3. Устанавливаются пакеты и файлы из бандла.
|
||
4. Применяются `sudoers` и служебные скрипты.
|
||
5. Записывается итоговая сеть устройства.
|
||
6. Устройство выключается, чтобы избежать конфликтов после установки.
|
||
|
||
Если где-то `ОШИБКА`, детали видны в таблице; полный вывод install пишется в
|
||
`logs/<mac>.log`.
|
||
|
||
Частая ошибка на шаге `сеть`: `Connection timed out` — SSH оборвался до записи
|
||
`network.json`. Устройство после этого остаётся на DHCP; в таблице будет
|
||
`ОШИБКА`, не `ГОТОВО`. С новых версий deploy-скрипта запись повторяется до 3
|
||
раз и проверяется чтением файла обратно.
|
||
|
||
Когда устройство показывает `ГОТОВО` — оно выключено. Можно отключать кабель
|
||
и включать уже на рабочей сети: поднимется на `final_ip` с сервисами
|
||
ButtonTask.
|
||
|
||
`Ctrl+C` в окне консоли — остановить инструмент.
|
||
|
||
## Повторный прогон / переустановка того же устройства
|
||
|
||
IP-адреса привязываются к MAC-адресу и запоминаются в файле `leases.json`
|
||
рядом с конфигом — при повторной установке то же устройство снова получит
|
||
тот же DHCP-IP. SSH fingerprint'ы аналогично хранятся в `host_keys.json`.
|
||
Если нужно "сбросить" привязки/ключи — удалите `leases.json` и/или
|
||
`host_keys.json` (файлы создаются заново автоматически).
|
||
|
||
## device-install.sh
|
||
|
||
На время install `network.json` из бандла временно прячется, а старый
|
||
`/opt/buttontask/config/network.json` на устройстве удаляется — иначе при
|
||
переустановке install мог бы применить static во время SSH-сессии и оборвать
|
||
связь. Целевой static `final_ip` записывается уже после `INSTALL-OK` и
|
||
проверяется чтением файла.
|
||
|
||
`config.json` и `.master` **по умолчанию сохраняются**, если уже есть на
|
||
устройстве (upgrade-safe). Для переустановки «как с завода» включите
|
||
`"reset_config": true` в `config.json`, галочку в GUI или переменную
|
||
`BUTTONTASK_RESET_CONFIG=1` при запуске install.
|
||
|
||
## Сборка в exe
|
||
|
||
Для упаковки GUI в один exe:
|
||
|
||
```powershell
|
||
powershell -ExecutionPolicy Bypass -File .\build-gui.ps1
|
||
```
|
||
|
||
В результате появится папка `dist\sshDeploy-gui\` с:
|
||
- `sshDeploy-gui.exe`
|
||
- `config.json`
|
||
- `config.example.json`
|
||
- `README.md`
|
||
- `plink.exe`
|
||
- `pscp.exe`
|
||
|
||
Оператору можно отдавать именно эту папку.
|