6 min read
My puck server hosting guide

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

  1. Go to https://hub.upcloud.com/deploy
  2. Choose your location. I’ll be selecting DE-FRA1 - Frankfurt
  3. Select the €3.00 per month Developer plan
  4. (Optional) enable an Automated backups plan
  5. Select Debian GNU/Linux 12 (Bookworm) as your operating system
  6. Disable IPv6 (unless you want it for some reason)
  7. Select the checkbox for your Public SSH key
  8. Choose your hostname and server name
  9. 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 enter
  • dpkg --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.