Files
game-server/README.md
bilal 88b48e1796 Switch headless display stack to Xorg dummy.
Replace Xvfb with Xorg dummy and mount /run/udev so Sunshine virtual input devices target the streamed X session instead of the host console.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-19 02:48:28 +03:00

6.4 KiB
Raw Blame History

Game Server с использованием Sunshine и Steam

Этот проект предоставляет Docker-конфигурацию для запуска игрового сервера с использованием Sunshine и Steam, позволяя запускать игры на нескольких клиентах одновременно.

Структура проекта

  • Dockerfile - файл для создания Docker-образа с Sunshine и Steam
  • docker-compose.yml - конфигурация для запуска нескольких контейнеров
  • players/ - директория с конфигурациями и данными для каждого игрока
    • p1_config/, p2_config/, p3_config/, p4_config/ - конфигурации для каждого клиента
    • p1_steam/, p2_steam/, p3_steam/, p4_steam/ - данные Steam для каждого клиента

Особенности

  • Поддержка 4 одновременных клиентов
  • Использование NVIDIA GPU для ускорения работы
  • Автоматическое восстановление контейнеров
  • Healthcheck для мониторинга состояния
  • Логирование для отладки

Требования

  • Docker и Docker Compose
  • NVIDIA драйверы
  • NVIDIA Container Toolkit
  • 2x Tesla K80 (суммарно 4 GPU-чипа)

Установка

  1. Убедитесь, что у вас установлен Docker и Docker Compose

  2. Склонируйте репозиторий

  3. Настройте пути к папкам Steam в docker-compose.yml

  4. Проверьте назначение GPU-чипов в NVIDIA_VISIBLE_DEVICES:

    • player1 -> GPU 1
    • player2 -> GPU 2
    • player3 -> GPU 3
    • player4 -> GPU 4

    GPU 0 в этой конфигурации обычно занят отдельной видеокартой (например, Quadro) и не используется для игровых контейнеров.

  5. Запустите команду:

    docker-compose up -d
    

APT кэширующий прокси (опционально)

Если у вас есть apt-cacher-ng (например http://192.168.1.60:3142), можно ускорить сборку образов:

  1. Создайте .env рядом с docker-compose.yml:
    echo 'APT_PROXY=http://192.168.1.60:3142' > .env
    
  2. Пересоберите контейнеры:
    docker compose up -d --build
    

Прокси передается в Dockerfile через build-arg APT_PROXY и автоматически записывается в /etc/apt/apt.conf.d/01proxy при сборке.

Настройка

Конфигурация Sunshine

Конфигурационные файлы Sunshine находятся в директориях players/pX_config/:

  • apps.json - список установленных игр
  • credentials/ - SSL сертификаты

sunshine.conf не хранится в репозитории и генерируется Sunshine автоматически при первом запуске контейнера.

Steam Big Picture запускается от отдельного пользователя steam внутри контейнера. Данные Steam сохраняются в players/pX_steam и не теряются после перезапуска контейнеров/сервера.

Важно: для корректной обработки ввода из Moonlight в контейнерах используется Xorg dummy (вместо Xvfb) и проброс /run/udev в контейнер. Это нужно, чтобы виртуальные устройства ввода Sunshine попадали в тот же X-сеанс, который стримится.

Порты

В Moonlight при ручном добавлении указывается один адрес в формате IP:base_port.

base_port для каждого клиента:

  • player1 -> 47989 (можно просто IP, это дефолт)
  • player2 -> 48019
  • player3 -> 48049
  • player4 -> 48079

Порты проброшены для каждого клиента отдельно (формат: host:container):

  • player1
    • TCP: 47984-47990:47984-47990
    • TCP/UDP: 48010:48010
    • UDP: 47998-48000:47998-48000
  • player2
    • TCP: 48014-48020:47984-47990
    • TCP/UDP: 48040:48010
    • UDP: 48028-48030:47998-48000
  • player3
    • TCP: 48044-48050:47984-47990
    • TCP/UDP: 48070:48010
    • UDP: 48058-48060:47998-48000
  • player4
    • TCP: 48074-48080:47984-47990
    • TCP/UDP: 48100:48010
    • UDP: 48088-48090:47998-48000

Moonlight использует base_port и вычисляет остальные порты автоматически.

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

При первом запуске Steam скачивает и распаковывает клиент (может занять 10-20 минут, в зависимости от канала). В это время в Moonlight может отображаться пустой/черный рабочий стол.

Проверка прогресса для player1:

docker exec -it game-player-1 bash -lc 'tail -f /home/steam/.local/share/Steam/debian-installation/logs/bootstrap_log.txt'

После завершения первичной загрузки повторно откройте сессию Moonlight и запустите Steam Big Picture.

Если запуск Steam прерывается после выхода из терминала (Hangup), используйте лог:

docker exec -it game-player-1 bash -lc 'tail -f /home/steam/steam-app.log'

Отладка

Для проверки состояния контейнеров используйте:

docker-compose ps

Для просмотра логов:

docker-compose logs player1

Улучшения

  1. Добавлен healthcheck для лучшей стабильности
  2. Добавлено логирование для отладки
  3. Оптимизирован Dockerfile
  4. Улучшена стабильность запуска контейнеров