Setting up a dedicated server: Difference between revisions
m (→Hosting Providers: removed hosting providers to their own page) |
Invicta nz (talk | contribs) (→Operating System: Added 24.04) |
||
(48 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
== Setting up a dedicated server == | == Setting up a dedicated server == | ||
'''There are no Windows binaries''' | '''There are no Windows binaries. You can't host a Pavlov server on any machine that runs Windows.''' | ||
This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own. | This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own. | ||
Line 15: | Line 15: | ||
And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go. | And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go. | ||
If you don't want to go through the hassle yourself and want to pay for a hosting service Arctic VR (PC and Shack) and Horde (Shack) provide a server hosting services and are trusted in the community. | '''If you don't want to go through the hassle yourself and want to pay for a hosting service: [https://www.arctic-vr.com/ Arctic VR (For both PC and Shack)] and Horde (Shack) provide a server hosting services and are trusted in the community.''' | ||
---- | |||
=== Server Requirements === | |||
==== Operating System ==== | |||
'''Pavlovserver can only be hosted under Linux.''' | |||
Known good operating systems are: | |||
* Ubuntu 18.04 x86_64 | |||
* Ubuntu 19/04 amd64 | |||
* Ubuntu 20.04 x86_64 | |||
* Ubuntu 22.04 x86_64 | |||
* Ubuntu 24.04 x86_64 | |||
* Rocky Linux 8 | |||
This can be running as a VM under windows, but this will increase the complexity of the setup beyond this guide. | |||
Ubuntu 15.04 x86 is known to fail to install using this guide. Recommend not running on "minimal" images as some tools are missing, and they can be installed, which is not covered in the scope of this guide. | |||
==== Resources and Performance Optimisation ==== | |||
* 2GB RAM for Basic 10 player vanilla server. 4GB for 24+ player server with content mods or large maps. More RAM is recommended for larger maps, higher player counts, or complex gamemodes. Not having enough RAM is a common cause of server crashes. | |||
* A ~2.5Ghz CPU will comfortably support a 10 player server. | |||
* A ~4Ghz CPU will comfortably support 24 players. Pavlov on PC can support up to 50 players. Shack is limited by 24. | |||
Pavlov servers are functionally single threaded - one thread does vast majority of work. More CPUs only help if you are running more servers. More clockspeed = higher performance = more users per server. Hence, no particular performance benefit is gained from multithreading - if you are running multiple instances of a pavlov server, you will require more CPU cores. | |||
Lower player counts are recommended for complex gamemodes (E.g. CodZ) and/or highly detailed maps, so that maximum number will often be lower. Note that these player count numbers are just suggestions to help optimise for the best performance, based on experiences with many server providers on different grades of hardware. | |||
As of 12/3/2024 24 is the hard limits for player counts for Shack, but PC is limited to 50. | |||
The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread. | The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread. | ||
Line 43: | Line 51: | ||
==== Hosting at home ==== | ==== Hosting at home ==== | ||
Hosting at home is generally not recomended. '''Not understanding the hosting at home requirements and configuration is a frequent cause of failed setups and questions in discord. Don't skip these steps if you are trying to host from home''' | |||
When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests. These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding, https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT. | When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests. These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding, https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT. | ||
Line 48: | Line 58: | ||
You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further. | You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further. | ||
'''There are serious security implications of hosting this software at home.''' None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about. | '''There are serious security implications of hosting this software at home.''' None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about. | ||
Line 60: | Line 68: | ||
Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue. | Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue. | ||
It should go without saying that hosting at home usually invites a myriad of potential problems that will be unique to your setup - such as your ISP, router, or network configuration. There is a lively community of like-minded server hosters on the Pavlov-VR Discord, so if you get stuck, head on over to the discord and see whether you can find the answers you're looking for. | |||
---- | ---- | ||
=== Starting Server Install === | |||
====Obtaining an ApiKey ==== | |||
[[File:Server API Key.jpg|thumb|Example code generated in settings menu]] | |||
'''<u>This is required for all servers as of the December 2024 Pavlov Update.</u>''' | |||
For your server to show up in the server list, there is now a requirement to have an ApiKey issued by Vankrupt. You will need to load up the game on your headset the navigate to the settings, in the general tab is there a button to Generate Server Code. | |||
[[File:Pavlov Settings API Key Button.jpg|thumb|API key generator button located in the settings menu]] | |||
* Your "pin" will only be valid for 15 minutes. | |||
* If your server key is exposed you can create a new key by generating a new 6 digit code. | |||
* This will invalidate the old key. | |||
* A server key can be used by multiple servers. | |||
* A user may only have one server key, requesting a new one will invalidate the old one. | |||
This will give you a 6 character code you need to combine with your player ID to generate a server key. | |||
Get the key by going here: https://api-key.vankrupt.net/ | |||
[[File:Generateserverkey.png|thumb|449x449px|Screenshot from vankrupt API website]] | |||
Once you submit you will get your unique Server API Key that needs to go into your Game.ini | |||
'''Warnings:''' | |||
* '''Abusing a Server key may result in a ban to the attached user.''' | |||
* '''<u>Do NOT share your server key</u>, it should be used by you alone.''' | |||
* '''Store your server key in a safe place, such as a password or secret manager.''' | |||
Save this key for later, so that you can ut this key in your Game.ini as follows: | |||
ApiKey="ABC123FALSEKEYDONTUSEME" | ApiKey="ABC123FALSEKEYDONTUSEME" | ||
or if you would like (personally untested..I would use | or if you would like (personally untested..I would use Game.ini) you can call it at server runtime with flag as follows: | ||
-KEY="ABC123FALSEKEYDONTUSEME" | -KEY="ABC123FALSEKEYDONTUSEME" | ||
This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key. | This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key. | ||
====System setup and software installation==== | ====System setup and software installation==== | ||
In this step we will: | |||
Install dependencies | # Check the operating system is compatible | ||
# Install some dependencies | |||
# create the user "steam" and set it's password, and switch to that user | |||
# as "steam" user, install Steamcmd, the binary used to download steam games in linux | |||
# use Steamcmd to install Pavlov. | |||
'''Ubuntu 20. | These steps only need to be done the first time you set up the server. We'll then look at some post-installation steps. | ||
===== Step 1: Check the operating system is compatible ===== | |||
Confirm Linux version, run the command: | |||
lsb_release -a | |||
Expect the result to say '''Ubuntu 20.04''' (or one of the other known supported operating systems - this guide assumes Ubuntu or a Fedora system) | |||
'''Rocky Linux, CentOS 8, and RHEL 8'' | ===== Step 2: Install some dependencies ===== | ||
<blockquote>'''For Ubuntu 22.10 or higher'''</blockquote> | |||
sudo apt update && sudo apt install -y gdb curl lib32gcc-s1 libc++-dev unzip | |||
<blockquote>'''For older version of Ubuntu prior to 22.10:'''</blockquote> | |||
sudo apt update && sudo apt install -y gdb curl lib32gcc1 libc++-dev unzip | |||
<blockquote>For Rocky Linux, CentOS 8, and RHEL 8</blockquote> | |||
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/g' /etc/selinux/config | |||
sudo setenforce 0 | |||
sudo yum install gdb curl glibc.i686 libstdc++.i686 libstdc++-devel.i686 libstdc++-devel.x86_64 unzip wget -y | |||
wget <nowiki>https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libcxx-3.8.0-3.el7.x86_64.rpm</nowiki> | |||
sudo rpm -i libcxx-3.8.0-3.el7.x86_64.rpm | |||
===== Step 3: Create the steam user ===== | |||
sudo useradd -m steam | |||
sudo useradd -m steam | |||
[Optional] Set | [Optional] Set the /bin/bash shell for the steam user this will allow you to use arrow keys in terminal and show what folder you are in at all times<pre>sudo chsh -s /bin/bash steam</pre> | ||
<pre>sudo | |||
[Optional] Set a password for steam.<pre>sudo passwd steam</pre> | |||
<pre> | Login as the Steam user. ('''You will need to do this each time you connect to your server - editing game files and interacting with the game server should be done as the steam user'''):<pre> | ||
sudo su -l steam | sudo su -l steam | ||
</pre> | </pre> | ||
===== Step 4: Install Steam, known as SteamCMD ===== | |||
Install Steam | |||
<pre> | <pre> | ||
mkdir ~/Steam && cd ~/Steam && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf - | mkdir ~/Steam && cd ~/Steam && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf - | ||
</pre> | </pre> | ||
===== Step 5: User SteamCMD to install Pavlov ===== | |||
There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC) | There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC) | ||
(You will need to run this command each time there is a Pavlov Server update). | (You will need to run this command each time there is a Pavlov Server update). | ||
<br /> | <br />To host '''PC Server (non-beta)''': | ||
To host '''PC Server (non-beta)''': | |||
<pre> | <pre> | ||
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit | ~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit | ||
</pre> | </pre> | ||
Line 148: | Line 171: | ||
</pre> | </pre> | ||
To host '''Shack RC''' (Quest): | To host '''Shack RC''' (Quest): | ||
<pre> | <pre> | ||
Line 154: | Line 177: | ||
</pre> | </pre> | ||
Now that we've installed the server, | ===== Post Installation Steps ===== | ||
Install a fresh copy of steamclient.so | Now that we've installed the server, Install a fresh copy of steamclient.so. You may also have to do this after each update. | ||
<pre> | <pre> | ||
~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit | ~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit | ||
Line 163: | Line 186: | ||
</pre> | </pre> | ||
All versions are required to run these commands to change the libc++ that steamclient uses: | |||
<code>sudo rm /usr/lib/x86_64-linux-gnu/libc++.so</code> | <code>sudo rm /usr/lib/x86_64-linux-gnu/libc++.so</code> | ||
<code>sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so</code> | <code>sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so</code> | ||
Make the PavlovServer script executable. (You only need to do this once): | Make the PavlovServer script executable. (You only need to do this once): | ||
Line 174: | Line 196: | ||
</pre> | </pre> | ||
Make a note to review these steps later, if you would like to automate server and steam client updates. | |||
---- | |||
=== Server Configuration === | |||
Before being able to properly use the server we need to configure it. You should attempt to start the server, let it start up, and then shut down the server, which should create all the required configuration files and directories. | |||
- | However, if you are having trouble, it may help to create the directories manually first - make sure you are doing these actions as the "steam" user. | ||
Start by creating some directories: | |||
<pre> | <pre> | ||
Line 191: | Line 215: | ||
==== Mods/Blacklist/Whitelist (optional) ==== | ==== Mods/Blacklist/Whitelist (optional) ==== | ||
The following three files allow you to specify mods, banned players, and whitelist players. | The following three files allow you to specify mods, banned players, and whitelist players. These are optional, but go ahead and create them. Populating the files is described later. | ||
<pre> | <pre> | ||
Line 200: | Line 224: | ||
====Configuring Game.ini==== | ====Configuring Game.ini==== | ||
If starting the server did not create a default Game.ini, create a new Game.ini file using following command to open an editor and copy/paste the following block into it then save it. | |||
Note not all of these options are required. For instance remove or comment out the Password=0000 line to make a public server with no pin. | |||
You will also need to fetch your API Key you set up earlier. | |||
<pre> | <pre> | ||
nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini | nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini | ||
Line 208: | Line 236: | ||
[/Script/Pavlov.DedicatedServer] | [/Script/Pavlov.DedicatedServer] | ||
bEnabled=true | bEnabled=true | ||
ServerName="My_private_idaho" | ServerName="My_private_idaho" | ||
MaxPlayers=10 # | MaxPlayers=10 #its recommended for the best experience to keep shack servers at or below 10 players pcvr and psvr are both capped at 24 too. | ||
ApiKey="ABC123FALSEKEYDONTUSEME" | ApiKey="ABC123FALSEKEYDONTUSEME" | ||
bSecured=true | bSecured=true | ||
Line 220: | Line 248: | ||
TickRate=90 | TickRate=90 | ||
TimeLimit=60 | TimeLimit=60 | ||
AFKTimeLimit=300 | |||
#Password=0000 | #Password=0000 | ||
#BalanceTableURL="vankruptgames/BalancingTable/main" | #BalanceTableURL="vankruptgames/BalancingTable/main" | ||
Line 225: | Line 254: | ||
MapRotation=(MapId="datacenter", GameMode="SND") | MapRotation=(MapId="datacenter", GameMode="SND") | ||
MapRotation=(MapId="sand", GameMode="DM") | MapRotation=(MapId="sand", GameMode="DM") | ||
AdditionalMods=UGC3462586 | |||
</pre> | </pre> | ||
* '''bEnabled''' - whether the server appears in the server list (unconfirmed) | * '''bEnabled''' - whether the server appears in the server list (unconfirmed) | ||
* '''ServerName''' - name it will be listed as. (approx 35 chars max) | * '''ServerName''' - name it will be listed as. (approx 35 chars max). There is a profanity filter that may cause the server to not show. It can be strict for example "BASS FISHING SERVER" might get flagged for "ASS" in the name. | ||
* '''MaxPlayers''' - See suggested specs for limits. | * '''MaxPlayers''' - See suggested specs for limits. Shack servers allow a maximum of 24 players and while PCVR can technically support 50 no more than 24 is recomended. | ||
* '''ApiKey''' - Unique ApiKey required to register server with master server. Replace with your key | * '''ApiKey''' - Unique ApiKey required to register server with master server. Replace with your key | ||
* '''bSecured''' - enabled Valve Anti-Cheat (VAC) | * '''bSecured''' - enabled Valve Anti-Cheat (VAC) | ||
Line 238: | Line 267: | ||
* '''bWhitelist''' - Only allow users in whitelist.txt to join | * '''bWhitelist''' - Only allow users in whitelist.txt to join | ||
* '''RefreshListTime''' - sets how often the running server checks for updates in ban/whitelist/mod files | * '''RefreshListTime''' - sets how often the running server checks for updates in ban/whitelist/mod files | ||
* '''LimitedAmmoType''' - sets limited ammo mode | * '''LimitedAmmoType''' - sets limited ammo mode, see Limited Ammo Types table below | ||
* '''TimeLimit''' - sets time limit for each map | * '''TimeLimit''' - sets time limit for each map (Only works on TDM/DM type modes not those with custom logic like TTT or SND) | ||
* '''TickRate''' - sets the server tickrate. (so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching) | * '''TickRate''' - sets the server tickrate. (Default is 90. so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching) | ||
* '''Password''' - PIN number for server #FYI - this is now also changeable via rcon. | * '''Password''' - PIN number for server #FYI - this is now also changeable via rcon. | ||
* '''BalanceTableURL''' - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one. | * '''BalanceTableURL''' - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one. | ||
* '''MapRotation''' - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. <nowiki>https://mod.io/g/pavlov</nowiki>. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity <nowiki>https://mod.io/g/pavlov/m/gravity1</nowiki> has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation. | * '''MapRotation''' - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. <nowiki>https://mod.io/g/pavlov</nowiki>. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity <nowiki>https://mod.io/g/pavlov/m/gravity1</nowiki> has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation. | ||
* '''AdditionalMods''' - you can add multiple of these. Find the mod(s) you want add on modio and take its resource ID, adding 'UGC' to the front of it. | |||
* '''AFKTimeLimit''' There is now a feature to kick players who are idle in the game. Integers are measured in seconds and 0 disables AFK kicking completely. | |||
Available game modes as of 09/06/2022: | Available game modes as of 09/06/2022: See Game modes table below | ||
For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode. | For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode. | ||
= Default Map ID's = | ===== Limited Ammo Types ===== | ||
{| class="wikitable" | |||
|+ | |||
!AmmoType | |||
!Name | |||
!Description | |||
|- | |||
|0 | |||
|Unlimited | |||
|Players have unlimited ammo, carry no ammo boxes and do not display an ammo count on the wrist. | |||
|- | |||
|1 | |||
|Limited Generic | |||
|Players carry ammo boxes with a limited amount of ammo. | |||
One box for each weapon class (Pistol, Submachine gun, Rifles/MGs, Shotgun, Sniper). | |||
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo. | |||
An ammo count is displayed on the wrist. | |||
|- | |||
|2 | |||
|Limited Specific | |||
|Players carry ammo boxes with a limited amount of ammo. | |||
One box for each weapon. | |||
Mags and ammo boxes can be put on the chest of the player to consolidate the ammo. | |||
An ammo count is displayed on the wrist. | |||
|- | |||
|3 | |||
|Custom | |||
|Allows for full control over ammo by the map. | |||
|- | |||
|4 | |||
| Limited Special | |||
|'''All weapons except "special" weapons are unlimited, more clarification is needed.''' | |||
|- | |||
|5 | |||
|Boxless | |||
|'''Like limited generic but without boxes? Clarification is needed.''' | |||
|} | |||
===== Game Modes ===== | |||
{| class="wikitable" | |||
|+ | |||
!GameMode | |||
!Name | |||
|- | |||
|DM | |||
|Death match | |||
|- | |||
|KOTH | |||
|King of the hill | |||
|- | |||
|GUN | |||
| Gun game | |||
|- | |||
|OITC | |||
| One in the chamber | |||
|- | |||
|SND | |||
|Search and destroy | |||
|- | |||
|TANKTDM | |||
|WW2 Team Death Match | |||
|- | |||
| TDM | |||
|Team Death Match | |||
|- | |||
|TTT | |||
|Trouble in Terrorist Town | |||
|- | |||
|TTTclassic | |||
|TTT with only innocent/traitor/detective | |||
|- | |||
|WW2GUN | |||
|WW2 gun game | |||
|- | |||
|ZWV | |||
| Zombie wave survival | |||
|- | |||
|HIDE | |||
|The Hidden | |||
|- | |||
|INFECTION | |||
|Hidden infection | |||
|- | |||
|PUSH | |||
|Push | |||
|- | |||
|PH | |||
|Prop hunt | |||
|} | |||
==== Default Map ID's ==== | |||
datacenter | datacenter | ||
Line 301: | Line 420: | ||
bunker (PC only) | bunker (PC only) | ||
=== Server Administration === | |||
Installing the server is half the battle. | |||
==== Server Visibility ==== | |||
If you've followed this guide successfully to this point, you should have a running instance of pavlovserver. For your server to be visible to the Master List, and so that it can be joined by players, you will need to make sure the server has the ports forwarded. | |||
You can also check the server visibility using the vankrupt API, or on some publicly hosted game server lists, or by launching the game and just looking for your server in the game browser. | |||
==== Firewall/Port forwarding ==== | ===== Firewall/Port forwarding ===== | ||
Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding. | Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding. | ||
Line 314: | Line 440: | ||
</pre> | </pre> | ||
'''Rocky Linux''' firewall commands to check firewall and open ports: | '''Rocky Linux''' firewall commands to check the firewall and open ports: | ||
<pre> | <pre> | ||
sudo firewall-cmd --zone=public --add-port=7777/tcp | sudo firewall-cmd --zone=public --add-port=7777/tcp | ||
Line 328: | Line 454: | ||
You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list. | You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list. | ||
If you are running multiple servers and have set additional ports (see http:// | If you are running multiple servers and have set additional ports (see http://pavlovwiki.com/index.php/Setting_up_a_dedicated_server#Running_multiple_servers_on_one_host) then you need to allow access to the defined port plus the port 400 higher. So if you use 7000 as your port, then UDP 7000 and 7400 need to be open | ||
If you have setup rcon via RconSettings.txt (below) then that port also | Whilst on the topic of port forwarding, If you have setup '''rcon''' via RconSettings.txt (below) then that port also needs to be allowed access via TCP, if your RCON controller will be external to your server. | ||
If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 & 8177) must also be open via TCP | If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 & 8177) must also be open via TCP | ||
ipv6 is not planned to be supported. You can disable by doing the following command: | |||
sudo nano /etc/default/grub | |||
And then edit the line below to GRUB_CMDLINE_LINUX_DEFAULT=”ipv6. disable=1″ | |||
This makes sure ipv6 is disabled on operating system restart. | |||
---- | ---- | ||
Line 338: | Line 471: | ||
==== Shack Maps (Quest) ==== | ==== Shack Maps (Quest) ==== | ||
Adding maps for the Shack version of Pavlov works differently to the steam version of the game, and you'll run into issues very quickly if you do not customise your server to accomodate this. | |||
To get started, first create the directory to hold the maps | To get started, first, create the directory to hold the maps | ||
<pre>mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps</pre> | <pre>mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps</pre> | ||
Rotate the server to the map you would like with RCON or editing the game.ini and the server will automatically download the map files. | |||
----------- | ----------- | ||
==== Handy tools for finding steamIDs ==== | ==== Handy tools for finding steamIDs ==== | ||
Line 460: | Line 494: | ||
</pre> | </pre> | ||
=== Configure Rcon === | ==== Configure Rcon ==== | ||
To enable Rcon access create config file: | To enable Rcon access create config file: | ||
<pre> nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt </pre> | <pre> nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt </pre> | ||
Line 471: | Line 505: | ||
You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware) | You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware) | ||
=== Starting the server === | ==== Starting the server manually ==== | ||
<pre> | <pre> | ||
cd ~/pavlovserver && ./PavlovServer.sh | cd ~/pavlovserver && ./PavlovServer.sh | ||
Line 480: | Line 512: | ||
That's it, your server will be automatically broadcast to the master server! :) | That's it, your server will be automatically broadcast to the master server! :) | ||
Note that when you close your terminal, the server will go down. See the "supervisors" section below for how to prevent this. | |||
Note that when you close your terminal, the server will go down. See the "supervisors" section below for how to prevent this. | |||
If you have followed the supervisor service-setup part of the guide, you can run pavlovserver as a service using systemctl. | |||
==== Seeing your server in a Master List ==== | |||
Two handy tools to determine quickly if your server is broadcasting are https://pavlovservers.com/ and [https://pavlovhorde.com/ Horde] public listings. | |||
If you're also handy with cURL, you can query the vankrupt game server listing directly, for Oculus/Shack servers, and PC servers: | |||
* <nowiki>https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus_app_id/0/0/0/all</nowiki> | |||
* <nowiki>https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus/0/0/0/all</nowiki> | |||
* <nowiki>https://prod-crossplay-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/steam/0/0/0/all</nowiki> | |||
where 1.0.17 is the version of the game. You can check the current version of the game your server is running by checking your log file (/home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log) and checking for the "version" line early in the startup of the log file. | |||
The endpoint also supports filtering - changing the '''/0/0/0''' in the URL will have the following effects: | |||
* /1/0/0/ hide empty servers | |||
* /0/1/0/ hide full servers | |||
* /0/0/1/ hide password protected servers | |||
You can also customize which gamemodes are shown by changing /all to /SND,TDM,DM,GUN,CUSTOM,ZWV,TTT,TTTCLASSIC,TANKTDM,WW2GUN,KOTH,OITC,HIDE,PH and removing what you don't want to view. | |||
---- | ---- | ||
Line 555: | Line 550: | ||
</pre> | </pre> | ||
Copy contents below into the file and save. | Copy the contents below into the file and save. | ||
<pre> | <pre> | ||
Line 599: | Line 594: | ||
sudo systemctl enable pavlovserver | sudo systemctl enable pavlovserver | ||
</pre> | </pre> | ||
Line 608: | Line 602: | ||
=== Running multiple servers on one host === | === Running multiple servers on one host === | ||
* Pavlovserver is functionally single threaded (there are multiple threads, but vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players. | * Pavlovserver is functionally single-threaded (there are multiple threads, but the vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players. | ||
* Make multiple server installs by defining a separate install dir for each server. | * Make multiple server installs by defining a separate install dir for each server. | ||
* Run each server with a unique port. eg: '''./PavlovServer.sh -PORT="Desired Port"''' | * Run each server with a unique port. eg: '''./PavlovServer.sh -PORT="Desired Port"''' | ||
* The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well) | * The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well) | ||
* If you are using RCON, each server will need a unique port defined in RconSettings.txt | * If you are using RCON, each server will need a unique port defined in RconSettings.txt | ||
* Ensure the ports are forwarded and opened in your firewall | * Ensure the ports are forwarded and opened in your firewall | ||
To duplicate directories: | To duplicate directories: | ||
Line 622: | Line 616: | ||
/home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port] | /home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port] | ||
</pre> | </pre> | ||
=== Starting server in competitive mode === | === Starting server in competitive mode === | ||
Line 664: | Line 659: | ||
<pre> cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string </pre> | <pre> cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string </pre> | ||
<hr> | |||
== Advanced Scripts For Server Management == | |||
<hr> | |||
=== '''Auto-updating the server (PCVR only)''' === | |||
Assuming you have followed this guide and used the default paths, users, and install instructions, you can paste the following into your terminal to auto-update your Pavlov server: | |||
<pre> | |||
cat << 'EOF' > $HOME/pavlov_daily_update_and_restart.sh | |||
#!/bin/bash | |||
USER="steam" | |||
SERVICENAME="pavlovserver.service" | |||
INSTALLDIRNAME="pavlovserver" | |||
USERHOME="/home/$USER" | |||
echo -e "Beginning Pavlov VR update run on $(date)\n\n" | |||
systemctl stop "$SERVICENAME" | |||
sleep 5 | |||
sudo -iu "$USER" "$USERHOME/Steam/steamcmd.sh" +login anonymous +force_install_dir "$USERHOME/$INSTALLDIRNAME" +app_update 622970 +exit | |||
sudo -iu "$USER" "$USERHOME/Steam/steamcmd.sh" +login anonymous +app_update 1007 +quit | |||
sudo -iu "$USER" cp "$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so" "$USERHOME/.steam/sdk64/steamclient.so" | |||
sudo -iu "$USER" cp "$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so" "$USERHOME/pavlovserver/Pavlov/Binaries/Linux/steamclient.so" | |||
systemctl start "$SERVICENAME" | |||
echo -e "Ending Pavlov VR update run on $(date)\n\n" | |||
EOF | |||
chmod +x $HOME/pavlov_daily_update_and_restart.sh | |||
mkdir $HOME/pavlov_update_logs && touch $HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log | |||
CRONLINE="00 2 * * * $HOME/pavlov_daily_update_and_restart.sh >>$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2>&1" | |||
(sudo crontab -u root -l; echo "$CRONLINE" ) | sudo crontab -u root - | |||
unset CRONLINE | |||
</pre> | |||
These commands will: | |||
1. Create a shell script in the "steam" user's home directory that automatically stops the Pavlov server, pulls any updates via steam, pull updates to the Steamworks SDK Redist, and copies the latest version of steamclient.so to the Pavlov server directory | |||
2. Make the shell script executable | |||
3. Create a new directory called "pavlov_update_logs" in the "steam" user's directory, and create a logfile inside that directory called "pavlov_daily_update_and_restart.sh.log". You can check this logfile to see the output of the Pavlov and Steam SDK update commands. | |||
4. Create a crontab entry for the root user that runs this shell script automatically every day at 2:00AM local time | |||
If you want to change the time that this script runs, edit the numbers "00 2" in the line that starts with "CRONLINE=". In the example provided, 00 is the minutes column, and 2 is the hour column. For example, if you wanted the server to automatically update and restart at 4:17AM every day, change the line starting with "CRONLINE=" to: | |||
<pre> | |||
CRONLINE="17 4 * * * $HOME/pavlov_daily_update_and_restart.sh >>$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2>&1" | |||
</pre> | |||
If the time is PM, use 24-hour time format, e.g. "32 18" for 6:32PM. | |||
<hr> | |||
=== '''Save Logs for records and stats''' === | |||
this is an automated script that will on a timer save all the backups made by the server before they are purged by the game for admin records and starts collection | |||
https://github.com/JTWP-org/backUpLogs2 | |||
<hr> | |||
=== '''Make an API request with Mod.io to get map picture and name''' === | |||
very basic script pass the script a map ID as an argument then it will give u the name and a thumbnail to use | |||
https://github.com/JTWP-org/mod.io-modcheck/tree/main | |||
=== '''Sharing Bans over gameserver on same machine''' === | |||
when you have a lot of servers keeping the bans synced can be a nightmare so using a symbolic link allows all the servers to use one file | |||
for this lets say I have pavlovserver000 and pavlovserver001 and they are located at /home/steam/pavlovserver000 and /home/steam/pavlovserver001 | |||
''step 1 will be to pick a blacklist to use as the new one and move it to a central location'' | |||
mkdir ~/shared ; mv /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ~/shared/blacklist.txt ; rm /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt | |||
now we have moved the blacklist from pavlovserver000 to a folder in our home called shared and then we removed the blacklist from pavlovserver001 | |||
step 2 making the links | |||
ln -s ~/shared/blacklist.txt /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ; ln -s ~/shared/blacklist.txt /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt | |||
now editing them in pavlovserver001's files will update the list for all of the servers it's not a sync its uses the same list if you want to check where a link is pointed if u | |||
ls -l | |||
It will show where the file is really located <hr> | |||
=== Interactive Update ALL === | |||
will find all server installs on machine and update them will update Ubuntu check what version and do correct updates for that version also UPDATE 29 PCVR STEP then it will list each server by server name and ask what type it is and then it will update and move to the next | |||
https://github.com/JTWP-org/Pavlov-updateallservers/tree/main<hr> | |||
=== getting map info with just the UGC === | |||
you will need to get a API key from mod.io for this ... running this bash script and passing a UGC number to it will return the map name mod.io url and a thumbnail | |||
HOW TO USE <pre>nano get-map.sh</pre> | |||
then enter this script <pre>#!/bin/bash | |||
ugc=000000 | |||
gameID=3959 #PAVLOV IS 3959 | |||
api-path="https://u-*ID NUMBER*.modapi.io/v1" #get on thhe access tab in mod.io settings | |||
api-key="" #get on thhe access tab in mod.io settings | |||
curl -X GET "${api-path}/v1/games/${gameID}/mods/$("${ugc:3})?api_key=${api-key}" -H 'Accept: application/json' | jq '.logo.thumb_1280x720, .name , .profile_url</pre> | |||
then give script perms to run <pre>sudo chmod +x get-map.sh</pre> | |||
and then run it like this | |||
<pre>bash get-map.sh UGC3409480 </pre> |
Latest revision as of 06:12, 7 December 2024
Setting up a dedicated server
There are no Windows binaries. You can't host a Pavlov server on any machine that runs Windows.
This guide is written exclusively for Linux and covers Ubuntu/Debian/Debian-like and Red Hat RPM-based distros. Possible to run with other distros, but some of the commands won't work and you will need to know enough to figure out the software install of dependencies on your own.
If you are considering hosting from home, please read that section of the wiki first.
This guide assumes you know the basics of using a bash terminal: ssh'ing into a server, running bash commands, editing text files, etc.
If you have no experience using bash, maybe start here. Editing text files via commandline is often a challenge. Suggest using nano and reading guide here
If you are new to linux and accessing your server from Windows, highly suggest using MobaXterm as your SSH client as that can make required editing of text files easier using built in editor instead of the native linux command line editors.
And finally, ask yourself why you want to setup a server? If you look at the list, there are many, many more servers than players. If you don't have a team, discord community, or group of friends ready to play on your server, chances are it will go unused. Got one of these... great, let's go.
If you don't want to go through the hassle yourself and want to pay for a hosting service: Arctic VR (For both PC and Shack) and Horde (Shack) provide a server hosting services and are trusted in the community.
Server Requirements
Operating System
Pavlovserver can only be hosted under Linux.
Known good operating systems are:
- Ubuntu 18.04 x86_64
- Ubuntu 19/04 amd64
- Ubuntu 20.04 x86_64
- Ubuntu 22.04 x86_64
- Ubuntu 24.04 x86_64
- Rocky Linux 8
This can be running as a VM under windows, but this will increase the complexity of the setup beyond this guide.
Ubuntu 15.04 x86 is known to fail to install using this guide. Recommend not running on "minimal" images as some tools are missing, and they can be installed, which is not covered in the scope of this guide.
Resources and Performance Optimisation
- 2GB RAM for Basic 10 player vanilla server. 4GB for 24+ player server with content mods or large maps. More RAM is recommended for larger maps, higher player counts, or complex gamemodes. Not having enough RAM is a common cause of server crashes.
- A ~2.5Ghz CPU will comfortably support a 10 player server.
- A ~4Ghz CPU will comfortably support 24 players. Pavlov on PC can support up to 50 players. Shack is limited by 24.
Pavlov servers are functionally single threaded - one thread does vast majority of work. More CPUs only help if you are running more servers. More clockspeed = higher performance = more users per server. Hence, no particular performance benefit is gained from multithreading - if you are running multiple instances of a pavlov server, you will require more CPU cores.
Lower player counts are recommended for complex gamemodes (E.g. CodZ) and/or highly detailed maps, so that maximum number will often be lower. Note that these player count numbers are just suggestions to help optimise for the best performance, based on experiences with many server providers on different grades of hardware.
As of 12/3/2024 24 is the hard limits for player counts for Shack, but PC is limited to 50.
The maximum number of servers you can run is dependent on how many CPUs you have. For example, if you have an 8 core CPU, the maximum number of servers would be 7. You should always have at least one CPU free as overhead, as Pavlov servers can use slightly more than one thread.
Hosting at home
Hosting at home is generally not recomended. Not understanding the hosting at home requirements and configuration is a frequent cause of failed setups and questions in discord. Don't skip these steps if you are trying to host from home
When hosting at home there are additional requirements regarding networking: Your router has to support port-forwarding, hair-pinning/LoopbackNAT, and respond to ping requests. These techniques are necessary to allow your server to be found and to talk back to the client. please see https://en.wikipedia.org/wiki/Port_forwarding, https://en.wikipedia.org/wiki/Hairpinning, and https://www.speedguide.net/faq/how-to-become-pingable-behind-a-routerfirewall-376 for more info and google for these terms in addition to your router model to find guides on how to enable/configure it properly. If you have modern Router, it may have these features already enabled, in this case you just have to configure port-forwarding. If you can see your server but not join it while others can, this is indicative of a failure of LoopbackNAT.
A second challenge to hosting at home is CGNAT (Carrier grade NAT: https://www.a10networks.com/blog/carrier-grade-nat/). Just like NAT on your home network that has to be gotten around w/ port-forwarding, CGNAT breaks the ability of external connections to be made back to your server, but the controls are solely in your ISPs hands. Sometimes if you ask, you can be removed from CGNAT pools and/or assigned a static IP. CGNAT rollouts are becoming very common now, so if your server worked then doesn't allow connections now, your ISP may have made this change.
You can check whether you’re on a CGNAT network by visiting a Web site such as ipaddress.com or whatsmyip.com and comparing the IP address listed to the public/WAN IP address assigned to your Internet gateway. To find your gateway’s public IP address, check the status page in the administrative interface. If the two IP addresses differ, you’re likely on a CGNAT network. If so, this problem must be resolved before you go any further.
There are serious security implications of hosting this software at home. None of the devs are security experts and there has been no security review of the code. You are opening up your system to the world and publicity advertising this fact. Expect that any system hosting this software is open to compromise from the Internet and act accordingly. If your router offers a DMZ network, use it. Consider hosting on a cloud based server and think twice before running this software on any system that contains data you care about or has access to networks and computers you care about.
If you're hosting at home using Oracle's VirtualBox, there are steps you can take to prevent double NAT (which can cause issues later on)
1. Select your VM and then click Settings in VirtualBox's main window.
2. Click on Network and change Attached To from NAT to Bridged Adapter.
Once you've done this, your VM should be connected directly to your home router and double NAT should no longer be a issue.
It should go without saying that hosting at home usually invites a myriad of potential problems that will be unique to your setup - such as your ISP, router, or network configuration. There is a lively community of like-minded server hosters on the Pavlov-VR Discord, so if you get stuck, head on over to the discord and see whether you can find the answers you're looking for.
Starting Server Install
Obtaining an ApiKey
This is required for all servers as of the December 2024 Pavlov Update. For your server to show up in the server list, there is now a requirement to have an ApiKey issued by Vankrupt. You will need to load up the game on your headset the navigate to the settings, in the general tab is there a button to Generate Server Code.
- Your "pin" will only be valid for 15 minutes.
- If your server key is exposed you can create a new key by generating a new 6 digit code.
- This will invalidate the old key.
- A server key can be used by multiple servers.
- A user may only have one server key, requesting a new one will invalidate the old one.
This will give you a 6 character code you need to combine with your player ID to generate a server key.
Get the key by going here: https://api-key.vankrupt.net/
Once you submit you will get your unique Server API Key that needs to go into your Game.ini
Warnings:
- Abusing a Server key may result in a ban to the attached user.
- Do NOT share your server key, it should be used by you alone.
- Store your server key in a safe place, such as a password or secret manager.
Save this key for later, so that you can ut this key in your Game.ini as follows:
ApiKey="ABC123FALSEKEYDONTUSEME"
or if you would like (personally untested..I would use Game.ini) you can call it at server runtime with flag as follows:
-KEY="ABC123FALSEKEYDONTUSEME"
This key can be re-used for a reasonable number of servers (a limit of 10 has been mentioned). Contact the Devs if you need more servers per key.
System setup and software installation
In this step we will:
- Check the operating system is compatible
- Install some dependencies
- create the user "steam" and set it's password, and switch to that user
- as "steam" user, install Steamcmd, the binary used to download steam games in linux
- use Steamcmd to install Pavlov.
These steps only need to be done the first time you set up the server. We'll then look at some post-installation steps.
Step 1: Check the operating system is compatible
Confirm Linux version, run the command:
lsb_release -a
Expect the result to say Ubuntu 20.04 (or one of the other known supported operating systems - this guide assumes Ubuntu or a Fedora system)
Step 2: Install some dependencies
For Ubuntu 22.10 or higher
sudo apt update && sudo apt install -y gdb curl lib32gcc-s1 libc++-dev unzip
For older version of Ubuntu prior to 22.10:
sudo apt update && sudo apt install -y gdb curl lib32gcc1 libc++-dev unzip
For Rocky Linux, CentOS 8, and RHEL 8
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/g' /etc/selinux/config sudo setenforce 0 sudo yum install gdb curl glibc.i686 libstdc++.i686 libstdc++-devel.i686 libstdc++-devel.x86_64 unzip wget -y wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libcxx-3.8.0-3.el7.x86_64.rpm sudo rpm -i libcxx-3.8.0-3.el7.x86_64.rpm
Step 3: Create the steam user
sudo useradd -m steam
[Optional] Set the /bin/bash shell for the steam user this will allow you to use arrow keys in terminal and show what folder you are in at all times
sudo chsh -s /bin/bash steam
[Optional] Set a password for steam.
sudo passwd steam
Login as the Steam user. (You will need to do this each time you connect to your server - editing game files and interacting with the game server should be done as the steam user):
sudo su -l steam
Step 4: Install Steam, known as SteamCMD
mkdir ~/Steam && cd ~/Steam && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -
Step 5: User SteamCMD to install Pavlov
There are different dedicated server versions for Pavlov Server - choose which server version you want to host (PC non-beta, PC Beta, Shack Live, or Shack RC) (You will need to run this command each time there is a Pavlov Server update).
To host PC Server (non-beta):
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta default +exit
To host PC BETA:
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta beta_server +exit
To host Shack Live (Quest):
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack +exit
To host Shack RC (Quest):
~/Steam/steamcmd.sh +force_install_dir /home/steam/pavlovserver +login anonymous +app_update 622970 -beta shack_beta +exit
Post Installation Steps
Now that we've installed the server, Install a fresh copy of steamclient.so. You may also have to do this after each update.
~/Steam/steamcmd.sh +login anonymous +app_update 1007 +quit mkdir -p ~/.steam/sdk64 cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/steamclient.so cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/pavlovserver/Pavlov/Binaries/Linux/steamclient.so
All versions are required to run these commands to change the libc++ that steamclient uses:
sudo rm /usr/lib/x86_64-linux-gnu/libc++.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libc++.so.1 /usr/lib/x86_64-linux-gnu/libc++.so
Make the PavlovServer script executable. (You only need to do this once):
chmod +x ~/pavlovserver/PavlovServer.sh
Make a note to review these steps later, if you would like to automate server and steam client updates.
Server Configuration
Before being able to properly use the server we need to configure it. You should attempt to start the server, let it start up, and then shut down the server, which should create all the required configuration files and directories.
However, if you are having trouble, it may help to create the directories manually first - make sure you are doing these actions as the "steam" user.
Start by creating some directories:
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Logs mkdir -p /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps
Mods/Blacklist/Whitelist (optional)
The following three files allow you to specify mods, banned players, and whitelist players. These are optional, but go ahead and create them. Populating the files is described later.
touch /home/steam/pavlovserver/Pavlov/Saved/Config/mods.txt touch /home/steam/pavlovserver/Pavlov/Saved/Config/blacklist.txt touch /home/steam/pavlovserver/Pavlov/Saved/Config/whitelist.txt
Configuring Game.ini
If starting the server did not create a default Game.ini, create a new Game.ini file using following command to open an editor and copy/paste the following block into it then save it.
Note not all of these options are required. For instance remove or comment out the Password=0000 line to make a public server with no pin.
You will also need to fetch your API Key you set up earlier.
nano /home/steam/pavlovserver/Pavlov/Saved/Config/LinuxServer/Game.ini
[/Script/Pavlov.DedicatedServer] bEnabled=true ServerName="My_private_idaho" MaxPlayers=10 #its recommended for the best experience to keep shack servers at or below 10 players pcvr and psvr are both capped at 24 too. ApiKey="ABC123FALSEKEYDONTUSEME" bSecured=true bCustomServer=true bVerboseLogging=false bCompetitive=false #This only works for SND bWhitelist=false RefreshListTime=120 LimitedAmmoType=0 TickRate=90 TimeLimit=60 AFKTimeLimit=300 #Password=0000 #BalanceTableURL="vankruptgames/BalancingTable/main" MapRotation=(MapId="UGC1758245796", GameMode="GUN") MapRotation=(MapId="datacenter", GameMode="SND") MapRotation=(MapId="sand", GameMode="DM") AdditionalMods=UGC3462586
- bEnabled - whether the server appears in the server list (unconfirmed)
- ServerName - name it will be listed as. (approx 35 chars max). There is a profanity filter that may cause the server to not show. It can be strict for example "BASS FISHING SERVER" might get flagged for "ASS" in the name.
- MaxPlayers - See suggested specs for limits. Shack servers allow a maximum of 24 players and while PCVR can technically support 50 no more than 24 is recomended.
- ApiKey - Unique ApiKey required to register server with master server. Replace with your key
- bSecured - enabled Valve Anti-Cheat (VAC)
- bCustomServer - activates some new modding tools (save and http functions. Required to write to blacklist.txt for bans)
- bCompetitive - sets the server to competitive mode for SND. If removed the server will default to false
- bVerboseLogging - enables verbose logging, mostly detailed statistics. Be prepared for significant increase in logging.
- bWhitelist - Only allow users in whitelist.txt to join
- RefreshListTime - sets how often the running server checks for updates in ban/whitelist/mod files
- LimitedAmmoType - sets limited ammo mode, see Limited Ammo Types table below
- TimeLimit - sets time limit for each map (Only works on TDM/DM type modes not those with custom logic like TTT or SND)
- TickRate - sets the server tickrate. (Default is 90. so far minimum stable seems around 50 and max around 120. Beware setting this changes weapon despawn time and breaks some game modes. Recommend not touching)
- Password - PIN number for server #FYI - this is now also changeable via rcon.
- BalanceTableURL - Points to a custom balance table from github. See https://github.com/vankruptgames/BalancingTable for instructions. This line isn't needed if you don't have one.
- MapRotation - you can add multiple of these. The map system has switched from the steam workshop to modio which means that the server rotation will need to be redone with modio UGCs. https://mod.io/g/pavlov. This is done by taking the resource ID from the modio page, adding “UGC” in front of it and then adding that to the rotation. For example the map gravity https://mod.io/g/pavlov/m/gravity1 has a resource ID of 2773760 so the map ID to add to the server would be “UGC2773760”. When a match ends, the server will load the next map in the rotation.
- AdditionalMods - you can add multiple of these. Find the mod(s) you want add on modio and take its resource ID, adding 'UGC' to the front of it.
- AFKTimeLimit There is now a feature to kick players who are idle in the game. Integers are measured in seconds and 0 disables AFK kicking completely.
Available game modes as of 09/06/2022: See Game modes table below
For maps running a Custom gamemode (CodZ, BR, Duel, etc.) it doesn't matter which gamemode you choose, as the map will automatically override it with the custom mode.
Limited Ammo Types
AmmoType | Name | Description |
---|---|---|
0 | Unlimited | Players have unlimited ammo, carry no ammo boxes and do not display an ammo count on the wrist. |
1 | Limited Generic | Players carry ammo boxes with a limited amount of ammo.
One box for each weapon class (Pistol, Submachine gun, Rifles/MGs, Shotgun, Sniper). Mags and ammo boxes can be put on the chest of the player to consolidate the ammo. An ammo count is displayed on the wrist. |
2 | Limited Specific | Players carry ammo boxes with a limited amount of ammo.
One box for each weapon. Mags and ammo boxes can be put on the chest of the player to consolidate the ammo. An ammo count is displayed on the wrist. |
3 | Custom | Allows for full control over ammo by the map. |
4 | Limited Special | All weapons except "special" weapons are unlimited, more clarification is needed. |
5 | Boxless | Like limited generic but without boxes? Clarification is needed. |
Game Modes
GameMode | Name |
---|---|
DM | Death match |
KOTH | King of the hill |
GUN | Gun game |
OITC | One in the chamber |
SND | Search and destroy |
TANKTDM | WW2 Team Death Match |
TDM | Team Death Match |
TTT | Trouble in Terrorist Town |
TTTclassic | TTT with only innocent/traitor/detective |
WW2GUN | WW2 gun game |
ZWV | Zombie wave survival |
HIDE | The Hidden |
INFECTION | Hidden infection |
PUSH | Push |
PH | Prop hunt |
Default Map ID's
datacenter
sand
bridge
containeryard
siberia (Prison Break)
hospital (Zombies map)
killhouse
range
tutorial
santorini
station
industry
ogcontainers (Shack only)
haguenau (Shack only)
foundation (Shack only)
stalingrad (PC only)
stalingrad_night (PC only)
santorini_night (PC only)
sand_night (PC only)
station_night (PC only)
industry_night (PC only)
bunker (PC only)
Server Administration
Installing the server is half the battle.
Server Visibility
If you've followed this guide successfully to this point, you should have a running instance of pavlovserver. For your server to be visible to the Master List, and so that it can be joined by players, you will need to make sure the server has the ports forwarded.
You can also check the server visibility using the vankrupt API, or on some publicly hosted game server lists, or by launching the game and just looking for your server in the game browser.
Firewall/Port forwarding
Using the default settings there are two UDP ports (7777, 8177) that need to be allowed to access the server either by firewall setup or port forwarding.
Ubuntu firewall commands to check firewall and open ports:
sudo ufw status sudo ufw allow 7777 sudo ufw allow 8177 sudo ufw allow 9100 sudo ufw status
Rocky Linux firewall commands to check the firewall and open ports:
sudo firewall-cmd --zone=public --add-port=7777/tcp sudo firewall-cmd --zone=public --add-port=7777/udp sudo firewall-cmd --zone=public --add-port=8177/tcp sudo firewall-cmd --zone=public --add-port=8177/udp sudo firewall-cmd --zone=public --add-port=9100/udp sudo firewall-cmd --zone=public --add-port=9100/tcp sudo firewall-cmd --list-ports firewall-cmd --runtime-to-permanent
You may also need to allow Pings (ICMP) for the server's true latency to appear in the master list.
If you are running multiple servers and have set additional ports (see http://pavlovwiki.com/index.php/Setting_up_a_dedicated_server#Running_multiple_servers_on_one_host) then you need to allow access to the defined port plus the port 400 higher. So if you use 7000 as your port, then UDP 7000 and 7400 need to be open
Whilst on the topic of port forwarding, If you have setup rcon via RconSettings.txt (below) then that port also needs to be allowed access via TCP, if your RCON controller will be external to your server.
If you are running Shack/Quest and want to have maps that are downloadable from your server, your server ports (ex. 7777 & 8177) must also be open via TCP
ipv6 is not planned to be supported. You can disable by doing the following command:
sudo nano /etc/default/grub
And then edit the line below to GRUB_CMDLINE_LINUX_DEFAULT=”ipv6. disable=1″
This makes sure ipv6 is disabled on operating system restart.
Shack Maps (Quest)
Adding maps for the Shack version of Pavlov works differently to the steam version of the game, and you'll run into issues very quickly if you do not customise your server to accomodate this.
To get started, first, create the directory to hold the maps
mkdir -p /home/steam/pavlovserver/Pavlov/Saved/maps
Rotate the server to the map you would like with RCON or editing the game.ini and the server will automatically download the map files.
Handy tools for finding steamIDs
Steam ID finder: https://steamidfinder.com/lookup/ or https://steamid.xyz/
You want to enter in the steamID64 format.
This tool can convert or lookup IDs: https://steamid.io/
If you are looking for a steamID of a player that has been on your server recently this is technique to find them:
grep -i playername ~/pavlovserver/Pavlov/Saved/Logs/* | grep TicketValidation
Configure Rcon
To enable Rcon access create config file:
nano /home/steam/pavlovserver/Pavlov/Saved/Config/RconSettings.txt
Copy in the following text - change password, and if desired the port:
Password=ChangeThisPassword Port=9100
You must specify a port for the Rcon server to use as well as a Password (use a different port per sever instance if running multiple server instances off the same hardware)
Starting the server manually
cd ~/pavlovserver && ./PavlovServer.sh
That's it, your server will be automatically broadcast to the master server! :)
Note that when you close your terminal, the server will go down. See the "supervisors" section below for how to prevent this.
If you have followed the supervisor service-setup part of the guide, you can run pavlovserver as a service using systemctl.
Seeing your server in a Master List
Two handy tools to determine quickly if your server is broadcasting are https://pavlovservers.com/ and Horde public listings.
If you're also handy with cURL, you can query the vankrupt game server listing directly, for Oculus/Shack servers, and PC servers:
- https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus_app_id/0/0/0/all
- https://prod-shack-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/oculus/0/0/0/all
- https://prod-crossplay-pavlov-ms.vankrupt.net/servers/v2/list/1.0.17/steam/0/0/0/all
where 1.0.17 is the version of the game. You can check the current version of the game your server is running by checking your log file (/home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log) and checking for the "version" line early in the startup of the log file.
The endpoint also supports filtering - changing the /0/0/0 in the URL will have the following effects:
- /1/0/0/ hide empty servers
- /0/1/0/ hide full servers
- /0/0/1/ hide password protected servers
You can also customize which gamemodes are shown by changing /all to /SND,TDM,DM,GUN,CUSTOM,ZWV,TTT,TTTCLASSIC,TANKTDM,WW2GUN,KOTH,OITC,HIDE,PH and removing what you don't want to view.
Supervising the server using systemd
Running ./PavlovServer.sh in your interactive shell is easy, but the server will shut down when you close your terminal. If you want to run the server in the background, you'll want to run it under a supervisor. There are many options, ranging from the simple (nohup, screen or tmux), to the more robust (supervisord, systemd).
Systemd is running by default on Ubuntu Linux, so we'll use that here.
To run the server as a systemd service, create the file /etc/systemd/system/pavlovserver.service (as root) by typing
sudo nano /etc/systemd/system/pavlovserver.service
Copy the contents below into the file and save.
[Unit] Description=Pavlov VR dedicated server [Service] Type=simple WorkingDirectory=/home/steam/pavlovserver ExecStart=/home/steam/pavlovserver/PavlovServer.sh RestartSec=1 Restart=always User=steam Group=steam [Install] WantedBy = multi-user.target
If you'd like your server to start as competitive without editing the game.ini, change the line "ExecStart=/home/steam/pavlovserver/PavlovServer.sh" to look like this below. Though it's much easier to just use the game.ini to enable competitive instead.
ExecStart=/home/steam/pavlovserver/PavlovServer.sh -COMPETITIVE=1
Change the user or paths as appropriate. After saving the service file, to start, restart, stop, or monitor the server:
sudo systemctl start pavlovserver sudo systemctl restart pavlovserver sudo systemctl stop pavlovserver sudo systemctl status pavlovserver
To view the logs:
sudo journalctl -u pavlovserver # to live-tail the logs sudo journalctl -u pavlovserver -f
If you want to run the pavlov server as soon as your server boots (e.g. a VPS you turn on and off), add pavlov as a startup service:
sudo systemctl enable pavlovserver
Advanced Server Administration
Running multiple servers on one host
- Pavlovserver is functionally single-threaded (there are multiple threads, but the vast majority of work occurs in the primary one). Make sure you have # of pavlovservers + 1 CPU available. More CPUs= more servers. Faster CPU = more players.
- Make multiple server installs by defining a separate install dir for each server.
- Run each server with a unique port. eg: ./PavlovServer.sh -PORT="Desired Port"
- The Server will use the Desired Port and the Port 400 above (Example: You choose 8200 as Port. So Port 8600 will be used as well)
- If you are using RCON, each server will need a unique port defined in RconSettings.txt
- Ensure the ports are forwarded and opened in your firewall
To duplicate directories:
be in the steam home folder
cp -r pavlovserver pavlovserver1 /home/steam/pavlovserver1/PavlovServer.sh -PORT=[Desired Port]
Starting server in competitive mode
Competitive mode will prevent dead teammates from being able to see the match, to prevent ghosting. You can either enable this via Game.ini (described in Game.ini file), or using the -COMPETITIVE=1 parameter.
/home/steam/pavlovserver1/PavlovServer.sh -COMPETITIVE=1
Useful Linux Commands
List files / folders in directory, print current working directory,
ls -la #list files/directories along with authorities and ownership pwd #print working directory sudo chown <owner> <file/directory> #change owner of file/directory. If root created something and you need to change it to steam sudo chgrp <group> <file/directory> #change group of file/directory.
Check if pavlov is running by checking process status. If the only row you see is the grep command, pavlov server is not started.
ps -ef | grep pav
Sample output:
steam 34044 1 0 16:52 ? 00:00:00 /bin/sh /home/steam/pavlovserver/PavlovServer.sh steam 34066 34044 80 16:52 ? 00:00:04 /home/steam/pavlovserver/Pavlov/Binaries/Linux/PavlovServer zombies+ 34101 34013 0 16:52 pts/0 00:00:00 grep --color=auto pav
Kill a process. Note this command uses 34044, which is a process id from the command output above.
kill -9 34044
Dump the log to the console so you can scroll through it:
cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log
Search the log for a string - replace my_string with case-sensitive string
cat /home/steam/pavlovserver/Pavlov/Saved/Logs/Pavlov.log | grep my_string
Advanced Scripts For Server Management
Auto-updating the server (PCVR only)
Assuming you have followed this guide and used the default paths, users, and install instructions, you can paste the following into your terminal to auto-update your Pavlov server:
cat << 'EOF' > $HOME/pavlov_daily_update_and_restart.sh #!/bin/bash USER="steam" SERVICENAME="pavlovserver.service" INSTALLDIRNAME="pavlovserver" USERHOME="/home/$USER" echo -e "Beginning Pavlov VR update run on $(date)\n\n" systemctl stop "$SERVICENAME" sleep 5 sudo -iu "$USER" "$USERHOME/Steam/steamcmd.sh" +login anonymous +force_install_dir "$USERHOME/$INSTALLDIRNAME" +app_update 622970 +exit sudo -iu "$USER" "$USERHOME/Steam/steamcmd.sh" +login anonymous +app_update 1007 +quit sudo -iu "$USER" cp "$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so" "$USERHOME/.steam/sdk64/steamclient.so" sudo -iu "$USER" cp "$USERHOME/Steam/steamapps/common/Steamworks SDK Redist/linux64/steamclient.so" "$USERHOME/pavlovserver/Pavlov/Binaries/Linux/steamclient.so" systemctl start "$SERVICENAME" echo -e "Ending Pavlov VR update run on $(date)\n\n" EOF chmod +x $HOME/pavlov_daily_update_and_restart.sh mkdir $HOME/pavlov_update_logs && touch $HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log CRONLINE="00 2 * * * $HOME/pavlov_daily_update_and_restart.sh >>$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2>&1" (sudo crontab -u root -l; echo "$CRONLINE" ) | sudo crontab -u root - unset CRONLINE
These commands will:
1. Create a shell script in the "steam" user's home directory that automatically stops the Pavlov server, pulls any updates via steam, pull updates to the Steamworks SDK Redist, and copies the latest version of steamclient.so to the Pavlov server directory
2. Make the shell script executable
3. Create a new directory called "pavlov_update_logs" in the "steam" user's directory, and create a logfile inside that directory called "pavlov_daily_update_and_restart.sh.log". You can check this logfile to see the output of the Pavlov and Steam SDK update commands.
4. Create a crontab entry for the root user that runs this shell script automatically every day at 2:00AM local time
If you want to change the time that this script runs, edit the numbers "00 2" in the line that starts with "CRONLINE=". In the example provided, 00 is the minutes column, and 2 is the hour column. For example, if you wanted the server to automatically update and restart at 4:17AM every day, change the line starting with "CRONLINE=" to:
CRONLINE="17 4 * * * $HOME/pavlov_daily_update_and_restart.sh >>$HOME/pavlov_update_logs/pavlov_daily_update_and_restart.sh.log 2>&1"
If the time is PM, use 24-hour time format, e.g. "32 18" for 6:32PM.
Save Logs for records and stats
this is an automated script that will on a timer save all the backups made by the server before they are purged by the game for admin records and starts collection
https://github.com/JTWP-org/backUpLogs2
Make an API request with Mod.io to get map picture and name
very basic script pass the script a map ID as an argument then it will give u the name and a thumbnail to use
https://github.com/JTWP-org/mod.io-modcheck/tree/main
Sharing Bans over gameserver on same machine
when you have a lot of servers keeping the bans synced can be a nightmare so using a symbolic link allows all the servers to use one file
for this lets say I have pavlovserver000 and pavlovserver001 and they are located at /home/steam/pavlovserver000 and /home/steam/pavlovserver001
step 1 will be to pick a blacklist to use as the new one and move it to a central location
mkdir ~/shared ; mv /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ~/shared/blacklist.txt ; rm /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt
now we have moved the blacklist from pavlovserver000 to a folder in our home called shared and then we removed the blacklist from pavlovserver001
step 2 making the links
ln -s ~/shared/blacklist.txt /home/steam/pavlovserver000/Pavlov/Saved/Config/blacklist.txt ; ln -s ~/shared/blacklist.txt /home/steam/pavlovserver001/Pavlov/Saved/Config/blacklist.txt
now editing them in pavlovserver001's files will update the list for all of the servers it's not a sync its uses the same list if you want to check where a link is pointed if u
ls -l
It will show where the file is really located
Interactive Update ALL
will find all server installs on machine and update them will update Ubuntu check what version and do correct updates for that version also UPDATE 29 PCVR STEP then it will list each server by server name and ask what type it is and then it will update and move to the next
https://github.com/JTWP-org/Pavlov-updateallservers/tree/main
getting map info with just the UGC
you will need to get a API key from mod.io for this ... running this bash script and passing a UGC number to it will return the map name mod.io url and a thumbnail
HOW TO USE
nano get-map.sh
then enter this script
#!/bin/bash ugc=000000 gameID=3959 #PAVLOV IS 3959 api-path="https://u-*ID NUMBER*.modapi.io/v1" #get on thhe access tab in mod.io settings api-key="" #get on thhe access tab in mod.io settings curl -X GET "${api-path}/v1/games/${gameID}/mods/$("${ugc:3})?api_key=${api-key}" -H 'Accept: application/json' | jq '.logo.thumb_1280x720, .name , .profile_url
then give script perms to run
sudo chmod +x get-map.sh
and then run it like this
bash get-map.sh UGC3409480