commit 95d7b24c73e86291959a7b863a048f3b667956d0 Author: bilal Date: Thu Jun 18 15:14:58 2026 +0300 Initial Docker-based game server setup for Sunshine and Steam. Configure multi-player containers with GPU pinning, Moonlight-ready ports, and baseline project documentation. Co-authored-by: Cursor diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc1cbfe --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +log +nvidia-smi* + +# local runtime data +players/*_steam/ +players/*_config/sunshine.conf + +# do not publish private Sunshine TLS keys +players/*_config/credentials/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..572c59a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +FROM ubuntu:22.04 + +# Отключаем интерактивные вопросы во время установки +ENV DEBIAN_FRONTEND=noninteractive + +# 1. Добавляем 32-битную архитектуру для Steam и базовые графические зависимости +RUN dpkg --add-architecture i386 && \ + apt-get update && apt-get install -y \ + xvfb fluxbox dbus-x11 xauth xfonts-base x11-xserver-utils \ + software-properties-common wget curl ca-certificates \ + libcap2-bin libgomp1 mesa-utils \ + libxcb-cursor0 libxcb-xinerama0 libxcb-xfixes0 libxcb-shape0 libxcb-randr0 libxcb-xtest0 \ + libxcb-x11-0 libxcb-render0 libxcb-render-util0 libxcb-util1 libxcb-keysyms1 \ + && add-apt-repository multiverse \ + && apt-get update + +# 2. Скачиваем оригинальный рабочий пакет Sunshine по вашей ссылке +# ВНИМАНИЕ: Замените маркер ниже на вашу ссылку из браузера, сохранив кавычки! +RUN wget "https://github.com/LizardByte/Sunshine/releases/download/v0.21.0/sunshine-ubuntu-22.04-amd64.deb" -O /tmp/sunshine.deb \ + && chmod +x /tmp/sunshine.deb + +# 3. Устанавливаем скачанный пакет и Steam со всеми зависимостями +RUN apt-get update && \ + echo "debconf steam/question select I AGREE" | debconf-set-selections \ + && apt-get install -y /tmp/sunshine.deb steam:i386 steam-devices \ + && rm -f /tmp/sunshine.deb \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# 4. Скрипт очищает сессию, поднимает виртуальный экран, fluxbox и запускает Sunshine +RUN echo '#!/bin/bash\n\ +rm -f /tmp/.X99-lock /tmp/.X11-unix/X99\n\ +Xvfb :99 -ac -screen 0 1920x1080x24 &\n\ +export DISPLAY=:99\n\ +export HOME=/root\n\ +sleep 3\n\ +fluxbox &\n\ +sleep 2\n\ +exec /usr/bin/sunshine' > /entrypoint.sh && chmod +x /entrypoint.sh \ + && chmod +x /entrypoint.sh + +USER root +ENTRYPOINT ["/entrypoint.sh"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c40f63 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# 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. Запустите команду: + ```bash + docker-compose up -d + ``` + +## Настройка + +### Конфигурация Sunshine + +Конфигурационные файлы Sunshine находятся в директориях `players/pX_config/`: +- `apps.json` - список установленных игр +- `credentials/` - SSL сертификаты + +`sunshine.conf` не хранится в репозитории и генерируется Sunshine автоматически при первом запуске контейнера. + +### Порты + +Каждый клиент использует следующие порты: +- TCP: 47984-47990 +- UDP: 47998-48000 + +Порты для каждого клиента отличаются для избежания конфликтов. + +## Отладка + +Для проверки состояния контейнеров используйте: +```bash +docker-compose ps +``` + +Для просмотра логов: +```bash +docker-compose logs player1 +``` + +## Улучшения + +1. Добавлен healthcheck для лучшей стабильности +2. Добавлено логирование для отладки +3. Оптимизирован Dockerfile +4. Улучшена стабильность запуска контейнеров + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..09bd169 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,107 @@ +x-game-template: &game-template + build: . + user: "root" + restart: unless-stopped + privileged: true + ipc: shareable + environment: + NVIDIA_DRIVER_CAPABILITIES: all + DISPLAY: ":99" + deploy: + resources: + limits: + cpus: '10' + memory: 28g + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu, compute, utility, video] + # Добавляем healthcheck для лучшей стабильности + healthcheck: + test: ["CMD", "pgrep", "sunshine"] + interval: 30s + timeout: 10s + retries: 3 + +services: + player1: + <<: *game-template + container_name: game-player-1 + environment: + NVIDIA_DRIVER_CAPABILITIES: all + DISPLAY: ":99" + NVIDIA_VISIBLE_DEVICES: "1" + RENDER_DEVICE_INDEX: "0" + ports: + - "47984-47990:47984-47990/tcp" + - "47998-48000:47998-48000/udp" + volumes: + - /DATA/AppData/game-server/players/p1_steam:/root/.local/share/Steam + - /DATA/AppData/game-server/players/p1_config:/root/.config/sunshine + # Добавляем логирование для отладки + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + player2: + <<: *game-template + container_name: game-player-2 + environment: + NVIDIA_DRIVER_CAPABILITIES: all + DISPLAY: ":99" + NVIDIA_VISIBLE_DEVICES: "2" + RENDER_DEVICE_INDEX: "0" + ports: + - "48014-48020:47984-47990/tcp" + - "48028-48030:47998-48000/udp" + volumes: + - /DATA/AppData/game-server/players/p2_steam:/root/.local/share/Steam + - /DATA/AppData/game-server/players/p2_config:/root/.config/sunshine + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + player3: + <<: *game-template + container_name: game-player-3 + environment: + NVIDIA_DRIVER_CAPABILITIES: all + DISPLAY: ":99" + NVIDIA_VISIBLE_DEVICES: "3" + RENDER_DEVICE_INDEX: "0" + ports: + - "48044-48050:47984-47990/tcp" + - "48058-48060:47998-48000/udp" + volumes: + - /DATA/AppData/game-server/players/p3_steam:/root/.local/share/Steam + - /DATA/AppData/game-server/players/p3_config:/root/.config/sunshine + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + player4: + <<: *game-template + container_name: game-player-4 + environment: + NVIDIA_DRIVER_CAPABILITIES: all + DISPLAY: ":99" + NVIDIA_VISIBLE_DEVICES: "4" + RENDER_DEVICE_INDEX: "0" + ports: + - "47974-47980:47984-47990/tcp" + - "47968-47970:47998-48000/udp" + volumes: + - /DATA/AppData/game-server/players/p4_steam:/root/.local/share/Steam + - /DATA/AppData/game-server/players/p4_config:/root/.config/sunshine + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" diff --git a/players/p1_config/apps.json b/players/p1_config/apps.json new file mode 100644 index 0000000..bde2842 --- /dev/null +++ b/players/p1_config/apps.json @@ -0,0 +1,34 @@ +{ + "env": { + "PATH": "$(PATH):$(HOME)/.local/bin" + }, + "apps": [ + { + "name": "Desktop", + "image-path": "desktop.png" + }, + { + "name": "Low Res Desktop", + "image-path": "desktop.png", + "prep-cmd": [ + { + "do": "xrandr --output HDMI-1 --mode 1920x1080", + "undo": "xrandr --output HDMI-1 --mode 1920x1200" + } + ] + }, + { + "name": "Steam Big Picture", + "detached": [ + "setsid steam steam://open/bigpicture" + ], + "prep-cmd": [ + { + "do": "", + "undo": "setsid steam steam://close/bigpicture" + } + ], + "image-path": "steam.png" + } + ] +} diff --git a/players/p2_config/apps.json b/players/p2_config/apps.json new file mode 100644 index 0000000..bde2842 --- /dev/null +++ b/players/p2_config/apps.json @@ -0,0 +1,34 @@ +{ + "env": { + "PATH": "$(PATH):$(HOME)/.local/bin" + }, + "apps": [ + { + "name": "Desktop", + "image-path": "desktop.png" + }, + { + "name": "Low Res Desktop", + "image-path": "desktop.png", + "prep-cmd": [ + { + "do": "xrandr --output HDMI-1 --mode 1920x1080", + "undo": "xrandr --output HDMI-1 --mode 1920x1200" + } + ] + }, + { + "name": "Steam Big Picture", + "detached": [ + "setsid steam steam://open/bigpicture" + ], + "prep-cmd": [ + { + "do": "", + "undo": "setsid steam steam://close/bigpicture" + } + ], + "image-path": "steam.png" + } + ] +} diff --git a/players/p3_config/apps.json b/players/p3_config/apps.json new file mode 100644 index 0000000..bde2842 --- /dev/null +++ b/players/p3_config/apps.json @@ -0,0 +1,34 @@ +{ + "env": { + "PATH": "$(PATH):$(HOME)/.local/bin" + }, + "apps": [ + { + "name": "Desktop", + "image-path": "desktop.png" + }, + { + "name": "Low Res Desktop", + "image-path": "desktop.png", + "prep-cmd": [ + { + "do": "xrandr --output HDMI-1 --mode 1920x1080", + "undo": "xrandr --output HDMI-1 --mode 1920x1200" + } + ] + }, + { + "name": "Steam Big Picture", + "detached": [ + "setsid steam steam://open/bigpicture" + ], + "prep-cmd": [ + { + "do": "", + "undo": "setsid steam steam://close/bigpicture" + } + ], + "image-path": "steam.png" + } + ] +} diff --git a/players/p4_config/apps.json b/players/p4_config/apps.json new file mode 100644 index 0000000..bde2842 --- /dev/null +++ b/players/p4_config/apps.json @@ -0,0 +1,34 @@ +{ + "env": { + "PATH": "$(PATH):$(HOME)/.local/bin" + }, + "apps": [ + { + "name": "Desktop", + "image-path": "desktop.png" + }, + { + "name": "Low Res Desktop", + "image-path": "desktop.png", + "prep-cmd": [ + { + "do": "xrandr --output HDMI-1 --mode 1920x1080", + "undo": "xrandr --output HDMI-1 --mode 1920x1200" + } + ] + }, + { + "name": "Steam Big Picture", + "detached": [ + "setsid steam steam://open/bigpicture" + ], + "prep-cmd": [ + { + "do": "", + "undo": "setsid steam steam://close/bigpicture" + } + ], + "image-path": "steam.png" + } + ] +}