Веб-панель управления сервером Project Zomboid
Менеджер запускает сервер PZ как дочерний процесс и держит его stdin/stdout: отсюда живая консоль без RCON, стриминг логов через SSE и корректная остановка по цепочке quit -> SIGTERM -> SIGKILL для всей группы процессов. Сам менеджер работает под systemd. Что входит: - управление жизненным циклом сервера, автозапуск и автоподъём после падения; - метрики процесса из /proc и состояние хоста, список игроков онлайн; - редакторы servertest.ini и SandboxVars.lua, сохраняющие исходное форматирование файлов; - моды: списки Workshop ID и Mod ID с порядком загрузки, названия из Steam; - бэкапы мира по расписанию и вручную, с ротацией и восстановлением; - установка и обновление сервера через SteamCMD; - вход по логину и паролю, первичная настройка по одноразовому коду. Веб-интерфейс без сборщика, вшит в бинарник через embed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
// Package sysinfo снимает метрики хоста и группы процессов игрового сервера.
|
||||
package sysinfo
|
||||
|
||||
import "sync"
|
||||
|
||||
// ProcStats — потребление ресурсов одной группой процессов.
|
||||
type ProcStats struct {
|
||||
// CPUPercent — доля CPU за интервал между двумя снимками; 100% = одно ядро.
|
||||
CPUPercent float64 `json:"cpu_percent"`
|
||||
// RSSBytes — резидентная память всех процессов группы.
|
||||
RSSBytes int64 `json:"rss_bytes"`
|
||||
// Threads — суммарное число потоков.
|
||||
Threads int `json:"threads"`
|
||||
}
|
||||
|
||||
// HostStats — общее состояние машины.
|
||||
type HostStats struct {
|
||||
MemTotalBytes int64 `json:"mem_total_bytes"`
|
||||
MemAvailableBytes int64 `json:"mem_available_bytes"`
|
||||
Load1 float64 `json:"load1"`
|
||||
CPUCount int `json:"cpu_count"`
|
||||
DiskTotalBytes int64 `json:"disk_total_bytes"`
|
||||
DiskFreeBytes int64 `json:"disk_free_bytes"`
|
||||
}
|
||||
|
||||
// Sampler считает CPU по разнице между вызовами, поэтому хранит прошлый снимок.
|
||||
type Sampler struct {
|
||||
mu sync.Mutex
|
||||
lastCPU float64 // накопленное CPU-время группы, секунды
|
||||
lastWall float64 // момент снятия, секунды монотонных часов
|
||||
}
|
||||
|
||||
// NewSampler создаёт счётчик метрик для одной группы процессов.
|
||||
func NewSampler() *Sampler { return &Sampler{} }
|
||||
|
||||
// Reset забывает предыдущий снимок — вызывается при перезапуске сервера,
|
||||
// иначе первый замер нового процесса посчитается от чужой базы.
|
||||
func (s *Sampler) Reset() {
|
||||
s.mu.Lock()
|
||||
s.lastCPU, s.lastWall = 0, 0
|
||||
s.mu.Unlock()
|
||||
}
|
||||
Reference in New Issue
Block a user