Как установить и запустить сервер CS2 на Debian и Ubuntu

Как установить сервер CS2 на Debian и Ubuntu: подготовка пакетов, установка SteamCMD, получение токена Steam, настройка конфигурации и портов. Команды для первого запуска, обновления сервера и работы через screen, Docker и Docker Compose.

13 октября 2026 г.Asomiru12 мин чтения

Начнем с установки пакетов и подготовки отдельного пользователя. Затем скачаем SteamCMD и файлы CS2, получим токен Steam, настроим сервер и подключимся к нему из игры. В конце разберем запуск через screen, Docker и Docker Compose, чтобы сервер продолжал работать после закрытия SSH.

Команды рассчитаны на Debian и Ubuntu с архитектурой amd64. Для новой машины можно взять Debian 13 или Ubuntu 24.04 LTS. Потребуется доступ по SSH и пользователь с правами sudo. Если вы вошли как root, выполняйте административные команды без sudo.

Пакеты Debian и Ubuntu

Обновим список пакетов и установим необходимые библиотеки вместе с утилитами для работы с сервером:

sudo apt update
sudo apt install -y \
  curl git ca-certificates tar gzip nano screen \
  lib32gcc-s1 lib32stdc++6 libstdc++6 \
  file procps iproute2 ufw openssl

curl скачает архив SteamCMD, tar и gzip его распакуют. ca-certificates нужен для проверки HTTPS-соединений. Через nano будем править конфиги, через screen запускать сервер в отдельной терминальной сессии. file, procps и iproute2 пригодятся при проверке библиотек, процессов и портов.

SteamCMD использует 32-битные библиотеки даже на 64-битной системе. Для них устанавливаем lib32gcc-s1 и lib32stdc++6. В этом варианте установки добавлять архитектуру i386 в dpkg не требуется. Инструкция SteamCMD отдельно указывает lib32gcc-s1 для Debian и Ubuntu.

git самому серверу не нужен. Он пригодится, если позже захотите скачать исходники плагина или хранить конфигурацию в репозитории. Токены и пароли в такой репозиторий добавлять нельзя.

Проверим архитектуру, свободное место и память:

dpkg --print-architecture
df -h /home
free -h

Первая команда должна вывести amd64. Для небольшой установки разумно оставить 100 ГБ свободного места на SSD и 8 ГБ памяти. Это запас для игры, обновлений, логов и дополнительных карт, а не точное требование Valve. Нагрузку по процессору нужно проверять с реальным числом игроков: количество ядер само по себе не говорит, насколько хорошо сервер будет работать.

Пользователь steam

Создадим учетную запись для SteamCMD и игрового процесса:

sudo adduser --disabled-password --gecos "" steam
sudo -iu steam

Теперь работаем от пользователя steam. Его домашний каталог находится в /home/steam. Установка игры и изменение ее файлов дальше выполняются без sudo.

Так у игрового процесса не будет административных прав на систему.

SteamCMD и файлы CS2

Подготовим каталог и распакуем SteamCMD прямо из архива Valve:

mkdir -p "$HOME/steamcmd"
cd "$HOME/steamcmd"
set -o pipefail
curl -sqL "https://client-update.steamstatic.com/installer/steamcmd_linux.tar.gz" | tar zxvf -

Параметр pipefail позволяет оболочке учитывать ошибку скачивания в цепочке команд. Если архив не распаковался, сначала исправьте ошибку curl или tar.

При первом запуске SteamCMD скачает собственные обновления:

./steamcmd.sh +quit

Установим CS2 в /home/steam/cs2:

mkdir -p "$HOME/cs2"
./steamcmd.sh \
  +force_install_dir "$HOME/cs2" \
  +login anonymous \
  +app_update 730 validate \
  +quit

Для CS2 используется App ID 730. Каталог установки задаем перед входом в SteamCMD. validate проверяет целостность файлов. Скачивание может занять заметное время, поэтому дождитесь сообщения об успешной установке. Порядок установки описан в документации сервера CS2.

Проверим наличие стартового скрипта:

ls -l "$HOME/cs2/game/cs2.sh"

Для Steamworks подготовим ссылку на 64-битную библиотеку SteamCMD:

mkdir -p "$HOME/.steam/sdk64"
ln -sfn "$HOME/steamcmd/linux64/steamclient.so" \
  "$HOME/.steam/sdk64/steamclient.so"
file -L "$HOME/.steam/sdk64/steamclient.so"

file должен определить 64-битный ELF-файл. Если вместо этого он сообщает, что файла нет, проверьте результат первого запуска SteamCMD и наличие steamcmd/linux64/steamclient.so. Библиотека из linux32 для этого пути не подходит.

Токен Steam

Для регистрации сервера в Steam понадобится Game Server Login Token, или GSLT. Откройте управление аккаунтами игровых серверов Steam, войдите в свой аккаунт и создайте запись с App ID 730. В заметке можно написать название сервера.

На этой странице Steam также перечисляет требования к аккаунту: он должен владеть игрой, иметь подходящий зарегистрированный телефон и не быть ограниченным, заблокированным или забаненным сообществом. Для каждой одновременно работающей копии сервера используйте отдельный токен.

Сохраним GSLT в отдельном конфиге, чтобы не вписывать его в команду запуска и историю оболочки:

umask 077
nano "$HOME/cs2/game/csgo/cfg/steam-token.cfg"

Вставьте одну строку и замените значение в кавычках своим токеном:

sv_setsteamaccount "PASTE_GSLT_HERE"

Сохраните файл через Ctrl+O, нажмите Enter и выйдите через Ctrl+X. Затем задайте права:

chmod 600 "$HOME/cs2/game/csgo/cfg/steam-token.cfg"

server.cfg

Основной конфиг создадим в каталоге game/csgo/cfg:

nano "$HOME/cs2/game/csgo/cfg/server.cfg"

Для первого запуска достаточно следующих настроек:

hostname "CS2 Server"
sv_lan 0
sv_password ""
sv_cheats 0
rcon_password ""
tv_enable 0
log on

hostname задает название сервера. Пустой sv_password разрешает вход без пароля. Для закрытых матчей впишите в него пароль, который передадите игрокам. sv_lan 0 задает работу через интернет, sv_cheats 0 запрещает чит-команды.

RCON в примере оставлен с пустым паролем. Если понадобится удаленное управление, создайте случайный пароль:

openssl rand -hex 24

Полученное значение можно записать как rcon_password в steam-token.cfg. У этого файла уже ограничены права доступа. Не используйте для RCON пароль от Steam или SSH.

Настройки правил матча лучше хранить в конфиге выбранного режима. Например, для Competitive создайте game/csgo/cfg/gamemode_competitive_server.cfg. Штатный gamemode_competitive.cfg оставьте для файлов игры: обновление или проверка целостности может восстановить его содержимое.

Порт 27015

Команды этого раздела выполняйте под администратором в отдельном SSH-подключении.

Для подключения игроков откроем UDP-порт 27015. На новой машине, где UFW еще не настроен, сначала разрешите SSH. Здесь показан стандартный порт 22; если SSH работает на другом порту, укажите его:

sudo ufw allow 22/tcp
sudo ufw allow 27015/udp
sudo ufw enable
sudo ufw status

Если UFW уже используется, добавьте игровое правило в действующую конфигурацию. Разрешения для других сервисов должны быть настроены до его включения. Синтаксис правил приведен в документации Ubuntu.

Для RCON можно отдельно разрешить TCP-порт 27015 только с адреса администратора:

sudo ufw allow from 203.0.113.20 to any port 27015 proto tcp

Замените 203.0.113.20 своим внешним IP. Если RCON не используется, это правило не требуется.

У хостинга может быть собственный сетевой экран. В нем тоже нужно разрешить UDP 27015. Если машина стоит за роутером, настройте проброс этого UDP-порта на ее локальный адрес. При CGNAT обычного проброса на домашнем роутере недостаточно: потребуется доступный извне адрес или другой способ доставки трафика.

Первый запуск

Вернемся в SSH-сессию пользователя steam:

cd "$HOME/cs2/game"
./cs2.sh \
  -dedicated \
  -console \
  -usercon \
  -port 27015 \
  -maxplayers 10 \
  +game_type 0 \
  +game_mode 1 \
  +exec steam-token.cfg \
  +map de_dust2 \
  +exec server.cfg

На Linux используем именно cs2.sh. Скрипт настраивает окружение для загрузки библиотек; запуск через него рекомендован в инструкции Valve.

В примере выбран Competitive, карта de_dust2 и лимит 10 игроков. Пару game_type и game_mode можно заменить:

Режим game_type game_mode
Casual 0 0
Competitive 0 1
Wingman 0 2
Deathmatch 1 2

Эти значения приведены в таблице игровых режимов, которая описывает CS:GO и CS2. Параметры режима указываем до загрузки карты.

После запуска дождитесь загрузки карты и регистрации сервера в Steam. В серверной консоли выполните:

status

Для подключения откройте консоль разработчика в самой игре и введите:

connect 203.0.113.10:27015

Здесь 203.0.113.10 нужно заменить внешним IP сервера. Если задан sv_password, сначала выполните в консоли игры команду password с вашим паролем.

При проблемах с подключением проверьте на машине сервера, слушается ли UDP-порт:

sudo ss -lunp 'sport = :27015'

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

Для остановки введите quit в консоли сервера. Этот первый запуск привязан к текущему терминалу. Для постоянной работы выберите один из способов ниже.

Обновление файлов

Перед обновлением остановите сервер. Под пользователем steam сохраните конфиги:

umask 077
tar -C "$HOME/cs2/game/csgo" \
  -czf "$HOME/cs2-cfg-$(date +%Y%m%d-%H%M%S).tar.gz" cfg

Затем запустите SteamCMD:

"$HOME/steamcmd/steamcmd.sh" \
  +force_install_dir "$HOME/cs2" \
  +login anonymous \
  +app_update 730 \
  +quit

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

Запуск в screen

screen оставляет терминальную сессию работающей после отключения от SSH. Он удобен, когда нужен доступ к серверной консоли. Автоматический запуск после перезагрузки машины и перезапуск упавшего процесса нужно настраивать отдельно.

Чтобы каждый раз не набирать параметры, создадим стартовый файл под пользователем steam:

nano "$HOME/start-cs2.sh"

Содержимое файла:

#!/usr/bin/env bash
set -euo pipefail

cd /home/steam/cs2/game

exec ./cs2.sh \
  -dedicated \
  -console \
  -usercon \
  -port 27015 \
  -maxplayers 10 \
  +game_type 0 \
  +game_mode 1 \
  +exec steam-token.cfg \
  +map de_dust2 \
  +exec server.cfg

Зададим права и запустим сервер:

chmod 700 "$HOME/start-cs2.sh"
screen -S cs2 "$HOME/start-cs2.sh"

Чтобы выйти из screen и оставить сервер работающим, нажмите Ctrl+A, отпустите клавиши и нажмите D. После этого можно закрыть SSH.

При следующем подключении перейдите к пользователю steam и вернитесь в консоль:

sudo -iu steam
screen -r cs2

Список сессий показывает screen -ls. Если сессия осталась прикрепленной к старому терминалу, используйте screen -d -r cs2. Для остановки сервера в его консоли введите quit. Эти команды и сочетания клавиш описаны в руководстве screen.

Запуск в Docker

Контейнерный вариант использует образ joedwards32/cs2. Это сторонний проект с открытыми исходниками. Он скачивает игру и проверяет обновления при запуске. Его можно использовать как отдельный способ установки: предварительно скачивать CS2 на хост через SteamCMD не требуется.

Если вы уже запустили сервер напрямую или через screen, остановите его перед запуском контейнера на том же порту.

Docker установим под администратором. Следующий блок предназначен для Debian или Ubuntu без установленного Docker. При готовой установке достаточно проверить доступность docker и docker compose.

Подключим официальный репозиторий:

. /etc/os-release
docker_distro="$ID"
docker_suite="${UBUNTU_CODENAME:-$VERSION_CODENAME}"

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL \
  "https://download.docker.com/linux/${docker_distro}/gpg" \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/${docker_distro}
Suites: ${docker_suite}
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
sudo apt install -y \
  docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-world
sudo docker compose version

Этот способ установки основан на документации Docker для Debian и Ubuntu. Старые пакеты docker.io или docker-compose не следует смешивать с пакетами из этого репозитория.

Подготовим отдельный каталог для контейнерной установки:

sudo install -d -m 0755 -o "$(id -un)" -g "$(id -gn)" /srv/cs2-docker
cd /srv/cs2-docker
mkdir -p data
sudo chown 1000:1000 data
umask 077
nano .env

Образ использует UID 1000 для игрового процесса. Каталог data должен быть доступен ему для записи. В .env укажем параметры:

SRCDS_TOKEN=PASTE_GSLT_HERE
CS2_SERVERNAME=CS2 Server
CS2_PORT=27015
CS2_LAN=0
CS2_RCONPW=REPLACE_WITH_RANDOM_PASSWORD
CS2_PW=
CS2_MAXPLAYERS=10
CS2_GAMETYPE=0
CS2_GAMEMODE=1
CS2_STARTMAP=de_dust2
TV_ENABLE=0

Замените GSLT и пароль RCON. Для пароля подойдет вывод openssl rand -hex 24. При необходимости впишите пароль для игроков в CS2_PW.

chmod 600 .env
sudo docker pull joedwards32/cs2:latest
sudo docker run -d -i -t \
  --name cs2 \
  --init \
  --restart unless-stopped \
  --stop-timeout 30 \
  --env-file /srv/cs2-docker/.env \
  --mount type=bind,src=/srv/cs2-docker/data,dst=/home/steam/cs2-dedicated \
  --publish 27015:27015/udp \
  --publish 127.0.0.1:27015:27015/tcp \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  joedwards32/cs2:latest

Игровой UDP-порт опубликован для внешних подключений. TCP-порт RCON доступен на хосте через 127.0.0.1; для управления извне можно использовать SSH-туннель. SourceTV отключен, поэтому его порт здесь не публикуется.

Docker создает собственные сетевые правила. При публикации портов обычные ограничения UFW могут не применяться так, как при запуске процесса на хосте. Внешние ограничения доступа задавайте с учетом сетевых правил Docker или через сетевой экран хостинга.

Посмотреть загрузку игры и сообщения сервера:

sudo docker logs --tail 100 -f cs2

Ctrl+C завершит просмотр логов, контейнер продолжит работать. Для входа в серверную консоль:

sudo docker attach --sig-proxy=false cs2

Выход из attach без остановки контейнера: Ctrl+P, затем Ctrl+Q.

Команды остановки и повторного запуска:

sudo docker stop cs2
sudo docker start cs2

Для загрузки обновлений игры:

sudo docker restart cs2

Файлы игры остаются в /srv/cs2-docker/data. Конфиги находятся в data/game/csgo/cfg. Основные параметры, перечисленные в .env, меняйте через .env. Чтобы применить изменение этого файла к контейнеру, его нужно пересоздать с той же командой docker run; обычный restart не перечитывает env-file.

Запуск через Docker Compose

Compose сохранит параметры контейнера в файле. Используем тот же каталог /srv/cs2-docker, файл .env и данные из предыдущего примера.

Если контейнер cs2 уже создан через docker run, остановите и удалите его перед переходом:

sudo docker stop cs2
sudo docker rm cs2

Каталог data при этом сохраняется.

Создадим файл:

cd /srv/cs2-docker
nano compose.yaml

Его содержимое:

services:
  cs2:
    image: joedwards32/cs2:latest
    container_name: cs2
    init: true
    restart: unless-stopped
    stop_grace_period: 30s
    stdin_open: true
    tty: true
    env_file:
      - .env
    ports:
      - "27015:27015/udp"
      - "127.0.0.1:27015:27015/tcp"
    volumes:
      - ./data:/home/steam/cs2-dedicated
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Проверим конфигурацию без вывода токена и запустим сервер:

sudo docker compose config --quiet
sudo docker compose up -d
sudo docker compose logs --tail 100 -f cs2

Пример с параметрами этого образа также есть в репозитории проекта.

Для остановки и следующего запуска:

sudo docker compose stop cs2
sudo docker compose start cs2

После изменения .env примените новые значения:

sudo docker compose up -d --force-recreate cs2

Для обновления игры достаточно перезапуска сервиса. Чтобы отдельно обновить контейнерный образ, выполните pull и up:

sudo docker compose restart cs2
sudo docker compose pull
sudo docker compose up -d

Политика unless-stopped возвращает работающий контейнер после перезапуска Docker или машины, если вы не остановили его вручную. После ручной остановки сервер останется выключенным до следующего start или up. Поведение описано в документации Docker.

Перед изменением образа или конфигов сохраните .env и каталог data/game/csgo/cfg. Игровые файлы, конфигурация и записи матчей в data переживут пересоздание контейнера, пока сам каталог остается на диске.

← Блог