Files
pzmanager/README.md
T
mrleo1nidandClaude Opus 5 fe517cfb71 Мод-менеджер с галочками и коллекции мастерской
Вместо двух отдельных списков (Workshop ID и Mod ID) — один список модов:
галочка включает мод, перетаскивание задаёт порядок загрузки, кнопка
убирает пакет вместе со всеми его модами.

Чтобы галочкам было за что зацепиться, панель читает mod.info уже
скачанных модов: серверу в Mods нужен именно Mod ID, а он лежит внутри
пакета мастерской и вручную его приходилось искать в описании мода. Пока
мод не скачан, строка помечена и галочка недоступна — Mod ID неизвестен.

Один пакет мастерской может содержать несколько модов; теперь они видны
отдельными строками и включаются по отдельности.

Коллекции: кнопка разворачивает коллекцию Steam в список входящих в неё
модов, сохраняя порядок со страницы коллекции. И мод, и коллекция
принимаются как ссылкой, так и голым идентификатором.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 00:36:06 +03:00

278 lines
16 KiB
Markdown

# PZ Manager
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![Go](https://img.shields.io/badge/Go-1.24%2B-00ADD8?logo=go&logoColor=white)](https://go.dev/)
[![Platform](https://img.shields.io/badge/platform-Linux%20%2F%20Ubuntu-EEEEEE?logo=ubuntu&logoColor=white&labelColor=555555)](https://ubuntu.com/)
[![last commit](https://img.shields.io/gitea/last-commit/mrleo1nid/pzmanager?gitea_url=https%3A%2F%2Fgitea.hsrv.site&logo=gitea&logoColor=white)](https://gitea.hsrv.site/mrleo1nid/pzmanager/commits/branch/main)
Веб-панель для управления выделенным сервером Project Zomboid на Ubuntu.
Один бинарник без зависимостей: веб-интерфейс вшит внутрь, Node.js и Python на
сервере не нужны.
## Что умеет
- **Профили серверов** — несколько независимых сборок (свой мир, конфиг,
песочница, моды и лимит памяти) с переключением одной кнопкой.
- **Управление сервером** — запуск, остановка (через команду `quit`, мир
сохраняется), перезапуск, автоподъём после падения, автозапуск вместе с
менеджером.
- **Живая консоль** — вывод сервера в реальном времени и отправка любых команд
(`players`, `save`, `servermsg`, `kickuser`, …).
- **Мониторинг** — состояние, аптайм, CPU и память процесса сервера, свободные
ОЗУ и диск на хосте, список игроков онлайн.
- **Редактор конфигов** — `servertest.ini` и `SandboxVars.lua` прямо в
браузере, с поиском по параметрам и сохранением комментариев в файле.
- **Мод-менеджер** — моды списком с галочками и перетаскиванием порядка
загрузки, добавление по ссылке и разворачивание коллекций 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
```
## Моды
Project Zomboid хранит моды в двух строках конфига: `WorkshopItems` — что
скачать из мастерской, `Mods` — что включить и в каком порядке. Панель
показывает их одним списком, где каждая строка — мод:
- **галочка** включает мод (добавляет его Mod ID в `Mods`);
- **перетаскивание** (или стрелки) задаёт порядок загрузки — для модов,
которые переопределяют одни и те же файлы, он решает, чья версия победит;
- **«Убрать»** выбрасывает пакет из `WorkshopItems` вместе со всеми его модами.
Добавить мод можно ссылкой на страницу мастерской или голым ID. Кнопка
**«Добавить коллекцию»** разворачивает коллекцию в список входящих в неё модов
— порядок берётся тот же, что на странице коллекции.
Mod ID, который нужен серверу, лежит внутри самого мода (`mod.info`), поэтому
панель читает уже скачанные моды с диска:
```
<server_dir>/steamapps/workshop/content/108600/<workshop id>/mods/<мод>/mod.info
~/Zomboid/mods/<мод>/mod.info # моды, положенные вручную
```
Пока сервер не скачал мод, его строка помечена «ещё не скачан» и галочка
недоступна: Mod ID неизвестен. Файлы загружает сам сервер при запуске по
списку `WorkshopItems` — то есть достаточно добавить моды, сохранить и
запустить сервер, после чего они станут доступны для включения.
Один пакет мастерской может содержать несколько модов — в списке они идут
отдельными строками, и включать их можно по отдельности.
## Профили серверов
Профиль — это отдельный сервер: свой мир, свой `*.ini`, свои настройки
песочницы, свой список модов и свой лимит памяти. Project Zomboid различает их
по параметру `-servername`, поэтому профили не мешают друг другу:
```
~/Zomboid/Server/vanilla.ini ~/Zomboid/Saves/Multiplayer/vanilla/
~/Zomboid/Server/vanilla_SandboxVars.lua
~/Zomboid/Server/modded.ini ~/Zomboid/Saves/Multiplayer/modded/
~/Zomboid/Server/modded_SandboxVars.lua
```
Работает всегда один профиль — активный: серверные файлы, игровые порты и файл
запуска JVM общие. Переключить профиль можно на остановленном сервере, выбрав
его в шапке панели или на вкладке «Профили»; после этого все вкладки —
конфиг, песочница, моды, бэкапы — относятся уже к нему.
При создании профиля можно скопировать `.ini` и настройки песочницы из
существующего: удобно, когда нужен тот же набор правил, но чистый мир.
Удаление профиля убирает его только из панели — мир и конфиги остаются на
диске. Чтобы вернуть профиль, создайте его с тем же идентификатором.
Обновление с версии, где сервер был один, проходит само: старые поля
`server_name`, `admin_password` и `java_memory` превращаются в первый профиль
при первом запуске.
## Доступ снаружи
Панель управляет сервером, поэтому наружу её лучше не выставлять голой. Два
разумных варианта:
**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 или скачать
profiles: # серверы: у каждого свой мир и настройки
- id: vanilla # vanilla -> vanilla.ini, Saves/Multiplayer/vanilla
title: Ванильный мир # как профиль подписан в панели
admin_password: "" # пароль админа игрового сервера
java_memory: 4g # -Xmx для JVM этого профиля
extra_args: [] # доп. аргументы start-server.sh
- id: modded
title: Сборка с модами
java_memory: 8g
active_profile: vanilla # какой профиль запускается и настраивается
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`; остальные —
при следующем запуске игрового сервера.
## Бэкапы
В архив попадают мир активного профиля и его серверные конфиги. Имя файла —
`pz-профиль-ГГГГММДД-ЧЧММСС[-пометка].tar.gz`, так что архивы разных сборок не
путаются, а ротация (`backup.keep`) считается по каждому профилю отдельно.
Архивы, снятые до появления профилей, панель тоже читает и восстанавливает.
Бэкап на живом сервере технически корректен, но снимок может отставать от
состояния мира в памяти. Если хочется гарантированной согласованности —
включите `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`.
## Лицензия
[MIT](LICENSE) — делайте с кодом что угодно, но без каких-либо гарантий.