Обновление панели из интерфейса и режим обновления в установщике
CI / test (push) Successful in 21s
Release / release (push) Successful in 27s

Установщик стал идемпотентным: на уже настроенной машине он определяет
установленную версию, останавливает службу, меняет бинарник и поднимает её
обратно, не трогая конфиг, миры и учётные записи. Зависимости при
обновлении не переустанавливаются — это лишние минуты apt.

Кнопки «Обновить» и «Перезапустить панель» появились на вкладке
«Настройки» вместе с текущей версией и описанием нового релиза.

Панель работает от непривилегированного пользователя и не может ни
заменить свой бинарник в /usr/local/bin, ни дёрнуть systemctl. Вместо
того чтобы расширять её права, установщик кладёт root-скрипт
pzmanager-admin и разрешает сервисному пользователю через sudoers ровно
эту одну команду. Скрипт сверяет sha256 скачанного бинарника с
checksums.txt релиза. Если правила sudo нет, кнопки не будет — панель
покажет команду для терминала.

Перед обновлением и перезапуском игровой сервер останавливается штатным
quit: иначе его погасил бы systemd уже в момент рестарта, и ожидание
растянулось бы на таймаут остановки.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 19:37:53 +03:00
co-authored by Claude Opus 5
parent 49d549463a
commit c0797be745
13 changed files with 833 additions and 25 deletions
+20
View File
@@ -268,6 +268,26 @@
<!-- Настройки -->
<section class="panel" data-panel="settings">
<h2>Версия панели</h2>
<div class="card update-card">
<div class="update-row">
<div>
<div class="stat" id="update-current"></div>
<p class="muted small" id="update-state">Проверяю обновления…</p>
</div>
<div class="update-actions">
<button class="btn btn-sm" id="btn-update-check">Проверить</button>
<button class="btn btn-sm btn-primary" id="btn-update-apply" hidden>Обновить</button>
<button class="btn btn-sm" id="btn-manager-restart">Перезапустить панель</button>
</div>
</div>
<p class="muted small" id="update-manual" hidden></p>
<details id="update-notes" hidden>
<summary>Что нового</summary>
<pre class="release-notes" id="update-notes-body"></pre>
</details>
</div>
<h2>Настройки менеджера</h2>
<form id="settings-form" class="fields"></form>
<button class="btn btn-primary" id="btn-settings-save">Сохранить настройки</button>