# 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` прямо в браузере, с поиском по параметрам и сохранением комментариев в файле. - **Моды** — списки 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 пользователь@сервер ``` Затем откройте и создайте администратора, введя код из журнала. 3. Во вкладке «Обзор» нажмите **Установить / обновить через SteamCMD** и дождитесь окончания — прогресс виден во вкладке «Консоль». 4. Запустите сервер. При первом запуске PZ создаст `~/Zomboid/Server/*.ini` — после этого станут доступны вкладки «Конфиг сервера», «Песочница» и «Моды». Не забудьте открыть игровые порты: ```bash sudo ufw allow 16261/udp sudo ufw allow 16262/udp ``` ## Профили серверов Профиль — это отдельный сервер: свой мир, свой `*.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) — делайте с кодом что угодно, но без каких-либо гарантий.