LogoLogo
edgegap.comDashboard
  • 📘Learning Center
    • Getting Started
    • Unity Games
      • Getting Started - Servers
      • Developer Tools
    • Unreal Engine Games
      • Getting Started - Servers
      • Developer Tools
    • Matchmaking
      • Getting Started
      • Matchmaker In-Depth
      • Ping Beacons
    • Advanced Features
      • Apps and Versions
      • Deployments
      • Managed Clusters
  • API Reference
    • Dedicated Servers
    • Integration
    • Matchmaking
    • Peer to Peer
  • Release Notes
  • 📚Documentation
    • Sample Projects
      • Unity Netcodes
        • Unity NGO
        • Photon Fusion 1
        • Photon Fusion 2
        • Mirror
        • Mirror WebGL
        • Fishnet
        • Fishnet WebGL
        • Photon Bolt
      • Unreal Top-Down Sample
      • NuxtJS
      • Ruby On Rails
      • Unity Lobbies
      • Unity Matchmaker
    • Tools & Integrations
      • Container
        • What is Docker
        • Your First Docker
        • The Good Practices
        • SSH in Your Container
        • External Registries
          • Docker Hub
          • AWS ECR
          • GCP GCR
          • Gitlab registry
      • Deploy from Nakama
      • EOS Lobby Integration
      • Switch From Gamelift
      • Switch From Multiplay
      • Playfab Bridge
    • Deployment
      • Endpoint Storage
        • How to Save Logs
        • Upload File to Deployment
      • Webhooks
    • Application
      • Command and Arguments
      • 1:1 Port Mapping
    • Session
      • How They Work
      • Application Version Configuration
      • Manage Request
      • Selectors Filtering
    • Fleet
      • Fleet Policy
      • Policy Filter
      • Linking Version
      • Fleet's Deployment
    • Container Registry
    • Distributed Relay
      • Matchmaker/Lobby
      • Relay Edgegap API
      • Transport Samples
    • Lobby
      • Lobby Service
      • Functions
    • Glossary
    • SLA Terms
Powered by GitBook
LogoLogo

Connect with Community

  • Discord
  • Linkedin
  • X

Read More

  • Release Notes
  • Blog
  • Enterprise
  • Legal
  • edgegap.com

© 2025 Edgegap

On this page
  • ✔️ Preparation
  • ⚡ Deploy Your First Dedicated Server on Edgegap
  • 1. Connect your Edgegap Account
  • 2. Configure Game Server Builds
  • 3. Build and Upload to Edgegap
  • 4. Test your Server Locally
  • 5. Deploy a Server on Edgegap
  • 5. Matchmaking and Next Steps
  • 🔧 Optimize Server Build Size
  • ✏️ Customize Server Image

Was this helpful?

  1. Learning Center
  2. Unreal Engine Games

Getting Started - Servers

PreviousUnreal Engine GamesNextDeveloper Tools

Last updated 3 days ago

Was this helpful?

Learn by doing and deploy your first Dedicated Server on Edgegap.

✔️ Preparation

  • .

  • ,

  • Choose your build method:

    • download and ,

    • download and ,

    • read (community guide) - Unreal Engine source not required.

Confident in your server builds? Skip to ✏️ Customize Server Image and Advanced Features.

⚡ Deploy Your First Dedicated Server on Edgegap

By the end of this guide, you will have deployed a dedicated server with Edgegap at no cost.

1. Connect your Edgegap Account

☑️ To get started, we’ll need you to . No credit card required.

☑️ Once you’re signed in, to connect your plugin.

✅ You may now proceed to the next step.

2. Configure Game Server Builds

Whether you’re using a Windows, Mac, or a Linux machine, you will need to build your server for Linux runtime, as most cloud providers nowadays (including Edgegap) run on Linux. Don’t worry, no Linux knowledge is required to accomplish this with our plugin.

  • use Solid State Drive (SSD) to speed up builds (from ~12+ hours to ~2+ hours),

  • this is only required the first time and every time you upgrade your Unreal Engine version.

Download branch with a git client! Using github UI will always download the unstable release branch.

☑️ Restart your development machine, otherwise you’ll run into errors later on!

☑️ Disable Unreal Engine version compatibility check for dedicated servers by adding this to your DefaultEngine.ini :

[ConsoleVariables]
net.IgnoreNetworkChecksumMismatch=1
net.CurrentHandshakeVersion=2
net.MinHandshakeVersion=2
net.VerifyNetSessionID=0
net.VerifyNetClientID=0

☑️ Verify your server is using OnlineSubsystemUtils.IpNetDriver as the default driver or the fallback driver in DefaultEngine.ini .

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

☑️ Restart Unreal Engine to reload latest changes.

☑️ Create a dedicated server target script by copying your <PROJECT>Editor.Target.cs file in project root folder and renaming the copy to <PROJECT>Server.Target.cs.

☑️ Replace any references to word Editor with Server in your server target script.

☑️ Enable standard output server logs by adding overrides in your server target script:

bUseLoggingInShipping = true;
bOverrideBuildEnvironment = true;

☑️ To reduce server egress and resource usage, set MaxNetTickRate and NetServerMaxTickRate in [/Script/OnlineSubsystemUtils.IpNetDriver] and rebuild:

MaxNetTickRate=60
NetServerMaxTickRate=60

[/script/engine.engine]
NetClientTicksPerSecond=60

✅ You may now proceed to the next step.

3. Build and Upload to Edgegap

Working in a team of developers means sharing your code. When things go wrong, the last thing you want to hear is “it works on my machine”. Game servers have to run reliably on any machine, since a successful games’ servers will run on thousands of server machines across the world.

To help make your server reliable, we use Docker - virtualization software to ensuring that all of your server code dependencies down to the operating system level are going to be always exactly the same, no matter how or where the server is launched.

☑️ Verify that Docker is installed and running.

☑️ Copy compiled plugin to your Plugins folder in the root of your Unreal project (not engine).

☑️ Launch your new Unreal Engine from Visual Studio and open toolbar item Edit / Plugins.

☑️ Enable our plugin in section INSTALLED / Other.

☑️ Configure our plugin by opening toolbar item Edit / Project Settings / Edgegap:

Always press enter after editing input values to ensure they are saved correctly.

  • API Token is needed to upload your server to Edgegap, get one by clicking Get Token.

  • Application name on Edgegap can match your project name or be customized, make sure to only use lowercase letters, numbers, or characters dash - and underscore _.

  • Image Path provides optionally a custom icon for your game server on Edgegap, skip for now.

  • Version name is useful for tracking client/server compatibility and rolling back in case of issues.

    • Timestamps are a great option for app version names, e.g. 2024.01.30-16.50.20-UTC .

    • Multiple application versions may point to the same image tag, such as v1.1.0 and dev .

    • Learn more about Apps and Versions later.

Do not reuse latest version to prevent our system from deploying outdated (cached) image.

☑️ Skip custom container registry settings for now, you can use third party registry later if you’d like.

✅ You may now proceed to the next step.

Troubleshooting and FAQ

open //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.

  • Verify that Docker is running on your development machine.


invalid reference format EdgegapLog: Warning: OnContainerizeCallback: Could not generate container, message:Failed

  • Verify that your application name is set and doesn't contain trailing whitespace.

  • Make sure to press Enter to confirm the input value when done editing.


  • Change build configuration in your XYZServerTarget.cs file:

BuildConfig = EProjectPackagingBuildConfigurations::PPBC_Shipping;

403 Forbidden, Could not push container, message:Failed

  • Please verify your docker credentials are correctly set.

  • If using Edgegap Container Registry, ensure the username doesn’t include app-version-pull , which is the profile only allowing pulling images. Your profile should resemble your account email instead.

4. Test your Server Locally

Let’s try deploying locally (on your machine) and connecting a game client, to make sure the server image is functioning properly.

☑️ Find your latest image tag in Docker GUI, or with docker image ls .

☑️ Run server container locally using the terminal of your choice:

docker run -d -p 7777/udp -e ARBITRIUM_PORTS_MAPPING='{"ports":{"gameport":{"internal":7777}}}' <image_tag>

☑️ Now it's time to connect your Unreal Engine Editor (PIE) game client to your local server container. Open Unreal PIE console with ~ (tilde) and connect with open <ip>:<port>:

  • ip = localhost or 127.0.0.1 (equivalent in most cases),

  • port = randomized external port value of the container in Docker GUI.

✅ You may now proceed to the next step.

Troubleshooting and FAQ

Can’t connect clients to server - Request timed out. , 请求超时 , ConnectionFailed , or Port verification failed

  • First, make sure that the container is up, and there are no runtime errors in your logs.

  • Please verify that your port values in the docker run command match.

  • Please ensure that your game client is connecting to the external port shown on your container details page, this value will be always randomized due to security reasons.

  • Please ensure you’ve renamed your target file and configured game builds as described in step 2. Configure Game Server Builds.


My container is up but I’m not able to connect for several minutes afterwards.

  • Once a container is up, your game engine initialization begins. This process may take anywhere from seconds to minutes, and the server doesn’t accept to player connections during this period.

  • Consider optimizing your server initialization to decrease this time period.

  • Game clients should retry connection in 1 second intervals for a limited amount of time (depending on your initialization duration), after which they should return to matchmaking.

  • Consider adding a loading scene so the server can perform initialization (and travel in case of Unreal Engine) at the same time as clients, while synchronizing state of both.


Warning: Could not create socket for bind address

  • Please install Epic’s Steam Subsystem plugin through Fab asset store.

  • When using Edgegap Integration Kit (EGIK) with SteamCore Integration Kit (SIK) source version downloaded from github, Epic’s Steam Subsystem plugin is not included due to Epic Games plugin distribution policies.


I connected but my screen is completely dark.

  • Verify you have the correct Game Default Map set under Edit / Project Settings / Maps & Modes.

5. Deploy a Server on Edgegap

This is the final step in this guide, after which you will have a server deployed on Edgegap cloud, to which players from anywhere in the world can connect.

☑️ You may select the following (or keep defaults):

  • Application on Edgegap from the previous step.

  • Application version on Edgegap from the previous step.

  • Number of random players emulating several players trying to play together.

  • Player region to emulate matchmaking in a specific region,

    • 3 regions offered for testing in dashboard for simplicity, 615+ regions available with API,

    • learn about Deployments and Matchmaking later.

☑️ Now we’ll perform the final test and connect your Unreal Engine game client to your cloud deployment. Grab your Deployment’s Host in place of server IP and the Deployment’s external port, open Unreal console in game client (tilde ~) and type open {host}:{port} .

The external port of your Deployment on Edgegap cloud will be chosen at random, so that a potential attacker (hacker) is slowed down and detected before they can cause damage.

🙌 Congratulations on your first Deployment on Edgegap! If you’d like to learn more, keep reading.

Troubleshooting and FAQ

Can’t connect clients to server - Request timed out. , 请求超时 , ConnectionFailed , or Port verification failed

  • Please ensure that your game client is connecting to the external port shown on your Deployment details page, this value will be always randomized due to security reasons.

  • Please ensure you’ve renamed your target file and configured game builds as described in step 2. Configure Game Server Builds.


My deployment is ready but I’m not able to connect for several minutes afterwards.

  • Once a deployment is Ready, your game engine initialization begins. This process may take anywhere from seconds to minutes, and the server doesn’t accept to player connections during this period.

  • Consider optimizing your server initialization to decrease this time period.

  • Game clients should retry connection in 1 second intervals for a limited amount of time (depending on your initialization duration), after which they should return to matchmaking.

  • Consider adding a loading scene so the server can perform initialization (and travel in case of Unreal Engine) at the same time as clients, while synchronizing state of both.


Warning: Could not create socket for bind address

  • Please install Epic’s Steam Subsystem plugin through Fab asset store.

  • When using Edgegap Integration Kit (EGIK) with SteamCore Integration Kit (SIK) source version downloaded from github, Epic’s Steam Subsystem plugin is not included due to Epic Games plugin distribution policies.


I connected but my screen is completely dark.

  • Verify you have the correct Game Default Map set under Edit / Project Settings / Maps & Modes.


My deployment stopped/restarted and I can’t access it’s logs anymore.

  • In case the server process crashes due to an exception, our system will attempt restarting the server automatically. Consider testing your server locally to uncover the root cause.


My deployment stopped automatically after X minutes.

  • Free Tier deployments have a 60 minute limit, please consider upgrading your account.


What will happen if a player leaves my deployment?

  • By default, servers don’t reject player connections. Authenticating players is up to your devs, since many different methods and player authentication providers can be used.

  • Game clients may store connection information locally to attempt reconnecting in case of unexpected client crashes.


My server shows 100% CPU utilization after becoming ready.

  • This may not be an issue, as game engines tend to perform CPU-heavy operations during server initializations. If the CPU usage doesn’t drop after 2-3 minutes from deployment start, you may need to optimize your server or increase app version resources.

  • Reducing tick rate can help control CPU usage due to processing less messages.

  • You’re limited to 1.5 vCPU and 3GB of memory (RAM) in Free Tier.

  • You may increase allocated resources when creating a new app version. You can duplicate your App version in our Dashboard and adjust these values as needed, without rebuilding your server or image.


My deployment is restarting repeatedly and shows error OOM kill

  • This is caused by exceeding allocated memory amount. Consider optimizing memory usage with object pooling, compression, or removing unneeded objects in your scene.

  • You’re limited to 1.5 vCPU and 3GB of memory (RAM) in Free Tier.

  • You may increase allocated resources when creating a new app version. You can duplicate your App version in our Dashboard and adjust these values as needed, without rebuilding your server or image.


Sometimes, my server’s memory (RAM) usage spikes to a high value, is that a problem?

  • As long as you stay within the allocated app version memory amount, this is not an issue.

  • Exceeding the allocated app version memory amount will cause OOM kill (see above).


Will my server performance be impacted by other servers running on the same machine?

  • No, our platform ensures that allocated resources will not be used by other studios, or other servers on shared infrastructure. With Edgegap, there are no noisy neighbors.

5. Matchmaking and Next Steps

We hope you had a good first experience with your deployment on Edgegap. We’ve simplified our configuration to show you using Edgegap is easy. We hope that you will find our platform very flexible in meeting your custom designs going forward.

🔧 Optimize Server Build Size

Only include what you absolutely need for your server to run.

Example .dockerignore file to remove extra files.
# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app
*.ipa

# These project files can be generated by the engine
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb

# Precompiled Assets
**/SourceArt/**/*.png
**/SourceArt/**/*.tga

# Builds
**/Build/*

# Whitelist PakBlacklist-<BuildConfiguration>.txt files
!**/Build/*/
**/Build/*/**
!**/Build/*/PakBlacklist*.txt

# Don't ignore icon files in Build
!**/Build/**/*.ico

# Configuration files generated by the Editor
**/Saved/*
**/Intermediate/*
**/DerivedDataCache/*
**/Binaries/*
**/Build/*
**/Releases/*
**/Packaged/*
  • Separate large server dependencies to a separate image to reuse in multi-stage builds. Docker will cache each layer and simply reuse the previous version and skip uploading this part unless specifically instructed to do so, saving you bandwidth and time waiting for the upload to finish.

  • If you’re not sure why one of your Dockerfile commands throws an error, try debugging locally. Create a new stage just before the issue happens (add a second FROM command), use --target to instruct the build process to stop at the problematic stage, and then docker exec -it {container} /bin/bash to enter interactive terminal inside your container. Afterwards, you can use shell commands in your base image to investigate further (e.g. top on ubuntu).

✏️ Customize Server Image

We also support adding your own Dockerfile for users who need more control over their images due to build size optimization, extraneous dependencies, or requiring more complex startup process. We’ll now share a few “do it yourself” tips and best practices.

☑️ on your development machine,

install to build on a stable foundation,

☑️ to build game servers for Linux.

To integrate Steam, use SteamSocketsNetDriver as default and IpNetDriver as fallback. Verify that is included in your server build artifact and set file permissions.

When using Lyra Starter Game sample, make sure to duplicate and .

☑️ for your custom Unreal Engine version built from source.

☑️ Click Create Application. Completing this step will result in a new application appearing in .

☑️ Once you’re happy with your configuration hit Build and Push, wait for the process to finish and verify there are no new errors in your Unreal console. Completing this step will result in a new folder appearing in your project root - Saved/LinuxServer. In addition, a new image appears now in your , and a new appears in your .

Verify that you have enough free space in your account’s . We recommend trying to 🔧 Optimize Server Build Size, and using . Images are stored on your local machine until deleted for backups.

☑️ Open and click Create Deployment.

☑️ Once you’re ready, hit Deploy to cloud, wait to reach . Ensure that your don’t show any errors and your don’t indicate 100% resource utilization (vCPU or memory), otherwise new player connections may be rejected, or your server stuck in a restart loop. See troubleshooting steps below to address any issues.

☑️ Completing this step will result in a on your Edgegap account.

Disable VPN when testing for more realistic conditions and receive a .

☑️ Once you verify you’re able to connect to your Deployment without issues and are done testing, Stop your Deployment to free up capacity in your account for the next build. In case you encounter issues, . If you can’t figure out the issue, we’re hanging out in our and happy to help.

First, make sure that the deployment is Ready, and there are no runtime exceptions or errors in your deployment log. If your deployment stopped, inspect logs in our .

Please verify that your port setting in your server build’s netcode settings matches the internal port in your . For plugin builds, the port is set for you automatically. You can change the port mapping by editing the without rebuilding. Find your protocol in your netcode integration.

Are you located in China and are using ? Your connection may be blocked by the Great Firewall. Consider adding a server located in China to your fleet, or using a VPN to connect.

Verify that the in DefaultEngine.ini.

We only keep logs for the duration of the deployment, if you wish to inspect logs after deployment stops, please .

See to discover all causes for stopping your deployment.

All deployments will be terminated after 24 hours of runtime following our server sanitization policy, for infrastructure maintenance, and to prevent racking up unexpected costs when deployment wasn’t shut down properly. For long-running servers, consider using .

See to discover all causes for stopping your deployment.

To allow players to join games in progress, consider using or .

☑️ Learn how to once the match concludes, and .

☑️ Looking for inspiration? Take a peek at our , sharing is caring!

Starting your Deployments manually, pasting URL and ports will not cut it for a live game. . Consider upgrading to pay as you go pricing tier to run multiple deployments.

We scale your servers based on demand, on a minute timescale. We’re able to serve ~40,000,000 (forty million) new players within seconds. Want control over scaling due to specific circumstances (MMOs, persistent world games)? See .

Copying unused files in your images results in image bloat, longer uploads, slower caching speeds, and slower overall server startup. .

Consider using .

📘
Build your Unreal Engine version from source
specific release branch (e.g.
5.5
)
Install Unreal Cross-Compiling Toolchain
64 bit steamclient.so for Linux
rename your
LyraGameEOS.Target.cs
file and the containing class name to match your project name
Rebuild our plugin
Edgegap Dashboard
Couldn’t find target rules file for target ‘ProjectName’ when building a project?
Container Registry
our API to delete older images
deployments dashboard page
new Deployment being started
inspect Dashboard logs of your deployment
Community Discord
Dashboard
App version
App version
Smart Fleets
integrate a third party log storage
Smart Fleets
Game Samples
Read more about Matchmaking
Smart Fleets
Review Docker image optimization suggestions
multi-stage Docker builds (link)
Unreal Engine version compatibility check has been disabled
Get access to Unreal Engine source code on Github
Set up Visual Studio
Unreal Engine source code
Unreal Engine source code
📦 Building from Containers
create a free account with Edgegap
create an Edgegap API token
⚡ Edgegap Integration Kit by Betide Studio
⚡ Dedicated Servers Quickstart Plugin
Edgegap Container Registry dashboard page underneath your Repository
dashboard underneath your Application
🏷️ App Versions
Sessions

We recommend watching . Docker is often confused with Dockerhub image registry. You do NOT need to use Dockerhub along with Docker. Think of Docker as a universal programming engine and Dockerhub as it’s App Store.

"Never install locally" (video)

☑️ Once you’ve verified you’re able to connect to your local server container and play without issues, you may delete the container 🗑️ to free up resources on your machine for other programs.

36MB
steamclient.so
3. Deployment Ready
Container Logs
Container Metrics
5. Deployment Stopped
5. Deployment Stopped
low-latency deployment
🔄 Deployment Lifecycle
stop deployments
Backfill

Always make sure you are working with a functioning server build.

  • Before assuming an issue is related to the custom Dockerfile, ensure your Unity server build can be started, and that the build process in Unity didn’t throw any exceptions or errors.

Always test locally before uploading.

  • Testing your image locally will save you lots of time while waiting for the upload to finish. It’s also entirely free ✨ as it doesn’t require any Edgegap resources.

  • When testing locally, make sure to set your internal port correctly:

    docker run \
      -p 7777/udp \
      -e ARBITRIUM_PORTS_MAPPING='{"ports":{"gameport":{"internal":7777}}}' \
      'registry.edgegap.com/<repository>:<tag>'

Make sure you’ve got the basics down. Every Dockerfile needs a few essential commands:

Delay declaration of parameters until latest possible moment. Configurability > composability due to long server build times.

  • Scenario: you need to define parameters like deployment stage, version, game mode, map, player count per server, backup frequency, or similar.

  • Bad solution: creating a separate image for every combination of your parameters. You will spend all of your time rebuilding the images with very little benefits from this approach.

  • Better solution - substitute configuration parameters just in time:

    1. deployment parameters - supplied just before the deployment is made - matchmaking selectors passed as environment variables, or your custom session management system passing environment variables at deployment time,

    2. version parameters - shared for all deployments on an app version - deployment stage, artifact tag, third party secrets and endpoints, and similar; then

    3. one single image - contains and loads all configuration options when launched.

Do NOT rely on EXPOSE docker command to handle port mapping.

  • The EXPOSE command is intended to signal to the user of your image which ports are to be opened, however due to security reasons we can’t let you define 1:1 port mappings on fixed ports. You may supply this argument but it will be ignored during deployment on Edgegap. Configure your port mapping through our Dashboard or API - see 🏷️ App Versions.

Do NOT run databases on Edgegap deployments.

  • Edgegap deployments are not intended for long-running processes and may be terminated after a long period of runtime without prior notice. A database (even if distributed) running in this manner may be terminated and result in an irreversible loss of data. If you need a database, please consider a third party DBaaS.

FROM {image} is your base image, for Unity projects we usually use a long-term supported Linux, but any Linux-based base image will do. These are usually public images stored on dockerhub. Dockerfile reference here. .

COPY {source} {destination} to copy your linux server build from your host machine inside the image, so you can start it later on. .

USER {user} should follow after a or equivalent, it’s best not to run everything as root to be on the safer side. .

CMD {command} will be the last line, most likely calling a StartServer.sh or some kind of startup script to make sure your server initializes correctly once everything is set up. .

do NOT use VOLUME - you will not be able to mount any local storage this way on Edgegap, consider our Endpoint Storage feature instead and use an S3 bucket, see .

Consider using our for hosting databases and long running services.

Dockerfile reference here
Dockerfile reference here
useradd (ubuntu) command
Dockerfile reference here
Dockerfile reference here
Endpoint Storage
Managed Clusters