MAATRIX GAMES / Блог / SteamCMD: установка и обновление игровых серверов

SteamCMD: установка и обновление игровых серверов

MAATRIX GAMES

Если сервер построен на Steam — а это большинство сборок в нашем каталоге, от Rust до ARK и CS2 — рано или поздно вы упрётесь в SteamCMD. Это консольная утилита Valve, через которую скачиваются и обновляются дедик-сборки без графического Steam-клиента. Разберём, как её поставить, какими командами пользоваться и как не остаться с сервером на старой версии, пока игроки уже обновились.

Что такое SteamCMD и зачем он нужен

SteamCMD — это облегчённый консольный клиент Steam, который умеет ровно то, что нужно администратору: логиниться, скачивать конкретное приложение по его App ID и класть файлы в указанную папку. Никакого интерфейса, никакого overlay — только команды. Именно через него разработчики публикуют dedicated-server билды отдельных игр как отдельные Steam-приложения (со своим App ID, отличным от клиентской версии игры), и именно SteamCMD их скачивает.

Практически у каждой игры на Source, Unity или Unreal, которая продаётся в Steam и поддерживает выделенные серверы, есть depot с серверной сборкой. Установка вручную через SteamCMD — это то, что происходит "под капотом" у любой панели управления (Pterodactyl, AMP и подобные) или у автоматического деплоя хостера, когда вы нажимаете "создать сервер". Понимать эти команды полезно, даже если вы обычно работаете через панель — рано или поздно понадобится ручной апдейт, откат на бету или диагностика, почему сервер не встал.

Установка SteamCMD на Linux

На Debian/Ubuntu (самый частый случай для игровых серверов) сначала нужно включить архитектуру i386 — сама утилита и часть серверных бинарников до сих пор 32-битные:

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install lib32gcc-s1 lib32stdc++6 ca-certificates curl -y

Дальше — сам SteamCMD. Ставить его стоит от отдельного непривилегированного пользователя, а не от root: так и безопаснее, и панели вроде Pterodactyl ожидают именно такую структуру.

sudo useradd -m -s /bin/bash steam
sudo su - steam
mkdir -p ~/steamcmd && cd ~/steamcmd
curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" -o steamcmd.tar.gz
tar -xvzf steamcmd.tar.gz
rm steamcmd.tar.gz

На CentOS/RHEL/AlmaLinux процесс отличается: нужно подключить репозиторий EPEL и репозиторий Steam с 32-битными пакетами, дальше yum install steamcmd или та же ручная распаковка архива — в зависимости от дистрибутива есть нюансы с именами пакетов glibc.i686. Если сомневаетесь, какой путь у вашего дистрибутива — Ubuntu/Debian с ручной распаковкой архива работает предсказуемее всего и меньше всего ломается при апгрейде системы.

Первый запуск скачает сам SteamCMD и обновит его — это нормально, подождите:

./steamcmd.sh +quit

Если всё прошло без ошибок, вы увидите приглашение Steam> и сможете выходить командой quit.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

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

Базовые команды: login, app_update, force_install_dir

Вся логика SteamCMD строится на нескольких командах, которые можно передавать как в интерактивном режиме, так и одной строкой через флаги +.

Для абсолютного большинства игровых серверов авторизация не нужна — используется анонимный вход:

login anonymous

Реальный Steam-аккаунт с покупкой игры нужен только для небольшого числа серверных сборок, которые физически привязаны к купленной копии игры (например, некоторые модовые сборки ARK или отдельные early access тайтлы) — в таких случаях login anonymous выдаст ошибку доступа, и придётся логиниться под своим аккаунтом, что для арендованного сервера обычно неудобно и небезопасно (лучше уточнять у хостера, поддерживается ли игра через анонимный вход, ещё до заказа).

Ключевая команда — app_update, ей передаётся App ID нужной игры:

force_install_dir /home/steam/rust
app_update 258550 validate

Порядок важен: force_install_dir указывается ДО app_update, иначе SteamCMD скачает файлы в дефолтную папку ~/Steam/steamapps/common/. Флаг validate заставляет SteamCMD сверить контрольные суммы всех файлов с манифестом — полезно при первой установке или подозрении на битую сборку, но замедляет процесс, поэтому в рутинных обновлениях его обычно опускают.

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

./steamcmd.sh +login anonymous +force_install_dir /home/steam/rust +app_update 258550 +quit

Несколько App ID для игр из нашего каталога, которые пригодятся чаще всего (актуальность на конец августа 2026 — Valve иногда меняет ID при крупных релизах, поэтому перед боевым обновлением сверяйтесь с SteamDB):

ИграApp ID сервера
Rust258550
7 Days to Die294420
ARK: Survival Evolved376030
Project Zomboid380870
Team Fortress 2232250
Left 4 Dead 2222860

Для игр, у которых сервер не строится на Source/GoldSrc (например, часть игр на Unreal Engine или собственных движках), процесс может отличаться — некоторые студии выкладывают серверный билд не через SteamCMD, а отдельным архивом на сайте или через Steam Workshop-подобный механизм. Уточняйте по конкретной игре в официальной вики или на форуме разработчика, если app_update с ожидаемым ID не находит приложение.

Скрипт автоматического обновления сервера

Ручной запуск команды каждый раз — не вариант, если серверов несколько или вы хотите обновляться регулярно без присутствия за клавиатурой. Универсальный shell-скрипт, который можно адаптировать под любую игру, меняя только App ID и путь:

#!/bin/bash
# update_server.sh — обновление игрового сервера через SteamCMD

STEAMCMD_DIR="/home/steam/steamcmd"
INSTALL_DIR="/home/steam/rust"
APP_ID="258550"
LOG_FILE="/home/steam/logs/update-$(date +%F).log"

mkdir -p "$(dirname "$LOG_FILE")"

echo "[$(date)] Старт обновления App ID $APP_ID" >> "$LOG_FILE"

"$STEAMCMD_DIR/steamcmd.sh" \
  +force_install_dir "$INSTALL_DIR" \
  +login anonymous \
  +app_update "$APP_ID" \
  +quit >> "$LOG_FILE" 2>&1

if grep -q "Success! App" "$LOG_FILE"; then
  echo "[$(date)] Обновление успешно" >> "$LOG_FILE"
else
  echo "[$(date)] ВНИМАНИЕ: возможна ошибка обновления, проверьте лог" >> "$LOG_FILE"
fi

Сделайте его исполняемым и проверьте вручную перед тем, как ставить в расписание:

chmod +x update_server.sh
./update_server.sh
tail -f /home/steam/logs/update-$(date +%F).log

Если сервер во время обновления должен быть выключен (а для большинства игр это обязательно — SteamCMD не умеет обновлять файлы, занятые запущенным процессом), добавьте в скрипт остановку и запуск сервера до и после блока с steamcmd.sh. Способ остановки зависит от того, как у вас поднят сервер — через systemd unit, screen/tmux-сессию или менеджер вроде supervisor; логику мягкого рестарта после обновления можно частично переиспользовать из подхода в статье про автоматический рестарт по расписанию через cron.

Автозапуск обновления через cron

Регулярную проверку обновлений удобнее всего повесить на cron — он есть в любом Linux-дистрибутиве и не требует дополнительных зависимостей. Открываем crontab пользователя, от которого работает сервер:

crontab -e

И добавляем строку, например, для проверки каждый день в 6 утра по времени сервера:

0 6 * * * /home/steam/update_server.sh >> /home/steam/logs/cron.log 2>&1

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

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

Синхронизация версий: почему игроки не могут зайти после патча

Самая частая жалоба после выхода патча — "не подключается к серверу" при том, что сервер вроде бы работает. Причина почти всегда одна: клиентская версия игры (которая обновляется у игроков автоматически через Steam) и серверная сборка разошлись по номеру версии или билда. Игровые протоколы почти никогда не гарантируют обратную совместимость между версиями — движок сверяет build ID или хеш протокола при рукопожатии и обрывает подключение ещё до входа в лобби.

Отсюда практическое правило: если разработчик выкатил патч клиенту (а Steam обновляет игры у игроков автоматически, если не отключено вручную), сервер нужно обновить как можно быстрее — в идеале в течение часа-двух после релиза патча, а не по расписанию раз в сутки. Для игр с активным community и частыми патчами (Rust с еженедельным форс-вайпом, CS2) многие админы держат отдельный screen/tmux с открытым SteamCMD именно для того, чтобы среагировать вручную сразу, как только увидят анонс патча, не дожидаясь cron.

Обратная ситуация тоже случается: после крупных обновлений иногда стоит ненадолго задержать апдейт сервера, если патч выходит "сырым" и комьюнити сообщает о критичных багах в первые часы — тогда игроки всё равно смогут зайти только после того, как сами обновят клиент, так что нет смысла торопиться, если явно ожидается hotfix в течение суток. Здесь помогает мониторинг официальных каналов игры (Discord, Steam news) — SteamCMD это не сделает за вас.

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

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

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

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

SteamCMD не запускается, пишет ошибку про libstdc++ или "32 bit"?

Почти всегда не хватает 32-битных библиотек. На Debian/Ubuntu проверьте, что архитектура i386 добавлена (dpkg --add-architecture i386) и пакеты lib32gcc-s1, lib32stdc++6 установлены, затем повторите apt update.

Можно ли обновлять сервер без остановки, "на горячую"?

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

Как откатиться на предыдущую версию, если новый патч сломал сервер?

Через параметр -beta в app_update, если разработчик держит старые билды в бета-ветках депо (это делают не все студии). Точные названия доступных веток смотрите на странице приложения в SteamDB, вкладка Depots.

SteamCMD скачивает файлы очень медленно, что делать?

Иногда помогает смена региона загрузки: @sSteamCmdForcePlatformType linux и явное указание сервера загрузки не всегда доступны напрямую, но если сеть у хостинга близко к дата-центрам Steam CDN — скорость обычно и так близка к максимуму канала; постоянно низкая скорость чаще говорит об ограничении на стороне сети хостера, а не о SteamCMD.

Нужен ли реальный Steam-аккаунт для покупки игры, чтобы поставить сервер?

Нет, для подавляющего большинства серверных сборок — login anonymous полностью достаточно, отдельное серверное Steam-приложение бесплатно и не требует владения игрой.