Выделенный сервер Project Zomboid в Docker-образе Danixu
Этот Dockerfile загружает выделенный сервер Project Zomboid через SteamCMD. По README, образ предназначен для развёртывания, в том числе через Kubernetes и Docker.
Готовый образ опубликован на Docker Hub.
Автор приводит список веток на SteamDB.
Переменные среды во время запуска
Образ передаёт некоторые переменные среды как аргументы серверной команды. Ниже — описание из 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; автор советует не включать, если всё работает. |
| IP | IP интерфейса, на котором сервер будет слушать подключения; по умолчанию все интерфейсы. |
| 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, чтобы не заменять пользовательские настройки после первого запуска. |
| SOFTRESET | README содержит одноимённый раздел, но прямо сообщает, что процедура сейчас не работает, вызывает аварийное завершение сервера и не выполняет описанные действия. Не использовать как рабочую процедуру; пояснение приведено ниже. |
| 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
Для списка обязательных портов README ссылается на официальную вики Project Zomboid.
Порты для клиентов 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:
- Скопируйте .env.template в .env и задайте нужные настройки. Единственная обязательная переменная — ADMINPASSWORD, причём только при первом запуске сервера; после как минимум одного успешного запуска её можно удалить. Остальные переменные необязательны.
- Запустите сервер командой ниже. Команда сохранена как текст 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 на неё; закреплённый тег версии продолжает указывать на прежний образ.