1. Подготовка окружения Ubuntu и создание оптимизированного Docker-образа для сервера CS 1.6
Подготовка окружения Ubuntu и создание оптимизированного Docker-образа для сервера CS 1.6
Добро пожаловать в курс DevOps для гейминга. Мы начинаем путь к созданию масштабируемой платформы для хостинга серверов Counter-Strike 1.6. Эта игра, несмотря на свой возраст, остается эталоном киберспортивных дисциплин и требует высокой стабильности и низкой задержки.
В этой первой статье мы заложим фундамент: подготовим операционную систему Ubuntu, разберемся с зависимостями старого движка GoldSrc и напишем Dockerfile, который позволит нам запускать серверы изолированно, безопасно и предсказуемо.
Зачем нам Docker для CS 1.6?
Традиционный запуск игровых серверов подразумевает ручную установку библиотек, скачивание файлов через SteamCMD и запуск скриптов в фоне (например, через screen). При масштабировании до 100 серверов этот подход превращается в администрирование хаоса. Конфликты портов, версий библиотек и сложность обновления — главные враги хостинг-провайдера.
Docker решает эти проблемы, предоставляя:
* Изоляцию: Каждый сервер живет в своем контейнере и не знает о существовании соседей. * Воспроизводимость: Образ, собранный один раз, будет работать одинаково на любом сервере. * Скорость: Развертывание нового экземпляра занимает секунды.
Шаг 1: Подготовка хост-системы Ubuntu
В качестве базовой ОС мы будем использовать Ubuntu 22.04 LTS или 24.04 LTS. Это стабильные релизы с длительной поддержкой. Перед тем как начать работу с Docker, необходимо оптимизировать саму систему.
Обновление и установка Docker
Сначала обновим индексы пакетов и установим необходимые утилиты:
Теперь установим Docker Engine. Рекомендуется использовать официальный репозиторий Docker, а не стандартный из Ubuntu, чтобы получать свежие версии:
Чтобы не писать sudo перед каждой командой Docker, добавим текущего пользователя в группу docker:
dockerfile
Используем легкий базовый образ Debian
FROM debian:bullseye-slimУстанавливаем метаданные
LABEL maintainer="admin@cs-hosting.com"Отключаем интерактивный режим при установке пакетов
ENV DEBIAN_FRONTEND=noninteractive1. Добавляем архитектуру i386 (32-бит)
2. Обновляем пакеты
3. Устанавливаем lib32gcc-s1 (критично для HLDS) и curl
4. Чистим кэш для уменьшения размера образа
RUN dpkg --add-architecture i386 && \ apt-get update && \ apt-get install -y --no-install-recommends \ lib32gcc-s1 \ lib32stdc++6 \ ca-certificates \ curl \ wget \ unzip && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*Создаем пользователя steam, чтобы не запускать сервер от root
RUN useradd -m -d /home/steam steam USER steam WORKDIR /home/steamСкачиваем SteamCMD
RUN mkdir steamcmd && \ cd steamcmd && \ curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -Устанавливаем сервер CS 1.6 (AppID 90)
Мы делаем это в одном слое RUN, чтобы зафиксировать файлы
+quit нужен для корректного выхода из steamcmd
RUN ./steamcmd/steamcmd.sh +force_install_dir /home/steam/cs16 \ +login anonymous \ +app_update 90 validate \ +quit || true # || true добавлен, так как steamcmd иногда возвращает код ошибки даже при успехеИсправление частой ошибки с steamclient.so
RUN mkdir -p /home/steam/.steam/sdk32 && \ ln -s /home/steam/steamcmd/linux32/steamclient.so /home/steam/.steam/sdk32/steamclient.soОткрываем порт по умолчанию
EXPOSE 27015/udpРабочая директория сервера
WORKDIR /home/steam/cs16Команда запуска по умолчанию
ENTRYPOINT ["./hlds_run"] CMD ["-game", "cstrike", "+maxplayers", "32", "+map", "de_dust2", "+port", "27015"] bash docker build -t cs16-server:v1 . bash docker run -d \ --name cs16-test \ -p 27015:27015/udp \ cs16-server:v1 \ -game cstrike +maxplayers 16 +map de_dust2 bash docker logs cs16-test ``Вы должны увидеть строчки вроде
Connection to Steam servers successful и VAC secure mode is activated`.Оптимизация размера образа
Получившийся образ может весить около 1 ГБ или больше. В будущих статьях мы рассмотрим использование Multi-stage builds, чтобы исключить сам SteamCMD из финального образа, оставив только скачанные файлы игры. Это позволит уменьшить размер и повысить безопасность, удалив инструменты загрузки из продакшн-контейнера.
Заключение
Мы успешно подготовили хост-систему и создали базовый Docker-образ для сервера CS 1.6. Теперь у нас есть "кирпичик", из которого мы будем строить нашу масштабируемую систему.
В следующей статье мы научимся управлять множеством таких контейнеров, использовать Docker Compose для локальной оркестрации и подготовим почву для автоматического развертывания через Telegram-бота.