Веб-панель управления сервером 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,199 @@
|
||||
# PZ Manager
|
||||
|
||||
Веб-панель для управления выделенным сервером Project Zomboid на Ubuntu.
|
||||
Один бинарник без зависимостей: веб-интерфейс вшит внутрь, Node.js и Python на
|
||||
сервере не нужны.
|
||||
|
||||
## Что умеет
|
||||
|
||||
- **Управление сервером** — запуск, остановка (через команду `quit`, мир
|
||||
сохраняется), перезапуск, автоподъём после падения, автозапуск вместе с
|
||||
менеджером.
|
||||
- **Живая консоль** — вывод сервера в реальном времени и отправка любых команд
|
||||
(`players`, `save`, `servermsg`, `kickuser`, …).
|
||||
- **Мониторинг** — состояние, аптайм, CPU и память процесса сервера, свободные
|
||||
ОЗУ и диск на хосте, список игроков онлайн.
|
||||
- **Редактор конфигов** — `servertest.ini` и `SandboxVars.lua` прямо в
|
||||
браузере, с поиском по параметрам и сохранением комментариев в файле.
|
||||
- **Моды** — списки Workshop ID и Mod ID с порядком загрузки, названия модов
|
||||
подтягиваются из мастерской Steam.
|
||||
- **Бэкапы** — ручные и по расписанию, с ротацией, скачиванием и
|
||||
восстановлением (перед восстановлением автоматически снимается страховочная
|
||||
копия).
|
||||
- **Установка и обновление** сервера через SteamCMD прямо из панели.
|
||||
|
||||
## Как это устроено
|
||||
|
||||
Менеджер запускает `start-server.sh` как дочерний процесс и держит его stdin,
|
||||
stdout и stderr. Отсюда следует всё остальное: команды консоли пишутся прямо в
|
||||
stdin (RCON не нужен), логи стримятся в браузер через SSE, а остановка идёт по
|
||||
цепочке `quit` → `SIGTERM` → `SIGKILL` для всей группы процессов.
|
||||
|
||||
Сам менеджер живёт под systemd, который его и перезапускает.
|
||||
|
||||
```
|
||||
systemd ──> pzmanager ──> start-server.sh ──> java (GameServer)
|
||||
│
|
||||
├── HTTP + SSE ──> браузер
|
||||
└── SteamCMD, бэкапы, конфиги
|
||||
```
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
Собрать бинарник (нужен Go 1.24+):
|
||||
|
||||
```bash
|
||||
make build-linux
|
||||
```
|
||||
|
||||
Скопировать `pzmanager` и папку `deploy/` на сервер и запустить установщик:
|
||||
|
||||
```bash
|
||||
sudo ./deploy/install.sh
|
||||
```
|
||||
|
||||
Установщик заведёт пользователя `pzserver`, поставит зависимости (SteamCMD,
|
||||
JRE, SDL2), положит бинарник в `/usr/local/bin` и включит systemd-юнит.
|
||||
|
||||
Дальше:
|
||||
|
||||
1. Посмотрите код первичной настройки:
|
||||
|
||||
```bash
|
||||
journalctl -u pzmanager -n 30 --no-pager
|
||||
```
|
||||
|
||||
2. Откройте панель. По умолчанию она слушает только `127.0.0.1:8080`, так что
|
||||
зайти на неё можно через SSH-туннель:
|
||||
|
||||
```bash
|
||||
ssh -L 8080:127.0.0.1:8080 пользователь@сервер
|
||||
```
|
||||
|
||||
Затем откройте <http://127.0.0.1:8080> и создайте администратора, введя код
|
||||
из журнала.
|
||||
|
||||
3. Во вкладке «Обзор» нажмите **Установить / обновить через SteamCMD** и
|
||||
дождитесь окончания — прогресс виден во вкладке «Консоль».
|
||||
|
||||
4. Запустите сервер. При первом запуске PZ создаст `~/Zomboid/Server/*.ini` —
|
||||
после этого станут доступны вкладки «Конфиг сервера», «Песочница» и «Моды».
|
||||
|
||||
Не забудьте открыть игровые порты:
|
||||
|
||||
```bash
|
||||
sudo ufw allow 16261/udp
|
||||
sudo ufw allow 16262/udp
|
||||
```
|
||||
|
||||
## Доступ снаружи
|
||||
|
||||
Панель управляет сервером, поэтому наружу её лучше не выставлять голой. Два
|
||||
разумных варианта:
|
||||
|
||||
**SSH-туннель (по умолчанию)** — ничего настраивать не нужно, панель слушает
|
||||
только localhost.
|
||||
|
||||
**HTTPS через reverse-proxy** — если панель нужна с телефона. Настройте nginx с
|
||||
сертификатом (например, от Let's Encrypt):
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name pz.example.com;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/pz.example.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/pz.example.com/privkey.pem;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# Живая консоль работает через Server-Sent Events.
|
||||
proxy_buffering off;
|
||||
proxy_read_timeout 24h;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
И запустите менеджер с флагом `--secure-cookies`, чтобы cookie сессии
|
||||
передавалась только по HTTPS (добавьте флаг в `ExecStart` юнита).
|
||||
|
||||
## Команды
|
||||
|
||||
```bash
|
||||
pzmanager serve # запустить панель (команда по умолчанию)
|
||||
pzmanager useradd <логин> # создать пользователя панели
|
||||
pzmanager passwd <логин> # сменить пароль
|
||||
pzmanager users # список пользователей
|
||||
```
|
||||
|
||||
Флаги: `--config <путь>`, `--listen <адрес>`, `--secure-cookies`.
|
||||
|
||||
## Конфигурация
|
||||
|
||||
Файл `~/.config/pzmanager/config.yaml` создаётся при первом запуске. Всё, что в
|
||||
нём есть, правится и через вкладку «Настройки».
|
||||
|
||||
```yaml
|
||||
listen: 127.0.0.1:8080 # адрес веб-панели
|
||||
data_dir: /home/pzserver/.local/share/pzmanager
|
||||
server_dir: /home/pzserver/pzserver # куда SteamCMD ставит сервер
|
||||
zomboid_dir: /home/pzserver/Zomboid # миры, конфиги и логи игры
|
||||
steamcmd_path: "" # пусто — найти в PATH или скачать
|
||||
server_name: servertest # servertest -> servertest.ini
|
||||
admin_password: "" # пароль админа игрового сервера
|
||||
java_memory: 4g # -Xmx для JVM
|
||||
extra_args: [] # доп. аргументы start-server.sh
|
||||
autostart: false # поднимать сервер вместе с менеджером
|
||||
autorestart: true # поднимать сервер после падения
|
||||
stop_timeout: 1m30s # сколько ждать после quit до SIGTERM
|
||||
log_buffer_lines: 5000 # строк консоли в памяти
|
||||
backup:
|
||||
dir: /home/pzserver/pzbackups
|
||||
schedule: 6h # 0 — отключить автобэкапы
|
||||
keep: 20 # сколько архивов хранить
|
||||
stop_server: false # останавливать сервер на время бэкапа
|
||||
```
|
||||
|
||||
Изменения `listen` применяются после `systemctl restart pzmanager`; остальные —
|
||||
при следующем запуске игрового сервера.
|
||||
|
||||
## Бэкапы
|
||||
|
||||
В архив попадают `~/Zomboid/Saves` и `~/Zomboid/Server` (миры и конфиги). Имя
|
||||
файла — `pz-ГГГГММДД-ЧЧММСС[-пометка].tar.gz`.
|
||||
|
||||
Бэкап на живом сервере технически корректен, но снимок может отставать от
|
||||
состояния мира в памяти. Если хочется гарантированной согласованности —
|
||||
включите `backup.stop_server` (игроков на время бэкапа выкинет) или отправляйте
|
||||
`save` в консоль перед ручным бэкапом.
|
||||
|
||||
Восстановление требует остановленного сервера. Перед распаковкой менеджер сам
|
||||
делает страховочную копию с пометкой `pre-restore`.
|
||||
|
||||
## Безопасность
|
||||
|
||||
- Пароли пользователей панели хранятся в виде bcrypt-хешей в
|
||||
`data_dir/users.json` (права 0600).
|
||||
- Сессии живут только в памяти: перезапуск менеджера разлогинивает всех.
|
||||
- Первого администратора можно создать только с одноразовым кодом из журнала.
|
||||
- Изменяющие запросы требуют собственный заголовок — это защита от CSRF.
|
||||
- Панель не выполняет произвольные команды хоста: всё, что она умеет, — это
|
||||
управление процессом сервера, SteamCMD и файлами в своих директориях.
|
||||
|
||||
Тем не менее доступ к панели равносилен доступу к игровому серверу, так что
|
||||
пароль стоит выбрать не короче того, что вы поставили бы на SSH.
|
||||
|
||||
## Разработка
|
||||
|
||||
```bash
|
||||
make test # тесты
|
||||
make vet # go vet
|
||||
make run # локальный запуск с конфигом в ./dev
|
||||
```
|
||||
|
||||
Веб-интерфейс — обычные HTML, CSS и JS в `web/static`, без сборщика; при
|
||||
`go build` они вшиваются в бинарник через `embed`.
|
||||
Reference in New Issue
Block a user