MAATRIX GAMES / Блог / Unturned: сервер не запускается — диагностика

Unturned: сервер не запускается — диагностика

MAATRIX GAMES

Запускаешь ServerHelper.sh или Unturned_Headless.x86_64, а консоль либо закрывается через секунду, либо зависает на загрузке карты и умирает без единого внятного сообщения. Для Unturned это особенно частая история, потому что сервер собирают своими руками через SteamCMD чаще, чем через готовые панели, — и любая мелочь на пути (недокачанный файл, занятый порт, забытый GSLT-токен) роняет запуск. Разбираем по порядку: сначала смотрим в лог, потом проходим стандартный набор виновников — от битой установки до конфигов.

Сначала — лог, а не гадание

Прежде чем что-то переустанавливать, найди лог последнего запуска. У выделенного сервера Unturned он лежит в папке Logs рядом с исполняемым файлом:

<путь_к_серверу>/Logs/Server_<ServerID>.log       — текущий/последний запуск
<путь_к_серверу>/Logs/Server_<ServerID>_Prev.log  — предыдущий запуск (до рестарта)

<ServerID> — это то самое имя папки, которое ты указывал при запуске через +InternetServer/ServerID или +LanServer/ServerID. Если сервер только что упал, смотри именно _Prev.log — актуальный файл может быть создан заново пустым при следующей попытке.

Открывай с конца, ищи строки с Exception, Error, Failed to, SteamAPI_Init() failed. Если лог вообще не создаётся или папка Logs пустая — это почти всегда значит, что до инициализации движка дело не дошло: либо файл не исполняемый, либо не хватает библиотек, либо путь запуска указан неверно. Про то, как в принципе читать логи и крэш-репорты игровых серверов и на что там смотреть в первую очередь, есть отдельный разбор: логи и крэш-репорты — как читать и искать причину.

Повреждённая установка через SteamCMD

Самая частая причина «не стартует» на практике — недокачанные или битые файлы после установки/обновления. Сервер Unturned ставится через SteamCMD под отдельным app id 1110390 (это ID инструмента дедика, не путать с 304930 — ID самой игры):

steamcmd +login anonymous \
  +force_install_dir /home/steam/u3ds \
  +app_update 1110390 validate \
  +quit

Флаг validate заставляет SteamCMD пересчитать контрольные суммы всех файлов и докачать то, что отличается. Если загрузка когда-то прерывалась — обрыв соединения, закрытый терминал, кончившееся место на диске — без validate битые файлы так и останутся лежать, и сервер будет падать при старте без внятной причины в логе.

Если после validate ничего не изменилось, снеси папку установки полностью и скачай заново, не полагаясь на докачку:

rm -rf /home/steam/u3ds
steamcmd +login anonymous +force_install_dir /home/steam/u3ds +app_update 1110390 validate +quit

Отдельно проверь свободное место на диске — SteamCMD не всегда явно пишет о его нехватке, просто останавливает закачку на середине. На Debian/Ubuntu также убедись, что подключена 32-битная архитектура и стоит lib32gcc-s1 — без них сама SteamCMD и часть зависимостей Unturned не запустятся:

sudo dpkg --add-architecture i386
sudo apt update && sudo apt install -y steamcmd lib32gcc-s1

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

Поднять сервер Unturned за пару минут

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

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

GSLT и BattlEye: сервер стартует, но что-то не так

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

Нет GSLT-токена. Начиная с обновления A6 Polaris Teaser, публичный сервер без GSLT (Game Server Login Token) считается «анонимным» — он либо не появляется в общем списке серверов внутри игры, либо Steam периодически обрывает его сессию. Получить токен можно на steamcommunity.com/dev/managegameservers, указав app id 304930 (ID самой игры Unturned). Токен вписывается отдельной строкой в Commands.dat:

GSLT ВАШ_ТОКЕН

Каждому серверу нужен свой отдельный токен — один и тот же ключ на два инстанса не назначить, второй сервер просто не сможет с ним подключиться к Steam.

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

Занятый или не проброшенный порт

Unturned использует связку из двух последовательных UDP-портов:

ПараметрЗначение по умолчаниюНазначение
Port27015/UDPосновной игровой трафик
Port + 127016/UDPSteam query — список серверов, пинг, статус

Оба порта задаются одной строкой Port 27015 в Commands.dat — второй порт сервер занимает автоматически как Port+1, отдельно его прописывать не нужно. Если порт уже занят (например, пробуешь поднять второй инстанс на той же машине с теми же настройками), в логе будет что-то вроде Failed to bind или Address already in use. Проверить занятость на Linux:

ss -ulnp | grep 27015

Если сервер стартует и не падает, но игроков всё равно нет — проблема не в запуске, а в проброс порта на файрволе или у хостера:

sudo ufw allow 27015:27016/udp
sudo ufw reload

Для нескольких серверов на одном IP разноси порты с шагом 2: 27015, 27017, 27019 и так далее, чтобы диапазоны Port/Port+1 не пересекались между инстансами. Подробный чек-лист по проверке проброса — в отдельной статье: порт не проброшен — как проверить и исправить.

Права доступа, CRLF в ServerHelper.sh и нехватка библиотек (Linux)

На Linux-хостах у Unturned встречается специфический баг, отдельный от прав доступа.

  • Файл не помечен исполняемым. После распаковки архива или переноса файлов с правами 644 вместо 755 скрипт просто откажется запускаться:
chmod +x ServerHelper.sh
  • CRLF-окончания строк в самом скрипте. Если ServerHelper.sh был отредактирован или скопирован через инструмент, который сохраняет Windows-переносы строк (\r\n), при попытке запуска можно получить ошибку вроде /bin/bash^M: bad interpreter: No such file or directory. Лечится конвертацией в Unix-переносы:
sed -i -e 's/\r$//' ServerHelper.sh
  • SteamAPI_Init() failed в консоли или логе. Обычно означает, что бинарник не может найти нужные Steam-библиотеки — либо не хватает 32-битных зависимостей (см. раздел про SteamCMD выше), либо запуск идёт не из той рабочей директории, где лежит структура сервера. ServerHelper.sh сам выставляет LD_LIBRARY_PATH, поэтому если ты запускаешь Unturned_Headless.x86_64 напрямую в обход скрипта — воспроизведи те же переменные окружения вручную или запускай именно через ServerHelper.sh.

Если сервер поднят как systemd-сервис, отдельно проверь WorkingDirectory в unit-файле — он должен указывать ровно на папку установки, иначе процесс не найдёт конфиги и упадёт с той же ошибкой, что и при запуске из чужой директории:

[Service]
Type=simple
User=steam
WorkingDirectory=/home/steam/u3ds
ExecStart=/home/steam/u3ds/ServerHelper.sh +InternetServer/MyServer
Restart=on-failure
RestartSec=10

Про автозапуск и переживание перезагрузки хоста в целом — отдельная статья: автозапуск игрового сервера при перезагрузке хоста.

Битые конфиги: Commands.dat и Config.json

Commands.dat читается построчно при каждом запуске — строки с // игнорируются как комментарии. Синтаксис простой, но именно поэтому его легко сломать: лишний пробел в имени команды, кириллица в значении, где её не ждут, или дублирующаяся строка Port могут привести к тому, что сервер либо не поднимет нужный модуль, либо тихо использует значения по умолчанию. Открой файл и построчно сверь с рабочим примером:

Name [MAATRIX] Мой сервер
Map PEI
MaxPlayers 24
Owner 76561198012345678
Port 27015
GSLT ВАШ_ТОКЕН

Config.json, в отличие от Commands.dat, — обычный JSON, и здесь одной лишней запятой достаточно, чтобы парсер упал при старте, часто без явного указания, в каком файле проблема. Прогони его через валидатор перед тем, как копать дальше:

python3 -m json.tool Config.json

Если валидатор ругается — он покажет примерную строку. Частые причины: ручная правка в редакторе с «умными кавычками» вместо обычных, обрыв файла при копировании по FTP на середине записи, или добавленный параметр без запятой перед следующим полем. Если конкретную ошибку найти не получается — переименуй файл (не удаляй, сохрани как бэкап) и дай серверу сгенерировать чистый конфиг заново при следующем запуске, а нужные значения перенеси туда вручную. Помни и общее правило: редактировать конфиги нужно только при остановленном сервере — работающий процесс может перезаписать файл своими значениями при выключении и стереть правки.

Поднять сервер Unturned за пару минут

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

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

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

Сервер запускается, но не виден в списке серверов внутри игры.

В девяти случаях из десяти это отсутствующий или неверный GSLT-токен — без него сервер считается анонимным. Проверь steamcommunity.com/dev/managegameservers и строку GSLT в Commands.dat.

Лог вообще не создаётся, даже пустой.

Значит, до инициализации движка дело не доходит: проверяй права на ServerHelper.sh, CRLF-переносы строк в самом скрипте и наличие 32-битных библиотек на Linux-хосте.

После обновления игры сервер перестал запускаться.

Первым делом прогони app_update 1110390 validate — после патча файлы дедика могли обновиться частично, особенно если апдейт прерывался.

SteamAPI_Init() failed — что это значит?

Обычно бинарник не находит нужные Steam-библиотеки или запущен не из рабочей директории сервера. Запускай строго через ServerHelper.sh, он сам выставляет нужные переменные окружения.

Сервер стартует локально, но падает как systemd-сервис.

Почти всегда дело в WorkingDirectory unit-файла — он должен указывать на папку установки, а не на домашний каталог пользователя.