Менеджер кладёт код первичной настройки в data/setup-token, установщик
дожидается файла и печатает код последним сообщением — за ним больше не
нужно идти в journalctl. Файл удаляется, как только создан администратор,
и не появляется на уже настроенной панели.
Установщик научился снимать панель с машины: --uninstall убирает службу,
бинарники и правило sudo, --purge вдобавок сносит каталог с мирами,
бэкапами и учётками. Данные удаляются только по явному подтверждению, а
каталог сносится, лишь если похож на установку панели: опечатка в PZ_HOME
не должна стоить чужих файлов. Копия установщика теперь лежит в
/opt/pzmanager, так что удалять можно без похода в репозиторий.
get.sh пробрасывает аргументы установщику и в режиме удаления не качает
бинарник. Заодно исправлена подстановка пустого массива аргументов:
"${ARGS[@]:-}" разворачивается в один пустой аргумент, из-за чего обычная
установка спотыкалась бы о него.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Установщик стал идемпотентным: на уже настроенной машине он определяет
установленную версию, останавливает службу, меняет бинарник и поднимает её
обратно, не трогая конфиг, миры и учётные записи. Зависимости при
обновлении не переустанавливаются — это лишние минуты apt.
Кнопки «Обновить» и «Перезапустить панель» появились на вкладке
«Настройки» вместе с текущей версией и описанием нового релиза.
Панель работает от непривилегированного пользователя и не может ни
заменить свой бинарник в /usr/local/bin, ни дёрнуть systemctl. Вместо
того чтобы расширять её права, установщик кладёт root-скрипт
pzmanager-admin и разрешает сервисному пользователю через sudoers ровно
эту одну команду. Скрипт сверяет sha256 скачанного бинарника с
checksums.txt релиза. Если правила sudo нет, кнопки не будет — панель
покажет команду для терминала.
Перед обновлением и перезапуском игровой сервер останавливается штатным
quit: иначе его погасил бы systemd уже в момент рестарта, и ожидание
растянулось бы на таймаут остановки.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Workflow CI гоняет gofmt, vet, тесты и сборку на каждый push в main;
workflow Release по тегу v* собирает бинарники под linux/amd64 и arm64,
считает контрольные суммы и публикует релиз через API Gitea.
Оба workflow забирают код через git, а не actions/checkout: это
JS-действие, которому нужен Node внутри контейнера, а в образе golang его
нет. Заодно сборка перестала зависеть от доступности github.com, что для
self-hosted инстанса существенно.
Скрипт deploy/get.sh ставит последний релиз одной командой: определяет
архитектуру, забирает файлы релиза, сверяет sha256 (бинарник ставится с
правами root) и передаёт управление install.sh. Обновление — та же
команда.
Версия сборки попадает в бинарник через ldflags, доступна как
`pzmanager version` и видна в панели на вкладке «Настройки»: без неё
нельзя понять, какой релиз стоит на сервере.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>