SteamCMD: установка и обновление игровых серверов
Если сервер построен на 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 сервера |
|---|---|
| Rust | 258550 |
| 7 Days to Die | 294420 |
| ARK: Survival Evolved | 376030 |
| Project Zomboid | 380870 |
| Team Fortress 2 | 232250 |
| Left 4 Dead 2 | 222860 |
Для игр, у которых сервер не строится на 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-приложение бесплатно и не требует владения игрой.