MAATRIX GAMES / Блог / Sons of the Forest — dedicatedserver.cfg

Sons of the Forest — dedicatedserver.cfg

MAATRIX GAMES

Базовый запуск сервера Sons of the Forest — дело двадцати минут: SteamCMD, дефолтный конфиг, порты открыты, и вот уже можно заходить по прямому IP. Но дефолтные значения dedicatedserver.cfg — это в лучшем случае "сойдёт", а не "как я хочу". Если вы держите сервер для конкретной компании друзей или сообщества и хотите настроить именно сложность, видимость и сетевые нюансы под себя — придётся закопаться в поля конфига чуть глубже, чем показывает большинство быстрых гайдов. Разберём файл по частям: что реально трогать, а что лучше не менять руками.

Структура dedicatedserver.cfg: что где лежит

Файл dedicatedserver.cfg в папке сервера — это JSON, несмотря на расширение. Если открыть его после свежей установки через SteamCMD, увидите плоский список верхнеуровневых полей (имя сервера, порты, лимит игроков) плюс два вложенных объекта, которые чаще всего и определяют, каким получится игровой опыт: GameSettings и CustomGameModeSettings.

Важный момент для тех, кто правит конфиг впервые: если файл повреждён (сломан синтаксис JSON) или отсутствует вовсе, сервер при следующем запуске пересоздаст его с дефолтными значениями поверх того, что было. Это удобная подстраховка, но она же означает риск случайно потерять кастомные настройки при правке на живом сервере — сохраняйте бэкап конфига перед серьёзными правками, отдельно от бэкапа сейвов из базовой инструкции по установке.

Ещё нюанс: набор полей менялся между патчами игры — Endnight то добавляли переключатели в CustomGameModeSettings, то переименовывали сетевые поля (об этом ниже, в разделе про порты). Если гайд в интернете показывает поля, которых нет в вашем файле — это версия из другого билда игры, а не ошибка. Ориентируйтесь на то, что реально сгенерировал ваш сервер, а не на скриншот трёхлетней давности.

Сложность: GameMode и тонкая настройка через CustomGameModeSettings

Поле GameMode — это первое, что стоит решить перед тем, как звать людей на сервер. Доступные значения: normal, hard, hardsurvival (перманентная смерть без возрождения — аналог классического Perma-Death), peaceful (враги не нападают, упор на строительство и исследование), creative (безлимитные ресурсы, без выживания) и custom.

Первые пять — это готовые пресеты, менять их вручную нельзя, только выбирать целиком. А вот custom включает чтение блока CustomGameModeSettings, где можно настроить десятки параметров по отдельности. Условно они делятся на четыре группы:

  • Враги: EnemySpawn (вкл/выкл спавн врагов вообще), EnemyHealth, EnemyDamage, EnemyArmour, EnemyAggression, AnimalSpawnRate, EnemySearchParties — большинство принимают значения Low / Normal / High.
  • Окружение: StartingSeason, SeasonLength, DayLength, PrecipitationFrequency — влияют на смену времён года и погоду, что для survival-режима не косметика, а реально меняет темп игры (холод и осадки бьют по выживанию через параметры ниже).
  • Выживание: ConsumableEffects, PlayerStatsDamage, ColdPenalties, BuildingResistance, ReducedFoodInContainers, SingleUseContainers, PlayersImmortalMode, OneHitToCutTree.
  • Мультиплеер: Cheats (разрешить консольные команды/читы), PvpDamage (урон между игроками).

Пример рабочего фрагмента конфига под режим "полу-хардкор для опытной компании, но без вечного холода":

{
  "GameMode": "Custom",
  "CustomGameModeSettings": {
    "EnemySpawn": true,
    "EnemyHealth": "High",
    "EnemyDamage": "Normal",
    "EnemyAggression": "High",
    "AnimalSpawnRate": "Normal",
    "StartingSeason": "Fall",
    "DayLength": "Normal",
    "ColdPenalties": "Low",
    "PlayersImmortalMode": false,
    "OneHitToCutTree": false,
    "Cheats": false,
    "PvpDamage": true
  }
}

Список не исчерпывающий — патчи добавляют новые переключатели, так что после обновления игры стоит открыть конфиг и посмотреть, не появилось ли что-то новое (сервер допишет их дефолтными значениями сам).

Практический совет: не выставляйте EnemyHealth и EnemyDamage на максимум одновременно, если часть игроков впервые в игре — это скорее фрустрирует новичков, чем создаёт честный челлендж. Разводите параметры: высокая агрессия и количество врагов при умеренном уроне держат напряжение, не превращая бой в лотерею.

Поднять сервер Sons of the Forest за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Видимость сервера: кто и как может зайти

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

  • ServerName — имя в списке серверов. Чисто косметика, но если сервер приватный, не пишите в название ничего, что раскрывает локацию или личные данные.
  • Password — строка до 40 символов. Пустая строка "" означает публичный сервер без пароля; любое значение делает сервер приватным по паролю (в отличие от полного скрытия из списка — сервер с паролем всё ещё виден в браузере серверов, просто не пустит без ввода пароля).
  • LanOnly — булево значение, ограничивает видимость только локальной сетью. Для арендованного VPS с белым IP это поле почти всегда должно быть false — иначе игроки извне физически не найдут сервер, даже с правильно открытыми портами.
  • IpAddress — интерфейс, на котором слушает сервер. По умолчанию 0.0.0.0 (слушать на всех интерфейсах), и для подавляющего большинства случаев его не нужно трогать. Указывать конкретный IP имеет смысл только если на машине несколько сетевых интерфейсов или дополнительных IP и вы сознательно хотите привязать сервер к одному из них.

Практическая связка для приватного сервера "для своих": LanOnly: false (чтобы друзья извне могли зайти), непустой Password, и ServerName без опознавательных деталей. Для полностью публичного набора игроков — Password пустой, а модерацию решаете уже через whitelist или админ-права, если игра/моды это поддерживают.

Сетевые порты: GamePort, QueryPort и новая схема BlobSyncPort

Здесь чаще всего путаница между разными гайдами в сети, и вот почему. Актуальная (на момент написания статьи) схема портов, которую генерирует свежая установка через SteamCMD, выглядит так:

ПолеПортПротоколНазначение
GamePort8766UDPосновной игровой трафик
QueryPort27016UDPзапрос статуса, отображение в списке серверов
BlobSyncPort9700UDPсинхронизация состояния мира между сервером и клиентами

Более старые гайды (и часть статей в этом же блоге) упоминают поле BlockingPort со значением 8767 вместо BlobSyncPort/9700 — это не два разных порта для одновременного открытия, а следствие того, что Endnight переименовали и изменили номер порта в одном из обновлений сетевого стека. Смотрите, что реально прописано в вашем dedicatedserver.cfg, и открывайте именно эти три порта на фаерволе — общий подход к настройке портов и файрвола для игрового сервера актуален, но конкретные номера сверяйте с файлом.

Рядом с портами полезно поле SkipNetworkAccessibilityTest. По умолчанию сервер при старте сам проверяет, что порты доступны снаружи, и это иногда подвешивает запуск в специфичных сетевых окружениях (некоторые NAT-конфигурации, виртуализированные сети у хостеров). Если вы уже вручную проверили доступность портов, можно выставить true — это уберёт внутреннюю проверку и ускорит старт, но тогда сами следите, что порты реально открыты, иначе получите сервер, который тихо не виден снаружи без предупреждения в логе.

Установка и обновление через SteamCMD: актуальный путь и легаси-нюанс с -beta

Сейчас стандартный и рекомендованный путь — устанавливать сервер как отдельное Steam-приложение с app id 2465200, анонимным логином, без покупки самой игры:

steamcmd +login anonymous +force_install_dir C:\sotf-server +app_update 2465200 validate +quit

Это тот же путь, что описан в базовой инструкции по установке сервера, и общие принципы работы с SteamCMD для игровых серверов разобраны в отдельной статье про установку и обновление через SteamCMD.

Но если гуглите старые гайды и натыкаетесь на команду вида +app_update 1326470 -beta dedicated (где 1326470 — app id самой игры, а не сервера) — это легаси-путь из первых месяцев после релиза, когда отдельного серверного приложения ещё не существовало и файлы раздавались через скрытую бета-ветку основного клиента. С появлением standalone app 2465200 этот путь стал не нужен и не поддерживается — не полагайтесь на него сейчас: ветка могла быть закрыта, а даже если формально ещё отвечает, версия файлов из неё не гарантированно совпадает с текущим клиентским билдом, что чревато рассинхроном протокола.

Если сомневаетесь, актуальна ли для вашей версии игры какая-то бета-ветка (например, тестовая ветка превью следующего патча), проверяйте текущий список веток на SteamDB по app id 2465200 перед тем, как что-то переключать: устаревшая ветка при -beta без валидной проверки просто откатит сервер на несовместимую версию.

Производительность: SaveMode, SaveInterval и throttling кадровой частоты

Отдельный блок полей влияет не на геймплей, а на то, сколько ресурсов сервер потребляет и как ведёт себя между сессиями игроков.

  • SaveMode — Continue продолжает сохранение с текущего состояния мира (обычный режим для постоянного сервера), New создаёт новый мир при следующем запуске. Перепутать эти два значения — частая причина паники в духе "сервер стёр весь прогресс", хотя на деле файл сейва никуда не делся, просто сервер стартовал новый.
  • SaveInterval — интервал автосохранения в секундах, логика та же, что и в базовой инструкции: слишком частое сохранение на большом мире создаёт микро-паузы при записи на диск, слишком редкое — риск потерять прогресс при аварийном падении процесса.
  • IdleTargetFramerate и ActiveTargetFramerate — целевая частота обновления сервера, когда на нём нет игроков (idle) и когда есть хотя бы один активный (active). Разделение существует специально, чтобы не жечь CPU впустую, пока сервер простаивает ночью без единого игрока — по умолчанию idle-значение ниже active. Если сервер стоит на слабом тарифе и живёт бок о бок с другими процессами, не поднимайте idle-частоту без причины.
  • IdleDayCycleSpeed — скорость смены игрового дня/ночи, пока сервер простаивает без игроков; может отличаться от той, что задана в игровых настройках сложности, и влияет на то, в какой момент суток застанут мир игроки, зашедшие после долгого простоя сервера.
  • LogFilesEnabled, TimestampLogFilenames, TimestampLogEntries — управляют логированием: стоит держать включённым хотя бы базовое логирование, оно пригодится при разборе причин краша или лагов, подробнее в общей теме работы с конфигурационными файлами игрового сервера.

Разумная база для небольшого сервера на 4-6 игроков: SaveMode: Continue, SaveInterval в районе 60-120 секунд, IdleTargetFramerate заметно ниже ActiveTargetFramerate (экономия CPU в простое), логи включены.

Поднять сервер Sons of the Forest за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Можно ли сменить GameMode с готового пресета на custom без потери сейва?

Да, смена режима сложности не трогает сам файл сохранения — применяется к правилам симуляции с момента рестарта, старый прогресс по постройкам и предметам остаётся на месте.

Что будет, если оставить и старые, и новые поля портов в конфиге одновременно?

Ничего страшного не случится — сервер использует актуальный для своей версии набор полей, лишние (устаревшие) просто игнорируются. Но для чистоты лучше свериться, какие поля реально отвечают за порты в вашей версии, и открывать на фаерволе именно их.

Стоит ли включать SkipNetworkAccessibilityTest на арендованном VPS?

Обычно не обязательно — на VPS с белым IP встроенная проверка проходит быстро. Смысл включать её появляется, если старт сервера ощутимо подвисает именно на этапе проверки сети (видно в логе) и вы уже вручную убедились, что порты открыты.

Работает ли -beta dedicated в 2026 году?

Полагаться на неё не стоит — это путь до появления отдельного app id 2465200, официально уже не актуальный. Используйте стандартную установку через 2465200.

Нужно ли открывать BlockingPort (8767) и BlobSyncPort (9700) одновременно?

Нет, это последовательные версии одного и того же назначения порта в разных билдах игры, а не два независимых порта — открывайте то поле, которое реально указано в вашем текущем dedicatedserver.cfg.