Last updated: 15 July 2025
Full credit to my friend MigoMipo for the system, just doing docs. You can find Puck at https://store.steampowered.com/app/2994020/Puck/
If you’re looking for high quality hosting, I have a promo code available for my host - 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 2 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. Full disclaimer, I am employed by UpCloud and make no money from this.
I’ll be using the 3 euro a month 1CPU/1GB developer plan here, which is good to run two 20-player Puck instances. UpCloud only charges 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. You might end up chatting to me :) 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.
Deploy your Linux server
- Go to https://hub.upcloud.com/deploy
- Choose your location. This should be geographically close to your playerbase
- Select the €3.00 per month Developer plan
- Select Debian GNU/Linux 12 (Bookworm) as your operating system
- Disable IPv6 and Utility networks (unless you want them 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, connect to the public IP address of the server as the root
user. The IP should be visible under https://hub.upcloud.com/server. Check this guide for help https://upcloud.com/docs/guides/connecting-to-your-server/#putty
Copy and run the script from my GitHub repository
curl -fsSL https://raw.githubusercontent.com/pogsee/puckserver-utils/main/puckserverinit.sh -o puckserverinit.sh
chmod +x puckserverinit.sh
./puckserverinit.sh
When prompted after a few minutes, provide input for the script
- Names of each server
- Admin steamID64 (you can add more admins later)
- Password (leave empty for none)
Start your servers
You can now start each (or only 1 if you want) server with systemctl start puck@server1
and systemctl start puck@server2
.
They should appear in the Puck server list now in-game!
Advanced configuration
Fancy yourself a computer whizz? Here’s some further information on how to re-configure the servers and how things work.
All of your relevant files are under /srv/puck. You can always go there with cd /srv/puck
and view the files with ls
There’s 3 files you need to worry about - server1.json
, server2.json
, and banned_steam_ids.json
banned_steam_ids.json
will record any banned players. On start/restart, both servers will re-read this file.
server1.json
and server2.json
are the files that define all the settings for your server.
Before making any changes here I recommend backing up your server configs with cp server1.json server1.json.backup
as an example.
You can edit the server .json files with any text edit of your choice, I tend to use nano, so nano server1.json
If you mess up the configuration, the servers will refuse to appear when started and use 100% CPU - use btop
to check. The formatting, commas, brackets, and quotation marks are vital. Remember the server will not take on new configuration from the file until stopped/started or restarted.
Overview of important fields
- port/pingPort: these are the network ports the server uses to communicate, 7777 and 7778 by default
- name: The name of the server. You can even set colours and formatting -
<b>name<b>
for bold and<color=cyan>name</color>
for colours - maxPlayers: The maximum number of players that can join the server at once. Recommended to keep to 10 for public servers
- voip: Enables or disables voice chat functionality
- password: Optionally sets a password players will need to enter to join the server
- isPublic: Enables or disables whether the server appears in the Puck server list
- adminSteamIds: Those with their steamID64’s here can run admin commands, like /pause, /resume, /kick, /ban etc. The format should be
["12361198866157321", "12361198047409321"],
All other fields I recommend to keep where they are, change at your own risk.
Extra credit
There’s a couple more things I recommend you do. You can restart the servers daily to ensure stable performance.
You can do this by editing the crontab and setting a job to do this at a specified time.
nano /etc/crontab
- Paste a new line (this will do 5AM UTC, change this as desired https://crontab.guru/#0_5___*)
0 5 * * * root systemctl restart puck@server1 && systemctl restart puck@server2
- Ctrl+O to save, Ctrl+X to exit
It’s a great idea to enable the UpCloud firewall to block any ports you don’t need, for security and stability.
- Navigate to https://hub.upcloud.com/server/, select your server, and go to the Firewall tab
- Using the Add rule button, add the following rules
- Protocol = TCP, Target port Single port = 22. This allow you to maintain SSH access
- Protocol = UDP, Source port Single port = 123. This is to allow NTP to sync with time servers
- Protocol = TCP, Target port Port range = 7777-7780. Puckserver ports
- Protocol = UDP, Target port Port range = 7777-7780. Puckserver ports
- Protocol = ICMP. Allows pings
- Enable the checkbox at the bottom to “Auto-add these DNS rules”
- Save changes
- Enable the toggle the firewall
The 3 euro plan cannot handle more than two Puck instances, but if you had a larger plan and wanted to try adding more, just copy your config to server3.json, change ports and name, and start puck@server3, and so on!