Getting Started - Servers
Learn by doing and 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.
Choose your build method:
⚡ Build from Containers is the fastest and most reliable method to get started,
⚡ Build from Plugin [legacy] requires building Unreal Engine from source.
⚡ Build from Containers
Building from containers is the fastest and most reliable method to get started.
Preparation
Create a Personal Access Token on Github:
navigate to Github Personal Access Tokens (classic) page,
Generate new token (classic),
enable only permission
[read:packages]
,generate token - store this value safely, you won't see it again.
1. Connect your Edgegap Account
☑️ To get started, you'll need to create a free account with Edgegap. No credit card required.
✅ 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.
☑️ Disable Unreal Engine version compatibility check for dedicated servers and set IpNetDriver
as the default driver or the fallback driver for replication networking:
net.IgnoreNetworkChecksumMismatch=1
net.CurrentHandshakeVersion=2
net.MinHandshakeVersion=2
net.VerifyNetSessionID=0
net.VerifyNetClientID=0
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions(DefName="GameNetDriver",DriverClassName="OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
MaxClientRate=1000000000
MaxInternetClientRate=1000000000
InitialConnectTimeout=120.0
MaxNetTickRate=60
NetServerMaxTickRate=60
DefaultServerTarget=LyraServer
☑️ 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.
When using Lyra Starter Game sample, make sure to duplicate and rename your LyraGameEOS.Target.cs
file and the containing class name to match your project name.
☑️ Enable standard output server logs by adding overrides in your server target script:
bUseLoggingInShipping = true;
bOverrideBuildEnvironment = true;
✅ 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.
☑️ Download our Edgegap Build Utils archive including:
platform-specific build scripts:
BuildAndUpload.ps1
for Windows,BuildAndUpload.sh
for macOS and Linux,
Dockerfile
- recipe for building your docker images,dockerignore
- list of noncritical files to remove and speed up builds,StartServer.sh
- utility script managing your Unreal Engine lifecycle on runtime.
☑️ Extract all contents of the archive to your project root directory.
☑️ Edit the BuildAndUpload
script for your platform to configure:
github credentials used to pull pre-built Unreal Engine images for Linux Servers,
project details - engine version, server configuration, .uproject file name,
Edgegap Registry credentials used to upload your completed builds.
☑️ Execute the edited script to start build and upload process. Completing this step will add a new image in your Edgegap Container Registry dashboard page in your Repository.
☑️ You will be automatically redirected to create a new 🏷️ App Versions in dashboard.
✅ You may now proceed to the next step, skip to 🧪 Test your Server Locally.
⚡ Build from Plugin
This is a legacy build method including advanced utilities, requiring building Unreal Engine from source.
Preparation
Choose one of the official plugins:
download ⚡ Dedicated Servers Quickstart Plugin.
1. Connect your Edgegap Account
☑️ To get started, you'll need to create a free account with Edgegap. No credit card required.
☑️ Once you’re signed in, create an Edgegap API token 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.
☑️ Build your Unreal Engine version from source on your development machine,
install specific release branch (e.g.
5.5
) to build on a stable foundation,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.
☑️ Install Unreal Cross-Compiling Toolchain to build game servers for Linux.
☑️ Restart your development machine, otherwise you’ll run into errors later on!
☑️ Disable Unreal Engine version compatibility check for dedicated servers and set IpNetDriver
as the default driver or the fallback driver for replication networking:
net.IgnoreNetworkChecksumMismatch=1
net.CurrentHandshakeVersion=2
net.MinHandshakeVersion=2
net.VerifyNetSessionID=0
net.VerifyNetClientID=0
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions(DefName="GameNetDriver",DriverClassName="OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
MaxClientRate=1000000000
MaxInternetClientRate=1000000000
InitialConnectTimeout=120.0
MaxNetTickRate=60
NetServerMaxTickRate=60
DefaultServerTarget=LyraServer
☑️ 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.
When using Lyra Starter Game sample, make sure to duplicate and rename your LyraGameEOS.Target.cs
file and the containing class name to match your project name.
☑️ Enable standard output server logs by adding overrides in your server target script:
bUseLoggingInShipping = true;
bOverrideBuildEnvironment = true;
✅ 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.
☑️ Rebuild our plugin for your custom Unreal Engine version built from source.
☑️ 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
anddev
.Learn more about Apps and Versions later.
Do not reuse latest
version to prevent our system from deploying outdated (cached) image.
☑️ Click Create Application. Completing this step will result in a new application appearing in Edgegap Dashboard.
☑️ Skip custom container registry settings for now, you can use third party registry later if you’d like.
☑️ 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 Edgegap Container Registry dashboard page underneath your Repository, and a new 🏷️ App Versions appears in your dashboard underneath your Application.
✅ You may now proceed to the next step.
🧪 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
or127.0.0.1
(equivalent in most cases),port
= randomized external port value of the container in Docker GUI.

☑️ 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.
✅ You may now proceed to the next step.
🟢 Deploy 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.
☑️ Open deployments dashboard page and click Create Deployment.
☑️ 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.
☑️ Once you’re ready, hit Deploy to cloud, wait to reach 3. Deployment Ready. Ensure that your Container Logs don’t show any errors and your Container Metrics 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 new Deployment being started on your Edgegap account.
☑️ 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}
.

Disable VPN when testing for more realistic conditions and receive a low-latency deployment.
☑️ 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, inspect Dashboard logs of your deployment. If you can’t figure out the issue, we’re hanging out in our Community Discord and happy to help.
🙌 Congratulations on your first Deployment on Edgegap! If you’d like to learn more, keep reading.
⭐ Matchmaking and More
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.
Starting your Deployments manually, pasting URL and ports will not cut it for a live game. Read more about Matchmaking. Consider upgrading to pay as you go pricing tier to run multiple deployments.
Looking for inspiration? Take a peek at our Game Samples, sharing is caring!
Stop Deployments
Learn about various methods to stop deployments once the match concludes.
Deployments will be stopped automatically when your server calls RequestExit
or crashes.
Environment Variables
☑️ Check if the current instance is a game client or server by reading if any of your Injected Environment Variables (e.g. ARBITRIUM_REQUEST_ID
) are set:
if (
FPlatformMisc::GetEnvironmentVariable(TEXT("ARBITRIUM_REQUEST_ID")).empty()
)
{
// client code
} else {
// server code
}
Optimize Server Builds
Only include what you absolutely need for your server to run.
Copying unused files in your images results in image bloat, longer uploads, slower caching speeds, and slower overall server startup. Review Docker image optimization suggestions.
Consider using multi-stage Docker builds (link).
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 thendocker 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.
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:
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. 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. Dockerfile reference here.USER {user}
should follow after a useradd (ubuntu) command or equivalent, it’s best not to run everything asroot
to be on the safer side. Dockerfile reference here.CMD {command}
will be the last line, most likely calling aStartServer.sh
or some kind of startup script to make sure your server initializes correctly once everything is set up. Dockerfile reference here.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 Endpoint Storage,EXPOSE 7777/UDP
is not required! This will not actually make the internal server port available from outside the container, it's only a hint for the developer and the port needs to bepublished when testing locally with
docker run <image> -p 7777/udp
,or mapped in Edgegap Port Mapping.
Delay declaration of parameters until latest possible moment. Configurability > composability due to long server build times. Apply this approach to Dockerfile commands to build and upload faster.
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:
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,
version parameters - shared for all deployments on an app version - deployment stage, artifact tag, third party secrets and endpoints, and similar; then
one single image - contains and loads all configuration options when launched.
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.
Consider using our Managed Clusters for hosting databases and long running services.
Last updated
Was this helpful?