Unreal Engine

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

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

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

Прежде чем начать, убедитесь, что создать бесплатную учетную запись на Edgegap (кредитная карта не требуется).

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

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

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

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

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

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

Этот метод не требует скачивания исходников Unreal или сборки 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 с Сервер в вашем скрипте целевой сборки сервера.

☑️ Включите вывод стандартных логов сервера добавив переопределения в ваш скрипт целевой сборки сервера:

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

По желанию: интеграция со Steam

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

Скачать steamclient.so

Dockerfile
...
RUN mkdir -p /home/ubuntu/.steam/sdk64
COPY ./steamclient.so /home/ubuntu/.steam/sdk64/steamclient.so
RUN chmod 755 /home/ubuntu/.steam/sdk64/steamclient.so
...

Убедитесь, что отключена сетевая подсистема Steam, которая отправляет пакеты через Steam Relay и может вызывать проблемы с подключением или всплески задержки. Это не мешает вам использовать другие функции Steamworks или публиковать игру в магазине Steam.

Config/DefaultEngine.ini
[OnlineSubsystemSteam]
bUseSteamNetworking=false

🔧 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 (PIE) к локальному контейнеру сервера. Откройте консоль Unreal PIE с помощью ~ (тильда) и подключитесь с помощью open <ip>:<port>:

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

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

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

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

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

Клиенты не могут подключиться к серверу - Запрос превысил время ожидания. , 请求超时 , ConnectionFailed , или Проверка порта не удалась

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

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

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

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


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

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

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

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

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


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

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

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


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

  • Проверьте, что у вас правильно задана Карта по умолчанию для игры в разделе Edit / Project Settings / Maps & Modes.

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

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

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

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

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

Поиск и устранение неполадок и 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 и в журнале развертывания нет исключений или ошибок. Если развертывание остановилось, проверьте логи в нашей Панели управления.

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

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

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

  • Вы находитесь в Китае и используете Smart Fleets? Ваше соединение может блокироваться Великой Фаерволлой. Рассмотрите добавление сервера, расположенного в Китае, в ваш флот или использование VPN для подключения.


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

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

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

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

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


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

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

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


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


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

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

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

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


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

  • Развертывания в бесплатном тарифе имеют лимит 60 минут, пожалуйста, рассмотрите обновление аккаунта.

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

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


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

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

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

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


После того как сервер становится Ready, мой сервер показывает 100% загрузку CPU.

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

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

  • В бесплатном тарифе вы ограничены 1.5 vCPU и 3 ГБ памяти (RAM).

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


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

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

  • В бесплатном тарифе вы ограничены 1.5 vCPU и 3 ГБ памяти (RAM).

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


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

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

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


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

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

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

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

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

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

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

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

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

Проверьте, является ли текущий экземпляр клиентом игры или сервером проверив, установлена ли переменная Edgegap:

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

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

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

Матчмейкинг

Ручной запуск развертываний, вставка URL и портов не подойдёт для живой игры.

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

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

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

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

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

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

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

Пример .dockerignore файл для удаления лишних файлов.

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

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

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

Настройка образа сервера

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

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

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

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

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

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

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

  • FROM {image} — это ваш базовый образ; для проектов Unity мы обычно используем поддерживаемую в долгосрочной перспективе 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-ведро, см. Endpoint Storage,

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

    • опубликован при локальном тестировании с помощью docker run <image> -p 7777/udp ,

    • или сопоставлен в Edgegap Port Mapping.

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

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

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

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

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

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

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

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

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

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

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

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