Сервер CS2 на VPS: SteamCMD, тикрейт и защита от DDoS
TL;DR
В этом руководстве мы развернём выделенный Linux-сервер Counter-Strike 2 на Ubuntu 24.04 LTS с помощью SteamCMD, настроим игровой режим, параметры запуска, systemd и firewall, а также разберём ограничения тикрейта и защиту от DDoS. Для небольшой компании обычно достаточно 4 vCPU, 8 ГБ RAM, NVMe-диска и порта 1 Гбит/с, но от volumetric DDoS защищает только upstream-провайдера.
- Используем отдельного системного пользователя
steam, а не запускаем CS2 от root. - Устанавливаем сервер из официальной SteamCMD-инфраструктуры через App ID
730. - Настраиваем порт игры, RCON, hostname, карты, режимы и автоматический запуск через systemd.
- Учитываем, что CS2 использует subtick-модель: один параметр
-tickrate 128не превращает VPS в «128-tick сервер». - Открываем только необходимые UDP-порты и отдельно проверяем, есть ли у хостинга DDoS-фильтрация.
- Создаём резервные копии конфигурации, server files и пользовательских данных, если используются плагины или статистика.
1. TL;DR
CS2-сервер на VPS подходит для закрытых матчей, тренировок, игровых сообществ и небольших турниров. Ключевые параметры — производительность одного или нескольких быстрых CPU-ядер, низкая задержка до игроков, стабильная сеть и наличие фильтрации DDoS на стороне дата-центра.
Пошаговая установка начинается с чистого Ubuntu-сервера. После установки SteamCMD сервер загружает файлы CS2, запускается от отдельного пользователя и управляется командами systemd. Конфигурация хранится отдельно от бинарных файлов, поэтому обновления можно выполнять с минимальным риском потери настроек.
2. Содержание
Статья построена как практический сценарий: сначала определяется конфигурация VPS, затем выполняется базовая защита SSH, устанавливается SteamCMD и CS2, после чего добавляются конфиги, автозапуск, firewall, резервное копирование и диагностика.
Команды рассчитаны на Ubuntu Server 24.04 LTS в 2026 году. Если используется Debian или другая Linux-система, названия пакетов и расположение SteamCMD могут отличаться. Перед выполнением команд замените домены, IP-адреса и пароли-заглушки на собственные значения.
3. Что мы настраиваем и зачем
Каким будет результат
В конце получится отдельный CS2 Dedicated Server, доступный игрокам по адресу вида 203.0.113.10:27015. Он будет запускаться автоматически после перезагрузки, перезапускаться при аварийном завершении и принимать обновления через SteamCMD.
На сервере можно использовать стандартные режимы Competitive, Casual, Deathmatch и Arms Race, а также конфигурации для тренировок. Для расширенных сценариев применяются серверные расширения и плагины, например SourceMod и MetaMod:Source. Их следует устанавливать только из проверенных источников: сторонние плагины получают доступ к игровому процессу и могут содержать уязвимости.
| Компонент | Назначение | Где хранится |
|---|---|---|
| SteamCMD | Загрузка и обновление файлов сервера | /opt/steamcmd |
| CS2 Dedicated Server | Игровой процесс | /srv/cs2 |
| Конфигурации | Порты, режимы, карты и правила | /srv/cs2/game/csgo/cfg |
| systemd unit | Автозапуск и рестарт | /etc/systemd/system/cs2.service |
| Логи | Диагностика запусков и ошибок | journald и файлы CS2 |
Self-hosted против управляемого игрового сервера
Облачный игровой хостинг экономит время: панель сама создаёт инстанс, устанавливает обновления и иногда предлагает готовую DDoS-защиту. Недостатки — ограниченный доступ к Linux, платные дополнительные слоты, привязка к конкретным модам и меньший контроль над логами и сетью.
Self-hosted CS2 на VPS даёт полный доступ к systemd, firewall, файловой системе, мониторингу и автоматизации. Это удобно, если сервер является частью собственной инфраструктуры или требуется нестандартный режим. Ответственность за обновления, резервные копии, секреты и сетевую безопасность при этом лежит на владельце.
Что не следует путать
Игровой Dedicated Server не является обычным клиентом Steam. На сервере не запускают графический интерфейс, Steam-клиент или рабочий стол. Для подключения игроки используют установленную у себя игру CS2, а серверу нужен только набор dedicated server-файлов и сетевой доступ.
Также сервер CS2 не обязан иметь HTTPS. Игровой протокол использует UDP, а TLS применяют для панели управления, API, веб-статистики или healthcheck-сервиса. Не стоит ставить веб-панель на тот же публичный порт, на котором работает игровой сервер.
4. Какой VPS-конфиг нужен под эту задачу
Минимальные требования
Для 5–10 игроков на стандартной карте технически может хватить 2 vCPU и 4 ГБ RAM, но такая конфигурация оставляет мало запаса для обновлений, мониторинга и фоновых процессов. Для стабильной игры лучше начинать с 4 vCPU, 8 ГБ RAM и быстрым NVMe-диском.
| Сценарий | CPU | RAM | Диск | Сеть |
|---|---|---|---|---|
| Личный сервер до 5 игроков | 2 быстрых vCPU | 4 ГБ | 40 ГБ NVMe | 100 Мбит/с |
| 10–12 игроков | 4 vCPU | 8 ГБ | 60 ГБ NVMe | 1 Гбит/с |
| 20 игроков или плагины | 6–8 vCPU | 12–16 ГБ | 80–120 ГБ NVMe | 1 Гбит/с |
| Несколько инстансов | 8–16 выделенных vCPU | 16–32 ГБ | 160 ГБ и больше | 1 Гбит/с и выше |
Важнее номинального количества ядер — частота и предсказуемость CPU. Игровой сервер чувствителен к задержкам одного потока, поэтому 4 быстрых ядра без сильного overselling часто лучше, чем 8 медленных shared-vCPU. Уточните у провайдера, используются ли dedicated CPU, какова политика oversubscription и есть ли ограничения на PPS.
Практичная конфигурация
Для одного сервера на 10–12 игроков можно взять подходящий VPS с 4 vCPU, 8 ГБ RAM, 80 ГБ NVMe, публичным IPv4, виртуализацией KVM и сетевым портом 1 Гбит/с. Желательно иметь консоль провайдера, снапшоты, обратный DNS и возможность заменить или добавить IPv6.
Диск нужен не только для текущих файлов CS2. Обновления могут временно занимать дополнительное место, а логи, дампы, плагины и архивы быстро увеличивают объём. Оставляйте минимум 25–30% свободного пространства и не храните единственную копию бэкапа на том же диске.
Когда выбирать dedicated
Dedicated-сервер оправдан, если нужны несколько игровых инстансов, большой постоянный онлайн, предсказуемая производительность или одновременно работают базы данных, веб-сервисы и системы статистики. Физические ядра уменьшают влияние соседей и позволяют точнее закрепить CPU affinity.
Для одного небольшого CS2-сервера dedicated обычно избыточен. Он имеет смысл не из-за самого слова «игровой», а из-за требований к количеству инстансов, стабильности нагрузки и пропускной способности. Если проблема только в DDoS, покупка мощнее не решает её: нужен upstream-фильтр, а не дополнительные ядра.
Выбор локации
Размещайте сервер ближе к большинству игроков и проверяйте маршрут от их интернет-провайдеров. Расстояние влияет на RTT, а перегруженные международные каналы могут давать потери пакетов даже при хорошем ping до соседнего региона.
До заказа выполните тесты до IP тестового сервера в нескольких подходящих дата-центрах с помощью ping, mtr и, при возможности, UDP-теста. Идеальный результат — стабильная задержка без потерь, а не минимальное среднее значение одного измерения.
5. Подготовка сервера
Обновление системы и базовые пакеты
Подключитесь к VPS под первоначальным пользователем, который имеет sudo. Укажите в командах собственное имя хоста. Сначала обновим индекс пакетов и установим утилиты для SSH, firewall, диагностики и резервного копирования.
# Задаём понятное имя сервера
sudo hostnamectl set-hostname cs2-01
# Обновляем пакеты и устанавливаем базовые инструменты
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y ca-certificates curl wget gnupg unzip tar \
lib32gcc-s1 lib32stdc++6 tmux ufw fail2ban htop iotop \
net-tools dnsutils mtr-tiny jq restic
После обновления проверьте версию ядра и свободное место. Если обновилось ядро, перезагрузите сервер в согласованное окно обслуживания.
# Проверяем ОС, ядро, память и диск
cat /etc/os-release
uname -r
free -h
df -h /
# Перезагрузка нужна, если обновилось ядро или системные библиотеки
sudo reboot
Отдельный пользователь и SSH-ключ
Не запускайте SteamCMD и CS2 от root. Создайте пользователя steam с домашним каталогом и отдельного административного пользователя, если его ещё нет. Для администрирования используйте SSH-ключ Ed25519, а парольный вход отключайте только после проверки нового ключа.
# Создаём системного пользователя для игровых файлов
sudo adduser --disabled-password --gecos "" steam
# При необходимости создаём администратора
sudo adduser deploy
sudo usermod -aG sudo deploy
# Создаём каталог SSH для deploy
sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
На локальном компьютере сгенерируйте ключ, если его ещё нет, и скопируйте публичную часть на сервер.
# Выполняется на вашем локальном компьютере
ssh-keygen -t ed25519 -C "cs2-admin"
# Замените адрес на IP сервера
ssh-copy-id [email protected]
# Проверьте новый вход в отдельном окне
ssh [email protected]
После успешного входа создайте drop-in для SSH. Не отключайте текущую сессию, пока не проверите новую.
# Разрешаем только ключевую аутентификацию
sudo tee /etc/ssh/sshd_config.d/10-hardening.conf > /dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
EOF
# Проверяем синтаксис и перечитываем конфигурацию
sudo sshd -t && sudo systemctl reload ssh
Firewall и fail2ban
Для игры обычно нужен UDP-порт 27015. TCP-порт на том же номере иногда требуется для отдельных функций или инструментов, но открывайте его только при необходимости. SSH разрешите до включения политики deny.
# Разрешаем SSH и игровой порт
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 27015/udp
sudo ufw allow 27015/tcp
# Включаем firewall и проверяем правила
sudo ufw --force enable
sudo ufw status verbose
# Включаем защиту SSH от перебора паролей
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Если SSH работает на нестандартном порту, замените правило 22/tcp. Изменение номера порта само по себе не является серьёзной защитой, но уменьшает количество автоматического мусорного сканирования. Реальная защита — ключи, запрет root и ограничение доступа по IP или VPN.
6. Установка ПО — пошагово
Шаг 1. Подготовка каталогов
SteamCMD доступен как пакет Ubuntu и как архив от Valve. Пакет проще обслуживать и подходит для стандартной установки. Игровые файлы разместим отдельно, чтобы обновлять их без изменения системных каталогов.
# Создаём каталоги и назначаем владельца steam
sudo install -d -m 755 -o steam -g steam /opt/steamcmd
sudo install -d -m 755 -o steam -g steam /srv/cs2
sudo install -d -m 755 -o steam -g steam /var/log/cs2
# Разрешаем steam читать и обновлять собственные файлы
sudo chown -R steam:steam /opt/steamcmd /srv/cs2 /var/log/cs2
Шаг 2. Установка SteamCMD
На Ubuntu 24.04 пакет SteamCMD может находиться в компоненте multiverse. Версия SteamCMD не фиксируется как версия CS2: при запуске утилита сама получает актуальные файлы клиента.
# Включаем репозиторий multiverse с 32-битными библиотеками
sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
# Устанавливаем SteamCMD и необходимые runtime-библиотеки
sudo apt install -y steamcmd lib32gcc-s1 lib32stdc++6
# Копируем запускатель в отдельный каталог
sudo cp -a /usr/games/steamcmd /opt/steamcmd/steamcmd.sh
sudo chown -R steam:steam /opt/steamcmd
Убедитесь, что бинарник запускается от пользователя steam.
# Проверяем запуск SteamCMD без root
sudo -u steam /opt/steamcmd/steamcmd.sh +quit
Шаг 3. Загрузка CS2 Dedicated Server
Для dedicated server используется App ID 730. В зависимости от текущей политики Valve серверные файлы могут загружаться через anonymous login. Если SteamCMD потребует авторизацию, используйте отдельную Steam-учётную запись без ценных предметов и не храните пароль в shell history.
# Загружаем или обновляем сервер CS2 в /srv/cs2
sudo -u steam /opt/steamcmd/steamcmd.sh \
+force_install_dir /srv/cs2 \
+login anonymous \
+app_update 730 validate \
+quit
Параметр validate проверяет локальные файлы и может значительно увеличить время обновления. Для обычного регулярного обновления достаточно app_update 730. После загрузки проверьте наличие запускаемого файла и объём каталога.
# Проверяем основные каталоги и размер установки
sudo -u steam find /srv/cs2/game/bin -maxdepth 2 -type f | head
du -sh /srv/cs2
ls -la /srv/cs2/game/csgo/cfg
Шаг 4. Скрипт запуска
Параметры запуска вынесем в отдельный файл. Это упрощает обновление systemd unit и исключает длинную команду из нескольких мест. Для приватного сервера задайте пароль через переменную окружения или файл с правами 600; не публикуйте его в конфигурации, которая попадает в Git.
# Создаём файл переменных с ограниченным доступом
sudo install -o steam -g steam -m 600 /dev/null /srv/cs2/cs2.env
# Записываем базовые параметры сервера
sudo tee /srv/cs2/cs2.env > /dev/null <<'EOF'
CS2_PORT=27015
CS2_HOSTNAME=Private CS2 Server
CS2_RCON_PASSWORD=CHANGE_THIS_TO_A_LONG_RANDOM_SECRET
CS2_TOKEN=
EOF
sudo chown steam:steam /srv/cs2/cs2.env
sudo chmod 600 /srv/cs2/cs2.env
Сгенерируйте длинный секрет без пробелов и подставьте его вместо временного значения.
# Генерируем случайный пароль для RCON
openssl rand -base64 32
Шаг 5. systemd unit
Сервис запускается в рабочем каталоге игры. Параметры -dedicated, -console, -usercon и +game_type являются практичной базой для стандартного сервера. Конкретные игровые режимы можно менять через конфигурационные файлы и команды.
# Создаём systemd-сервис CS2
sudo tee /etc/systemd/system/cs2.service > /dev/null <<'EOF'
[Unit]
Description=Counter-Strike 2 Dedicated Server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=steam
Group=steam
WorkingDirectory=/srv/cs2
EnvironmentFile=/srv/cs2/cs2.env
ExecStart=/bin/bash -lc 'exec /srv/cs2/game/bin/linuxsteamrt64/cs2 -dedicated -console -usercon -port ${CS2_PORT} +hostname "${CS2_HOSTNAME}" +map de_dust2 +game_type 0 +game_mode 1'
Restart=on-failure
RestartSec=10
LimitNOFILE=1048576
Nice=-5
UMask=0027
[Install]
WantedBy=multi-user.target
EOF
# Перечитываем unit-файлы и включаем автозапуск
sudo systemctl daemon-reload
sudo systemctl enable --now cs2
# Проверяем статус и последние сообщения
sudo systemctl status cs2 --no-pager
sudo journalctl -u cs2 -n 80 --no-pager
Путь к бинарнику может измениться в будущих обновлениях CS2. Если systemd сообщает, что файл не найден, выполните поиск:
# Находим актуальный бинарный файл сервера
sudo -u steam find /srv/cs2/game -type f -name 'cs2' -o -name 'cs2_linux64'
Шаг 6. Обновление через отдельный скрипт
Не запускайте SteamCMD одновременно с работающим сервером: обновление может заменить библиотеки во время игрового процесса. Используйте maintenance window, остановите службу, обновите файлы и запустите её снова.
# Создаём безопасный скрипт обновления CS2
sudo tee /usr/local/sbin/update-cs2 > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
systemctl stop cs2
runuser -u steam -- /opt/steamcmd/steamcmd.sh \
+force_install_dir /srv/cs2 \
+login anonymous \
+app_update 730 \
+quit
systemctl start cs2
systemctl --no-pager --full status cs2
EOF
# Ограничиваем запуск скрипта администраторами
sudo chmod 750 /usr/local/sbin/update-cs2
sudo chown root:root /usr/local/sbin/update-cs2
# Выполняем обновление вручную
sudo /usr/local/sbin/update-cs2
7. Конфигурация
Основной игровой конфиг
Создайте файл server.cfg. CS2 читает его из каталога game/csgo/cfg. Секрет RCON лучше не хранить в репозитории, но для штатной загрузки игрового конфига он должен быть доступен процессу. Безопаснее передавать его через отдельный файл с правами 600 и ограничить доступ к серверу.
# Создаём каталог конфигурации
sudo install -d -o steam -g steam -m 750 /srv/cs2/game/csgo/cfg
# Создаём базовый конфиг сервера
sudo -u steam tee /srv/cs2/game/csgo/cfg/server.cfg > /dev/null <<'EOF'
hostname "Private CS2 Server"
sv_cheats 0
sv_lan 0
sv_hibernate_when_empty 0
sv_hibernate_postgame_delay 0
sv_hibernate_ms 0
mp_autoteambalance 1
mp_limitteams 1
mp_freezetime 12
mp_roundtime 1.92
mp_roundtime_defuse 1.92
mp_maxrounds 24
mp_c4timer 40
mp_buytime 20
mp_buy_anywhere 0
mp_startmoney 800
mp_restartgame 0
sv_logfile 1
sv_log_onefile 0
sv_logbans 1
sv_logecho 1
EOF
# Ограничиваем запись конфигурации пользователем steam
sudo chown steam:steam /srv/cs2/game/csgo/cfg/server.cfg
sudo chmod 640 /srv/cs2/game/csgo/cfg/server.cfg
Название карты de_dust2 в systemd можно заменить на другую карту. Для ручной смены карты через консоль используется команда changelevel de_mirage. Не добавляйте в публичный сервер sv_cheats 1: это изменяет правила игры и может повлиять на доверие игроков.
Режимы и тикрейт
В CS2 используется архитектура subtick. В классическом понимании tickrate — число полных обновлений состояния мира в секунду. В subtick-системе сервер дополнительно учитывает точное время действий между сетевыми тиками, поэтому сравнение «64 против 128» уже не описывает весь процесс обработки ввода.
Параметр -tickrate 128 иногда встречается в старых руководствах и конфигурациях. Он не гарантирует, что сервер будет работать как прежний 128-tick сервер, а в актуальной версии игры часть поведения контролируется самим движком. Не подменяйте измерение качества сети этим параметром.
Проверяйте сервер по нескольким показателям:
- стабильность RTT у игроков;
- отсутствие packet loss и резких скачков jitter;
- загрузка одного CPU-потока без постоянного упора в 100%;
- отсутствие server hitches и задержек обработки;
- корректная работа выбранного игрового режима.
Для соревновательного сервера не устанавливайте сомнительные «tickrate-патчи». Они могут ломать обновления, противоречить текущей архитектуре CS2 или создавать несовместимость с клиентами. Сначала обновите сервер до текущей версии и сравните результат на чистой конфигурации без плагинов.
GSLT и публичный сервер
Для публичного игрового сервера может потребоваться Game Server Login Token. Токен связывает сервер с аккаунтом и используется в соответствии с правилами Steam. Не публикуйте его в чатах, Git, systemd unit и общедоступных логах. Если токен скомпрометирован, отзовите его и создайте новый.
Храните токен в /srv/cs2/cs2.env или в отдельном файле с правами 600. Точная переменная и способ передачи могут зависеть от текущей версии server launcher, поэтому проверяйте актуальный вывод запуска и документацию Valve перед публичным размещением.
Проверка процесса и порта
# Проверяем службу и процесс CS2
systemctl is-active cs2
pgrep -a cs2
# Проверяем, слушается ли UDP-порт
sudo ss -lunp | grep 27015
# Проверяем загрузку CPU и памяти
ps -eo pid,user,pcpu,pmem,cmd --sort=-pcpu | head -n 10
free -h
Проверка UDP с другого компьютера сложнее, чем проверка TCP. Можно использовать Steam Server Browser, подключение из клиента CS2 и сетевой мониторинг провайдера. Команда nc -z для UDP не даёт надёжного подтверждения: отсутствие TCP-ответа не означает, что игровой UDP-порт закрыт.
Управление через RCON
RCON позволяет выполнять команды удалённо, но это дополнительная поверхность атаки. Используйте длинный пароль, не открывайте отдельный RCON-порт без необходимости и ограничивайте административный доступ по IP. Если требуется постоянное удалённое управление, безопаснее организовать доступ через WireGuard или административный bastion.
Не передавайте RCON-пароль в публичных скриптах. После изменения пароля перезапустите службу и проверьте, что старые подключения не сохраняются. Логи RCON регулярно просматривайте, особенно если сервер доступен из интернета.
HTTPS для мониторинга
Игровому протоколу CS2 не нужен Caddy или Certbot. HTTPS полезен только для отдельного веб-сервиса: например, healthcheck, страницы статистики или внутренней панели. Веб-сервис должен слушать localhost, а Caddy — принимать внешний трафик на 443 и автоматически получать сертификат для домена.
# Устанавливаем Caddy из официального Debian-репозитория пакетов
sudo apt install -y caddy
# Создаём простой healthcheck-файл
sudo install -d -o www-data -g www-data -m 755 /var/www/cs2
echo 'CS2 host is reachable' | sudo tee /var/www/cs2/index.html
# Задаём домен и корневой каталог сайта
sudo tee /etc/caddy/Caddyfile > /dev/null <<'EOF'
cs2-status.example.com {
root /var/www/cs2
file_server
header {
Cache-Control "no-store"
}
}
EOF
# Проверяем Caddy и перезапускаем его
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl enable --now caddy
sudo systemctl reload caddy
# Открываем только HTTPS для веб-статуса
sudo ufw allow 443/tcp
Для этого примера DNS-запись cs2-status.example.com должна указывать на IP VPS, а порты 80 и 443 должны быть доступны для выпуска и обновления сертификата. Не публикуйте через Caddy каталог /srv/cs2 целиком: в нём могут находиться логи, токены и конфигурации.
Защита от DDoS
DDoS бывает разным. Volumetric-атака забивает канал или порт множеством пакетов. Protocol attack расходует таблицы состояний и сетевые ресурсы. Application-level атака может создавать большое число легитимно выглядящих запросов к панели или API. UFW и fail2ban полезны против сканирования и перебора, но не остановят поток в десятки гигабит в секунду.
Проверяйте у провайдера следующие характеристики:
- есть ли постоянная upstream-фильтрация для UDP;
- какой объём атаки заявлен и измеряется ли он по битам, PPS или обоим параметрам;
- фильтруется ли игровой порт 27015, а не только веб-трафик;
- как быстро включается scrubbing и уведомляет ли провайдер о событии;
- можно ли сменить IP после атаки без длительного простоя;
- предоставляются ли NetFlow, графики трафика и журналы сетевых событий.
Не используйте прокси, предназначенные для HTTP, как универсальную защиту CS2: обычный CDN не проксирует игровой UDP-трафик. При серьёзной атаке правильная последовательность — сообщить в abuse/NOC, сохранить временные метрики, попросить включить фильтрацию и при необходимости перенести сервер на новый IP. Самостоятельное блокирование отдельных адресов помогает только против малых повторяющихся атак.
8. Бэкапы и обслуживание
Что сохранять
Чистые бинарные файлы CS2 обычно можно скачать заново, поэтому первыми в резервную копию попадают конфиги, systemd unit, переменные окружения, плагины, карты, логи аудита и данные статистики. Если используется база данных, её нужно экспортировать логически, а не копировать работающие файлы InnoDB или PostgreSQL без согласованного snapshot.
/srv/cs2/game/csgo/cfg— серверные настройки;/srv/cs2/cs2.env— секреты, в зашифрованном хранилище;/etc/systemd/system/cs2.service— автозапуск;- каталоги SourceMod, MetaMod, карт и пользовательских ресурсов;
- дампы баз данных, если они используются;
- список пакетов и собственные скрипты обновления.
Restic и внешнее хранилище
Для простого сценария используйте S3-совместимое внешнее хранилище. Переменные доступа держите в root-only файле, а пароль репозитория — отдельно. Внешнее хранилище должно находиться не на том же VPS и желательно в другом дата-центре.
# Создаём каталог с секретами restic
sudo install -d -m 700 /etc/restic
sudo tee /etc/restic/cs2.env > /dev/null <<'EOF'
export RESTIC_REPOSITORY='s3:https://s3.example.com/cs2-backups'
export AWS_ACCESS_KEY_ID='REPLACE_ME'
export AWS_SECRET_ACCESS_KEY='REPLACE_ME'
export RESTIC_PASSWORD='REPLACE_WITH_A_LONG_REPOSITORY_PASSWORD'
EOF
sudo chmod 600 /etc/restic/cs2.env
# Инициализируем репозиторий один раз
sudo bash -c 'source /etc/restic/cs2.env && restic init'
Создайте скрипт, который останавливает сервер только при необходимости. Для конфигов и плагинов достаточно короткого окна. Если на сервере есть динамические пользовательские данные, согласуйте момент копирования или используйте snapshot, предоставляемый хранилищем.
# Создаём скрипт ежедневного бэкапа
sudo tee /usr/local/sbin/backup-cs2 > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
source /etc/restic/cs2.env
restic backup \
/srv/cs2/game/csgo/cfg \
/srv/cs2/cs2.env \
/etc/systemd/system/cs2.service \
/usr/local/sbin/update-cs2 \
--tag cs2-config
restic forget \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
--prune
EOF
sudo chmod 700 /usr/local/sbin/backup-cs2
sudo chown root:root /usr/local/sbin/backup-cs2
# Проверяем резервное копирование вручную
sudo /usr/local/sbin/backup-cs2
sudo bash -c 'source /etc/restic/cs2.env && restic snapshots'
Планировщик cron
Запускайте бэкап ночью или в период минимального онлайна. Стандартный cron не сообщает об ошибках владельцу автоматически, поэтому добавьте лог в journald или настройте уведомление через внешний monitoring-сервис.
# Запускаем бэкап каждый день в 04:20
sudo tee /etc/cron.d/cs2-backup > /dev/null <<'EOF'
20 4 root /usr/local/sbin/backup-cs2 >> /var/log/cs2-backup.log 2>&1
EOF
sudo chmod 644 /etc/cron.d/cs2-backup
# Проверяем синтаксис заданий и журнал
sudo systemctl restart cron
sudo tail -n 30 /var/log/cs2-backup.log
Резервная копия считается рабочей только после тестового восстановления. Раз в месяц создайте временный каталог, восстановите туда конфиг и проверьте, что он читается, секреты доступны, а сервер может запуститься после чистой установки.
Обновления и maintenance window
Обновления CS2 могут включать изменения клиента и сервера, поэтому не обновляйте продуктивный инстанс прямо во время матча. Сначала выполните загрузку на тестовом VPS или после бэкапа, затем перезапустите сервер, проверьте порт, карту, плагины и подключение клиента.
Для одного инстанса подходит maintenance window длительностью 10–20 минут. Для нескольких серверов применяйте последовательное обновление: сначала тестовый, затем менее важный, потом основной. Полный rolling update невозможен без второго игрового инстанса, на который можно временно перевести игроков.
Минимальный мониторинг
Контролируйте доступность UDP-порта, состояние systemd, свободное место, RAM, CPU steal time и сетевой трафик. Аварийными порогами можно считать заполнение диска выше 80%, постоянный load average выше числа доступных ядер, рост packet loss и повторяющиеся рестарты службы.
# Полезные проверки перед началом игрового вечера
systemctl is-active --quiet cs2 && echo "CS2: OK" || echo "CS2: DOWN"
df -h /
free -h
sudo ss -s
sudo journalctl -u cs2 --since "1 hour ago" --no-pager | tail -n 80
9. Troubleshooting и FAQ
Сервер не запускается: «No such file or directory»
Сначала выполните systemctl status cs2 и просмотрите journalctl -u cs2 -n 100. Частая причина — изменившийся путь к бинарнику после обновления, отсутствие 32-битных библиотек или неправильный владелец каталога. Проверьте файл командой find /srv/cs2/game -type f, установите lib32gcc-s1 и запустите бинарник вручную от пользователя steam, чтобы увидеть исходную ошибку.
SteamCMD выдаёт ошибку загрузки или App ID не устанавливается
Проверьте DNS, исходящий HTTPS и свободное место: curl -I https://steamcdn-a.akamaihd.net, df -h. Запускайте SteamCMD от пользователя steam и указывайте +force_install_dir до +login. Если anonymous login больше не разрешён для конкретного сценария, используйте отдельную Steam-учётную запись без ценных предметов и не передавайте пароль через командную строку.
Игроки не видят сервер в списке
Проверьте, что служба активна и слушает именно публичный интерфейс: sudo ss -lunp | grep 27015. Затем проверьте правила UFW, security group и сетевой firewall в панели VPS. CS2 использует UDP, поэтому TCP-проверка не подтверждает доступность игры. Попробуйте прямое подключение по IP и порту из клиента, а не только поиск по имени.
Высокий ping или rubber-banding при низкой загрузке CPU
Это обычно проблема маршрута, packet loss, jitter или перегрузки канала, а не нехватка RAM. Сравните mtr от нескольких сетей игроков, графики трафика VPS и метрики packet loss. Проверьте соседнюю локацию, отключите тяжёлые плагины и убедитесь, что бэкап или обновление не насыщают исходящий канал. Если потери начинаются за пределами дата-центра, проблему должен исследовать провайдер.
Поможет ли параметр -tickrate 128?
Он не гарантирует классический 128-tick режим. Современный CS2 использует subtick-обработку, поэтому качество зависит от версии движка, нагрузки сервера, задержки и потерь пакетов. Не добавляйте параметр только потому, что он есть в старых гайдах. Сначала измерьте стабильность сервера на чистой конфигурации, затем тестируйте изменения на отдельном инстансе.
Какой VPS-конфиг минимально подойдёт?
Для личного сервера на несколько игроков минимально разумны 2 быстрых vCPU, 4 ГБ RAM, 40 ГБ NVMe и публичный IPv4. Для стабильной игры 10–12 человек лучше взять 4 vCPU, 8 ГБ RAM и порт 1 Гбит/с. Важны не только цифры: уточните наличие DDoS-фильтрации UDP, CPU steal time, ограничения PPS и географию дата-центра. Оставляйте запас диска и памяти под обновления и плагины.
Что выбрать — VPS или dedicated для этой задачи?
VPS подходит для одного сервера, небольшой группы игроков и умеренного числа плагинов. Dedicated стоит выбирать для нескольких инстансов, крупного сообщества, постоянной высокой нагрузки или когда необходимы гарантированные физические ядра. Однако dedicated не заменяет DDoS-защиту: при забитом внешнем канале одинаково недоступны и VPS, и физический сервер. Сначала определите требования к CPU и сети, затем сравните стоимость фильтрации.
UFW включён, но сервер всё равно недоступен
Проверьте порядок диагностики: sudo ufw status numbered, sudo ss -lunp, статус systemd и firewall/security group в панели провайдера. Убедитесь, что открыт UDP, а не только TCP, и что порт в systemd совпадает с портом в правиле UFW. Если используется IPv6, аналогичное правило должно быть разрешено и для IPv6 либо IPv6 следует корректно отключить, а не оставлять частично настроенным.
Как защититься от DDoS самостоятельно?
На самом сервере можно ограничить административные порты, отключить ненужные сервисы, настроить rate limiting для веб-панели и быстро блокировать очевидные источники мусорного трафика. Но это не остановит атаку, которая заполняет канал до VPS. Для UDP-игры нужна фильтрация на уровне сети провайдера или специализированный игровой scrubbing-сервис. Заранее сохраните контакты NOC и план смены IP, не полагайтесь только на iptables.
После обновления пропали плагины или настройки
Проверьте, не перезаписали ли вы каталог game/csgo собственной копией при восстановлении. Сравните владельцев и права: файлы должны быть доступны пользователю steam. Убедитесь, что плагины совместимы с текущей версией CS2 и MetaMod:Source. Если проблема появилась сразу после обновления, остановите сервер, восстановите конфиги из бэкапа и временно запустите чистую версию без расширений.
10. Выводы и следующие шаги
Мы получили управляемый CS2 Dedicated Server на Ubuntu 24.04 с установкой через SteamCMD, автозапуском systemd, базовыми игровыми конфигурациями, firewall и резервным копированием. Для качества игры важнее стабильный CPU, близкая локация и отсутствие потерь пакетов, чем формальное указание «128 tick».
Дальше стоит добавить внешний мониторинг, протестировать восстановление из Restic и оформить регламент обновлений. При росте онлайна можно вынести статистику и веб-панель на отдельный сервис, запустить второй игровой инстанс для maintenance window, а при постоянной высокой нагрузке перейти на dedicated с гарантированными ядрами и специализированной UDP DDoS-фильтрацией.