Compare commits
17 Commits
cursor/fix
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| a214ff761b | |||
| 93bc4bae05 | |||
| 42aae93970 | |||
| 88b48e1796 | |||
| 10ee14233b | |||
| f4996bd0b0 | |||
| cd931c13cf | |||
| 7e14ebb644 | |||
| 925366d5b1 | |||
| d465caad02 | |||
| 9788ca9db2 | |||
| 5b59aea5c8 | |||
| 98c12c0f00 | |||
| 1729fbf497 | |||
| 7510bf2ee8 | |||
| 16eb5ab230 | |||
| 6642cecf20 |
1
.env.example
Normal file
1
.env.example
Normal file
@@ -0,0 +1 @@
|
||||
APT_PROXY=http://192.168.1.60:3142
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,6 +5,8 @@ nvidia-smi*
|
||||
# local runtime data
|
||||
players/*_steam/
|
||||
players/*_config/sunshine.conf
|
||||
.env
|
||||
!.env.example
|
||||
|
||||
# do not publish private Sunshine TLS keys
|
||||
players/*_config/credentials/
|
||||
|
||||
76
Dockerfile
76
Dockerfile
@@ -3,11 +3,20 @@ FROM ubuntu:22.04
|
||||
# Отключаем интерактивные вопросы во время установки
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# Опциональный прокси для apt (например apt-cacher-ng: http://192.168.1.60:3142)
|
||||
ARG APT_PROXY
|
||||
RUN if [ -n "$APT_PROXY" ]; then \
|
||||
printf 'Acquire::http::Proxy "%s";\nAcquire::https::Proxy "%s";\n' "$APT_PROXY" "$APT_PROXY" > /etc/apt/apt.conf.d/01proxy; \
|
||||
fi
|
||||
|
||||
# 1. Добавляем 32-битную архитектуру для Steam и базовые графические зависимости
|
||||
RUN dpkg --add-architecture i386 && \
|
||||
apt-get update && apt-get install -y \
|
||||
xvfb fluxbox dbus-x11 xauth xfonts-base x11-xserver-utils \
|
||||
software-properties-common wget curl ca-certificates \
|
||||
xserver-xorg-core xserver-xorg-video-dummy xserver-xorg-input-libinput \
|
||||
fluxbox dbus-x11 xauth xfonts-base x11-xserver-utils \
|
||||
software-properties-common wget curl ca-certificates locales pciutils \
|
||||
libboost-chrono1.74.0 libboost-filesystem1.74.0 libboost-locale1.74.0 \
|
||||
libboost-program-options1.74.0 libboost-thread1.74.0 \
|
||||
libcap2-bin libgomp1 mesa-utils \
|
||||
libxcb-cursor0 libxcb-xinerama0 libxcb-xfixes0 libxcb-shape0 libxcb-randr0 libxcb-xtest0 \
|
||||
libxcb1 libxcb-render0 libxcb-render-util0 libxcb-util1 libxcb-keysyms1 \
|
||||
@@ -16,23 +25,80 @@ RUN dpkg --add-architecture i386 && \
|
||||
|
||||
# 2. Скачиваем оригинальный рабочий пакет Sunshine по вашей ссылке
|
||||
# ВНИМАНИЕ: Замените маркер ниже на вашу ссылку из браузера, сохранив кавычки!
|
||||
RUN wget "https://github.com/LizardByte/Sunshine/releases/download/v0.21.0/sunshine-ubuntu-22.04-amd64.deb" -O /tmp/sunshine.deb \
|
||||
RUN wget "https://github.com/LizardByte/Sunshine/releases/download/v0.20.0/sunshine-ubuntu-22.04-amd64.deb" -O /tmp/sunshine.deb \
|
||||
&& chmod +x /tmp/sunshine.deb
|
||||
|
||||
# 3. Устанавливаем скачанный пакет и Steam со всеми зависимостями
|
||||
RUN apt-get update && \
|
||||
echo "debconf steam/question select I AGREE" | debconf-set-selections \
|
||||
&& apt-get install -y /tmp/sunshine.deb steam:i386 steam-devices \
|
||||
libxtst6 libxtst6:i386 \
|
||||
libxss1 libxss1:i386 \
|
||||
libnss3 libnss3:i386 \
|
||||
libxi6 libxi6:i386 \
|
||||
libgtk2.0-0 libgtk2.0-0:i386 \
|
||||
libglib2.0-0 libglib2.0-0:i386 \
|
||||
libpipewire-0.3-0 libpipewire-0.3-0:i386 \
|
||||
libxcb-res0 libxcb-res0:i386 \
|
||||
libvpx7 libvpx7:i386 \
|
||||
libvdpau1 libvdpau1:i386 \
|
||||
libbz2-1.0 libbz2-1.0:i386 \
|
||||
libibus-1.0-5 libibus-1.0-5:i386 \
|
||||
&& ln -sf /lib/x86_64-linux-gnu/libvpx.so.7 /lib/x86_64-linux-gnu/libvpx.so.6 \
|
||||
&& ln -sf /lib/i386-linux-gnu/libvpx.so.7 /lib/i386-linux-gnu/libvpx.so.6 \
|
||||
&& locale-gen en_US.UTF-8 \
|
||||
&& rm -f /tmp/sunshine.deb \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# 4. Скрипт очищает сессию, поднимает виртуальный экран, fluxbox и запускает Sunshine
|
||||
# 4. Конфиг Xorg dummy: нужен для корректной работы ввода Moonlight в контейнере
|
||||
RUN mkdir -p /etc/X11 \
|
||||
&& echo 'Section "ServerLayout"\n\
|
||||
Identifier "Layout0"\n\
|
||||
Screen 0 "Screen0"\n\
|
||||
EndSection\n\
|
||||
\n\
|
||||
Section "Device"\n\
|
||||
Identifier "Device0"\n\
|
||||
Driver "dummy"\n\
|
||||
VideoRam 256000\n\
|
||||
EndSection\n\
|
||||
\n\
|
||||
Section "Monitor"\n\
|
||||
Identifier "Monitor0"\n\
|
||||
HorizSync 28.0-80.0\n\
|
||||
VertRefresh 48.0-75.0\n\
|
||||
Modeline "1920x1080" 172.80 1920 2040 2248 2576 1080 1081 1084 1118\n\
|
||||
EndSection\n\
|
||||
\n\
|
||||
Section "Screen"\n\
|
||||
Identifier "Screen0"\n\
|
||||
Device "Device0"\n\
|
||||
Monitor "Monitor0"\n\
|
||||
DefaultDepth 24\n\
|
||||
SubSection "Display"\n\
|
||||
Depth 24\n\
|
||||
Modes "1920x1080"\n\
|
||||
EndSubSection\n\
|
||||
EndSection\n\
|
||||
' > /etc/X11/xorg-dummy.conf
|
||||
|
||||
# 5. Поднимаем Xorg dummy, fluxbox и Sunshine
|
||||
RUN echo '#!/bin/bash\n\
|
||||
set -e\n\
|
||||
rm -f /tmp/.X99-lock /tmp/.X11-unix/X99\n\
|
||||
Xvfb :99 -ac -screen 0 1920x1080x24 &\n\
|
||||
id steam >/dev/null 2>&1 || useradd -m -s /bin/bash steam\n\
|
||||
mkdir -p /home/steam/.local/share/Steam /tmp/xdg-steam\n\
|
||||
ln -sfn /home/steam/.local/share/Steam /home/steam/.steam\n\
|
||||
chown -R steam:steam /home/steam /tmp/xdg-steam\n\
|
||||
modprobe uinput >/dev/null 2>&1 || true\n\
|
||||
mkdir -p /run/dbus\n\
|
||||
dbus-daemon --system --fork || true\n\
|
||||
Xorg :99 -config /etc/X11/xorg-dummy.conf -nolisten tcp -noreset +extension GLX +extension RANDR +extension RENDER &\n\
|
||||
export DISPLAY=:99\n\
|
||||
export HOME=/root\n\
|
||||
export LANG=en_US.UTF-8\n\
|
||||
export LC_ALL=en_US.UTF-8\n\
|
||||
sleep 3\n\
|
||||
fluxbox &\n\
|
||||
sleep 2\n\
|
||||
|
||||
35
README.md
35
README.md
@@ -43,6 +43,21 @@
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### APT кэширующий прокси (опционально)
|
||||
|
||||
Если у вас есть `apt-cacher-ng` (например `http://192.168.1.60:3142`), можно ускорить сборку образов:
|
||||
|
||||
1. Создайте `.env` рядом с `docker-compose.yml`:
|
||||
```bash
|
||||
echo 'APT_PROXY=http://192.168.1.60:3142' > .env
|
||||
```
|
||||
2. Пересоберите контейнеры:
|
||||
```bash
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Прокси передается в `Dockerfile` через build-arg `APT_PROXY` и автоматически записывается в `/etc/apt/apt.conf.d/01proxy` при сборке.
|
||||
|
||||
## Настройка
|
||||
|
||||
### Конфигурация Sunshine
|
||||
@@ -53,6 +68,10 @@
|
||||
|
||||
`sunshine.conf` не хранится в репозитории и генерируется Sunshine автоматически при первом запуске контейнера.
|
||||
|
||||
`Steam Big Picture` запускается от отдельного пользователя `steam` внутри контейнера. Данные Steam сохраняются в `players/pX_steam` и не теряются после перезапуска контейнеров/сервера.
|
||||
|
||||
Важно: для корректной обработки ввода из Moonlight в контейнерах используется `Xorg dummy` (вместо `Xvfb`) и проброс `/run/udev` в контейнер. Это нужно, чтобы виртуальные устройства ввода Sunshine попадали в тот же X-сеанс, который стримится.
|
||||
|
||||
### Порты
|
||||
|
||||
В Moonlight при ручном добавлении указывается один адрес в формате `IP:base_port`.
|
||||
@@ -84,6 +103,22 @@
|
||||
|
||||
Moonlight использует `base_port` и вычисляет остальные порты автоматически.
|
||||
|
||||
### Первый запуск Steam
|
||||
|
||||
При первом запуске Steam скачивает и распаковывает клиент (может занять 10-20 минут, в зависимости от канала). В это время в Moonlight может отображаться пустой/черный рабочий стол.
|
||||
|
||||
Проверка прогресса для `player1`:
|
||||
```bash
|
||||
docker exec -it game-player-1 bash -lc 'tail -f /home/steam/.local/share/Steam/debian-installation/logs/bootstrap_log.txt'
|
||||
```
|
||||
|
||||
После завершения первичной загрузки повторно откройте сессию Moonlight и запустите `Steam Big Picture`.
|
||||
|
||||
Если запуск Steam прерывается после выхода из терминала (`Hangup`), используйте лог:
|
||||
```bash
|
||||
docker exec -it game-player-1 bash -lc 'tail -f /home/steam/steam-app.log'
|
||||
```
|
||||
|
||||
## Отладка
|
||||
|
||||
Для проверки состояния контейнеров используйте:
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
x-game-template: &game-template
|
||||
build: .
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
APT_PROXY: ${APT_PROXY:-}
|
||||
user: "root"
|
||||
restart: unless-stopped
|
||||
privileged: true
|
||||
@@ -39,8 +42,9 @@ services:
|
||||
- "48010:48010/udp"
|
||||
- "47998-48000:47998-48000/udp"
|
||||
volumes:
|
||||
- /DATA/AppData/game-server/players/p1_steam:/root/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p1_steam:/home/steam/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p1_config:/root/.config/sunshine
|
||||
- /run/udev:/run/udev:ro
|
||||
# Добавляем логирование для отладки
|
||||
logging:
|
||||
driver: "json-file"
|
||||
@@ -62,8 +66,9 @@ services:
|
||||
- "48040:48010/udp"
|
||||
- "48028-48030:47998-48000/udp"
|
||||
volumes:
|
||||
- /DATA/AppData/game-server/players/p2_steam:/root/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p2_steam:/home/steam/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p2_config:/root/.config/sunshine
|
||||
- /run/udev:/run/udev:ro
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
@@ -84,8 +89,9 @@ services:
|
||||
- "48070:48010/udp"
|
||||
- "48058-48060:47998-48000/udp"
|
||||
volumes:
|
||||
- /DATA/AppData/game-server/players/p3_steam:/root/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p3_steam:/home/steam/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p3_config:/root/.config/sunshine
|
||||
- /run/udev:/run/udev:ro
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
@@ -106,8 +112,9 @@ services:
|
||||
- "48100:48010/udp"
|
||||
- "48088-48090:47998-48000/udp"
|
||||
volumes:
|
||||
- /DATA/AppData/game-server/players/p4_steam:/root/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p4_steam:/home/steam/.local/share/Steam
|
||||
- /DATA/AppData/game-server/players/p4_config:/root/.config/sunshine
|
||||
- /run/udev:/run/udev:ro
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
|
||||
@@ -1,31 +1,17 @@
|
||||
{
|
||||
"env": {
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin"
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin:/usr/games"
|
||||
},
|
||||
"apps": [
|
||||
{
|
||||
"name": "Desktop",
|
||||
"image-path": "desktop.png"
|
||||
},
|
||||
{
|
||||
"name": "Low Res Desktop",
|
||||
"image-path": "desktop.png",
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "xrandr --output HDMI-1 --mode 1920x1080",
|
||||
"undo": "xrandr --output HDMI-1 --mode 1920x1200"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Steam Big Picture",
|
||||
"detached": [
|
||||
"setsid steam steam://open/bigpicture"
|
||||
"bash -lc 'id steam >/dev/null 2>&1 || useradd -m -s /bin/bash steam; ROOT=/home/steam/.local/share/Steam/debian-installation; mkdir -p ${ROOT} /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; runuser -u steam -- nohup env DISPLAY=:99 HOME=/home/steam XDG_RUNTIME_DIR=/tmp/xdg-steam TMPDIR=/home/steam/tmp LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 bash -lc \"cd ${ROOT} && exec dbus-run-session -- /usr/games/steam -tenfoot -fullscreen -no-cef-sandbox\" >/home/steam/steam-app.log 2>&1 < /dev/null &'"
|
||||
],
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "",
|
||||
"undo": "setsid steam steam://close/bigpicture"
|
||||
"undo": ""
|
||||
}
|
||||
],
|
||||
"image-path": "steam.png"
|
||||
|
||||
@@ -1,31 +1,17 @@
|
||||
{
|
||||
"env": {
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin"
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin:/usr/games"
|
||||
},
|
||||
"apps": [
|
||||
{
|
||||
"name": "Desktop",
|
||||
"image-path": "desktop.png"
|
||||
},
|
||||
{
|
||||
"name": "Low Res Desktop",
|
||||
"image-path": "desktop.png",
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "xrandr --output HDMI-1 --mode 1920x1080",
|
||||
"undo": "xrandr --output HDMI-1 --mode 1920x1200"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Steam Big Picture",
|
||||
"detached": [
|
||||
"setsid steam steam://open/bigpicture"
|
||||
"bash -lc 'id steam >/dev/null 2>&1 || useradd -m -s /bin/bash steam; ROOT=/home/steam/.local/share/Steam/debian-installation; mkdir -p ${ROOT} /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; runuser -u steam -- nohup env DISPLAY=:99 HOME=/home/steam XDG_RUNTIME_DIR=/tmp/xdg-steam TMPDIR=/home/steam/tmp LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 bash -lc \"cd ${ROOT} && exec dbus-run-session -- /usr/games/steam -tenfoot -fullscreen -no-cef-sandbox\" >/home/steam/steam-app.log 2>&1 < /dev/null &'"
|
||||
],
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "",
|
||||
"undo": "setsid steam steam://close/bigpicture"
|
||||
"undo": ""
|
||||
}
|
||||
],
|
||||
"image-path": "steam.png"
|
||||
|
||||
@@ -1,31 +1,17 @@
|
||||
{
|
||||
"env": {
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin"
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin:/usr/games"
|
||||
},
|
||||
"apps": [
|
||||
{
|
||||
"name": "Desktop",
|
||||
"image-path": "desktop.png"
|
||||
},
|
||||
{
|
||||
"name": "Low Res Desktop",
|
||||
"image-path": "desktop.png",
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "xrandr --output HDMI-1 --mode 1920x1080",
|
||||
"undo": "xrandr --output HDMI-1 --mode 1920x1200"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Steam Big Picture",
|
||||
"detached": [
|
||||
"setsid steam steam://open/bigpicture"
|
||||
"bash -lc 'id steam >/dev/null 2>&1 || useradd -m -s /bin/bash steam; ROOT=/home/steam/.local/share/Steam/debian-installation; mkdir -p ${ROOT} /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; runuser -u steam -- nohup env DISPLAY=:99 HOME=/home/steam XDG_RUNTIME_DIR=/tmp/xdg-steam TMPDIR=/home/steam/tmp LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 bash -lc \"cd ${ROOT} && exec dbus-run-session -- /usr/games/steam -tenfoot -fullscreen -no-cef-sandbox\" >/home/steam/steam-app.log 2>&1 < /dev/null &'"
|
||||
],
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "",
|
||||
"undo": "setsid steam steam://close/bigpicture"
|
||||
"undo": ""
|
||||
}
|
||||
],
|
||||
"image-path": "steam.png"
|
||||
|
||||
@@ -1,31 +1,17 @@
|
||||
{
|
||||
"env": {
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin"
|
||||
"PATH": "$(PATH):$(HOME)/.local/bin:/usr/games"
|
||||
},
|
||||
"apps": [
|
||||
{
|
||||
"name": "Desktop",
|
||||
"image-path": "desktop.png"
|
||||
},
|
||||
{
|
||||
"name": "Low Res Desktop",
|
||||
"image-path": "desktop.png",
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "xrandr --output HDMI-1 --mode 1920x1080",
|
||||
"undo": "xrandr --output HDMI-1 --mode 1920x1200"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Steam Big Picture",
|
||||
"detached": [
|
||||
"setsid steam steam://open/bigpicture"
|
||||
"bash -lc 'id steam >/dev/null 2>&1 || useradd -m -s /bin/bash steam; ROOT=/home/steam/.local/share/Steam/debian-installation; mkdir -p ${ROOT} /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; runuser -u steam -- nohup env DISPLAY=:99 HOME=/home/steam XDG_RUNTIME_DIR=/tmp/xdg-steam TMPDIR=/home/steam/tmp LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 bash -lc \"cd ${ROOT} && exec dbus-run-session -- /usr/games/steam -tenfoot -fullscreen -no-cef-sandbox\" >/home/steam/steam-app.log 2>&1 < /dev/null &'"
|
||||
],
|
||||
"prep-cmd": [
|
||||
{
|
||||
"do": "",
|
||||
"undo": "setsid steam steam://close/bigpicture"
|
||||
"undo": ""
|
||||
}
|
||||
],
|
||||
"image-path": "steam.png"
|
||||
|
||||
Reference in New Issue
Block a user