Files
game-server/рекомендации.md
bilal 1dd56ee73d Document current architecture and operational practices.
Update README with Steam launch scripts, shm sizing, Moonlight setup, and troubleshooting; add рекомендации.md and ignore local SSH keys.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 18:49:02 +03:00

4.5 KiB
Raw Permalink Blame History

Проверенные рекомендации

Ниже только те пункты, которые подтверждаются текущей конфигурацией проекта и практикой запуска на сервере.

1) Healthcheck Sunshine

Текущий вариант ["CMD", "pgrep", "sunshine"] рабочий в этой сборке: в контейнере есть /usr/bin/sunshine, процесс виден как sunshine.

healthcheck:
  test: ["CMD", "pgrep", "sunshine"]
  interval: 30s
  timeout: 10s
  retries: 3

2) Entrypoint и tini

  • Контейнер стартует через tini/entrypoint.shsunshine.
  • tini нужен, чтобы fluxbox и другие дочерние процессы не превращались в zombie и панель задач оставалась видимой.
  • Проверка: docker exec game-player-1 cat /proc/1/commtini.

3) Shared memory (/dev/shm)

  • Для Steam CEF обязательно shm_size: "2gb" в docker-compose.yml.
  • При 64 MB (дефолт Docker) в cef_log.txt появляется Less than 64MB of free space — окно входа мигает.
  • После изменения shm_size нужен --force-recreate, а не просто restart.
docker exec game-player-1 df -h /dev/shm

4) Права на volume Steam

Проблема прав на bind-mount критична. Правильный подход — точечный chown в entrypoint.sh и start-steam.sh:

mkdir -p /home/steam/.local/share/Steam /tmp/xdg-steam /home/steam/tmp
ln -sfn /home/steam/.local/share/Steam /home/steam/.steam
chown -R steam:steam /home/steam /tmp/xdg-steam

Не рекомендуется: chmod -R 777 /DATA/AppData/game-server/players/.

5) Xorg dummy и ввод Moonlight

  • Используется минимальный xorg-dummy.conf без привязки к /dev/input/mice.
  • Добавление InputDevice с физическим устройством может вернуть проблему, когда ввод уходит в хостовую консоль.
  • Ввод Moonlight обрабатывается через Sunshine/XTest в изолированном X-сессии :99.

6) Запуск Steam (start-steam.sh)

Текущий подход:

  • Запуск от runuser -u steam с DISPLAY=:99, XDG_RUNTIME_DIR=/tmp/xdg-steam, TMPDIR=/home/steam/tmp
  • Двухфазный старт: -silent -no-cef-sandbox, затем однократно steam://open/gamepadui
  • Блокировка flock — защита от двойного запуска при быстрых кликах в Moonlight
  • Если Steam уже работает и UI виден — процесс не убивается
  • keep-steam-window.sh держит окно «Sign in to Steam» на экране (без растягивания на 1920×1080)

Не использовать прямой -gamepadui -fullscreen в apps.json — это вызывает ChunkLoadError и нестабильность CEF.

7) System DBus

Steam webhelper требует рабочий system DBus. В entrypoint.sh и start-steam.sh DBus поднимается автоматически:

dbus-daemon --system --fork

Проверка:

docker exec game-player-1 runuser -u steam -- \
  dbus-send --system --print-reply --dest=org.freedesktop.DBus \
  /org/freedesktop/DBus org.freedesktop.DBus.ListNames

8) Что проверить на хосте

  1. Установлен nvidia-container-toolkit.
  2. User namespaces для Steam:
    sysctl kernel.unprivileged_userns_clone
    
    Ожидается 1.
  3. Контейнеры со смягчёнными профилями (как в docker-compose.yml):
    security_opt:
      - seccomp:unconfined
      - apparmor:unconfined
    

9) Быстрая проверка после перезапуска

docker compose ps
docker compose logs --tail=200 player1
docker exec -it game-player-1 bash -lc '
  cat /proc/1/comm
  pgrep -a sunshine
  pgrep -a "steam -srt" || true
  df -h /dev/shm
  DISPLAY=:99 xwininfo -root -tree | grep -iE "Sign in|1918x" || true
'

Если сервисы healthy, а Steam не открывается в Moonlight — смотреть steam-app.log, cef_log.txt, webhelper-linux.txt и дерево окон на DISPLAY=:99.