-------> English | Русский <-------
Техническое руководство по запуску Pixel Streaming в контейнере Docker, с автаматическим запуском и отключением пустых серверов.
Отказ от ответственности: Всё преведенные материалы расчитаны на личное использование.
Если этот проект оказался полезным для Вас, вы можете оценить его, поставив звёздочку.🌟
Пожертвования горячо приветствуются, какими бы маленькими они ни были, и большое спасибо. 😌
| Bitcoin (BTC) | 1Dbwq9EP8YpF3SrLgag2EQwGASMSGLADbh |
| Ethereum (ERC20) | 0x22258ea591966e830199d27dea7c542f31ed5dc5 |
| Binance Smart Chain (BEP20) | 0x22258ea591966e830199d27dea7c542f31ed5dc5 |
| Solana (SOL) | yYYXsiVTzsvfvsMnBxfxSZEWTGytjAViE2ojf3hbLeF |
| Cloud tips | cloudtips |
Эта инструкция поможет вам развернуть игру на Unreal Engine 5 с технологией Pixel Streaming в контейнерах Docker (Windows). Контейнеры позволяют запускать несколько копий игры с уникальными IP-адресами и автоматически масштабировать сервер под количество игроков.
- скачиваем библиотеку под свою версию движка PixelStreamingInfrastructure releases
- Matchmaker.bat
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\WebServers\Matchmaker\platform_scripts\cmd\run.bat'
- Start_Games.bat
Games_CI_CD.exe -AudioMixer -PixelStriming=localhost -PixelStrimingPort=8888 -renderoffscreen
- Start_PixelStrimeng.bat
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\WebServers\SignallingWebServer\platform_scripts\cmd\Start_SignallingServer.ps1' --UseMatchmaker=true --HttpPort 80 --StreamerPort 8888 --SFUPort 8889"
1.1. Установка **Docker** и включение контейнеров **Windows**
-
Включите поддержку контейнеров Windows:
Install-WindowsFeature -Name Containers -Restart
-
Включите Hyper-V (если еще не включено):
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart
-
Установите Docker Desktop для Windows:
- Скачать Docker Desktop
- В настройках Docker выберите режим Windows Containers.
-
Проверьте, что Docker работает в Windows-режиме:
docker info | Select-String "OSType"
Если вывод содержит
OSType: windows, значит все настроено правильно.
Создайте файл Dockerfile в папке с файлами игры:
# Используем Windows Server Core FROM mcr.microsoft.com/windows/servercore:ltsc2019 # Устанавливаем .NET Framework 4.8 вручную через DISM RUN dism /online /enable-feature /featurename:NetFx4 /all # Создаем папку для игры WORKDIR C:\\GameServer # Копируем файлы игры в контейнер COPY . C:\\GameServer # Открываем порт для Pixel Streaming EXPOSE 8888 EXPOSE 8889 EXPOSE 80 EXPOSE 443 # Запуск игры через батник CMD ["cmd", "/c", "C:\\GameServer\\Start_PixelStrimeng.bat && C:\\GameServer\\Start_Games.bat"]
docker build -t my-pixel-streaming-game .
docker run -d --name game1 --network nat my-pixel-streaming-game
- На компьютере, где образ уже собран, выполни:
docker save -o my-pixel-streaming-game.tar my-pixel-streaming-game
Это создаст файл my-pixel-streaming-game.tar в текущей директории.
- Создаем сеть и запускаем несколько контейнеров:
docker network create game_network docker run -d --name game1 --network game_network my-pixel-streaming-game docker run -d --name game2 --network game_network my-pixel-streaming-game docker run -d --name game3 --network game_network my-pixel-streaming-game
- Проверка IP-адресов контейнеров:
docker inspect -f "{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}" game1 docker inspect -f "{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}" game2
-
Чтобы автоматически запускать/останавливать серверы в зависимости от игроков, можно:
-
Написать Node.js/Python скрипт для отслеживания подключений.
-
Использовать Matchmaker, который управляет контейнерами через
docker runиdocker stop.
Эта реализация позволяет автоматически запускать и останавливать контейнеры с игрой в зависимости от количества подключенных игроков.
- Каждый новый игрок вызывает создание нового контейнера с игрой.
- Если игрок уходит, лишний контейнер автоматически удаляется.
- Можно вручную запускать и останавливать контейнеры через API
/start/:idи/stop/:id.
На сервере, где будет работать этот скрипт, установите Node.js Далее создайте проект:
mkdir docker-manager
cd docker-manager
npm init -y
- Установите зависимости:
npm install express dockerode ws
express— создаст API для управления контейнерамиdockerode— управляет контейнерами Dockerws— WebSocket для отслеживания игроков
- Создайте файл
server.jsи вставьте код:
const express = require("express"); const Docker = require("dockerode"); const WebSocket = require("ws"); const app = express(); const docker = new Docker(); const wss = new WebSocket.Server({ port: 3001 }); const GAME_IMAGE = "my-pixel-streaming-game"; const CONTAINERS = {}; let playerCount = 0; // Функция запуска контейнера async function startContainer(name, port) { try { const container = await docker.createContainer({ Image: GAME_IMAGE, name, Tty: true, ExposedPorts: { "8888/tcp": {} }, HostConfig: { PortBindings: { "8888/tcp": [{ HostPort: port.toString() }] }, NetworkMode: "nat", }, Cmd: ["cmd", "/c", "C:\\GameServer\\Start_Games.bat"], }); await container.start(); CONTAINERS[name] = container; console.log(`✅ Запущен контейнер ${name} на порту ${port}`); } catch (error) { console.error(`Ошибка запуска контейнера ${name}:`, error); } } // Функция остановки контейнера async function stopContainer(name) { if (CONTAINERS[name]) { try { await CONTAINERS[name].stop(); await CONTAINERS[name].remove(); delete CONTAINERS[name]; console.log(`🛑 Остановлен контейнер ${name}`); } catch (error) { console.error(`Ошибка остановки контейнера ${name}:`, error); } } } // API-запрос для запуска контейнера вручную app.post("/start/:id", async (req, res) => { const id = req.params.id; await startContainer(`game_${id}`, 8000 + parseInt(id)); res.send(`Контейнер game_${id} запущен.`); }); // API-запрос для остановки контейнера вручную app.post("/stop/:id", async (req, res) => { const id = req.params.id; await stopContainer(`game_${id}`); res.send(`Контейнер game_${id} остановлен.`); }); // WebSocket сервер для отслеживания игроков wss.on("connection", (ws) => { console.log("📡 Игрок подключился"); playerCount++; // Запускаем новый сервер при необходимости if (playerCount > Object.keys(CONTAINERS).length) { startContainer(`game_${playerCount}`, 8000 + playerCount); } ws.on("close", () => { console.log("🚪 Игрок отключился"); playerCount--; // Останавливаем сервер, если игроков нет if (playerCount < Object.keys(CONTAINERS).length) { stopContainer(`game_${playerCount + 1}`); } }); }); // Запуск API сервера app.listen(3000, () => console.log("🚀 API сервер запущен на порту 3000"));
node server.js
const ws = new WebSocket("ws://localhost:3001");
ws.close();
\BUILD\ArchivedBuilds\Windows> docker build -t my-pixel-streaming-game "docker build" requires exactly 1 argument. See 'docker build --help'. Usage: docker build [OPTIONS] PATH | URL | - Build an image from a Dockerfile
открой Dockerfile
- замени строку:
FROM mcr.microsoft.com/windows/servercore:ltsc2022
на:
FROM mcr.microsoft.com/windows/servercore:ltsc2019
- Сохрани изменения и заново запусти сборку:
docker build -t my-pixel-streaming-game .Step 1/9 : FROM mcr.microsoft.com/windows/servercore:ltsc2019
ltsc2019: Pulling from windows/servercore
78f28541e48e: Pull complete
17fa36014f7b: Pull complete
Digest: sha256:2bacc4bdc5d1bd805587cb90a2fb2d58d1c775b02df1a19fd221cbfc639ff587
Status: Downloaded newer image for mcr.microsoft.com/windows/servercore:ltsc2019
---> 73684753fcee
Step 2/9 : RUN powershell -Command Add-WindowsFeature NET-Framework-Features
---> Running in 7ef5c86cab60
Add-WindowsFeature : The request to add or remove features on the specified
server failed.
Installation of one or more roles, role services, or features failed.
The service cannot be started, either because it is disabled or because it has
no enabled devices associated with it. Error: 0x80070422
At line:1 char:1
+ Add-WindowsFeature NET-Framework-Features
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (@{Vhd=; Credent...Name=localh
ost}:PSObject) [Install-WindowsFeature], Exception
+ FullyQualifiedErrorId : DISMAPI_Error__Failed_To_Enable_Updates,Microsof
t.Windows.ServerManager.Commands.AddWindowsFeatureCommand
Success Restart Needed Exit Code Feature Result
------- -------------- --------- --------------
False No Failed {}
- "
The service cannot be started, either because it is disabled or because it has no enabled devices associated with it. Error: 0x80070422" означает, что служба, необходимая для установки Windows-фич, отключена в контейнере.
В Windows Server Core в контейнере, установи роли через Add-WindowsFeature
если не работает стандартным способом то есть вариант 2
- Вместо:
RUN powershell -Command Add-WindowsFeature NET-Framework-Features
Используй установку через DISM:
RUN powershell -Command "dism.exe /online /enable-feature /featurename:NetFx3 /all"Этот проект распространяется по MIT License.
Для детальной документации ознакомьтесь с Английским README или Русским README.