Files
game-server/README.md
bilal 88b48e1796 Switch headless display stack to Xorg dummy.
Replace Xvfb with Xorg dummy and mount /run/udev so Sunshine virtual input devices target the streamed X session instead of the host console.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-19 02:48:28 +03:00

141 lines
6.4 KiB
Markdown
Raw Permalink 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.
# Game Server с использованием Sunshine и Steam
Этот проект предоставляет Docker-конфигурацию для запуска игрового сервера с использованием Sunshine и Steam, позволяя запускать игры на нескольких клиентах одновременно.
## Структура проекта
- `Dockerfile` - файл для создания Docker-образа с Sunshine и Steam
- `docker-compose.yml` - конфигурация для запуска нескольких контейнеров
- `players/` - директория с конфигурациями и данными для каждого игрока
- `p1_config/`, `p2_config/`, `p3_config/`, `p4_config/` - конфигурации для каждого клиента
- `p1_steam/`, `p2_steam/`, `p3_steam/`, `p4_steam/` - данные Steam для каждого клиента
## Особенности
- Поддержка 4 одновременных клиентов
- Использование NVIDIA GPU для ускорения работы
- Автоматическое восстановление контейнеров
- Healthcheck для мониторинга состояния
- Логирование для отладки
## Требования
- Docker и Docker Compose
- NVIDIA драйверы
- NVIDIA Container Toolkit
- 2x Tesla K80 (суммарно 4 GPU-чипа)
## Установка
1. Убедитесь, что у вас установлен Docker и Docker Compose
2. Склонируйте репозиторий
3. Настройте пути к папкам Steam в `docker-compose.yml`
4. Проверьте назначение GPU-чипов в `NVIDIA_VISIBLE_DEVICES`:
- `player1` -> GPU `1`
- `player2` -> GPU `2`
- `player3` -> GPU `3`
- `player4` -> GPU `4`
GPU `0` в этой конфигурации обычно занят отдельной видеокартой (например, Quadro) и не используется для игровых контейнеров.
5. Запустите команду:
```bash
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
Конфигурационные файлы Sunshine находятся в директориях `players/pX_config/`:
- `apps.json` - список установленных игр
- `credentials/` - SSL сертификаты
`sunshine.conf` не хранится в репозитории и генерируется Sunshine автоматически при первом запуске контейнера.
`Steam Big Picture` запускается от отдельного пользователя `steam` внутри контейнера. Данные Steam сохраняются в `players/pX_steam` и не теряются после перезапуска контейнеров/сервера.
Важно: для корректной обработки ввода из Moonlight в контейнерах используется `Xorg dummy` (вместо `Xvfb`) и проброс `/run/udev` в контейнер. Это нужно, чтобы виртуальные устройства ввода Sunshine попадали в тот же X-сеанс, который стримится.
### Порты
В Moonlight при ручном добавлении указывается один адрес в формате `IP:base_port`.
`base_port` для каждого клиента:
- `player1` -> `47989` (можно просто `IP`, это дефолт)
- `player2` -> `48019`
- `player3` -> `48049`
- `player4` -> `48079`
Порты проброшены для каждого клиента отдельно (формат: `host:container`):
- `player1`
- TCP: `47984-47990:47984-47990`
- TCP/UDP: `48010:48010`
- UDP: `47998-48000:47998-48000`
- `player2`
- TCP: `48014-48020:47984-47990`
- TCP/UDP: `48040:48010`
- UDP: `48028-48030:47998-48000`
- `player3`
- TCP: `48044-48050:47984-47990`
- TCP/UDP: `48070:48010`
- UDP: `48058-48060:47998-48000`
- `player4`
- TCP: `48074-48080:47984-47990`
- TCP/UDP: `48100:48010`
- UDP: `48088-48090:47998-48000`
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'
```
## Отладка
Для проверки состояния контейнеров используйте:
```bash
docker-compose ps
```
Для просмотра логов:
```bash
docker-compose logs player1
```
## Улучшения
1. Добавлен healthcheck для лучшей стабильности
2. Добавлено логирование для отладки
3. Оптимизирован Dockerfile
4. Улучшена стабильность запуска контейнеров