Выделенный сервер Sons of the Forest - это бесплатная загрузка через SteamCMD (app id 2465200), он вмещает восемь игроков, для комфортной работы ему нужны 8 ГБ памяти и два ядра, а настраивается он целиком одним JSON-файлом dedicatedserver.cfg. Перед началом стоит знать две вещи. Серверная программа существует только как сборка для Windows: нативного бинарника под Linux нет, поэтому на Linux она работает под Wine или Proton, чем большинство хостеров тихо занимается за вас. И поскольку конфигурация - это JSON, а не снисходительный формат «ключ-значение», как в первой игре, одна лишняя запятая приводит к тому, что сервер стартует со значениями по умолчанию, а ошибку разбора кладёт куда-то в лог, который никто не читает. Всё остальное - детали, и большая их часть лежит в этом самом файле.
Что такое выделенный сервер и что он умеет#
В Sons of the Forest есть три вида мультиплеера: хост, играющий из своей копии игры, сессия только по приглашению и выделенный сервер. Выделенный сервер - это отдельное бесплатное приложение без рендеринга, которое распространяется через Steam как инструмент, а не как часть игры, и только в этом варианте мир существует, когда никто не играет.
Что вы получаете:
- Постоянный мир. Сохранение пишется по таймеру и при корректном выключении. Постройки, срубленные деревья, убитые каннибалы и состояние сюжета переживают перезапуск.
- До восьми игроков. Это предел самой игры, а не тарифа, и поддерживаемого способа его поднять нет.
- Режимы игры - Normal, Hard, Hard Survival, Peaceful, Creative и Custom, выбираются в конфиге.
- Свои правила. В режиме Custom доступно около двух десятков отдельных переключателей: здоровье врагов, урон, агрессивность, длина сезона, длина дня, штрафы выживания и добыча в контейнерах.
- Аккаунты владельцев, которым доступна внутриигровая админ-панель с киком, баном и телепортом.
- Пароль - единственная защита доступа, если не считать режима только для локальной сети.
Не менее важно то, чего нет. Нет RCON, нет серверной консоли, в которую можно вводить команды, нет набора чат-команд, нет белого списка помимо пароля и нет никакой поддержки модов, о которой заявлял бы разработчик. Администрирование происходит в игре, из-под игрока, отмеченного как владелец. Если по сравнению с выделенным сервером The Forest это выглядит скудно, так оно и есть: новая игра вышла с меньшим набором серверных инструментов, чем старая, и пока их не догнала.
Требования и потребление ресурсов#
Для кооперативной игры на выживание это тяжёлый сервер, и людей удивляет прежде всего память. Sons of the Forest держит в памяти много состояния мира, и оно растёт вместе с исследованной группой территорией и со всем, что она построила.
| Группа | RAM | CPU | Примечание |
|---|---|---|---|
| 2-4 игрока, начало игры | 8 GB | 2 ядра | Минимум, а не комфортный запас |
| 4-6 игроков, обжитая база | 10 GB | 2-2,5 ядра | Типичный случай |
| 8 игроков, давний мир | 12 GB | 3 ядра | Дорого обходятся и постройки, и исследованная территория |
| Режим Creative, много построек | 12 GB+ | 3 ядра | Главное - количество построек |
Эти цифры относятся ко всему контейнеру целиком, а на Linux в него входит и слой Wine, и виртуальный дисплей, без которого сервер не желает запускаться. В эталонных Linux-развёртываниях для группы из четырёх человек требуют не меньше 8 ГБ и рекомендуют больше, поэтому тарифы на эту игру начинаются именно там, а не с тех 2-3 ГБ, которые раньше значили сервер кооперативного выживания.
- CPU: симуляцию тянет в основном один поток, как почти в любой survival-игре на Unity. От тактовой частоты зависит, будет ли бой у базы идти рывками. Второе и третье ядро всё равно помогают: сохранение, сеть и синхронизация blob идут параллельно.
- Диск: установка занимает примерно 10-15 ГБ, а каждый слот сохранения - это
SaveData.zipв десятки мегабайт, растущий вместе с миром. Разумный минимум - 50 ГБ, если вы держите несколько слотов и копий. - Сеть: в обычной игре скромная. Исключение - вход игрока: он тянет текущее состояние мира через порт BlobSync. В зрелом мире это настоящая передача данных, из-за чего первый вход занимает время.
Честный вариант ответа на вопрос о размерах: если в вашем тарифе 8 ГБ, обычной группе этого хватит, но не рассчитывайте, что в режиме Creative с тысячей построек вам тоже будет комфортно. В статье CPU или RAM для игровых серверов разобрано, как понять, чего именно вам не хватает, прежде чем платить не за то.
Установка и первый запуск#
Выделенный сервер на SteamCMD скачивается анонимно, поэтому аккаунт Steam и токен игрового сервера не нужны:
$ steamcmd +force_install_dir C:\sotf-server +login anonymous \ +app_update 2465200 validate +quitЕсли SteamCMD вам незнаком, в статье SteamCMD простыми словами разобраны app id, validate и поддержание установки в актуальном состоянии. Исполняемый файл - SonsOfTheForestDS.exe, рядом лежит StartSOTFDedicated.bat как штатный запускатор; учтите, что этот bat-файл заменяется при каждом обновлении, так что правки в нём не сохранятся.
Запустите сервер один раз. При первом старте он создаёт папку с пользовательскими данными, пишет стандартный dedicatedserver.cfg и пустой ownerswhitelist.txt, сообщает об этом и останавливается. Это ожидаемое поведение, а не сбой: сервер не заработает, пока оба файла не появятся и вы не получите возможность их отредактировать.
В Windows эта папка находится здесь:
C:\Users\<user>\AppData\LocalLow\Endnight\SonsOfTheForestDS\В ней лежат dedicatedserver.cfg, ownerswhitelist.txt и каталог Saves. Всю папку можно перенести аргументом командной строки, и это то, что нужно, если на машине работает больше одного сервера:
SonsOfTheForestDS.exe -userdatapath "C:/sotf-server/userdata"Стоит знать ещё два аргумента. -verboseLogging включает подробный лог, и это разница между диагностикой сбоя при запуске за две минуты и гаданием. Кроме того, любой ключ конфига можно переопределить в командной строке с префиксом -dedicatedserver., именно так панели выставляют значения, не переписывая ваш файл:
SonsOfTheForestDS.exe -dedicatedserver.ServerName "Kelvin's Revenge" -dedicatedserver.MaxPlayers "6"На хостинге с панелью всё это пропускается. Сервер появляется после прохождения платежа, файл конфигурации уже на месте, а те же значения видны полями на вкладке Startup. Вам остаётся только редактирование, описанное ниже: на RE:NODE это встроенный в браузер редактор файлов, который подсветит JSON и сделает несбалансированную скобку очевидной, либо SFTP, если вам удобнее работать локально.
dedicatedserver.cfg по ключам#
Один JSON-объект, без секций, комментарии не допускаются. Значения по умолчанию, которые сервер записывает при первом старте:
{ "IpAddress": "0.0.0.0", "GamePort": 8766, "QueryPort": 27016, "BlobSyncPort": 9700, "ServerName": "Sons Of The Forest Server (dedicated)", "MaxPlayers": 8, "Password": "", "LanOnly": false, "SaveSlot": 1, "SaveMode": "Continue", "GameMode": "Normal", "SaveInterval": 600, "IdleDayCycleSpeed": 0.0, "IdleTargetFramerate": 5, "ActiveTargetFramerate": 60, "LogFilesEnabled": false, "TimestampLogFilenames": true, "TimestampLogEntries": true, "SkipNetworkAccessibilityTest": false, "GameSettings": {}, "CustomGameModeSettings": {}}Что делает каждый из самых интересных ключей:
| Ключ | По умолчанию | Что делает |
|---|---|---|
ServerName | Sons Of The Forest Server | Имя в списке серверов |
MaxPlayers | 8 | Документированный диапазон - от 1 до 8 |
Password | пусто | Пусто означает, что зайти может любой. Максимум 40 символов |
LanOnly | false | true полностью прячет сервер от интернета |
SaveSlot | 1 | Какую папку сохранения загружать и в какую писать |
SaveMode | Continue | Continue загружает слот, New начинает в нём заново |
GameMode | Normal | См. следующий раздел |
SaveInterval | 600 | Секунд между сохранениями мира |
IdleDayCycleSpeed | 0.0 | Как быстро идёт время, пока никого нет онлайн |
IdleTargetFramerate | 5 | Целевой tick, когда сервер пуст |
ActiveTargetFramerate | 60 | Целевой tick, когда игроки на сервере |
LogFilesEnabled | false | Писать логи на диск, а не только в консоль |
SkipNetworkAccessibilityTest | false | Пропустить проверку портов при запуске |
IdleDayCycleSpeed со значением 0.0 замораживает часы, пока сервер пуст, а это почти всегда то, чего хочет компания друзей: никто не возвращается и не обнаруживает, что зима уже прошла. Поставьте 1.0, если хотите, чтобы время шло дальше. IdleTargetFramerate со значением 5 - причина, по которой пустой сервер почти не нагружает процессор, и лучше его не трогать.
SkipNetworkAccessibilityTest заслуживает отдельного замечания. При запуске сервер проверяет, доступны ли его порты снаружи, и жалуется, если нет. На хосте, который стоит за NAT или фильтрующим слоем, эта проверка может провалиться на вполне исправном сервере. Если всё остальное настроено верно и падает только она, поставить true вполне допустимо. Ставить true потому, что вы не открыли порты, - нет.
Режимы игры и свои настройки#
GameMode принимает одно из значений Normal, Hard, HardSurvival, Peaceful, Creative или Custom. Первые пять - готовые пресеты. Custom - тот, который читает CustomGameModeSettings.
Два переключателя находятся в постоянно действующем блоке GameSettings и работают в любом режиме:
"GameSettings": { "Gameplay.TreeRegrowth": true, "Structure.Damage": true}Gameplay.TreeRegrowth отращивает срубленные деревья со временем, и на давно живущем сервере это очень важно: без него территория базы превращается в поле пней. Structure.Damage определяет, могут ли каннибалы ломать то, что вы построили: выключите, и оборона базы перестанет быть тем, о чём нужно думать, - одним группам это нужно, другие считают это всей игрой.
При GameMode со значением Custom становится доступно остальное. Вот эти ключи, все с префиксом GameSetting.:
| Ключ | Значения |
|---|---|
GameSetting.Vail.EnemySpawn | true, false |
GameSetting.Vail.EnemyHealth | low, normal, high |
GameSetting.Vail.EnemyDamage | low, normal, high |
GameSetting.Vail.EnemyArmour | low, normal, high |
GameSetting.Vail.EnemyAggression | low, normal, high |
GameSetting.Vail.EnemySearchParties | low, normal, high |
GameSetting.Vail.AnimalSpawnRate | low, normal, high |
GameSetting.Environment.StartingSeason | spring, summer, autumn, winter |
GameSetting.Environment.SeasonLength | short, default, long, realistic |
GameSetting.Environment.DayLength | short, default, long, realistic |
GameSetting.Environment.PrecipitationFrequency | low, default, high |
GameSetting.Survival.ConsumableEffects | normal, hard |
GameSetting.Survival.PlayerStatsDamage | off, normal, hard |
GameSetting.Survival.ColdPenalties | off, normal, hard |
GameSetting.Survival.StatRegenerationPenalty | off, normal, hard |
GameSetting.Survival.ReducedFoodInContainers | true, false |
GameSetting.Survival.SingleUseContainers | true, false |
GameSetting.Survival.BuildingResistance | low, normal, high |
GameSetting.Survival.CreativeMode | true, false |
GameSetting.Survival.PlayersImmortalMode | true, false |
GameSetting.Survival.OneHitToCutTree | true, false |
GameSetting.Construction.NoCuttingsSpawn | true, false |
GameSetting.FreeForm.ForcePlaceFullLoad | true, false |
GameSetting.Multiplayer.Cheats | true, false |
Рабочий пример - сервер для строительства, где каннибалы всё же появляются, но рутина выживания отключена:
"GameMode": "Custom","CustomGameModeSettings": { "GameSetting.Vail.EnemySpawn": true, "GameSetting.Vail.EnemyAggression": "low", "GameSetting.Survival.PlayerStatsDamage": "off", "GameSetting.Survival.ColdPenalties": "off", "GameSetting.Environment.SeasonLength": "long", "GameSetting.Survival.OneHitToCutTree": true}Про этот список стоит знать две вещи, прежде чем копировать из него. В документации Endnight значения пишутся строчными буквами, а файл, который генерирует сервер, использует формы с заглавной, например "Normal"; скопируйте форму из собственного сгенерированного файла, и вам не придётся выяснять, какую из них предпочитает парсер. И ещё: в официальной таблице и в официальном примере расходятся в том, называется предпоследний ключ OneHitToCutTree или OneHitToCutTrees, - хорошая иллюстрация того, почему -verboseLogging заслуживает своего места: лог говорит, какие ключи сервер на самом деле принял.
Порты и подключение#
Три порта, все UDP, нужны все:
| Порт | Протокол | Назначение |
|---|---|---|
8766 | UDP | Игровой трафик |
27016 | UDP | Запросы Steam - список серверов |
9700 | UDP | BlobSync - состояние мира для входящих игроков |
Порт BlobSync - тот, который пропускают чаще всего: в большинстве игр его аналога нет, а два порта Steam выглядят как полный набор. Сервер с открытыми 8766 и 27016, но не 9700, ведёт себя очень конкретным и сбивающим с толку образом: он появляется в списке, принимает подключение, а потом игрок навсегда зависает на экране загрузки. Если вы видите именно это, дело в порте 9700. В статье порты игровых серверов разобрано, почему у игр появляются отдельные игровой, запросный и передающий порты.
Игроки находят сервер через Multiplayer, затем Dedicated Servers, где список можно отфильтровать по названию. Подключение по адресу делается с того же экрана. Если вы завели имя для адреса, список всё равно показывает IP: домен помогает людям запомнить адрес, а не найти сервер, и нужная запись A описана в статье как привязать домен к игровому серверу.
Владельцы, админы и модерация#
Набора админ-команд нет. Вместо него ownerswhitelist.txt в папке пользовательских данных перечисляет Steam ID, которым доступна внутриигровая админ-панель, по одному на строку:
# One SteamID64 per line. Lines starting with # are comments.# Jane7656119801234567876561198087654321Это должен быть 17-значный SteamID64. Vanity URL, код друга или Steam ID3 будут молча проигнорированы. Файл создаётся при первом запуске и читается при старте, так что добавьте ID и перезапустите сервер: правка файла на работающем сервере ничего не даёт. Учтите, что сервер отказывается запускаться, пока этого файла нет, - это одна из двух причин, по которым самый первый запуск сразу останавливается.
Владелец в игре открывает меню паузы, переходит к списку игроков и оттуда может повысить игрока до администратора, понизить до гостя, а также кикнуть, забанить или разбанить гостей. Вот и весь набор. Нет пароля администратора, нет сообщений по расписанию, нет фильтра чата и нет записи о том, кто что сделал. Для публичного сервера это действительно скудно, и практический ответ - работать с паролем и раздавать его, а не держать сервер открытым и пытаться его контролировать.
Сохранения, слоты и резервные копии#
Мир лежит в папке пользовательских данных:
Saves/DedicatedServer/Multiplayer/0000000001/Каждый слот - отдельный мир, а имя папки - номер слота, дополненный нулями до десяти цифр: слот 1 - это 0000000001. SaveSlot в конфиге выбирает, какой из них загрузит сервер, так что второй мир заводится остановкой сервера, сменой числа и новым запуском.
Такое дополнение нулями - ещё и приём для переноса мира на сервер. Сессия, которую вы сами вели из клиента игры, лежит в AppData\LocalLow\Endnight\SonsOfTheForest\Saves\<SteamID64>\Multiplayer\ в папке с числовым id мира. Остановите сервер, скопируйте эту папку целиком в Saves/DedicatedServer/Multiplayer/, переименуйте в номер слота с нулями, поставьте SaveSlot в соответствии с ним, а SaveMode в Continue и запустите. Мир переезжает; инвентарь и позиции игроков, как правило, нет, так что предупредите людей, что просыпаться придётся с пустыми руками. Сессия, в которую вы заходили, а не вели её, лежит в MultiplayerClient и не является полным миром - её перенести нельзя.
Что нужно знать о том, когда происходит запись:
- По таймеру. Каждые
SaveIntervalсекунд, по умолчанию 600. Десять минут прогресса - это риск по умолчанию. - При корректной остановке. Обычная остановка сервера сначала сохраняет мир. Дождитесь строки о сохранении в консоли, прежде чем считать, что оно произошло.
- Не при убийстве процесса. Убитый процесс, остановка из-за нехватки памяти или сбой хоста теряют всё после последнего сохранения по таймеру.
Сокращение SaveInterval до 300 стоит короткого подвисания каждые пять минут и вдвое уменьшает то, что может забрать сбой. В большом мире это подвисание заметно, так что это компромисс, а не бесплатный выигрыш. Встроенное поведение в любом случае не является резервной копией: оно перезаписывает тот же слот, поэтому мир, сохранившийся в сломанном состоянии, затирает хороший.
Настоящие резервные копии - это копии папки Saves, которые хранятся в другом месте, делаются по расписанию и время от времени проверяются. В статье бэкапы, которые действительно восстанавливаются речь о второй половине - проверке, которую все пропускают. На RE:NODE в тарифы входят слоты для backup, копии хранятся вне машины, которую защищают, восстановление - одна кнопка, а вкладка Schedules сделает ночную копию по выражению cron. Стоит сопоставить это с поведением памяти: если сервер упирается в лимит, контейнер останавливается и запускается заново с чистого листа, а не уходит в swap, и чистый перезапуск сервера Sons of the Forest всё равно стоит вам всего, что произошло после последнего сохранения.
Обновления, производительность и устранение неполадок#
Клиент и сервер должны быть одной сборки. После патча игры выполните app_update, прежде чем кто-либо попытается зайти, потому что ошибка, которую получает клиент с несовпадающей версией, ничего не объясняет. Совместимость сохранений между патчами в целом держалась, но крупное обновление - как раз тот момент, когда стоит сделать резервную копию вручную.
Сервер не появляется в списке. Проверьте все три UDP-порта, убедитесь, что LanOnly равен false, затем подождите: список обновляется медленно. Подключение напрямую по адресу - тест, который отделяет проблему списка от проблемы сервера.
Игроки подключаются и зависают на загрузке. Порт 9700 закрыт. Это самая частая неполадка, и на проблему с портом она совсем не похожа.
Сервер отказывается запускаться и называет конфиг. JSON не разобрался. The configuration couldn't be read without error означает некорректный JSON: запятая после последнего ключа или «умная» кавычка, вставленная с веб-страницы. Сообщение с названием одной настройки означает значение вне допустимого диапазона. Прогоните файл через любой JSON-валидатор перед перезапуском.
`UDP 8766 is closed` или подобное от самопроверки. При старте сервер обращается к собственному публичному адресу, чтобы проверить каждый порт, и проверка проходит, только если ваша сеть возвращает трафик обратно. За NAT без поддержки hairpin она проваливается на сервере, который прекрасно работает. Убедитесь снаружи, что игрок может зайти, затем поставьте SkipNetworkAccessibilityTest в true.
`Failed to get public ip from Steam`. Серверу нужен маршрутизируемый публичный адрес IPv4. Один IPv6 не поддерживается.
Мир сбросился. SaveMode равен New или изменился SaveSlot. Старый слот по-прежнему на диске: остановите сервер, верните значения, и он вернётся.
Память неуклонно растёт. Нормально для мира, который активно исследуют и застраивают. Ежедневный перезапуск по расписанию держит её ровной, об этом говорится в статье расписания перезапусков, которые помогают. Если она добирается до лимита за часы, а не за дни, мир перерос тариф.
Сетевая проверка при запуске проваливается, но сервер работает. Поставьте SkipNetworkAccessibilityTest в true, убедившись, что игроки действительно могут зайти.
FAQ#
Сколько игроков вмещает сервер Sons of the Forest?
Восемь. Ограничение заложено в игре, так что ни один хостер не может продать вам больше, а MaxPlayers выше восьми игнорируется. Поставить меньше полезно, если хочется оставить группу небольшой и сэкономить память.
Работает ли выделенный сервер на Linux?
Не нативно. Endnight выпускает только сборку для Windows, поэтому на Linux сервер работает под Wine или Proton. Это работает достаточно хорошо, чтобы большая часть хостинга делалась именно так, но пути в любом руководстве при этом остаются путями Windows, а лог - логом Windows.
Почему моему серверу нужно 8 GB, когда The Forest работал на 3?
Потому что это гораздо больший мир с куда большей детализацией симуляции, построенный на более новом движке. Сервер первой игры действительно лёгкий, этот - нет. Закладывайте 8 GB для обычной группы и от 10 до 12 для давнего мира на восемь игроков.
Можно ли перенести существующий мир на выделенный сервер?
Мультиплеерный мир, который вы вели сами, - да. Скопируйте папку с числовым именем из каталога Saves\<SteamID64>\Multiplayer в Saves/DedicatedServer/Multiplayer сервера, переименуйте её в десятизначный номер слота и укажите этот слот в SaveSlot. Постройки и состояние мира переезжают, инвентарь - обычно нет. Одиночное сохранение или мир, в который вы только заходили, имеют другую форму и не переносятся.
Есть ли админ-команды или RCON?
Нет. RCON-порта нет, набора консольных команд нет, чат-команд нет. Администрирование - это внутриигровая панель, доступная Steam ID из ownerswhitelist.txt, и она умеет кик и бан, больше ничего.
Поддерживает ли Sons of the Forest моды на выделенном сервере?
Поддерживаемого API для модов нет, и разработчик ничего такого не документирует. Загрузчики от сообщества существуют и ломаются с каждым патчем, а сервер с модами - это сервер, где у каждого игрока должен стоять один и тот же неофициальный код. Для компании друзей это выполнимо, для чего-то публичного поддерживать это не стоит.




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