Установка в /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:
+11
-2
@@ -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
|
||||
}
|
||||
}()
|
||||
|
||||
Reference in New Issue
Block a user