Обновление панели из интерфейса и режим обновления в установщике
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
+8
View File
@@ -17,6 +17,7 @@ import (
"github.com/mrleo1nid/pzmanager/internal/pzconfig"
"github.com/mrleo1nid/pzmanager/internal/pzserver"
"github.com/mrleo1nid/pzmanager/internal/steamcmd"
"github.com/mrleo1nid/pzmanager/internal/updater"
)
// csrfHeader — заголовок, который обязан прислать клиент при изменяющих
@@ -34,6 +35,7 @@ type Server struct {
backups *backup.Manager
steam *steamcmd.Client
workshop *pzconfig.WorkshopClient
updater *updater.Updater
static fs.FS
// secureCookies включает флаг Secure у cookie сессии (панель за HTTPS).
secureCookies bool
@@ -55,6 +57,8 @@ type Options struct {
Static fs.FS
SecureCookies bool
SetupToken string
// Repo — репозиторий, из которого панель берёт обновления.
Repo string
}
// New собирает HTTP-обработчик панели.
@@ -68,6 +72,7 @@ func New(o Options) *Server {
backups: o.Backups,
steam: o.Steam,
workshop: pzconfig.NewWorkshopClient(),
updater: updater.New(o.Repo, o.Version),
static: o.Static,
secureCookies: o.SecureCookies,
setupToken: o.SetupToken,
@@ -114,6 +119,9 @@ func (s *Server) Handler() http.Handler {
"GET /api/backups/{name}/download": s.handleDownloadBackup,
"POST /api/backups/{name}/restore": s.handleRestoreBackup,
"POST /api/install": s.handleInstall,
"GET /api/update": s.handleCheckUpdate,
"POST /api/update": s.handleApplyUpdate,
"POST /api/manager/restart": s.handleRestartManager,
"GET /api/task": s.handleTaskStatus,
"POST /api/task/cancel": s.handleTaskCancel,
"GET /api/users": s.handleListUsers,