For the complete documentation index, see llms.txt. This page is also available as Markdown.

Unreal Engine — начало работы

Учитесь на практике и разверните свой первый выделенный сервер на Edgegap. К концу этого руководства вы бесплатно развернёте выделенный сервер с Edgegap.

Сборка с помощью Docker Desktop — самый быстрый, простой и надёжный способ начать.

✔️ Подготовка

Прежде чем начать, обязательно создайте бесплатную учетную запись в Edgegap (кредитная карта не требуется). Вы можете позже пригласить членов вашей команды, даже если у них ещё нет учётной записи Edgegap.

Настройте несколько основных параметров на вашей машине для разработки:

Установите Docker Desktop и расширение Docker Edgegap
Установите расширение Edgegap Quickstart для Docker
Получите доступ к ресурсам Unreal Engine на GitHub
Создать персональный токен доступа GitHub (классический)
  • включить только разрешение [read:packages] ,

  • создать токен - сохраните это значение в безопасном месте, вы не увидите его снова.

Уверены в своих сборках сервера? Перейдите к Unreal Engine и Расширенные функции.

⚙️ 1. Настройка проекта

Независимо от того, используете ли вы компьютер с Windows, Mac или Linux, вы будете должны собрать свой сервер для среды выполнения Linux, поскольку большинство поставщиков облачных услуг в настоящее время (включая Edgegap) работают на Linux. Не беспокойтесь, знание Linux не требуется.

Этот способ не требует загрузки исходного кода Unreal Engine или сборки его из исходников!

☑️ Начните с проверки версии Unreal Engine — предзаполнено значением из файлов вашего проекта.

☑️ Введите имя пользователя GitHub и PAT из Unreal Engineдля загрузки зависимостей с GitHub.

Создать персональный токен доступа GitHub (классический)
  • включить только разрешение [read:packages] ,

  • создать токен - сохраните это значение в безопасном месте, вы не увидите его снова.

☑️ Отключить проверку совместимости версии Unreal Engine для выделенных серверов и установить IpNetDriver в качестве драйвера по умолчанию или запасного драйвера для сетей репликации:

☑️ Перезапустите Unreal Engine чтобы загрузить последние изменения.

☑️ Создайте скрипт целевой сборки выделенного сервера скопировав ваш <PROJECT>Editor.Target.cs файл в корневой папке проекта и переименовав копию в <PROJECT>Server.Target.cs.

☑️ Замените любые ссылки на слово Editor на Server в вашем скрипте целевой сборки сервера.

☑️ Измените параметры сборки сервера по умолчанию редактируя ваш скрипт целевой сборки сервера:

✅ Теперь вы можете перейти к следующему шагу.

Необязательно: интеграция со Steam

Чтобы интегрировать Steam, используйте IpNetDriver в качестве драйвера сети по умолчанию и убедитесь, что 64-битный steamclient.so для Linux скопирован в образ по пути /home/ubuntu/.steam/sdk64/ .

Скачать steamclient.so

🔧 2. Сборка игрового сервера

Теперь мы соберём и подготовим ваш проект, а затем упакуем его в легко повторно используемый Docker-образ.

Работа в команде разработчиков предполагает совместное использование кода. Когда что-то идет не так, последнее, что вы хотите услышать — «у меня работает». Серверы игр должны надежно запускаться на любой машине, поскольку успешные игровые серверы работают на тысячах серверов по всему миру.

Чтобы сделать ваш сервер надежным, мы используем Docker — виртуализационное ПО, гарантирующее, что все зависимости вашего серверного кода вплоть до уровня операционной системы всегда будут точно такими же, независимо от того, как и где запускается сервер.

Мы рекомендуем посмотреть «Никогда не устанавливайте локально» (видео). Вам НЕ нужно использовать Dockerhub с Docker. Docker ≠ Dockerhub. Думайте о Docker как о движке для программирования, а о Dockerhub — как о его магазине приложений.

☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):

  • Имя образа — это уникальный идентификатор на ваше усмотрение, которым вы помечаете сборку сервера перед публикацией.

    • Обычно в него входит название вашей игры — например, «my-game-server».

  • Тег образа — это идентификатор, указывающий на конкретную версию вашего образа.

    • Термин «артефакт сборки» иногда используется для обозначения конкретной версии вашего образа.

    • Отличный вариант по умолчанию для тегирования — метка времени, например 2024.01.30-16.23.00-UTC .

☑️ Собрать проект после того, как вы будете довольны своей конфигурацией. Выполнение этого шага добавит новый образ с исполняемым файлом вашего Linux-игрового сервера в локальный Docker-клиент.

✅ Теперь можно перейти к следующему шагу.

🧪 3. Локальное тестирование сервера

Давайте попробуем развернуть локально (на вашей машине) и подключить игровой клиент, чтобы убедиться, что образ сервера работает правильно, прежде чем мы загружать и развертывать (что может занять некоторое время).

☑️ Выберите тег образа, который вы хотите запустить локально (удалённые образы будут загружены). При желании можно указать дополнительные аргументы docker run для настройки локального теста:

  • -p 7777:7777/udp — это отображение портов вашего локального контейнера портов,

  • -e ARBITRIUM_PORT_GAMEPORT_INTERNAL=7777 — это переменная окружения имитирующая реальное развертывание Edgegap и указывающая вашему игровому серверу внутренний порт, на котором нужно слушать подключения игроков.

☑️ Когда будете довольны своей конфигурацией, нажмите Запустить локальный сервер. Выполнение этого шага приведёт к запуску нового контейнера на вашей машине разработки.

☑️ Теперь пора подключить игровой клиент Unreal Engine Editor (PIE) к локальному контейнеру сервера. Откройте консоль Unreal PIE с помощью ~ (тильда) и подключитесь с помощью open <ip>:<port>:

  • ip = localhost или 127.0.0.1 (в большинстве случаев эквивалентно),

  • порт = случайное внешнее значение порта контейнера в Docker GUI.

☑️ Как только вы убедитесь, что можете подключиться к локальному серверному контейнеру и играть без проблем, вы можете удалить контейнер 🗑️, чтобы освободить ресурсы на вашей машине для других программ.

✅ Теперь можно перейти к следующему шагу.

Устранение неполадок и FAQ

Не удаётся подключить клиентов к серверу — Превышено время ожидания запроса. , 请求超时 , ConnectionFailed или Проверка порта не удалась

  • Сначала убедитесь, что контейнер запущен и в логах нет ошибок во время выполнения.

  • Проверьте, что значения портов в вашей docker run команде совпадают.

  • Убедитесь, что игровой клиент подключается к внешнему порту указанному на странице сведений о контейнере; это значение всегда будет случайным из соображений безопасности.

  • Убедитесь, что вы переименовали целевой файл и настроили сборки игры, как описано в шаге ⚙️ 1. Настройка проекта.


Мой контейнер запущен, но я всё равно не могу подключиться в течение нескольких минут.

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

  • Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.

  • Игровые клиенты должны повторять попытку подключения с интервалом в 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего должны возвращаться в матчмейкинг.

  • Рассмотрите возможность добавления загрузочной сцены, чтобы сервер мог выполнять инициализацию (и переход, если речь об Unreal Engine) одновременно с клиентами, синхронизируя состояние обеих сторон.


Предупреждение: не удалось создать сокет для адреса привязки

  • Пожалуйста, установите плагин Epic Steam Subsystem через магазин ассетов Fab.

  • При использовании Edgegap Integration Kit (EGIK) с исходной версией SteamCore, загруженной с GitHub, плагин Epic Steam Subsystem не включён из-за политики распространения плагинов Epic Games.


Я подключился, но экран полностью чёрный.

  • Проверьте, что у вас указан правильный Game Default Map в Edit / Project Settings / Maps & Modes.

☁️ 4. Публикация в Edgegap

Пора разместить ваш сервер в интернете! Теперь, когда ваш образ успешно может обслуживать игроков, мы можем загрузить его в Edgegap и начать запускать в любой точке мира. В этом руководстве мы будем использовать Реестр контейнеров Edgegap (хранилище для образов).

☑️ Выберите имя приложения чтобы помечать и группировать похожие образы на Edgegap.

☑️ Выберите тег образа, который вы хотите опубликовать и Загрузить образ. Выполнение этого шага приведёт к загрузке образа вашего сервера в Edgegap Registry и созданию новой версии приложения в вашем веб-браузере. Обязательно создайте свой портов когда появится запрос, с значениями по умолчанию.

✅ Теперь можно перейти к следующему шагу.

Устранение неполадок и FAQ

отказано: добавление 756,6 МиБ ресурса хранения, которое при обновлении до текущего использования 4,3 ГиБ превысит настроенный верхний предел в 4,7 ГиБ , ошибка фиксации на ref "layer-sha256:--------": неожиданный статус от PUT-запроса к https://registry.edgegap.com/

  • Похоже, у вас закончилось место для хранения образов на Регистр контейнеров. Рассмотрите возможность удаления неиспользуемых артефактов сборки (если они у вас есть) или оптимизации размера сборки сервера. Если вы используете пользовательский Dockerfile или .dockerignore, вы могли скопировать некоторые ненужные файлы в образ.


Вы достигли лимита приложений: 2 , Не удалось обновить тег/версию docker: вы достигли лимита версий приложения: 2

  • Вы достигли лимитов нашего бесплатного тарифа, пожалуйста, рассмотрите возможность обновления учетной записи. В качестве альтернативы вы можете удалить существующие ресурсы через наш Панель управления.


Моя новая версия приложения не отображается в плагине/расширении.

  • Пожалуйста, убедитесь, что вы заполнили форму создания версии приложения на последнем шаге.

🚀 5. Развертывание в облаке

Это последний шаг в этом руководстве, после которого у вас будет сервер, развернутый в облаке Edgegap, к которому игроки из любой точки мира смогут подключаться.

☑️ Выберите приложение и версию из предыдущего шага для развертывания.

☑️ Как только будете готовы, нажмите Развернуть в облаке, дождитесь достижения Развертывания. Выполнение этого шага приведёт к запуску нового Развертывания в вашей учетной записи Edgegap.

☑️ Убедитесь, что в выводе консоли нет новых ошибок. Также проверьте, что ваши Развертывания не показывают ошибок и ваши Развертывания не указывают на 100% загрузку ресурсов (vCPU или память), иначе новые подключения игроков могут быть отклонены, или ваш сервер застрянет в цикле перезапуска. См. ниже шаги по устранению неполадок для решения любых проблем.

☑️ Теперь мы выполним финальный тест и подключим ваш редактор Unreal Engine к облачному развертыванию. Возьмите Host развертывания вместо IP сервера и внешний порт, откройте консоль Unreal в игровом клиенте (тильда ~) и введите open {host}:{port} .

Внешний порт вашего развёртывания в облаке Edgegap будет выбран случайным образом, чтобы потенциальный злоумышленник (хакер) замедлялся и обнаруживался до того, как сможет нанести ущерб.

☑️ Как только вы убедитесь, что можете подключиться к вашему развёртыванию без проблем и завершите тестирование, Остановите ваше развёртывание чтобы освободить ресурсы в вашем аккаунте для следующей сборки.

🙌 Поздравляем с вашим первым развёртыванием в Edgegap! Если хотите узнать больше, продолжайте чтение.

Устранение неполадок и FAQ

Не удаётся подключить клиентов к серверу — Превышено время ожидания запроса. , 请求超时 , ConnectionFailed или Проверка порта не удалась

  • Сначала убедитесь, что развертывание Ready и в журнале развертывания нет исключений или ошибок во время выполнения. Если развертывание остановилось, проверьте журналы в нашей панели управления.

  • Проверьте, что настройка порта в сетевых настройках вашей сборки сервера совпадает с внутренним портом в вашей версии приложения. Для сборок плагинов порт задаётся автоматически. Вы можете изменить сопоставление портов, отредактировав версии приложения без пересборки. Найдите ваш протокол в вашей интеграции netcode.

  • Убедитесь, что игровой клиент подключается к внешнему порту указанному на странице сведений о развертывании; это значение всегда будет случайным из соображений безопасности.

  • Убедитесь, что вы переименовали целевой файл и настроили сборки игры, как описано в шаге ⚙️ 1. Настройка проекта.


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

  • После того как развертывание становится Ready, начинается инициализация игрового движка. Этот процесс может занять от нескольких секунд до нескольких минут, и в этот период сервер не принимает подключения игроков.

  • Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.

  • Игровые клиенты должны повторять попытку подключения с интервалом в 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего должны возвращаться в матчмейкинг.

  • Рассмотрите возможность добавления загрузочной сцены, чтобы сервер мог выполнять инициализацию (и переход, если речь об Unreal Engine) одновременно с клиентами, синхронизируя состояние обеих сторон.


Предупреждение: не удалось создать сокет для адреса привязки

  • Пожалуйста, установите плагин Epic Steam Subsystem через магазин ассетов Fab.

  • При использовании Edgegap Integration Kit (EGIK) с исходной версией SteamCore Integration Kit (SIK), загруженной с GitHub, плагин Epic Steam Subsystem не включён из-за политики распространения плагинов Epic Games.


Я подключился, но экран полностью чёрный.


Моё развертывание остановилось/перезапустилось, и я больше не могу получить доступ к его логам.

  • Если процесс сервера аварийно завершится из-за исключения, наша система попытается автоматически перезапустить сервер. Рассмотрите возможность локального тестирования сервера, чтобы выявить первопричину.

  • Мы храним логи только в течение времени жизни развертывания; если вы хотите просматривать логи после остановки развертывания, пожалуйста подключите стороннее хранилище логов.

  • См. Развертывания чтобы узнать все причины остановки вашего развертывания.


Моё развертывание автоматически остановилось через X минут.

  • Развертывания Free Tier ограничены 60 минутами, пожалуйста, рассмотрите возможность обновления аккаунта.

  • Все развертывания будут завершены через 24 часа работы в соответствии с нашей политикой санитации серверов, для обслуживания инфраструктуры и чтобы избежать неожиданных расходов, если развертывание не было корректно остановлено. Для долгоживущих серверов рассмотрите возможность использования Частные пулы серверов с Постоянное хранение.

  • См. Развертывания чтобы узнать все причины остановки вашего развертывания.


Что произойдёт, если игрок покинет моё развертывание?

  • По умолчанию серверы не отклоняют подключения игроков. Проверка подлинности игроков — задача ваших разработчиков, поскольку можно использовать множество различных методов и провайдеров аутентификации игроков.

  • Игровые клиенты могут локально хранить информацию о подключении, чтобы попытаться переподключиться в случае неожиданного сбоя клиента.

  • Чтобы позволить игрокам присоединяться к уже идущим играм, рассмотрите возможность использования Подробный обзор или Сессии.


Мой сервер показывает 100% загрузку CPU после того, как стал готов.

  • Это может не быть проблемой, так как игровые движки обычно выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается спустя 2–3 минуты после запуска развертывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.

  • Снижение частоты тиков может помочь контролировать загрузку CPU за счёт обработки меньшего числа сообщений.

  • В Free Tier вы ограничены 1,5 vCPU и 3 ГБ памяти (RAM).

  • Вы можете изменить выделенные ресурсы для существующих версий или дублировать версию и изменить ресурсы в новой копии. Ни один из вариантов не требует пересборки сервера.


Моё развертывание постоянно перезапускается и показывает ошибку OOM kill

  • Это вызвано превышением выделенного объёма памяти. Рассмотрите возможность оптимизации использования памяти с помощью пулов объектов, сжатия или удаления ненужных объектов в вашей сцене.

  • В Free Tier вы ограничены 1,5 vCPU и 3 ГБ памяти (RAM).

  • Вы можете изменить выделенные ресурсы для существующих версий или дублировать версию и изменить ресурсы в новой копии. Ни один из вариантов не требует пересборки сервера.


Иногда использование памяти (RAM) моего сервера резко возрастает до высокого значения — это проблема?

  • Пока вы не выходите за предел выделенного объёма памяти версии приложения, это не является проблемой.

  • Превышение выделенного объёма памяти версии приложения приведёт к OOM kill (см. выше).


Будет ли производительность моего сервера ухудшаться из-за других серверов, работающих на той же машине?

  • Нет, наша платформа гарантирует, что выделенные ресурсы не будут использоваться другими студиями или другими серверами на общей инфраструктуре. С Edgegap у вас нет шумных соседей.

👉 Следующие шаги

После того как у вас настроена рабочая клиент/серверная система, убедитесь, что сохранили копию вашего проекта (используя систему контроля версий, такую как git), чтобы вы всегда могли проследить свои шаги в случае возникновения проблем.

Продолжайте чтение, чтобы узнать больше о темах, связанных с жизненным циклом сервера и обнаруживаемостью.

Остановить развертывания

Когда матч заканчивается (или игроки уходят), ваше развертывание можно остановить, чтобы сэкономить средства. Пустые или заполненные лишь частично развертывания могут неоправданно увеличивать ваши расходы!

Если вы следовали этому руководству и собирали с помощью нашего Docker Extension, вы можете просто вызвать метод FGenericPlatformMisc::RequestExit . Мы добавили в упакованный образ скрипт, управляющий процессом вашего сервера, который автоматически выполнит корректное завершение развертывания.

Чтобы настроить управление жизненным циклом сервера, измените наш пример StartServer.sh скрипт.

Предпочитаете управлять жизненным циклом из Unreal? См. Инструменты разработчика для blueprint самозавершения API.

Внедрённые переменные

Читайте полезную информацию, например ID развертывания, IP-адрес сервера, его местоположение и многое другое, обращаясь к внедрённым переменным окружения. Каждое развертывание автоматически включает:

Профилирование серверов

Чтобы понять и оптимизировать проблемы производительности сервера на Edgegap, изучите Развертывания, Развертыванияи многое другое Развертывания инструменты в вашем распоряжении.

Вы также можете использовать существующие инструменты профилирования Unreal Engine с Edgegap:

Session Automation

Автоматизируйте популярные игровые сценарии для управления сессиями и масштабирования по требованию с помощью одного из:

Подбор игроков:

  • Короткие раунды

  • Матчи по запросу

  • Рейтинговая система и/или Пользовательские правила

Браузер серверов:

  • Постоянные или раунды

  • Региональные социальные хабы

  • Автоматическое назначение и/или Пользовательский поиск

Собственный бэкенд:

Оптимизация сборок

Настройте чанкинг ассетов, чтобы отделить ассеты только для клиента от ассетов сервера.

Исключите ассеты и плагины, которые нужны только клиенту и не требуются для работы сервера.

Пересмотрите стратегию подготовки контента.

  • Рассмотрите Cooking on the Fly (COTF) чтобы отложить подготовку клиентских ассетов и ускорить сборки сервера.

Реализуйте Level Streaming, чтобы уменьшить нагрузку на память во время работы.

Включайте только то, что абсолютно необходимо для работы вашего сервера.

Пример .dockerignore файл, чтобы удалить лишние файлы.

Рассмотрите возможность использования многоэтапных сборок Docker (ссылка).

  • Выделите крупные зависимости сервера в отдельный образ для повторного использования в многоэтапных сборках. Docker будет кэшировать каждый слой и просто повторно использовать предыдущую версию, пропуская загрузку этой части, если только это специально не указано, экономя вам трафик и время ожидания завершения загрузки.

  • Если вы не уверены, почему одна из ваших команд Dockerfile вызывает ошибку, попробуйте отладить её локально. Создайте новый этап прямо перед тем, как возникает проблема (добавьте вторую FROM команду), используйте --target чтобы указать процессу сборки остановиться на проблемном этапе, а затем docker exec -it {container} /bin/bash чтобы войти в интерактивный терминал внутри вашего контейнера. После этого вы можете использовать команды shell в базовом образе, чтобы исследовать проблему дальше (например, top в Ubuntu).

Настроить образ

Мы также поддерживаем добавление собственного Dockerfile для пользователей, которым нужен больший контроль над образами из-за оптимизации размера сборки, лишних зависимостей или более сложного процесса запуска. Ниже мы поделимся несколькими советами и лучшими практиками «сделай сам».

Всегда убедитесь, что вы работаете с рабочей сборкой сервера.

  • Прежде чем предполагать, что проблема связана с пользовательским Dockerfile, убедитесь, что вашу серверную сборку можно запустить, и что процесс сборки в вашем игровом движке не выдал никаких исключений или ошибок.

Всегда тестируйте локально перед загрузкой.

  • Локальное тестирование вашего образа сэкономит вам массу времени, пока вы ждёте завершения загрузки. Это также совершенно бесплатно ✨, поскольку не требует ресурсов Edgegap.

  • При локальном тестировании обязательно правильно задайте внутренний порт:

Убедитесь, что у вас есть базовые навыки. Каждый Dockerfile нуждается в нескольких обязательных командах:

  • FROM {image} — это ваш базовый образ; обычно мы используем долгосрочно поддерживаемый Linux, но подойдёт любой базовый образ на Linux. Обычно это публичные образы, хранящиеся на Docker Hub. Справочник по Dockerfile здесь. Справочник по Dockerfile здесь.

  • COPY {source} {destination} чтобы скопировать вашу серверную сборку Linux с хост-машины внутрь образа, чтобы вы могли запустить её позже. Справочник по Dockerfile здесь.

  • USER {user} должен следовать после команды useradd (ubuntu) или эквивалентной; лучше не запускать всё от root на случай большей безопасности. Справочник по Dockerfile здесь.

  • CMD {command} будет последней строкой, скорее всего вызывающей StartServer.sh или какой-то скрипт запуска, чтобы убедиться, что ваш сервер корректно инициализируется после завершения настройки. Справочник по Dockerfile здесь.

  • НЕ используйте VOLUME — вы не сможете смонтировать таким образом какое-либо локальное хранилище на Edgegap; вместо этого рассмотрите нашу функцию Endpoint Storage и используйте S3 bucket, см. Endpoint Storage,

  • EXPOSE 7777/UDP не требуется! На самом деле это не сделает внутренний порт сервера доступным извне контейнера; это лишь подсказка для разработчика, а порт должен быть

Откладывайте объявление параметров до самого последнего возможного момента. Из-за долгого времени сборки сервера конфигурируемость важнее компонуемости. Применяйте этот подход к командам Dockerfile, чтобы быстрее собирать и загружать.

  • Сценарий: вам нужно определить параметры, такие как стадия развертывания, версия, режим игры, карта, число игроков на сервер, частота резервного копирования или подобное.

  • Плохое решение: создавать отдельный образ для каждой комбинации ваших параметров. Вы потратите всё своё время на пересборку образов, получив при этом очень мало пользы от такого подхода.

  • Лучшее решение — подставлять параметры конфигурации в последний момент:

    1. параметры развертывания — передаются непосредственно перед выполнением развертывания — селекторы матчмейкинга передаются как переменные среды, или ваша собственная система управления сессиями передаёт переменные среды во время развертывания,

    2. параметры версии — общие для всех развертываний в версии приложения — стадия развертывания, тег артефакта, секреты и конечные точки сторонних сервисов и подобное; затем

    3. один-единственный образ — содержит и загружает все параметры конфигурации при запуске.

НЕ запускайте базы данных в развертываниях Edgegap.

  • Развертывания Edgegap не предназначены для длительно работающих процессов и могут быть завершены после долгого времени работы без предварительного уведомления. База данных (даже распределённая), работающая таким образом, может быть завершена, что приведёт к необратимой потере данных. Если вам нужна база данных, рассмотрите сторонний DBaaS.

  • Рассмотрите использование наших Управляемых кластеров для размещения баз данных и длительно работающих сервисов.

Последнее обновление

Это было полезно?