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

Цель и необходимость

Если честно, то я не игроман и к играм абсолютно равнодушен, но было интересно решить вопрос с играми с инженерной точки зрения. Также меня не устраивало, что мне могут диктовать, во что, когда и как играть.

Что имеем:

  1. Возможность запускать игры на любом устройстве через механизм Steam Remote Play. Если коротко, то вся нагрузка ложится на основной хост-компьютер, и его роль может выполнять сервер с настроенной для работы видеокартой Nvidia и запущенным Steam.

        ---
title: Схема работы Steam Remote Play
---
flowchart TD
    subgraph A [Хост-компьютер]
        A1[Игра запущена]
        A2[Кодирование видео/аудио]
    end

    subgraph B [Домашняя сеть]
        direction LR
        B1[Проводное<br>или Wi-Fi соединение]
    end

    subgraph C [Клиент-устройство]
        C1[Декодирование<br>видео/аудио]
        C2[Вывод на дисплей]
        C3[Ввод с контроллера]
    end

    A1 --> A2
    A2 -->|Потоковое видео| B
    B -->|Данные| C1
    C1 --> C2
    C3 -->|Управление| B
    B -->|Ввод| A
    
  1. Единственный вопрос в этой схеме: «Как запустить Steam на Linux?». Таким образом, я нашел open-source проект Steam-Headless/docker-steam-headless: A Headless Steam Docker image supporting NVIDIA GPU and accessible via Web UI.

docker-compose

Как установить драйверы Nvidia на Linux и сделать доступной видеокарту в Docker в отдельной VM Proxmox не описываю, можете найти эту информацию в соответствующей статье ниже. Мой docker-compose.yml:

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

Файл-шаблон с переменными необходимо скачивать отсюда и он должен располагаться в 1 директории с docker-compose.yml. Важно помнить, что образ сначала попытается скачать драйвера с официального сайта Nvidia, а потом будет их искать в дополнительном репозитории для Flatpak.

Инструкции по запуску через docker-compose можно посмотреть также тут. После запуска docker-compose переходим по адресу в браузере: http://<Your IP>:8083 и должны увидеть экран удаленного стола с процессом установки всех компонентов для работы.

Как играть?

  1. Подключаем наше устройство ТВ/планшет (Android) к нашей локальной сети.

  2. Устанавливаем на устройство Steam Link.

  3. Подключаем джойстик к устройству.

  4. Запускаем SteamLink и наш сервер должен быть найден этим устройством.

Где и как искать игры?

Где и как искать игры не из Steam не описываю, но говорят, на части популярных торрент-трекерах появился раздел с играми на Linux. Действия для игр не из Steam:

  1. Возможность эффективной игры на Linux можно проверить через protondb.com

  2. Устанавливаем на сервер игру любым доступным способом.

  3. Добавляем игру через Steam: Games -> Add Non-Steam game to My Library -> Выбираем файл запуска с игрой.

  4. Картинки для игр можно искать на SteamGridDB, чтобы игра была заполнена метаданными и мало чем отличалась от установленных со Steam игр.

  5. Важно для каждой игры включить: Manage->Properties->Compatibility->Proton Hotfix. Что такое Proton от Valve можно увидеть тут.

Эффективность игры зависит от Вашего железа и архитектуры, например, у меня игры на HDD и диски проброшены внутрь VM. В планах игры переместить на SSD диски, а далее рассмотреть вопрос выделения отдельного ПК для игр.

!include plantuml/nextcloud_disks.plantuml

Итог

Теперь мы можем запускать игры не только из Steam и быть автономны насколько это возможно от корпораций и их диктатуры.

Ссылки Github:

  1. Зачем нужен собственный сервер в 2025?

  2. Как установить Proxmox?

  3. Как установить Docker?

  4. Как запустить прокси-сервер для сервисов?

  5. Как установить драйвера NVIDIA в Linux?