Ein Valheim-Server mit Quadlet

Der Dedicated Server als eine deklarative Datei, die systemd direkt verwaltet

Ein eigener Valheim-Server für den Freundeskreis ist ein Klassiker im Homelab. Meistens heißt das: steamcmd installieren und anschließend noch eine systemd-Unit pflegen, damit der Server nach einem Neustart wieder läuft. Mit Quadlet von Podman wird das zu einer einzigen deklarativen Datei.

Was Quadlet macht

Quadlet liest INI-artige .container-Dateien aus /etc/containers/systemd/ (oder ~/.config/containers/systemd/) und generiert daraus je eine systemd-Unit – hier also valheim-server.service. Container, Ports, Volumes, Restart-Policy und Healthcheck stehen zusammen in einem File, das sich versionieren lässt.

Die Datei

Meine Quadlet-Datei für den Server (Passwort und World-ID anonymisiert):

[Unit]
Description=Valheim Server

[Container]
Label=app=valheim-server
Label=homepage.group=Service
Label=homepage.name=Valheim
Label=homepage.icon=steam.png
Label=homepage.widget.type=gamedig
Label=homepage.widget.serverType=valheim
Label=homepage.widget.url=udp://host.containers.internal:2457

ContainerName=valheim-server
Image=ghcr.io/mbround18/valheim:latest
AutoUpdate=registry
Volume=/opt/container/valheim-server/config:/home/steam/.config/unity3d/IronGate/Valheim
Volume=/opt/container/valheim-server/data:/home/steam/valheim
PublishPort=2456:2456/udp
PublishPort=2457:2457/udp
PublishPort=2458:2458/udp
Environment=NAME=Valhalla
Environment=PUBLIC=1
Environment=PASSWORD=changeme
Environment=WORLD=myworld
Environment=TZ="Europe/Berlin"
Environment=TYPE=vanilla
Environment=PRESET=Hard
#Optional
#Environment=MODIFIERS="resources=muchmore"
#Environment=SET_KEY=nobuildcost

HealthCmd=/usr/local/bin/odin status --address 127.0.0.1:2457
HealthOnFailure=kill

[Service]
Restart=always
TimeoutStartSec=300

Was drinsteht

Image ist mbround18/valheim, der Dedicated Server zusammen mit Odin als Manager; automatische Updates und World-Backups kommen damit quasi mit. AutoUpdate=registry holt beim nächsten Start das aktuelle Image aus dem Registry.

Die zwei Volumes halten Config und Weltdaten unter /opt/container/valheim-server/ auf dem Host, ein Neustart des Containers kostet dadurch nichts.

Der Server hört auf Port 2456 und belegt zusätzlich 2457 und 2458 – alle drei UDP-Ports müssen in Router oder Firewall freigegeben sein, wenn man den Server von außen erreicht will.

Die Environment=-Zeilen sind die üblichen Optionen: Name, Passwort, World-ID, Timezone und das Schwierigkeits-Preset. MODIFIERS und SET_KEY lassen sich bei Bedarf aktivieren.

Über HealthCmd fragt Podman per odin status den Statusport 2457 ab; meldet der Check ein Problem, wird der Container beendet und Restart=always startet ihn neu. TimeoutStartSec=300 ist für den allerersten Start gedacht, da das Image dort noch den Server von Steam lädt.

Die Label=homepage.*-Einträge verwende ich für meine Homelab-Homepage, die aus solchen Labels ein gamedig-Widget erzeugt und live den Status des Servers anzeigt.

Betrieb

File ablegen, Generator neu laufen lassen und die Unit aktivieren:

sudo systemctl daemon-reload
sudo systemctl enable --now container-valheim-server.service
journalctl -u container-valheim-server.service -f

Im Rootless-Setup sind das die --user-Varianten. Mods, Backups und der Rest sind in der Doku des Images beschrieben.