# Как запустить игровой сервер?

## Цель и необходимость
Если честно, то я не игроман и к играм абсолютно равнодушен, но было интересно решить вопрос с играми с инженерной точки зрения. Также меня не устраивало, что мне могут диктовать, во что, когда и как играть.
Что имеем:
1. Возможность запускать игры на любом устройстве через механизм [Steam Remote Play](https://help.steampowered.com/ru/faqs/view/0689-74B8-92AC-10F2). Если коротко, то вся нагрузка ложится на основной хост-компьютер, и его роль может выполнять сервер с настроенной для работы видеокартой Nvidia и запущенным [Steam](https://ru.wikipedia.org/wiki/Steam).
```{mermaid}
---
title: Схема работы Steam Remote Play
---
flowchart TD
subgraph A [Хост-компьютер]
A1[Игра запущена]
A2[Кодирование видео/аудио]
end
subgraph B [Домашняя сеть]
direction LR
B1[Проводное
или Wi-Fi соединение]
end
subgraph C [Клиент-устройство]
C1[Декодирование
видео/аудио]
C2[Вывод на дисплей]
C3[Ввод с контроллера]
end
A1 --> A2
A2 -->|Потоковое видео| B
B -->|Данные| C1
C1 --> C2
C3 -->|Управление| B
B -->|Ввод| A
```
2. Единственный вопрос в этой схеме: "Как запустить Steam на Linux?". Таким образом, я нашел open-source проект [Steam-Headless/docker-steam-headless: A Headless Steam Docker image supporting NVIDIA GPU and accessible via Web UI](https://github.com/Steam-Headless/docker-steam-headless).
## docker-compose
Как установить драйверы Nvidia на Linux и сделать доступной видеокарту в Docker в отдельной VM Proxmox не описываю, можете найти эту информацию в соответствующей статье ниже.
Мой `docker-compose.yml`:
```yaml
services:
steam-headless:
image: josh5/steam-headless:latest
restart: unless-stopped
shm_size: ${SHM_SIZE}
ipc: host
ulimits:
nofile:
soft: 1024
hard: 524288
cap_add:
- NET_ADMIN
- SYS_ADMIN
- SYS_NICE
security_opt:
- seccomp:unconfined
- apparmor:unconfined
runtime: nvidia
network_mode: host
hostname: ${NAME}
extra_hosts:
- "${NAME}:127.0.0.1"
environment:
# System
- TZ=${TZ}
- USER_LOCALES=${USER_LOCALES}
- DISPLAY=${DISPLAY}
# User
- PUID=${PUID}
- PGID=${PGID}
- UMASK=${UMASK}
- USER_PASSWORD=${USER_PASSWORD}
# Mode
- MODE=${MODE}
# Web UI
- WEB_UI_MODE=${WEB_UI_MODE}
- ENABLE_VNC_AUDIO=${ENABLE_VNC_AUDIO}
- PORT_NOVNC_WEB=${PORT_NOVNC_WEB}
- NEKO_NAT1TO1=${NEKO_NAT1TO1}
# Steam
- ENABLE_STEAM=${ENABLE_STEAM}
- STEAM_ARGS=${STEAM_ARGS}
# Sunshine
- ENABLE_SUNSHINE=${ENABLE_SUNSHINE}
- SUNSHINE_USER=${SUNSHINE_USER}
- SUNSHINE_PASS=${SUNSHINE_PASS}
# Xorg
- ENABLE_EVDEV_INPUTS=${ENABLE_EVDEV_INPUTS}
- FORCE_X11_DUMMY_CONFIG=${FORCE_X11_DUMMY_CONFIG}
# Nvidia specific config
- NVIDIA_DRIVER_CAPABILITIES=${NVIDIA_DRIVER_CAPABILITIES}
- NVIDIA_VISIBLE_DEVICES=${NVIDIA_VISIBLE_DEVICES}
- NVIDIA_DRIVER_VERSION=${NVIDIA_DRIVER_VERSION}
devices:
- /dev/fuse
- /dev/uinput
device_cgroup_rules:
- 'c 13:* rmw'
volumes:
- ${HOME_DIR}:/home/default/:rw
- /mnt/media/games/:/mnt/games/:rw
- ${SHARED_SOCKETS_DIR}/.X11-unix/:/tmp/.X11-unix/:rw
- ${SHARED_SOCKETS_DIR}/pulse/:/tmp/pulse/:rw
```
Файл-шаблон с переменными необходимо скачивать [отсюда](https://github.com/Steam-Headless/docker-steam-headless/blob/master/docs/compose-files/.env) и он должен располагаться в 1 директории с `docker-compose.yml`. Важно помнить, что образ сначала попытается скачать драйвера с официального [сайта Nvidia](https://download.nvidia.com/XFree86/Linux-x86_64/), а потом будет их искать в дополнительном репозитории [для Flatpak](https://github.com/flathub/org.freedesktop.Platform.GL.nvidia/releases/).
Инструкции по запуску через docker-compose можно посмотреть также [тут](https://github.com/Steam-Headless/docker-steam-headless/blob/master/docs/docker-compose.md).
После запуска docker-compose переходим по адресу в браузере: `http://:8083` и должны увидеть экран удаленного стола с процессом установки всех компонентов для работы.

## Как играть?
1. Подключаем наше устройство ТВ/планшет (Android) к нашей локальной сети.
2. Устанавливаем на устройство [Steam Link](https://play.google.com/store/apps/details?id=com.valvesoftware.steamlink).
3. Подключаем джойстик к устройству.
4. Запускаем SteamLink и наш сервер должен быть найден этим устройством.

![]()
## Где и как искать игры?
Где и как искать игры не из Steam не описываю, но говорят, на части популярных торрент-трекерах появился раздел с играми на Linux.
Действия для игр не из Steam:
1. Возможность эффективной игры на Linux можно проверить через [protondb.com](https://www.protondb.com/)
2. Устанавливаем на сервер игру любым доступным способом.
3. Добавляем игру через Steam: Games -> Add Non-Steam game to My Library -> Выбираем файл запуска с игрой.
4. Картинки для игр можно искать на [ SteamGridDB](https://www.steamgriddb.com), чтобы игра была заполнена метаданными и мало чем отличалась от установленных со Steam игр.

5. Важно для каждой игры включить: Manage->Properties->Compatibility->Proton Hotfix. Что такое Proton от Valve можно увидеть [тут](https://ru.wikipedia.org/wiki/Valve_Proton).
Эффективность игры зависит от Вашего железа и архитектуры, например, у меня игры на HDD и диски проброшены внутрь VM. В планах игры переместить на SSD диски, а далее рассмотреть вопрос выделения отдельного ПК для игр.
```{uml}
!include plantuml/nextcloud_disks.plantuml
```
## Итог
Теперь мы можем запускать игры не только из Steam и быть автономны насколько это возможно от корпораций и их диктатуры.


Ссылки Github:
1. [Зачем нужен собственный сервер в 2025?](./server.md)
2. [Как установить Proxmox?](./proxmox.md)
3. [Как установить Docker?](./docker.md)
4. [Как запустить прокси-сервер для сервисов?](./npm.md)
5. [Как установить драйвера NVIDIA в Linux?](./nvidia_drivers.md)