Менеджер запускает сервер 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>
200 lines
10 KiB
Markdown
200 lines
10 KiB
Markdown
# 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`.
|