Full credit to my friend MigoMipo for the system, just doing docs. You can find Puck at https://store.steampowered.com/app/2994020/Puck/
I’ll be demonstrating this using the cloud host I am currently employed by - upcloud.com. We have locations all over the globe - Europe, USA and Asia.
Limited time only - sign up with promo code puck25 https://signup.upcloud.com/?promo=puck25
You’ll get an extended 1 month trial, and enough credits to run 2 to 4 Puck instances for a few months. At the end of your trial month, you will need to make a one-time, minimum 10 euro deposit with Visa/Mastercard to continue using the account after this. We’ll be using the 3 euro a month plan. We only charge by the hour from your credit balance - no commitment!
Before you get started, set up your SSH keys following this guide, using PuTTY if you’re on a Windows-based PC: https://upcloud.com/docs/guides/use-ssh-keys-authentication/#putty.
Any problems with SSH keys and I recommend asking questions to any AI chatbot, like Mistral’s Le Chat for example https://chat.mistral.ai/chat. If you are still struggling, you can open a live chat with our support team for further assistance. Your private key file is your password - keep it safe.
I will indicate terminal commands to execute with code blocks
. Please read the guide fully and carefully - I recommend to copy and paste commands where applicable.
Deploying your Linux server
- Go to https://hub.upcloud.com/deploy
- Choose your location. I’ll be selecting DE-FRA1 - Frankfurt
- Select the €3.00 per month Developer plan
- (Optional) enable an Automated backups plan
- Select Debian GNU/Linux 12 (Bookworm) as your operating system
- Disable IPv6 (unless you want it for some reason)
- Select the checkbox for your Public SSH key
- Choose your hostname and server name
- Deploy!
Connect to the server
Using PuTTY or your preferred SSH client/terminal, connect to the public IP address of the server as the root
user. The IP should be visible under https://hub.upcloud.com/server.
Create the folders for installation
mkdir /srv/puck
mkdir /srv/puck/puckserver
Update and install dependencies
apt update && apt upgrade -y
apt install software-properties-common
apt-add-repository non-free
and press enterdpkg --add-architecture i386
apt update && apt install steamcmd
(tab+enter to select done, arrows+enter to agree)- Optional:
reboot
to apply all updates (connect again after 1-2 minutes)
Install the Steam Puck server
/usr/games/steamcmd +force_install_dir /srv/puck/puckserver +login anonymous +app_update 3481440 +quit
this should finish with Success! App ‘3481440’ fully installed.
Create the service user and set permissions
useradd -r puck
chown -R puck:puck /srv/puck
Create the systemd unit and reload systemd
echo -e '[Unit]\nDescription=Puck Server\n\n[Service]\nWorkingDirectory=/srv/puck\nUser=puck\nExecStart=/srv/puck/puckserver/Puck.x86_64 --serverConfigurationPath %i.json\n\n[Install]\nWantedBy=multi-user.target' > /etc/systemd/system/puck@.service
systemctl daemon-reload
First run and further configuration
To generate your configuration, you need to run the Puck instance once with systemctl start puck@server1
wait about 60 seconds, then stop it again with systemctl stop puck@server1
.
You’ll now have a couple more files under /srv/puck. Go there with cd /srv/puck
and ls
to view the files. You should have banned_steam_ids.json
- this stores the steam IDs of any player banned for you, and can be re-loaded on server start to keep out those pesky trolls.
But the main thing you’ll want to look at is server1.json
- this is where you can set things how you like. First, make a backup copy with cp server1.json server1.json.bak
Then we can go through the settings. Most of these are obvious, but I’ll cover the ones you might want to change. Make sure you don’t mess with the formatting - follow the use of commas, and quotes where applicable.
Open the config file with the editor of your choice: nano is quite simple for beginners nano server1.json
once you’ve made your changes, write to the file with ctrl+O then enter, and exit with ctrl+X.
port/pingPort: these are the network ports the server uses to communicate, 7777 and 7778 by default. Leave this alone - only increase (example to 7779+7880, 7781+7882 etc) when you are configuring further servers.
name: The name of your server. You can even set colours and formatting - <b>bold<b>
and <color=cyan>name</color>
will make the words contained cyan - use any colour you want of course. Check the Unity docs for more information on this.
adminSteamIds: Enter in the [] block the steamID64’s of those you want to give admin permissions to - example ["12361198866157321", "12361198047409321"],
you can find this on a site like https://www.steamidfinder.com/
reloadBannedSteamIds: Recommend changing this from false
to true
. This ensures the banned IDs file is loaded on server start.
serverTickRate/clientTickRate: recommend 360 for both of these, but feel free to experiment. This is how fast the server and client update each other.
targetFrameRate: recommended to be 10-20 higher than tickrate. I use 380.
Done!
So now you should be able to run systemctl start puck@server1
and see your server come online in-game! If you need to edit your config further, you need to restart the service with systemctl restart puck@server1
Multiple servers?
Here’s the really cool part about this system - ease of running multiple servers on one virtual machine. The UpCloud 3 euro plan can handle two - though you need to give it some extra swap memory (500MB in this case) to prevent issues there.
fallocate -l 500M /swapfile
dd if=/dev/zero of=/swapfile bs=1M count=500
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab
Now on to the server config magic…
- Make a new server config -
cp server1.json server2.json
- Edit the new config -
nano server2.json
- Change the ports to 7779 and 7880
- Update the name to a different one
- Write and exit the file - ctrl+O, enter, ctrl+X
- run it -
systemctl start puck@server2
And there you go, you’ll have a second server running! Server2 will use the server2.json.
The 3 euro plan cannot handle any more, but if you had a larger plan and wanted to try adding more, just create a server3.json, change ports and name, and start puck@server3, and so on! If you want a 3rd+4th puck instance, I recommend cloning the server following this guide https://upcloud.com/resources/tutorials/server-cloning then just rename your servers in the config to 3 and 4, etc. No need to change ports, as it’s a totally new virtual machine.