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

109 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Проверенные рекомендации
Ниже только те пункты, которые подтверждаются текущей конфигурацией проекта и практикой запуска на сервере.
## 1) Healthcheck Sunshine
Текущий вариант `["CMD", "pgrep", "sunshine"]` рабочий в этой сборке: в контейнере есть `/usr/bin/sunshine`, процесс виден как `sunshine`.
```yaml
healthcheck:
test: ["CMD", "pgrep", "sunshine"]
interval: 30s
timeout: 10s
retries: 3
```
## 2) Entrypoint и tini
- Контейнер стартует через `tini``/entrypoint.sh``sunshine`.
- `tini` нужен, чтобы fluxbox и другие дочерние процессы не превращались в zombie и панель задач оставалась видимой.
- Проверка: `docker exec game-player-1 cat /proc/1/comm``tini`.
## 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`.
```bash
docker exec game-player-1 df -h /dev/shm
```
## 4) Права на volume Steam
Проблема прав на bind-mount критична. Правильный подход — точечный `chown` в `entrypoint.sh` и `start-steam.sh`:
```bash
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 поднимается автоматически:
```bash
dbus-daemon --system --fork
```
Проверка:
```bash
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:
```bash
sysctl kernel.unprivileged_userns_clone
```
Ожидается `1`.
3. Контейнеры со смягчёнными профилями (как в `docker-compose.yml`):
```yaml
security_opt:
- seccomp:unconfined
- apparmor:unconfined
```
## 9) Быстрая проверка после перезапуска
```bash
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`.