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>
This commit is contained in:
2026-06-27 18:49:02 +03:00
parent ab4ee8b9d6
commit 1dd56ee73d
3 changed files with 275 additions and 101 deletions

108
рекомендации.md Normal file
View File

@@ -0,0 +1,108 @@
# Проверенные рекомендации
Ниже только те пункты, которые подтверждаются текущей конфигурацией проекта и практикой запуска на сервере.
## 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`.