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 <cursoragent@cursor.com>
This commit is contained in:
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@@ -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/
|
||||||
43
Dockerfile
Normal file
43
Dockerfile
Normal file
@@ -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"]
|
||||||
82
README.md
Normal file
82
README.md
Normal file
@@ -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. Улучшена стабильность запуска контейнеров
|
||||||
|
|
||||||
107
docker-compose.yml
Normal file
107
docker-compose.yml
Normal file
@@ -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"
|
||||||
34
players/p1_config/apps.json
Normal file
34
players/p1_config/apps.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
34
players/p2_config/apps.json
Normal file
34
players/p2_config/apps.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
34
players/p3_config/apps.json
Normal file
34
players/p3_config/apps.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
34
players/p4_config/apps.json
Normal file
34
players/p4_config/apps.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user