# 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 пользователь@сервер ``` Затем откройте и создайте администратора, введя код из журнала. 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`.