Puck Guide

A quick guide to hosting your own Puck server

Getting Started - The Simple Way

There are TWO different ways of hosting your own Puck server, one is to simply open your game up normally and open the "SERVER BROWSER" menu and select "NEW SERVER" at the bottom

Server Browser

You will be presented with this screen

New Server Menu
  • Server Type: Choose between "Self Hosted" or "Dedicated"
    • Self Hosted means on your own system and network, Dedicated uses Pucks own servers however are limited in Tick rate and can feel quite sluggish
  • Name: Enter your server name (appears in server browser)
    • You can use Unity Rich Text for colours and sizes, be careful of the character limit & do not abuse this
  • Port: Set the port number (default is 7777)
    • This is the port you will either forward (in your modem/router panel) or you can enable UPNP
  • Maximum Players: Use slider to set player limit
  • Password Protected: Toggle to require password for joining
  • Password: Enter password if protection is enabled
  • VoIP: Toggle voice chat on/off (checkbox)

⚠️ Important Considerations

This method relies on good ping and framerate. Dedicated servers are limited to 100hz/100fps. Self-hosted servers need solid network and system specs for higher refresh rates.

The videos below show high vs low frame rates. In Puck, physics run server-side, so your mouse movements are limited by the server's tick rate, causing sluggish controls unless adjusted.

Port Forwarding Setup

If players can't connect to your server, you need to open ports 7777 and 7778 (UDP) on your router. So long as you are not behind a CGNAT.

Access your router's admin panel: Run ipconfig in Windows Terminal, copy the "Default Gateway" IP address (like 192.168.1.1), paste it into your browser's address bar, then log in using the credentials typically on your router's label.

Port Forward Setup Example:

Port Forwarding Guides by Router Brand

Enabling UPnP

Alternative: You can enable UPnP instead of manual port forwarding. This is less reliable but automatically handles port forwarding for all applications. Look for a UPnP toggle in your router admin settings (usually at 192.168.1.1).

Security Warning

Enabling UPnP can resolve connection issues rather than simply port forwarding, however, this can create security vulnerabilities. A lot of routers have UPnP disabled by default for a reason.

Still Can't Connect?

Check Your PC Firewall

Your PC's firewall might be blocking the connection even when your router is configured correctly. Make sure Windows Firewall and any other security software are allowing ports 7777 and 7778 through.

CGNAT / Double-NAT Issues

If your network is behind a "double-NAT" or CGNAT (Carrier-Grade NAT), port forwarding won't work properly.

How to check: Compare your router's WAN IP address with your public IP from ifconfig.io. If they don't match, you're behind CGNAT.

Solution: Use a paid VPS provider instead (see guides below).

CGNAT network diagram showing double-NAT configuration

The Advanced Way

Want something more permanent, stable, dedicated and more performant?

VPS vs Home Server

VPS: Professional hosting, better uptime, monthly cost. Best for 24/7 public servers (CDL, Toasters Rinks & PHL).

Home Server: No ongoing costs, full control, uses your bandwidth/electricity. Best for friends & family servers.

VPS Providers

Operating System

Debian (Recommended) - Stable, beginner-friendly, minimal resources.
Ubuntu Server - User-friendly, great community support.
Fedora Server - Modern features, cutting-edge packages.
Docker Container - Easiest deployment (Not available yet).
Windows Server - Familiar interface but resource-heavy. Not recommended.

Server Setup & Configuration

This guide was last updated for Build 202

Prerequisites

  • A Debian-based (Debian 12 bookworm) server with SSH access
  • (Debian 13 has now released but has not been tested, likely the exact same)
  • Root access and preferably a dedicated sudo user
  • At least 2GB of memory (each Puck server uses ~300MB)
  • Basic command line knowledge

These commands are executed as root user

If you are not comfortable with the command line, please use the simple guide above.

You can use sudo to run commands as root, but for the sake of simplicity, we will be using su -l for the entire guide.

A dedicated puckd user will be created below for the server daemon

Step 1: Update Your System

apt update && apt upgrade -y

Step 2: Install Prerequisites & SteamCMD

Install necessary tools and prepare SteamCMD:

apt install software-properties-common
echo "deb http://deb.debian.org/debian bookworm main contrib non-free" > /etc/apt/sources.list.d/nonfree.list
dpkg --add-architecture i386
apt update
apt install steamcmd

Step 3: Create Server Download Directory

mkdir -p /srv/puck-download

Step 4: Download Puck Server Files

Use SteamCMD to download the server files:

/usr/games/steamcmd +force_install_dir /srv/puck-download +login anonymous +app_update 3481440 +quit

Note: 3481440 is the Steam App ID for Puck's dedicated server. You can verify it on SteamDB.

Step 5: Create System User for Running Server

Create a dedicated system user for running the server:

adduser --system --no-create-home --group puckd

Step 6: Set Up the First Server Instance

Create the server directory and assign permissions:

mkdir -p /srv/puck/server1
cp -r /srv/puck-download/* /srv/puck/server1/
chown -R puckd:puckd /srv/puck/server1
chmod +x /srv/puck/server1/start_server.sh
chmod +x /srv/puck/server1/Puck.x86_64

Step 7: Create Server Configuration

nano /srv/puck/server1/config.json

Paste and modify as needed:

{
  "port": 7777,
  "pingPort": 7778,
  "name": "My Dedicated Puck Server",
  "maxPlayers": 10,
  "password": "",
  "voip": false,
  "isPublic": true,
  "adminSteamIds": [],
  "reloadBannedSteamIds": false,
  "usePuckBannedSteamIds": true,
  "printMetrics": true,
  "kickTimeout": 300,
  "sleepTimeout": 60,
  "joinMidMatchDelay": 10,
  "targetFrameRate": 120,
  "serverTickRate": 100,
  "clientTickRate": 200,
  "startPaused": false,
  "allowVoting": true,
  "phaseDurationMap": {
    "Warmup": 600,
    "FaceOff": 3,
    "Playing": 300,
    "BlueScore": 5,
    "RedScore": 5,
    "Replay": 10,
    "PeriodOver": 15,
    "GameOver": 15
  },
  "mods": [
    {
      "id": 3493628417,
      "enabled": false,
      "clientRequired": true
    },
    {
      "id": 3491056040,
      "enabled": true,
      "clientRequired": false
    }
  ]
}

Important Settings

  • Name: Enter your server name (appears in server browser)
    • You can use Unity Rich Text for colors and sizes. Be careful of the character limit and do not abuse this feature.
  • Port: Set the port number (default is 7777)
    • This is the port you will either forward (in your modem/router panel) or you can enable UPnP.
  • targetFrameRate: The actual FPS the server will attempt to run at. Recommended to set this value 10-20 above tickRate.
  • serverTickRate: This is essentially the "data rate" of the server. Recommended values are 240-360Hz+ if your hardware & network can handle it.
  • clientTickRate: The rate at which players send input updates to the server (should improve input lag). You can experiment with this value - I set mine to the same as the serverTickRate.
  • Mods: The example configuration will add Toaster's Crispy Shadows (3493628417) as a client-sided mod and GAFURIX' Custom MOTD (3491056040) as a server-sided mod to your server.

Step 8: Create systemd Unit

nano /etc/systemd/system/puck@.service

Paste:

[Unit]
Description=Puck Dedicated Server - %i
After=network.target

[Service]
WorkingDirectory=/srv/puck/%i
User=puckd
ExecStart=/srv/puck/%i/start_server.sh --serverConfigurationPath /srv/puck/%i/config.json
Restart=on-failure

[Install]
WantedBy=multi-user.target

Step 9: Enable and Start the Server

systemctl daemon-reload
systemctl enable puck@server1
systemctl start puck@server1

Check status:

systemctl status puck@server1
journalctl -u puck@server1 -f

Step 10: Open Firewall Ports

By default, Debian has no firewall configured, meaning all ports are open. On a VPS, this is a security risk.

Install ufw and open required UDP ports
apt install ufw
ufw enable
ufw allow 7777/udp
ufw allow 7778/udp

Adjust port numbers based on your configuration.


Managing Multiple Servers

Step 1: Duplicate Server Files

Copy the existing server instance to create a new one:

cp -r /srv/puck/server1 /srv/puck/server2

Step 2: Configure New Server Ports

Edit the configuration file and change the port numbers:

Change ports to one above both, example 7779 & 7780
nano /srv/puck/server2/config.json

Step 3: Set File Permissions

Mods & Logging will break if you skip this step

Give ownership of the new files to the puckd user:

chown -R puckd:puckd /srv/puck/server2

Step 4: Enable Auto-Start

Enable the new server to start automatically on boot:

systemctl enable puck@server2

Step 5: Start and Monitor

Start the server:

systemctl start puck@server2

Check if it's working with logs:

journalctl -u puck@server2 -f

Server Management Commands

Troubleshooting

Service won't start
Check logs with journalctl -u puck@server1

Can't connect
Double-check firewall and public IP on VPS

Your Puck server should now be live and ready for players.