Перейти к содержанию

Выделенный сервер Project Zomboid в Docker-образе Danixu

Настройка выделенного сервера Project Zomboid в Docker-образе Danixu: переменные, сохранение данных, моды и ограничения описанной конфигурации.

Этот Dockerfile загружает выделенный сервер Project Zomboid через SteamCMD. По README, образ предназначен для развёртывания, в том числе через Kubernetes и Docker.

Готовый образ опубликован на Docker Hub.

Информация
В этом снимке README сказано, что Build 42 уже является стабильной веткой и образ по умолчанию запускает её. README также сообщает, что ветки unstable, на которую раньше ссылалась заметка, больше нет в Steam и её указание сейчас приводит к ошибке сборки: ERROR! Failed to set beta 'unstable'. Это заявление источника, а не независимая проверка текущих веток.

Автор приводит список веток на SteamDB.

Информация
README предупреждает: запуск образа в Windows через WSL2 в Docker Desktop заметно замедляет старт сервера. При большом количестве модов он, по оценке автора, может занимать 15–40 минут. В качестве обходного пути автор предлагает Linux-систему или виртуальную машину Linux. Это не результат нашего тестирования.

Переменные среды во время запуска

Образ передаёт некоторые переменные среды как аргументы серверной команды. Ниже — описание из README; оно относится именно к этому образу и может измениться.

ПеременнаяОписание из README
ADMINUSERNAMEИмя администратора; если не задано, используется admin.
ADMINPASSWORDЗадаёт или меняет пароль администратора. Обязательно при первом запуске, иначе запуск завершится ошибкой. После первого успешного запуска автор рекомендует удалить переменную: сервер записывает все аргументы в журнал открытым текстом. Не оставляйте секрет в логах и конфигурации дольше необходимого.
PASSWORDЗадаёт или меняет пароль сервера; необязательно.
RCONPASSWORDЗадаёт пароль RCON; используйте надёжный пароль.
PUBLICПоказывает сервер в игровом браузере при true и скрывает при false. Если не задано, сохраняется значение файла настроек; при первом запуске оно false.
DISPLAYNAMEЗадаёт или меняет имя сервера в браузере. Если не задано, значение сохраняется из файла настроек.
CACHEDIRПапка хранения данных. По умолчанию — Zomboid в домашнем каталоге (/home/steam/Zomboid). Источник рекомендует постоянный volume, чтобы сохранить состояние сервера.
COOPВместо выделенного запускает кооперативный сервер и отключает доступность администратора по умолчанию. По умолчанию выключено.
DEBUGВключает режим отладки сервера.
FORCEUPDATEПринудительно обновляет сервер при каждом запуске; если образ старый, это может занять много времени.
FORCESTEAMCLIENTSOUPDATEПринудительно обновляет библиотеки steamclient.so в pz-dedicated перед запуском. Может помочь при загрузке объектов Workshop; автор советует не включать, если всё работает.
IPIP интерфейса, на котором сервер будет слушать подключения; по умолчанию все интерфейсы.
MIN_MEMORYНачальный объём памяти JVM, например 2048m.
MAX_MEMORYМаксимальный лимит памяти JVM, например 4096m.
MEMORYОбъём памяти серверной JVM, например 8096m. Используется как запасное значение для минимума и максимума, если MIN_MEMORY и MAX_MEMORY не заданы.
MODFOLDERSПапки для загрузки игровых модов. Допустимы workshop, steam и mods; варианты разделяются запятыми, например workshop,steam,mods.
NOSTEAMЗапускает сервер в режиме NoSteam, чтобы к нему могли подключаться пользователи без Steam.
PORTПорт сервера; значение по умолчанию 16261.
UDPPORTВторой UDP-порт для прямых подключений (настройка UDPPort в INI сервера); значение по умолчанию 16262. Отдельного аргумента командной строки нет, поэтому значение записывается в INI.
SERVERNAMEИмя сервера, позволяющее иметь несколько наборов серверных данных. Смена имени создаёт новый набор: текущий прогресс временно не будет доступен, но не теряется; возврат прежнего имени снова загрузит его. README предупреждает не использовать пробелы и специальные символы, иначе пользователь администратора может работать некорректно.
SERVERPRESETСтандартный пресет нового сервера; если не задан, используется apocalypse. Допустимые значения: Apocalypse, Beginner, Builder, FirstWeek, SixMonthsLater, Survival, Survivor.
SERVERPRESETREPLACEЗаменяет пресет сервера значением SERVERPRESET. По умолчанию false, чтобы не заменять пользовательские настройки после первого запуска.
SOFTRESETREADME содержит одноимённый раздел, но прямо сообщает, что процедура сейчас не работает, вызывает аварийное завершение сервера и не выполняет описанные действия. Не использовать как рабочую процедуру; пояснение приведено ниже.
STEAMPORT1 и STEAMPORT2Два дополнительных порта, которые, по README, нужны Steam. Автор предполагает, что это UDP, но пишет, что возможен и TCP; тип не подтверждён.
STEAMVACВключает или отключает защиту SteamVac на сервере.
WORKSHOP_IDSСписок ID Workshop через точку с запятой. Пустое значение очистит существующий список.
MOD_IDSСписок ID модов через точку с запятой. README отмечает, что в Build 42 формат ID в INI изменился на \mod1;\mod2; каждый ID нужно предварять двумя обратными слешами, чтобы экранировать обратный слеш внутри INI. Пустое значение тоже очистит существующее; используйте SELF_MANAGED_MODS, чтобы сохранить уже записанные значения.
SELF_MANAGED_MODSПри значении 1 или true контейнер не меняет поля Mods и WorkshopItems в INI сервера. Подходит для внешнего управления, например через bind mounts или менеджер Workshop. Если значение не задано или false, entrypoint обновляет эти поля на основе MOD_IDS/WORKSHOP_IDS.
LANGЗадаёт локаль контейнера, которую сервер использует для языка. Например en_US.UTF-8 или es_ES.UTF-8. Доступны только локали, собранные в образе: базовый образ содержит en_US.UTF-8, а образ добавляет значения build-аргумента EXTRA_LOCALES. При запросе отсутствующей локали при запуске выводится предупреждение.

Для внешнего редактирования конфигурации автор приводит бесплатный открытый инструмент PZMM; его команда экспорта профиля:

PZ_HOME=./data pzmm server export <SERVERNAME>

После обнаружения модов контейнер устанавливает их при втором запуске сервера. Карты добавляются уже при том запуске, когда моды обнаружены, сразу после загрузки элементов Workshop.

Переменные среды во время сборки

Эти переменные используются во время сборки образа.

STEAMAPPBRANCH задаёт beta-ветку Project Zomboid для загрузки. Если значение не указано, используется стабильная публичная ветка — это рекомендуемый README вариант, если сейчас не открыта бета. Список веток автор предлагает смотреть на SteamDB.

По README, это работает только при использовании docker compose. При сборке через docker build аргумент нужно передать явно:

docker build --compress --no-cache --build-arg STEAMAPPBRANCH=<branch-name> .

Soft Reset: раздел источника не является рабочей инструкцией

Информация
README перечисляет предполагаемые последствия Soft Reset (очистка предметов на земле и в контейнерах с появлением новой добычи, удаление трупов и реанимированных игроков, сброс зомби, крови и сигнализаций, а также сброс игровых часов) и указывает исторический список файлов данных zombie_X_Y.bin, map_t.bin, map_meta.bin и reanimated.bin. Это не готовая команда или подтверждённый перечень файлов для современных версий. Сам автор помечает список файлов как TODO для поиска эквивалентов в современных версиях, выражает неуверенность насчёт сброса времени и прямо сообщает: процедура сейчас работает некорректно, вызывает аварийное завершение, перечисленные эффекты не выполняются и состояние сервера не меняется. Поэтому шаги удаления файлов или включения SOFTRESET здесь не предлагаются как способ сброса.

Порты, указанные в README

Для списка обязательных портов README ссылается на официальную вики Project Zomboid.

Информация
Автор прямо предупреждает, что следующий список предварительный и может измениться. Значения ниже сохранены как цитируемое содержимое README, но не подтверждены здесь по текущей официальной документации. Перед настройкой брандмауэра или NAT проверьте официальные требования для вашей версии и типа клиента. Примеры диапазонов в самом README также противоречат пояснению о следующем порте и количеству из 50 портов; не используйте их без отдельной проверки.

Порты для клиентов Steam по README

  • 8766 UDP
  • 8767 UDP
  • 16261 UDP (можно изменить)

Порты для клиентов без Steam по README

  • 8766 UDP
  • 8767 UDP
  • 16261 UDP (можно изменить)
  • 16262–16272 TCP (диапазон зависит от указанного выше порта и числа клиентских слотов)

Примечания автора к портам

  • Порт 16261 можно изменить переменной PORT. По README, это сдвигает диапазон TCP на следующий порт; пример автора: при PORT=12234 диапазон TCP будет 12234–12244.
  • Диапазон TCP используется клиентами, поэтому для каждого слота нужен отдельный порт. Например, серверу на 50 игроков, по расчёту README, нужно открыть 50 портов в firewall/NAT — 16262–16312.
  • Вики указывает, что порты для No Steam предназначены клиентам без Steam, однако автор сообщает, что использует Steam-клиент и у него эти порты тоже задействованы. Это наблюдение автора, не проверенное нами.

Запуск образа

Для настройки сервера README предлагает программу docker-compose:

  1. Скопируйте .env.template в .env и задайте нужные настройки. Единственная обязательная переменная — ADMINPASSWORD, причём только при первом запуске сервера; после как минимум одного успешного запуска её можно удалить. Остальные переменные необязательны.
  2. Запустите сервер командой ниже. Команда сохранена как текст README и здесь не выполнялась:

docker-compose up -d

Папка scripts

В папке scripts находятся три скрипта:

  • entry.sh — скрипт образа, запускающий сервер;
  • search_folder.sh — ищет карты в папках модов;
  • get_updates.sh — ищет новую версию на форуме и сайте, чтобы загрузить и собрать последнюю стабильную или unstable-версию. Будет создан локальный образ и предпринята попытка загрузить его на Docker Hub, но без разрешений она завершится неудачей.

Кроме новых версий Project Zomboid, плановый workflow пересобирает образ, если Dockerfile или скопированные в образ скрипты изменились после публикации текущего образа. По README, исправление попадает на Docker Hub не позднее чем через шесть часов без ручного запуска.

Чтобы не ждать, можно вручную запустить workflow Docker Image CI с флажком force_build либо запустить скрипт с FORCE_BUILD=true. Это команды из README; они не выполнялись:

FORCE_BUILD=true ./scripts/get_updates.sh

Уже опубликованная версия не перезаписывается. Повторная сборка публикует новую ревизию версии (например, 42.20.4-release-2, затем -3 и далее) и перемещает latest и latest-release на неё; закреплённый тег версии продолжает указывать на прежний образ.