Обновление панели из интерфейса и режим обновления в установщике
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
+34
View File
@@ -444,3 +444,37 @@ input.input-sm, .input-sm { width: auto; padding: 6px 10px; font-size: 13px; }
text-transform: none;
letter-spacing: 0;
}
/* ---------- Обновление панели ---------- */
.update-card { margin-bottom: 22px; }
.update-row {
display: flex;
align-items: center;
gap: 16px;
flex-wrap: wrap;
}
.update-row > div:first-child { flex: 1; min-width: 200px; }
.update-row .stat { font-size: 20px; margin: 0; }
.update-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.update-card details { margin-top: 12px; }
.update-card summary { cursor: pointer; color: var(--muted); font-size: 13px; }
.release-notes {
margin: 10px 0 0;
padding: 12px;
background: var(--bg);
border: 1px solid var(--border);
border-radius: 8px;
max-height: 260px;
overflow: auto;
white-space: pre-wrap;
word-break: break-word;
font-size: 12.5px;
line-height: 1.5;
}
.update-available { color: var(--accent); }