Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

This guide will help you deploy your Unreal Engine 5 game with Pixel Streaming support in Docker containers (Windows). Containers allow you to run multiple copies of your game with known IP addresses and automatically scale your servers to the number of players.

License

Notifications You must be signed in to change notification settings

AnikBeris/Unreal-Engine-Docker-Pixel-Streaming

Repository files navigation

-------> English | Русский <-------

Project Logo


Техническое руководство по запуску Pixel Streaming в контейнере Docker, с автаматическим запуском и отключением пустых серверов.

Отказ от ответственности: Всё преведенные материалы расчитаны на личное использование.

Если этот проект оказался полезным для Вас, вы можете оценить его, поставив звёздочку.🌟

Image

Пожертвования горячо приветствуются, какими бы маленькими они ни были, и большое спасибо. 😌

Bitcoin (BTC) 1Dbwq9EP8YpF3SrLgag2EQwGASMSGLADbh
Ethereum (ERC20) 0x22258ea591966e830199d27dea7c542f31ed5dc5
Binance Smart Chain (BEP20) 0x22258ea591966e830199d27dea7c542f31ed5dc5
Solana (SOL) yYYXsiVTzsvfvsMnBxfxSZEWTGytjAViE2ojf3hbLeF
Cloud tips cloudtips

//

Docker для Unreal Engine 5 с Pixel Streaming

Эта инструкция поможет вам развернуть игру на Unreal Engine 5 с технологией Pixel Streaming в контейнерах Docker (Windows). Контейнеры позволяют запускать несколько копий игры с уникальными IP-адресами и автоматически масштабировать сервер под количество игроков.




🔄 Установка-подготовка игры


создаём 3 .bat файла запуска

  1. Matchmaker.bat
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\WebServers\Matchmaker\platform_scripts\cmd\run.bat'
  1. Start_Games.bat
Games_CI_CD.exe -AudioMixer -PixelStriming=localhost -PixelStrimingPort=8888 -renderoffscreen
  1. Start_PixelStrimeng.bat
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\WebServers\SignallingWebServer\platform_scripts\cmd\Start_SignallingServer.ps1' --UseMatchmaker=true --HttpPort 80 --StreamerPort 8888 --SFUPort 8889"

🔄 Установка-подготовка Docker и включение контейнеров Windows Hyper-V


1.1. Установка **Docker** и включение контейнеров **Windows**
  1. Включите поддержку контейнеров Windows:

    Install-WindowsFeature -Name Containers -Restart
  2. Включите Hyper-V (если еще не включено):

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart
  3. Установите Docker Desktop для Windows:

  4. Проверьте, что Docker работает в Windows-режиме:

    docker info | Select-String "OSType"

    Если вывод содержит OSType: windows, значит все настроено правильно.




📂 2. Создание Docker-образа с игрой


2.1. Создание Dockerfile

Создайте файл 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"]



📦 2.2. Сборка Docker-образа

docker build -t my-pixel-streaming-game .

2.3. Запуск контейнера

docker run -d --name game1 --network nat my-pixel-streaming-game



📥 3. Сохранение образа в файл (.tar)


  • На компьютере, где образ уже собран, выполни:
docker save -o my-pixel-streaming-game.tar my-pixel-streaming-game

Это создаст файл my-pixel-streaming-game.tar в текущей директории.


4. Масштабирование (несколько копий игры)


  • Создаем сеть и запускаем несколько контейнеров:
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



5. Автоматизация запуска и остановки

  • Чтобы автоматически запускать/останавливать серверы в зависимости от игроков, можно:

  • Написать Node.js/Python скрипт для отслеживания подключений.

  • Использовать Matchmaker, который управляет контейнерами через docker run и docker stop.




Реализация на Node.js для управления Docker-контейнерами


Эта реализация позволяет автоматически запускать и останавливать контейнеры с игрой в зависимости от количества подключенных игроков.

📌 Как это работает?

  • Каждый новый игрок вызывает создание нового контейнера с игрой.
  • Если игрок уходит, лишний контейнер автоматически удаляется.
  • Можно вручную запускать и останавливать контейнеры через API /start/:id и /stop/:id.

📌 Шаг 1: Установка Node.js и зависимостей

На сервере, где будет работать этот скрипт, установите Node.js Далее создайте проект:

mkdir docker-manager
cd docker-manager
npm init -y
  • Установите зависимости:
npm install express dockerode ws
  • express — создаст API для управления контейнерами
  • dockerode — управляет контейнерами Docker
  • ws — WebSocket для отслеживания игроков

📌 Шаг 2: Создание сервера управления контейнерами

  • Создайте файл 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"));

📌 Шаг 3: Запуск и использование


1️⃣ Запустить сервер управления:

node server.js

2️⃣ Подключить игроков через WebSocket:

const ws = new WebSocket("ws://localhost:3001");

3️⃣ Остановить сервер (игрок отключился):

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.

About

This guide will help you deploy your Unreal Engine 5 game with Pixel Streaming support in Docker containers (Windows). Containers allow you to run multiple copies of your game with known IP addresses and automatically scale your servers to the number of players.

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

AltStyle によって変換されたページ (->オリジナル) /