All the guides I have found on setting up a dedicated Valheim server on Linux had gaps in one place or another, so I decided to document my own setup for the benefit of others. This guide is aimed at users wanting to set up the Valheim Dedicated Server on a headless Linux server. If you simply want to run this on an always-on desktop with a graphical login, this guide may not be as useful to you.
This guide is written for Debian 11 (bullseye), but much if not all of it will also apply to Ubuntu, as it is based on Debian. Credit has to go to the Hosting Servers guide on the Valheim Fandom wiki for basic information on how to invoke the server executable, which ports need to be exposed to the outside world, and configuration options.
Install the game via SteamCMD
SteamCMD is basically headless Steam for headless servers. We need it to download the Valheim Dedicated Server.
Set Up Multiarch
SteamCMD is provided by Debian, but as an i386 (32-bit x86) package, so you will need to add the i386 architecture to dpkg on your system to install i386 packages. (For more information see MultiArch/HOWTO on the Debian wiki.) To do this, run the following commands.
$ sudo dpkg --add-architecture $ sudo apt-get update
Now install SteamCMD itself.
$ sudo apt-get install steamcmd
Set up a Separate User and Group for Steam
It is always best to run services as a dedicated user and group from everything else on your system, so that if a service is compromised, an attacker can only access that service’s files. (We will further harden the Valheim system service later.) Normally you would create a “system” user for system services, but Steam, even the headless SteamCMD, does not seem to behave properly unless it is run in a normal user environment. (See the man page adduser(8) for details on how a system user is different from a normal user.)
Create the steam user with the “adduser” command, disabling logins as we are only going to use this account via “sudo”.
$ sudo adduser --disabled-login steam
Sadly, SteamCMD does not have a very good interface, so this next part will be a bit awkward for those of you already familiar with the Linux command line. Run the commands as follows (command output is omitted.)
$ sudo -iu steam # Opens a login shell as the "steam" user. See the man page sudo(8). $ steamcmd Steam>login anonymous Steam>force_install_dir ./valheim/ # The Valheim server has a different appID from the client. Check this link. Steam>app_update 896660 Steam>quit ^C
If the “quit” command just leaves the program hanging with no prompt, type Ctrl+C to completely quit. This appears to be a bug in SteamCMD.
Now that you have the Valheim Dedicated Server installed, it’s time to set up the service to run it.
Run the Valheim Server via Systemd
The Valheim Dedicated Server comes with a wrapper script to run the server, but we are going to run the server executable directly for our systemd service unit.
The Systemd Unit
Write the following code to the file “/usr/local/lib/systemd/system/valheim.service”.
[Unit] Description=Valheim Dedicated Server After=network-online.target [Service] Type=exec User=steam Group=steam Environment="LD_LIBRARY_PATH=/home/steam/valheim/linux64" "SteamAppId=892970" ExecStart=/home/steam/valheim/valheim_server.x86_64 -name "I forgot to name my server" -world "Midgard" -port 2456 -password "secret" # Security settings LockPersonality=true NoNewPrivileges=true RestrictRealtime=true RestrictNamespaces=true SystemCallArchitectures=native [email protected] @clock @debug @module @mount @privileged @reboot @setuid @cpu-emulation CapabilityBoundingSet= RestrictAddressFamilies=AF_INET AF_INET6 RestrictSUIDSGID=true PrivateDevices=true PrivateTmp=true PrivateMounts=true PrivateUsers=true ProtectControlGroups=true ProtectHome=tmpfs BindPaths=/home/steam ProtectKernelModules=true ProtectKernelTunables=true ProtectSystem=full ProtectClock=true ProtectKernelLogs=true ProtectProc=invisible ProtectHostname=true RemoveIPC=true InaccessiblePaths=/srv/
A full explanation of the systemd directives used in this unit is beyond the scope of this guide, but for those interested, the relevant man pages are as follows.
Specifying a World
The “-world” argument is optional; if you leave it out, the server will generate a world for you from a random seed on the first run.
Otherwise, it specifies the name of a world to use, which must exist in the directory “/home/steam/.config/unity3d/IronGate/Valheim/worlds/”. In the systemd unit above, we specify the world named “Midgard”, so there must exist a file named “/home/steam/.config/unity3d/IronGate/Valheim/worlds/Midgard.fwl”. This lets you use a world copied from elsewhere.
If you want to use an existing world from your PC, keeping your progress, you must also copy the corresponding “.db” file to the same location as the “.fwl” file.
If you want to use a new world but with a specific seed, you must create the world with the game client, as the server provides no way of specifying a seed for the initial world creation.
Enabling the Service
That defines the service, but systemd does not know about it until it reloads units. Do this by running
$ sudo systemctl daemon-reload
Then enable it with
$ sudo systemctl enable valheim.service
Now the Valheim server will automatically start on boot, but not until the network is up (that’s what the line “After=network-online.target” does.) To start it now without rebooting, run
$ sudo systemctl start valheim.service
And that concludes this Valheim guide. Help us improve this guide by leaving your suggestions in the comment section below.