Установка в /opt и доступ к панели по сети

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

Адрес панели задаётся при установке (PZ_LISTEN), каталог и пользователь —
через PZ_HOME и PZ_USER. Конфиг создаётся только при первой установке,
поэтому повторный запуск установщика обновляет бинарник, не трогая
настройки, миры и учётки.

Адрес теперь занимается до автозапуска игрового сервера: если IP ещё не
поднят или порт занят, менеджер падает сразу с внятной ошибкой, а не
оставляет работающий сервер PZ без панели управления.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 19:18:13 +03:00
co-authored by Claude Opus 5
parent fe517cfb71
commit 29782dcce9
4 changed files with 147 additions and 46 deletions
+11 -2
View File
@@ -8,6 +8,7 @@ import (
"errors"
"flag"
"fmt"
"net"
"net/http"
"os"
"os/signal"
@@ -147,6 +148,15 @@ func serve(cfg *config.Config, users *auth.Store, secureCookies bool) error {
IdleTimeout: 120 * time.Second,
}
// Адрес занимаем до автозапуска игрового сервера: если его не поднять
// (IP ещё не назначен, порт занят), лучше упасть сразу, чем оставить
// работающий сервер PZ без панели управления.
listener, err := net.Listen("tcp", cfg.Listen)
if err != nil {
return fmt.Errorf("не удалось занять адрес %s: %w", cfg.Listen, err)
}
fmt.Printf("pzmanager слушает http://%s\n", cfg.Listen)
if cfg.AutoStart {
if err := supervisor.Start(); err != nil {
supervisor.AppendLog("manager", "Автозапуск не удался: "+err.Error())
@@ -155,8 +165,7 @@ func serve(cfg *config.Config, users *auth.Store, secureCookies bool) error {
errCh := make(chan error, 1)
go func() {
fmt.Printf("pzmanager слушает http://%s\n", cfg.Listen)
if err := httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
if err := httpServer.Serve(listener); err != nil && !errors.Is(err, http.ErrServerClosed) {
errCh <- err
}
}()