RE:NODE

Выделенный сервер Valheim на Windows: установка

Автор Команда RE:NODE
11 мин чтения


На Windows выделенный сервер Valheim можно получить двумя способами: установить «Valheim Dedicated Server» из раздела Tools вашей библиотеки Steam или скачать приложение 896660 через SteamCMD в любую папку. В обоих случаях дальше вы копируете start_headless_server.bat, задаёте имя сервера, мир и пароль в своей копии, разрешаете valheim_server.exe в брандмауэре Защитника Windows на UDP 2456-2458 и запускаете. Если сервер нужен дольше одного вечера, запустите его как службу Windows через NSSM, настроив отправку Ctrl+C при остановке, чтобы мир сохранялся. Ловушки здесь свои, виндовые: закрытие окна консоли крестиком убивает сервер без сохранения, запрос файрвола легко ошибочно проигнорировать, а служба, работающая под учётной записью SYSTEM, сохраняет миры в месте, где никто не догадается их искать.

Сами аргументы запуска разобраны по одному в справочнике по аргументам запуска Valheim; эта статья - про установку на Windows и службу вокруг неё.

Steam Tools или SteamCMD: что выбрать#

Оба способа дают одинаковые файлы сервера. Разница в том, кто их обновляет и где они лежат.

Копия из Steam ToolsSteamCMD
Нужен клиент SteamДа, с входом в аккаунтНет
Место установкиsteamapps\common\Valheim dedicated serverЛюбая выбранная вами папка
ОбновленияSteam, автоматически, пока клиент запущенПри запуске команды обновления
Подходит дляСервер на игровом ПК на один вечерМашина, на которой сервер работает постоянно

Копия из Steam Tools - быстрый путь. В библиотеке Steam переключите фильтр так, чтобы он включал Tools, найдите «Valheim Dedicated Server» и установите. При стандартной установке она окажется в C:\Program Files (x86)\Steam\steamapps\common\Valheim dedicated server. Подвох в том, что Steam обновляет её, когда ему вздумается: для ванильного сервера это удобно, для модифицированного - проблема, и вдобавок сервер привязан к сеансу рабочего стола с запущенным Steam.

SteamCMD - путь для машины, которая больше ничем не занята. Скачайте steamcmd.zip с сайта разработчиков Valve, распакуйте в папку вроде C:\steamcmd и выполните:

code
C:\steamcmd\steamcmd.exe +force_install_dir C:\valheim\server +login anonymous +app_update 896660 validate +quit

Первый запуск обновляет сам SteamCMD, затем скачивает сервер. Владеть Valheim не нужно: приложение сервера скачивается анонимно. +force_install_dir должен стоять перед +login, а путь - вести в папку, куда ваш пользователь может писать; избегайте Program Files, где любая запись требует повышения прав, а без них молча уходит в виртуализированную папку. Устройство команды и её коды ошибок описаны в статье SteamCMD: подробный разбор.

Той же командой сервер обновляют и потом. Сначала остановите сервер: SteamCMD не может заменить файлы, которые удерживает открытыми работающий процесс, и вы получите наполовину обновлённую установку.

Что лежит в папке сервера#

После любой из установок в папке находятся:

  • valheim_server.exe - сам сервер.
  • valheim_server_Data - папка данных Unity. Ничего внутри не редактируйте.
  • start_headless_server.bat - пример стартового скрипта.
  • steam_appid.txt, steamclient64.dll и другие файлы API Steam, нужные серверу для регистрации.
  • Документация, например короткое PDF-руководство от Iron Gate, в зависимости от сборки.

Миров в этой папке нет. По умолчанию сервер сохраняет их в профиле пользователя, от имени которого запущен, - в %USERPROFILE%\AppData\LocalLow\IronGate\Valheim, причём миры лежат в worlds_local, а adminlist.txt, bannedlist.txt и permittedlist.txt - рядом с этой папкой. От этого факта зависит раздел про службу ниже. Все пути для Windows и Linux перечислены в статье расположение файлов Valheim.

Безопасная правка start_headless_server.bat#

Штатный скрипт выглядит так - с поправкой на комментарии и на то, есть ли в строке-примере уже -crossplay, что зависит от сборки:

start_headless_server.bat (as shipped)
@echo offset SteamAppId=892970echo "Starting server PRESS CTRL-C to exit"REM Tip: Make a local copy of this script to avoid it being overwritten by steam.REM NOTE: Minimum password length is 5 characters & Password cant be in the server name.REM NOTE: You need to make sure the ports 2456-2458 is being forwarded to your servervalheim_server -nographics -batchmode -name "My server" -port 2456 -world "Dedicated" -password "secret"

Последуйте совету из комментария. Каждое обновление - автоматическое от Steam или validate - возвращает этот файл к исходному, а вместе с ним теряются имя сервера и пароль. Скопируйте его в start_valheim.bat в той же папке и правьте копию:

start_valheim.bat
@echo offcd /d "%~dp0"set SteamAppId=892970valheim_server.exe -nographics -batchmode -name "Longship Crew" -port 2456 ^  -world "Midgard" -password "herring-barrel-42" -public 1 ^  -saveinterval 900 -backups 4

Что делает каждое изменение:

  • cd /d "%~dp0" переходит в папку, где лежит скрипт, и он работает из ярлыка, планировщика заданий или службы. Без этого двойной щелчок в Проводнике работает, а запуск откуда-то ещё может не найти valheim_server.exe или его данные.
  • set SteamAppId=892970 остаётся. Это номер клиента игры, и по нему сервер представляется Steam. Не меняйте его на номер сервера.
  • Символ ^ в конце строки продолжает её в пакетном файле, что делает длинную команду читаемой. После каретки не должно быть ничего, даже пробела.
  • -saveinterval 900 сохраняет мир каждые 15 минут вместо 30, вдвое сокращая то, что может потеряться при сбое.

Добавляйте -crossplay, только если на сервер должны заходить игроки с Xbox или Game Pass; компромиссы описаны в статье кроссплей Valheim и игроки с Xbox.

Первый запуск и чистая остановка#

Дважды щёлкните по своей копии. Откроется окно консоли с прокручивающимся логом. При первом запуске создаётся и сохраняется новый мир, и это заметно дольше, чем последующие запуски. Ищите Load world: с названием вашего мира и Game server connected: это значит, что Steam принял регистрацию. С -crossplay следом идёт строка с шестизначным кодом присоединения.

Чтобы остановить сервер, щёлкните в окне и нажмите Ctrl+C, затем подождите. Сервер сохранит мир и завершится; в некоторых сборках после этого окно спросит Terminate batch job (Y/N)? - это Windows спрашивает про скрипт, а не про сервер: сохранение уже произошло, и любой ответ подойдёт.

Не закрывайте окно крестиком. Это завершает процесс без последовательности остановки, и всё, что было после последнего сохранения, пропадает - при интервале по умолчанию до тридцати минут. Выход из Windows, принудительная перезагрузка для обновлений и снятие задачи в Диспетчере задач дают тот же результат. Это самый веский довод в пользу службы, которой можно приказать отправлять Ctrl+C.

Если ожидаемый мир не загрузился и вместо него создан новый, значит, имя в -world не совпадает с именем файла в worlds_local. Ваш прежний мир не тронут; исправьте имя и перезапустите. Сбои при запуске, сгруппированные по сообщениям лога, собраны в статье сервер Valheim падает при запуске.

Брандмауэр Защитника Windows и проброс портов#

Когда valheim_server.exe впервые открывает сетевой порт, брандмауэр Защитника Windows показывает запрос, для каких сетей его разрешить. Ошибиться можно двумя способами:

  1. Запрос появляется позади окна консоли, никто на него не отвечает, и входящий трафик блокируется.
  2. Отмечены только «Частные сети», а Windows считает ваше подключение общедоступным - так часто бывает на только что установленной машине или на сервере в дата-центре, - и правило не применяется.

Не полагайтесь на запрос, создайте явные правила из PowerShell, запущенного с правами администратора:

code
New-NetFirewallRule -DisplayName "Valheim UDP" -Direction Inbound `  -Protocol UDP -LocalPort 2456-2458 -Action Allow -Profile Any

UDP 2456 несёт игровой трафик, 2457 отвечает на запросы Steam; третий порт диапазона упомянут в комментарии примера скрипта, и открыть его ничего не стоит. Протокол важен: правило для TCP Valheim ничего не даёт. Если вы раньше ответили на запрос «Отмена», Windows создала для valheim_server.exe блокирующее правило, а блокирующие правила сильнее разрешающих. Найдите его в разделе «Монитор брандмауэра Защитника Windows в режиме повышенной безопасности», «Правила для входящих подключений» и удалите.

Дома пробросьте тот же диапазон UDP на роутере на локальный адрес ПК и закрепите за этим ПК постоянный адрес (резервирование в DHCP), чтобы проброс не сломался, когда он получит новый. На облачном сервере с Windows такое же правило нужно и в сетевом файрволе провайдера. Как менять -port, запускать два сервера на одной машине и проверять, открыт ли порт на самом деле, описано в статье порты Valheim.

Проверяйте подключением по IP с машины вне вашей сети: Join Game, Add Server, your.public.ip:2456. Если так работает, а в общем списке сервера по-прежнему нет, подождите - список может обновляться несколько минут, - и загляните в статью сервер Valheim не отображается в списке.

Запуск сервера как службы через NSSM#

Сервер в окне консоли останавливается, когда кто-то выходит из системы, закрывает окно или Windows Update перезагружает машину. NSSM, Non-Sucking Service Manager, оборачивает любую программу в службу Windows: она запускается при загрузке без вошедшего пользователя, перезапускается после сбоя и - что важнее всего для Valheim - может останавливать программу через Ctrl+C, а не убивать её.

Скачайте NSSM, положите nssm.exe в любое место из PATH и из командной строки с правами администратора выполните:

code
nssm install Valheim C:\valheim\server\valheim_server.exenssm set Valheim AppDirectory C:\valheim\servernssm set Valheim AppParameters -nographics -batchmode -name "Longship Crew" -port 2456 -world "Midgard" -password "herring-barrel-42" -public 1 -saveinterval 900 -savedir C:\valheim\savenssm set Valheim AppEnvironmentExtra SteamAppId=892970nssm set Valheim AppStopMethodConsole 60000nssm set Valheim AppStdout C:\valheim\logs\valheim.lognssm set Valheim AppStderr C:\valheim\logs\valheim.lognssm set Valheim AppRotateFiles 1nssm set Valheim Start SERVICE_AUTO_STARTnssm start Valheim

Служба запускает valheim_server.exe напрямую, а не пакетный файл, поэтому сигнал остановки от NSSM попадает прямо в сервер. Строки, которые не очевидны, по порядку:

  • AppEnvironmentExtra SteamAppId=892970 заменяет строку set из пакетного файла. Без неё сервер не зарегистрируется в Steam.
  • AppStopMethodConsole 60000 велит NSSM при остановке отправить Ctrl+C и ждать завершения процесса до 60 секунд, прежде чем переходить к более жёстким методам. Большому миру это время нужно, чтобы записаться. Убедитесь, что метод «Console» не отключён в AppStopMethodSkip; по умолчанию он включён.
  • AppStdout и AppStderr перехватывают лог, поскольку у службы нет окна. Сначала создайте папку logs. AppRotateFiles 1 ротирует файл при запуске службы, чтобы он не рос бесконечно.
  • -savedir C:\valheim\save - та строка, что сбережёт вам потерянный день. Прочитайте следующий абзац.

По умолчанию служба работает под LocalSystem. Профиль LocalSystem - это C:\Windows\System32\config\systemprofile, поэтому без -savedir сервер сохранит данные в C:\Windows\System32\config\systemprofile\AppData\LocalLow\IronGate\Valheim - и создаст там новый мир, потому что ваш существующий лежит в вашем собственном профиле. Либо передайте -savedir с простой папкой, как выше, и перенесите в неё папку worlds_local и файлы списков, либо запустите службу под обычной учётной записью через nssm set Valheim ObjectName .\valheim "password". Аккуратнее всего сочетание отдельного локального пользователя с минимальными правами и -savedir.

Управляйте ею как любой службой: nssm restart Valheim, sc query Valheim или консоль служб. nssm edit Valheim открывает графическое окно со всеми настройками, если вам удобнее щёлкать мышью. Чтобы обновить сервер, остановите службу, выполните команду SteamCMD и запустите службу снова.

Обновления, перезапуски и бэкапы на Windows#

Планировщик заданий может запускать небольшой скрипт каждую ночь или неделю, который останавливает службу, выполняет обновление через SteamCMD и снова запускает службу:

C:\valheim\update.bat
nssm stop ValheimC:\steamcmd\steamcmd.exe +force_install_dir C:\valheim\server +login anonymous +app_update 896660 +quitnssm start Valheim

Не ставьте это в расписание для модифицированного сервера. Патч Valheim ломает моды BepInEx, пока их авторы не подтянутся, а автоматическое обновление принесёт вам эту поломку в четыре утра. О том, когда обновлять и что значит ошибка Incompatible version, рассказывает статья как обновить сервер Valheim.

Собственные копии -backups сервера лежат в той же папке worlds_local, что и мир, на том же диске. Настоящие бэкапы делайте копированием папки сохранений в другое место - на другой диск, в NAS, в объектное хранилище - по расписанию, лучше всего сразу после плановой перезагрузки, когда мир только что был чисто сохранён. Стратегия и порядок восстановления описаны в статье бэкапы сервера Valheim и повреждение мира.

Сама Windows - последняя ловушка. Windows Update перезагружает машину, когда считает нужным, если не задать активные часы или окно обслуживания. С NSSM и остановкой через Ctrl+C перезагрузка проходит как чистая остановка, но сервер всё равно недоступен, пока машина не поднимется. Игровой сервер на вашем повседневном игровом ПК к тому же конкурирует с вашей игрой за один и тот же процессор; когда пора переезжать, рассказывают статьи Linux или Windows для игровых серверов и свой игровой сервер дома или аренда.

На RE:NODE вопросов про службу, файрвол и обновления не возникает: сервер работает в собственном контейнере, оба порта UDP входят в тариф, Restart отправляет чистую остановку, чтобы мир сохранился, а аргументы запуска - это поля на вкладке Startup, а не пакетный файл, копию которого нужно хранить.

FAQ#

Можно ли играть на том же ПК, где запущен сервер?

Да. Запустите сервер, затем игру и подключитесь по 127.0.0.1:2456 или по адресу в локальной сети. Сервер и игра конкурируют за процессор, поэтому ПК среднего уровня лучше справляется с несколькими друзьями, чем с десятью. Все остальные подключаются по вашему публичному адресу.

Почему мой мир пропал после настройки службы?

Почти наверняка служба работает под другой учётной записью, чем та, с которой вы проверяли, поэтому сохраняет данные в её профиле и создала там новый мир. Ваш старый мир по-прежнему лежит в вашем AppData\LocalLow\IronGate\Valheim\worlds_local. Укажите в -savedir постоянную папку и перенесите мир туда.

Должен ли клиент Steam быть запущен?

Для копии из Steam Tools Steam должен работать ради обновлений, но сервер запускается и без него, если задан SteamAppId. Установке через SteamCMD клиент не нужен никогда.

Безопасно ли закрывать окно сервера?

Нет. Закрытие окна убивает процесс без сохранения. Нажмите в нём Ctrl+C и дождитесь сохранения или остановите службу NSSM, которая отправит Ctrl+C сама.

Можно ли запустить два сервера Valheim на одной машине с Windows?

Да, с разными названиями миров, разными значениями -port с разницей не меньше трёх (обычно 2456 и 2466) и отдельными диапазонами в файрволе. Остальное решают две службы NSSM с разными именами.