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

PZ Manager

License: MIT Go Platform last commit

Веб-панель для управления выделенным сервером 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, а остановка идёт по цепочке quitSIGTERMSIGKILL для всей группы процессов.

Сам менеджер живёт под systemd, который его и перезапускает.

systemd ──> pzmanager ──> start-server.sh ──> java (GameServer)
                │
                ├── HTTP + SSE ──> браузер
                └── SteamCMD, бэкапы, конфиги

Быстрый старт

Собрать бинарник (нужен Go 1.24+):

make build-linux

Скопировать pzmanager и папку deploy/ на сервер и запустить установщик:

sudo ./deploy/install.sh

Установщик заведёт пользователя pzserver, поставит зависимости (SteamCMD, JRE, SDL2), положит бинарник в /usr/local/bin и включит systemd-юнит.

Дальше:

  1. Посмотрите код первичной настройки:

    journalctl -u pzmanager -n 30 --no-pager
    
  2. Откройте панель. По умолчанию она слушает только 127.0.0.1:8080, так что зайти на неё можно через SSH-туннель:

    ssh -L 8080:127.0.0.1:8080 пользователь@сервер
    

    Затем откройте http://127.0.0.1:8080 и создайте администратора, введя код из журнала.

  3. Во вкладке «Обзор» нажмите Установить / обновить через SteamCMD и дождитесь окончания — прогресс виден во вкладке «Консоль».

  4. Запустите сервер. При первом запуске PZ создаст ~/Zomboid/Server/*.ini — после этого станут доступны вкладки «Конфиг сервера», «Песочница» и «Моды».

Не забудьте открыть игровые порты:

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):

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 юнита).

Команды

pzmanager serve                  # запустить панель (команда по умолчанию)
pzmanager useradd <логин>        # создать пользователя панели
pzmanager passwd <логин>         # сменить пароль
pzmanager users                  # список пользователей

Флаги: --config <путь>, --listen <адрес>, --secure-cookies.

Конфигурация

Файл ~/.config/pzmanager/config.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.

Разработка

make test     # тесты
make vet      # go vet
make run      # локальный запуск с конфигом в ./dev

Веб-интерфейс — обычные HTML, CSS и JS в web/static, без сборщика; при go build они вшиваются в бинарник через embed.

Лицензия

MIT — делайте с кодом что угодно, но без каких-либо гарантий.

S
Description
No description provided
Readme MIT
1.1 MiB
v0.9.2
Latest
2026-09-07 14:57:17 +00:00
Languages
Go 60.5%
JavaScript 27.2%
Shell 5.7%
HTML 3.2%
CSS 3.2%
Other 0.2%