MAATRIX GAMES / Блог / Squad: краш при загрузке плагина или кастомной карты

Squad: краш при загрузке плагина или кастомной карты

MAATRIX GAMES

Сервер работал ровно, ты закинул новый кастомный слой в ротацию или поставил плагин на SquadJS — и через пару минут либо сам SquadGameServer тихо умирает, либо RCON отваливается, а часть игроков зависает на бесконечном экране загрузки. Хуже всего то, что в Squad это не один и тот же процесс: есть родной движок сервера (Unreal Engine 4) и есть SquadJS — отдельный Node.js-инструмент, который живёт своей жизнью и крашится по совсем другим причинам. Разберём методику: как понять, где реально упало, как бинарным поиском вычислить виновника среди модов и плагинов, как сверить кастомный слой у сервера и у клиентов и куда смотреть, если дело в недостающих зависимостях.

Сначала пойми: где именно упало — движок сервера или SquadJS

Прежде чем что-то отключать, важно понять, какой процесс реально умер — это резко сужает круг подозреваемых и экономит время, потому что чинить их приходится по-разному.

SquadGameServer исчез из списка процессов, игроков выкинуло всех разом. Это краш самого движка — виноват мод (загруженный через -mods=), битый или незарегистрированный кастомный слой, либо повреждённый файл контента. Проверяй так:

systemctl status squad-server
ps aux | grep -i squadgame

Игроки продолжают играть, матч не прерывался, но RCON перестал отвечать, вебхуки в Discord замолчали, а статистика/логи чата больше не пишутся. Это упал не сервер, а SquadJS — отдельный процесс, который подключается к серверу через RCON и парсинг логов. Матч он не рушит, но теряется всё, что завязано на его плагины (античит-статистика, авторотация карт, автобан по словам). Проверяй в зависимости от того, как у тебя запущен SquadJS — через pm2 или отдельный systemd-юнит:

pm2 status squadjs
# или
systemctl status squadjs

Игроки виснут на загрузке конкретного слоя, а SquadGameServer в ps aux всё ещё жив. Это чаще не краш сервера вовсе, а рассинхрон контента у клиента — сервер ждёт загрузку карты, но у части игроков нет актуальной версии мода/слоя. Переходи сразу к разделу про сверку версии карты.

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

Логируем консоль и SquadJS до следующего краша

Для самого игрового сервера всегда держи флаг -log в параметрах запуска — без него часть диагностической информации в текстовый лог просто не попадает:

./SquadGameServer.sh Port=7787 QueryPort=27165 -log

Лог пишется в SquadGame/Saved/Logs/ (для UE4-серверов это, как правило, файл вида SquadGame.log — точное имя может отличаться от билда к билду, смотри, что реально появилось в папке после старта). Если сервер поднят через systemd (см. гайд по установке Squad), после падения сразу проверь и системный журнал:

journalctl -u squad-server --since "2 hours ago" | grep -iE "fatal|assert|error|crash"

LowLevelFatalError и Assertion failed — типичные строки, которыми UE4 отмечает падение движка на кривом ассете или несовместимом коде мода; ищи их в последних 50-100 строках перед обрывом, а не в начале файла.

Для SquadJS диагностика проще — это обычный Node.js-процесс, и при необработанном исключении в консоль (или в файл лога, если так настроено) летит стандартный JS-стектрейс с именем файла плагина:

pm2 logs squadjs --lines 200
# или
journalctl -u squadjs -f

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

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

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

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

Метод исключения: моды сервера и плагины SquadJS по одному

Моды и total conversion-контент на Squad-сервере грузятся через параметр запуска -mods=<id1>,<id2>,... со списком Steam Workshop ID — это правится прямо в ExecStart systemd-юнита:

# /etc/systemd/system/squad-server.service
ExecStart=/home/squadserver/squad-server/SquadGame/Binaries/Linux/SquadGameServer.sh Port=7787 QueryPort=27165 -log -mods=123456789

Чтобы исключить мод — убери его ID из строки, перечитай юнит и перезапусти:

sudo systemctl daemon-reload
sudo systemctl restart squad-server

Если модов немного (2-5) — отключай по одному в порядке от последнего добавленного, свежие изменения первый подозреваемый. Если список длинный — дели пополам: убрал половину ID, воспроизвёл ситуацию — если краш пропал, виновник там, если остался — в оставшейся половине. Повторяй, сужая круг.

Плагины SquadJS проверяются заметно быстрее и без риска для идущего матча — они настраиваются в конфиге SquadJS (обычно config.json в его рабочей папке) отдельным блоком на каждый плагин. Закомментируй или удали блок подозреваемого плагина и перезапусти именно процесс SquadJS, а не игровой сервер:

pm2 restart squadjs

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

Кастомный слой: регистрация, версия и контент карты

Если краш или зависание привязаны к конкретному кастомному слою, первым делом проверь регистрацию — движок должен знать о слое заранее. Файл Layers.cfg (в части версий и модовых фреймворков — LayerList.cfg, сверяйся с тем, что реально лежит в SquadGame/ServerConfig/) — это реестр: слой, не прописанный там, сервер либо не увидит вовсе, либо попытается загрузить неполные данные и упадёт на переходе. Подробно про саму регистрацию слоёв — в статье про кастомные миссии для Squad.

Дальше — версия контента. Кастомные слои чаще всего идут как часть мода, скачанного через Steam Workshop, и рассинхрон версий у сервера и у клиентов — частая причина именно зависания на загрузке, а не мгновенного краша. Сверь контрольную сумму актуально скачанного контента с тем, что реально лежит в кэше сервера:

cd ~/steamcmd
./steamcmd.sh +login anonymous +workshop_download_item 393380 <workshopID> +quit
sha256sum ~/Steam/steamapps/workshop/content/393380/<workshopID>/*.pak

(393380 — Steam App ID клиента Squad, используется для обращения к Workshop; не путай с 403240 — app id самого дедикейтед-сервера, про который подробно в гайде по установке сервера).

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

Недостающие зависимости и рассинхрон версий

У Squad есть несколько мест, где недостающая зависимость выглядит как «случайный» краш, хотя причина вполне конкретная:

  • ID мода не указан в -mods=, а слой на него ссылается. Если ты добавил слой в Layers.cfg/MapRotation.cfg, но забыл прописать ID соответствующего мода в параметрах запуска — движок при попытке смонтировать ассеты слоя не найдёт нужный пакет и упадёт, а не просто откажет с понятной ошибкой.
  • FactionRotation.cfg не расширен под нестандартную связку фракций. Кастомные слои с необычными комбинациями сторон требуют явной записи в этом файле — без неё жеребьёвка фракций на слое может подставить не ту сторону, для которой мод собирался, и это тоже иногда роняет загрузку.
  • Мод собран под предыдущий крупный патч игры. После обновления Squad часть классов и структур движка может измениться, и мод, не пересобранный автором под новую версию, падает с LowLevelFatalError прямо на монтировании ассетов. Проверяй дату последнего обновления мода на странице Workshop против даты патча игры, прежде чем ставить его на боевой сервер.
  • SquadJS не совпадает по версии с текущим патчем сервера. После крупных обновлений протокол RCON или формат логов иногда чуть меняются, и устаревшая сборка SquadJS начинает либо не подключаться, либо падать на парсинге незнакомой строки лога. Сверяйся с release notes SquadJS на GitHub при каждом крупном патче Squad.

Частые причины по опыту

Если метод исключения ещё не запущен, а разобраться хочется быстрее — вот на что чаще всего падает грех:

  • Свежий кастомный слой без обкатки на закрытом тестовом сервере. Самая частая история — слой добавили в паблик-ротацию сразу после скачивания, не прогнав его хотя бы раз с закрытой группой (подробно об этом — в статье про кастомные миссии).
  • Кэш Workshop на сервере не обновился вслед за автором мода. Особенно часто ловится, если мод обновляется прямо посреди активной ротации, а перекачка контента настроена только на плановый рестарт раз в сутки.
  • Плагин SquadJS падает на редком ивенте. Например, парсинг нестандартного символа в никнейме игрока или необычного формата killfeed-сообщения — такие баги вылезают не сразу, а через недели стабильной работы, когда наконец происходит нужное сочетание событий.
  • Пропущенная строка при копировании конфигов с другого сервера. Если ты переносил Layers.cfg/MapRotation.cfg с одного своего сервера на другой и забыл синхронно перенести список ID модов в -mods= — получаешь слой, который вроде бы прописан, но без нужного контента.
  • Одновременная замена мода и обновление SquadJS в один заход. Как и с любым сервером — если поменял сразу несколько компонентов, а потом что-то упало, ты лишаешь себя возможности быстро понять, к чему привязан краш. Меняй по одному с проверкой между шагами.

Если параллельно администрируешь ещё и сервер на другом движке — общая методика чтения логов и краш-репортов разобрана в статье про логи и краш-репорты, а базовая настройка самого Squad-сервера — в гайде по установке.

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

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

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

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

Как быстро понять — упал сам сервер или просто SquadJS?

Проверь ps aux | grep -i squadgame: если процесс жив и игроки в матче — дело в SquadJS, смотри его лог отдельно. Если процесса нет вовсе — это краш движка, ищи виновника среди модов и слоёв.

Можно ли тестировать плагины SquadJS без рестарта основного игрового сервера?

Да, и это стоит делать в первую очередь — SquadJS работает поверх RCON и логов как отдельный процесс, его рестарт не трогает идущий матч. Бисекцию плагинов SquadJS можно гонять прямо во время игры, в отличие от модов сервера.

Сервер крашится только на конкретном кастомном слое — с чего начать разбор?

Сначала проверь регистрацию слоя в Layers.cfg, затем сверь контрольную сумму .pak-файлов мода в кэше сервера с актуальной версией из Workshop. Рассинхрон версии — самая частая причина именно точечного краша на одном слое.

Restart=on-failure в systemd спасает от даунтайма при таком краше?

Спасает от долгого простоя — сервис поднимется заново через RestartSec, но не лечит первопричину. Если виновник мод или слой, сервер будет падать по кругу при каждом заходе на ту же карту, пока ты его не найдёшь и не уберёшь из ротации.

Нужно ли писать автору мода или плагина, если нашёл виновника?

Стоит, приложив точный стектрейс или строки из SquadGame/Saved/Logs/ — если автор ещё поддерживает контент, это ускорит фикс для всех, кто его использует. Для давно заброшенных модов быстрее поискать замену в Workshop, чем ждать ответа.