RE:NODE

Эксплуатация11 мин чтения

Параметры запуска игрового сервера: разбор по играм

Что делают флаги запуска игрового сервера: стили -flag, +convar и ?option, переменные запуска в панели и реальные командные строки для Source, Unity, Unreal и Java.

0 прочтений

Параметры запуска - это аргументы командной строки, которой запускается игровой сервер: какой мир загрузить, на каком порту слушать, сколько памяти использовать, какие моды загрузить и куда писать логи. Некоторые игры настраиваются почти целиком так (у Valheim вообще нет конфиг-файла), другие используют командную строку только для самого необходимого, а всё остальное держат в конфиг-файле, и синтаксис зависит от движка: -flag value у игр на Unity и игр Bohemia, +convar value у Source и Rust, ?Option=Value у Unreal, --option у Factorio. В панели вы редко набираете строку сами: она собирается из шаблона и переменных на вкладке Startup. Понимание того, во что превращается шаблон и какие флаги важны для вашей игры, - это то, что позволяет починить сервер, который не запускается или делает не то, что написано в его настройках.

В этой статье - синтаксисы, как переменные запуска в панели превращаются в командную строку, реальные строки запуска для распространённых игр, что побеждает, когда флаг и конфиг-файл расходятся, и ошибки, из-за которых случается большинство сбоев при запуске.

Параметры запуска и конфиг-файлы#

У каждого игрового сервера есть два места, где могут жить настройки, и полезно знать, что игра держит в каждом из них.

  • Командная строка читается один раз, при старте процесса. Обычно в ней то, что нужно серверу до того, как он сможет прочитать что-либо ещё: порт, мир или сохранение для загрузки, путь к конфиг-файлу, объём памяти, список модов.
  • Конфиг-файлы читаются после запуска, часто повторно при смене карты или по команде перезагрузки. В них длинный список игровых настроек.

Это разделение в разных играх разное. Valheim помещает всё в командную строку. Minecraft не помещает туда почти ничего, кроме памяти и jar, а остальное держит в server.properties. Игры на Source принимают почти любую консольную переменную и так, и так. DayZ и Arma 3 берут из командной строки путь к конфиг-файлу, порт и список модов, а всё остальное - из .cfg. Прежде чем менять настройку, выясните, где игра её ожидает: значение не в том месте - это не ошибка, оно просто молча игнорируется.

Четыре синтаксиса#

СтильПримерКто использует
-flag value или -flag=value-port=2302, -batchmodeUnity, Bohemia (Arma, DayZ), опции Java, Valheim
+command value+map de_inferno, +server.port 28015Движок Source, Rust, FiveM
?Option=ValueTheIsland?listen?MaxPlayers=20URL карт Unreal Engine
--long-option value--start-server saves/world.zipFactorio и другие обычные программы Linux

Префикс + в Source и Rust имеет конкретный смысл: он выполняет консольную команду или задаёт консольную переменную при запуске, точно так же, как если бы её ввели в консоль сервера. Опция с - - это параметр запуска, который движок читает до того, как появится консоль. Так что в игре на Source -port 27015 задаёт сетевой порт во время старта движка, а +map de_dust2 - это консольная команда map de_dust2, которая выполняется, когда движок готов. Неверный префикс - частая причина того, что параметр ничего не делает.

Опции Unreal с ? дописываются к первому аргументу, карте, без пробелов: MapName?listen?Port=7777. Отдельные флаги -Option=Value идут после пробела. Многие игры на Unreal принимают некоторые настройки в обоих местах, а документируют только одно.

Как панель собирает командную строку#

В панели на базе Pterodactyl каждая игра описана egg, в котором есть шаблон запуска. В шаблоне используются заполнители в двойных фигурных скобках, и панель заполняет их переменными с вкладки Startup и значениями, которые система задаёт сама.

A Paper egg's startup template, simplified
java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}} nogui

При запуске сервера {{SERVER_JARFILE}} становится тем, что указано на вкладке Startup, скажем server.jar, а остальное заполняется из собственных переменных окружения системы:

ПеременнаяОткуда берётсяЗначение
SERVER_MEMORYЛимит памяти тарифаВ мегабайтах
SERVER_PORTОсновное выделение портаПорт, на котором должна слушать игра
SERVER_IPАдрес основного выделенияВнутри контейнера часто 0.0.0.0
Переменные eggВкладка StartupВсё, что определяет egg: имя мира, ветка, пароль

Авторы egg решают, какие переменные пользователь может видеть и какие может менять. Переменную, которая видна, но не редактируется, - обычный пример это порт - задаёт хостер, потому что её изменение сломало бы сопоставление между контейнером и внешним миром. Дополнительные порты, добавленные на вкладке Network, автоматически не используются: игра слушает их, только если ей об этом говорит переменная, флаг или конфиг-файл, поэтому только что добавленному порту query или RCON часто нужна ещё одна настройка. Какие порты нужны каждой игре, описано в статье порты игровых серверов простыми словами.

На RE:NODE на вкладке Startup хранятся игровые переменные и переменные окружения сервера, а пароли вроде админского и пароля RCON генерируются для каждого сервера при его создании. Как в целом устроены egg, рассказано в статье панель Pterodactyl простыми словами.

Строки запуска по движкам#

Java: Minecraft и прокси

bash
$ java -Xms4G -Xmx4G -XX:+UseG1GC -jar paper.jar --nogui

Всё до -jar - опции виртуальной машины Java: размер heap, сборщик мусора, системные свойства. Всё после имени jar - аргументы для самого сервера. Опция JVM после jar или аргумент сервера перед ним игнорируются или отклоняются. nogui и --nogui оба отключают старое окно сервера; на headless-хосте его всё равно негде показывать. Размер heap и флаги сборщика - отдельная тема, описанная в статье флаги JVM и версии Java для Minecraft.

Unity: Valheim, Rust, 7 Days to Die, Unturned

Почти каждый сервер на Unity запускается с -batchmode (без интерактивного окна и ввода) и -nographics (вообще без графического устройства), плюс -logFile <path>, чтобы задать, куда идёт вывод. Затем следуют собственные опции игры:

bash
$ ./valheim_server.x86_64 -nographics -batchmode -name "Longship Crew" \    -port 2456 -world "Midgard" -password "herring-barrel-42" -crossplay$ ./RustDedicated -batchmode -logfile rust.log +server.port 28015 \    +server.level "Procedural Map" +server.seed 1234 +server.worldsize 4000 \    +server.maxplayers 100 +server.hostname "Example Rust" \    +server.identity "main" +rcon.port 28016 +rcon.password "change-me" +rcon.web 1$ ./7DaysToDieServer.x86_64 -logfile output_log.txt -quit -batchmode \    -nographics -configfile=serverconfig.xml -dedicated$ ./ServerHelper.sh +InternetServer/MyServer

Rust показывает соглашение с + в стиле Source на движке Unity: каждый аргумент +server. и +rcon. - консольная переменная. +InternetServer/MyServer в Unturned задаёт папку сервера внутри Servers/, где его собственный Commands.dat хранит всё остальное. Полная таблица флагов Valheim есть в руководстве по выделенному серверу Valheim.

Unreal Engine: Palworld, The Isle, Abiotic Factor, Satisfactory

bash
$ ./PalServer.sh -port=8211 -players=32 -useperfthreads \    -NoAsyncLoadingThread -UseMultithreadForDS

Palworld документирует три флага потоков как улучшающие производительность на многоядерных машинах, -port и -players - очевидные, а -publiclobby - переключатель, который показывает сервер в списке как сервер сообщества. Большинство игровых настроек Palworld - вовсе не флаги, они живут в PalWorldSettings.ini. Другие серверы на Unreal устроены так же: URL карты с опциями через ?, затем -Port=, -QueryPort=, -log и флаги конкретной игры. Последнее слово за документацией каждой игры, потому что у двух игр на Unreal редко бывает что-то общее, кроме флагов самого движка.

Движок Source: CS2, TF2, Garry's Mod, CS 1.6

bash
$ ./cs2 -dedicated -port 27015 +map de_inferno +game_type 0 +game_mode 1 \    +sv_setsteamaccount <GSLT>$ ./srcds_run -game tf -console -port 27015 +map ctf_2fort \    +maxplayers 24 +sv_setsteamaccount <GSLT>$ ./srcds_run -game garrysmod -console -port 27015 +maxplayers 32 \    +gamemode sandbox +map gm_construct +host_workshop_collection <id>

-game задаёт папку игры (tf, garrysmod, cstrike). -console даёт текстовую консоль. +game_type и +game_mode вместе выбирают режим CS2: 0 и 1 - соревновательный, 0 и 0 - обычный, 1 и 2 - deathmatch. -tickrate, знакомый по руководствам для CS:GO и Counter-Strike: Source, в CS2 ничего не делает: там сервер работает на фиксированных 64 тиках с sub-tick вводом. Особенности CS2 описаны в статье команды и cvars сервера CS2.

Bohemia: Arma 3 и DayZ

bash
$ ./arma3server_x64 -port=2302 -config=server.cfg -cfg=basic.cfg \    -profiles=profiles -name=server -mod="@CBA_A3;@ace" -serverMod="@admintools"$ ./DayZServer -config=serverDZ.cfg -port=2302 -profiles=profiles \    -mod="@CF;@Community-Online-Tools" -dologs -adminlog -netlog -freezecheck

Список модов разделяется точкой с запятой, и порядок важен: сначала зависимости. -serverMod загружает моды, которые нужны серверу, но не клиентам. -profiles определяет, куда идут логи и файл RPT. Одна-единственная отсутствующая папка @, указанная в -mod, останавливает сервер, так что этот параметр - первый подозреваемый, когда сервер Bohemia падает после изменения модов.

Всё остальное

bash
# Factorio$ ./bin/x64/factorio --start-server saves/world.zip \    --server-settings data/server-settings.json --port 34197# Terraria$ ./TerrariaServer -config serverconfig.txt -port 7777# Project Zomboid$ ./start-server.sh -servername main -adminpassword "change-me"# FiveM$ ./run.sh +exec server.cfg +set onesync on

Память Project Zomboid задаётся не в командной строке, а значением -Xmx внутри ProjectZomboid64.json, который читает скрипт запуска. +exec server.cfg в FiveM выполняет конфиг-файл как консольные команды, поэтому server.cfg написан как список команд, а не пар ключ-значение, - см. статью server.cfg FiveM простыми словами.

Когда командная строка и конфиг-файл расходятся#

Когда одна и та же настройка есть в обоих местах, побеждает та, что применена последней, и это не всегда командная строка.

  • Игры на Source выполняют server.cfg при загрузке карты, то есть после обработки командной строки. Поэтому +sv_password в командной строке перезаписывается строкой sv_password в server.cfg при каждой смене карты.
  • Rust при запуске тоже читает server/<identity>/cfg/server.cfg, так что у convar, заданной и там, и в командной строке, два источника, и угадывать, какой победит, не стоит. Выберите один.
  • Valheim не с чем расходиться: командная строка и есть конфигурация.
  • Игры на Unreal ведут себя по-разному. Одни предпочитают значения из командной строки значениям из ini, другие наоборот, а третьи для отдельных настроек игнорируют один из источников. Проверяйте на значении, которое видно в браузере серверов.

Безопасная привычка - держать каждую настройку ровно в одном месте. Если переменные запуска в панели задают порт и пароль, удалите эти строки из конфиг-файла, а не держите их «синхронизированными».

Флаги памяти и лимит контейнера#

Флаги памяти взаимодействуют с лимитом тарифа так, что многих застают врасплох. У контейнера жёсткий потолок памяти; -Xmx сервера на Java - это только его heap, а JVM нужна память сверх heap для собственного кода, потоков, буферов и нативных библиотек. Если выставить -Xmx на весь тариф, на эти накладные расходы места не останется, и под нагрузкой процесс будет завершён по лимиту.

Безопасное правило для серверов на Java - heap примерно 85-90% от контейнера на больших тарифах и чуть меньше на маленьких, где фиксированные накладные расходы составляют большую долю. У серверов на Unity и Unreal аналогичного флага нет; их память - это сколько нужно игре, и единственный рычаг - собственные настройки игры.

На RE:NODE сервер, достигший лимита памяти, останавливается и перезапускается начисто, а не уходит в swap, так что слишком большой heap проявляется как необъяснимые рестарты, а не как медленный сервер. Какой признак искать, описано в статье почему игровой сервер постоянно перезапускается.

Секреты в командной строке#

Пароли, пароли RCON, токены игрового сервера Steam и лицензионные ключи часто оказываются параметрами запуска. Это работает, но с тремя оговорками:

  • Логи их повторяют. Многие игры при запуске выводят полную командную строку, так что пароль оказывается в каждом файле лога. Удаляйте его, прежде чем делиться логом.
  • Другие пользователи панели их видят. Любой, у кого есть право просматривать вкладку Startup, видит значения. Давайте модераторам доступ к консоли, а не к настройкам запуска.
  • Имена публичны. Valheim отказывается запускаться, если пароль встречается в имени сервера, и не зря: имя видно в публичном списке.

Если игра позволяет хранить секрет в конфиг-файле, часто это место лучше; если нет, относитесь к переменным запуска как к конфиденциальным. Общая практика описана в статье переменные окружения и секреты.

Разбор проблем со строкой запуска#

Ошибки, вызванные параметрами, узнаваемы:

  • Сервер игнорирует настройку. Неверный префикс (- там, где нужен +), не то место (командная строка для настройки, которую игра читает только из конфига) или конфиг-файл, который позже её переопределяет.
  • «Unknown option» или сервер выводит справку и завершается. Опечатка или опция из другой игры либо старой версии. Так делают и Factorio, и Java.
  • Мир сбрасывается на новый. Имя мира, сохранения или identity в параметрах не совпадает с папкой на диске, и сервер создал новый.
  • Аргументы разбиваются не там. Значение с пробелом, например имя сервера, без кавычек. -name Longship Crew передаёт Crew отдельным бессмысленным аргументом.
  • Порт уже занят. Командная строка говорит игре один порт, а конфиг - другой, и она пытается открыть оба, или второй сервер скопировал строку первого.
  • Мод не найден. Пути в -mod у Bohemia задаются относительно папки сервера и в Linux чувствительны к регистру. @ace и @ACE - разные папки.

Когда изменение запуска ведёт себя странно, читайте самые первые строки консоли. Большинство серверов выводят полученные параметры, и сравнение этой строки с задуманным находит большинство таких ошибок за секунды. Что искать, описано в статье как читать консоль сервера.

FAQ#

Что делают параметры запуска на игровом сервере?

Это аргументы, с которыми запускается сервер: порт, мир, память, расположение конфиг-файла, список модов, путь к логам. Некоторые игры настраиваются целиком через них; большинство используют их для самого необходимого, а остальное читают из конфиг-файла.

Чем отличаются - и + в параметрах запуска?

В играх на Source и в Rust опции с - читает движок во время запуска, а аргументы с + - это консольные команды или переменные, которые выполняются, когда сервер готов. Неверный префикс обычно означает, что настройка молча игнорируется.

Почему сервер игнорирует настройку, которую я указал в строке запуска?

Либо игра читает эту настройку только из конфиг-файла, либо конфиг-файл позже задаёт её снова и переопределяет командную строку. Держите каждую настройку в одном месте и смотрите первые строки консоли, чтобы увидеть, что сервер на самом деле получил.

Можно ли добавить свои флаги в панели?

Зависит от egg: многие предоставляют переменную вроде «дополнительные аргументы», другие - только переменные, которые определили их авторы. Если саму команду запуска редактировать нельзя, место для дополнительных настроек - обычно конфиг-файл игры.

Должен ли Xmx совпадать с памятью тарифа?

Нет. Java нужна память сверх heap, так что heap, равный всему лимиту, не оставляет процессу места для остального. Оставляйте примерно 10-15% запаса, на маленьких тарифах больше.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000