Dedikovaný Valheim server na Linuxu jsou čtyři kroky: nainstalovat SteamCMD, vytvořit uživatele, který nevlastní nic jiného než server, stáhnout app 896660 anonymním přihlášením a spustit valheim_server.x86_64 přes kopii přibaleného start_server.sh, který nastavuje LD_LIBRARY_PATH na vlastní složku serveru linux64 a SteamAppId na 892970. Otevři UDP 2456 a 2457, skript obal do jednotky systemd, která server zastavuje signálem SIGINT, aby se při ukončení uložil svět, a máš server, který přežije restart. Celé to zabere asi patnáct minut na čerstvém Ubuntu nebo Debianu a většina potíží pochází ze tří míst: spuštění pod rootem, úprav skriptu, který Steam přepisuje, a zabití procesu místo jeho zastavení.
Tenhle článek je o instalaci. Co znamenají jednotlivé argumenty spuštění, najdeš v přehledu argumentů Valheim serveru a širší souvislosti - dimenzování, adminy, modifikátory světa - v průvodci dedikovaným Valheim serverem.
Co potřebuješ, než začneš#
Server Valheimu je 64bitový linuxový build hry na Unity. Běží na každé současné distribuci pro x86-64; většina lidí používá Ubuntu 22.04 a 24.04 nebo Debian 12 a z nich vycházejí i příkazy níže. Stroje s ARM (Raspberry Pi, cloudové instance Ampere) ho nativně spustit nezvládnou - samotný SteamCMD je jen pro x86 a emulace serveru přes Box64 je koníček, ne způsob, jak hostovat partu hráčů.
| Zdroj | Minimum | Pohodlně pro 10 hráčů |
|---|---|---|
| RAM | 2 GB volné | 4 GB volné |
| CPU | 1 rychlé jádro | 2 jádra, vysoká frekvence |
| Disk | 3 GB na instalaci | 10 GB se světy a zálohami |
| Síť | UDP 2456-2457 dostupné | Totéž, nízká latence k hráčům |
Paměť je údaj, ve kterém se lidé mýlí na druhou stranu: server sám je skromný, ale roste s prozkoumaným světem a počtem postavených dílů. Kolik RAM potřebuje Valheim server má čísla podle stáří světa a velikosti party. Na malém VPS nezapomeň, že si svůj podíl bere i operační systém a SteamCMD; stroj s 2 GB, na kterém neběží nic jiného, stačí pro tři kamarády a pro deset je to těsné.
Potřebuješ také sudo na stroji a terminál, ve kterém se dobře vyznáš. Pokud je server úplně nový, udělej nejdřív základy - přihlášení bez roota, klíče SSH, aktualizace - které prochází první hodina na novém VDS.
Instalace SteamCMD na Ubuntu a Debianu#
SteamCMD je příkazový klient Steamu od Valve. Obě distribuce ho balíčkují, ale leží v non-free části archivu a vyžaduje 32bitové knihovny, takže napřed přijdou dva přípravné kroky.
Na Ubuntu povol komponentu multiverse a architekturu i386:
$ sudo add-apt-repository multiverse$ sudo dpkg --add-architecture i386$ sudo apt update$ sudo apt install steamcmdNa Debianu 12 je balíček v non-free. Přidej contrib non-free ke komponentám ve zdrojích (v /etc/apt/sources.list, nebo na řádek Components: v /etc/apt/sources.list.d/debian.sources u novějších instalací), potom:
$ sudo dpkg --add-architecture i386$ sudo apt update$ sudo apt install steamcmdInstalátor se zeptá na souhlas s licenční smlouvou Steamu; použij šipky a Enter. Binárka skončí v /usr/games/steamcmd, což je ve výchozím PATH běžných uživatelů, ale ne vždy ve skriptech a jednotkách systemd, takže všude mimo interaktivní shell používej celou cestu.
Vyplatí se nainstalovat i pár knihoven najednou. Backend pro crossplay načítá libatomic1 a bez ní server spuštěný s -crossplay při startu spadne na chybu chybějící knihovny. libpulse0 se na minimalistických obrazech často uvádí jako potřebná také, protože runtime Unity se na ni linkuje i bez zvuku. Ani jedna nevadí:
$ sudo apt install libatomic1 libpulse0 ca-certificatesPokud nechceš balíček z distribuce, funguje i tarball od Valve - stáhni steamcmd_linux.tar.gz, rozbal ho do domovského adresáře uživatele serveru a místo steamcmd spouštěj ./steamcmd.sh. Příkazy jsou stejné. Obecnou mechaniku - co dělá +force_install_dir, proč existuje validate, jak fungují beta větve - vysvětluje SteamCMD vysvětlený.
Vlastní uživatel pro server#
Nespouštěj server pod rootem ani pod svým běžným účtem. Vlastní účet bez sudo udrží napadený nebo zlobící server ve svém domovském adresáři, dělá vlastnictví souborů předvídatelné a zajistí, že soubory světa nikdy neskončí s vlastníkem root jen proto, že někdo jednou spustil skript přes sudo.
$ sudo useradd --create-home --shell /bin/bash valheim$ sudo -iu valheimVšechno odtud až do části o systemd se děje pod tímto uživatelem. Rozložení, které článek používá:
| Cesta | Co tam leží |
|---|---|
/home/valheim/server | Instalace serveru ze SteamCMD |
/home/valheim/server/start_valheim.sh | Tvoje kopie startovacího skriptu |
/home/valheim/.config/unity3d/IronGate/Valheim | Výchozí adresář s uloženými daty: světy a soubory seznamů |
/home/valheim/Steam | Vlastní cache a logy SteamCMD |
Nejdůležitější je adresář s uloženými daty. Pokud nepředáš -savedir, server zapisuje světy do worlds_local pod ~/.config/unity3d/IronGate/Valheim uživatele, který ho spouští, a soubory adminlist.txt, bannedlist.txt a permittedlist.txt leží o úroveň výš. Spusť server jednou pod jiným uživatelem a v jeho domovském adresáři si bez řečí vytvoří úplně nový svět - to je nejčastější hlášení „zmizel mi svět“ na Linuxu. Kde Valheim ukládá soubory zmapuje každou cestu na obou platformách.
Stažení app 896660#
Dedikovaný server Valheimu je ve Steamu samostatná aplikace oproti hře. Server je 896660; herní klient je 892970. Server se stahuje anonymním přihlášením - Valheim vlastnit nemusíš a SteamCMD nepotřebuje žádný účet.
$ /usr/games/steamcmd +force_install_dir /home/valheim/server \ +login anonymous +app_update 896660 validate +quitNa pořadí záleží: +force_install_dir musí být před +login a současný SteamCMD vypíše varování, když je prohodíš. První spuštění aktualizuje samotný SteamCMD, což může trvat minutu a vypsat hromadu průběhu, a pak stáhne zhruba 1-2 GB souborů serveru. Úspěch končí hláškou:
Success! App '896660' fully installed.Pokud uvidíš Error! App '896660' state is 0x202 after update job, je plný disk; 0x602 a podobné kódy obvykle znamenají problém s oprávněními v instalačním adresáři nebo přerušené stahování. Nejdřív spusť stejný příkaz znovu - SteamCMD naváže - a pokud se chyba opakuje, zkontroluj df -h a vlastníka adresáře.
Stejný příkaz je zároveň příkaz k aktualizaci. Spusť ho vždy, když Valheim dostane patch, se zastaveným serverem. validate zkontroluje každý soubor proti manifestu, což je pomalejší, ale opraví všechno, co poškodil pád nebo neopatrná úprava; přepíše také tvoje úpravy souborů dodávaných se serverem, a právě proto ti další část radí zkopírovat startovací skript. Načasování aktualizací pro partu - a co znamená chyba Incompatible version, když to uděláš špatně - popisuje aktualizace Valheim serveru.
start_server.sh, LD_LIBRARY_PATH a SteamAppId#
Součástí instalace je ukázkový startovací skript. Jeho obsah vypadá zhruba takto, až na přesné komentáře a na to, zda ukázkový řádek už obsahuje -crossplay (záleží na buildu):
#!/bin/bashexport templdpath=$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATHexport SteamAppId=892970echo "Starting server PRESS CTRL-C to exit"# Tip: Make a local copy of this script to avoid it being overwritten by steam.# NOTE: Minimum password length is 5 characters & Password cant be in the server name.# NOTE: You need to make sure the ports 2456-2458 is being forwarded to your server./valheim_server.x86_64 -name "My server" -port 2456 -world "Dedicated" -password "secret"export LD_LIBRARY_PATH=$templdpathDva řádky tu dělají skutečnou práci a oba jsou důvod, proč samotné spuštění valheim_server.x86_64 selže.
LD_LIBRARY_PATH=./linux64 říká dynamickému linkeru, aby hledal ve vlastní složce serveru linux64, kde leží steamclient.so, který server potřebuje ke komunikaci se Steamem. Bez toho dostaneš [S_API FAIL] SteamAPI_Init() failed a server, který se nikdy nezaregistruje. Všimni si, že cesta je relativní: skript funguje jen při spuštění z instalačního adresáře, a proto jednotka systemd níže nastavuje WorkingDirectory.
SteamAppId=892970 říká Steam API, o jakou hru jde. Ano, je to id klienta, ne serveru - takhle se server Valheimu ohlašuje Steamu a změna na 896660 všechno rozbije.
Komentář ve skriptu je rada, kterou následuj: udělej kopii. validate i každá aktualizace vrátí start_server.sh do dodávané verze, takže úpravy zmizí při dalším patchi. Tvoje vlastní kopie s vlastním jménem přežije:
#!/bin/bashcd "$(dirname "$0")"export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATHexport SteamAppId=892970exec ./valheim_server.x86_64 -nographics -batchmode \ -name "Longship Crew" -port 2456 -world "Midgard" \ -password "herring-barrel-42" -public 1 \ -saveinterval 900 -backups 4$ chmod +x /home/valheim/server/start_valheim.shTři změny oproti ukázce jsou záměrné. cd "$(dirname "$0")" zařídí, že relativní cesta ke knihovnám funguje, ať skript voláš odkudkoli. -nographics -batchmode jsou standardní příznaky Unity pro proces bez displeje; ukázka je někdy vynechává a server běží i bez nich, ale brání tomu, aby se runtime Unity snažil inicializovat grafiku na stroji, který žádnou nemá. A exec nahradí shell procesem serveru, takže SIGINT, který pošle systemd nebo Ctrl+C, jde rovnou do Valheimu, a ne do shellu, který ho nemusí předat dál. Tanec s templdpath vynech - má smysl jen tehdy, když se skript načítá přes source, ne když se spouští.
První start a co má říkat log#
Poprvé skript spusť ručně pod uživatelem valheim, ať vidíš, co se děje:
$ cd /home/valheim/server$ ./start_valheim.shPrvní start nového světa trvá déle než jakýkoli další, protože se svět generuje a ukládá. Řádky, které stojí za to poznat, zhruba v pořadí, v jakém se objeví:
Valheim version: l-0.xxx.xx (network version xx)Load world: Midgard (Midgard)Game server connectedSession "Longship Crew" with join code 483920 and IP 203.0.113.10:2456 is activeŘetězec s verzí se liší podle patche; důležitý je tvar. Load world s názvem tvého světa potvrzuje argument -world. Pokud jsi čekal existující svět a místo toho vidíš zprávy o generování nového, název neodpovídá souboru v worlds_local - včetně velkých písmen. Game server connected znamená, že registrace u Steamu proběhla; pokud se neobjeví, hledej výš chyby SteamAPI_Init, které značí špatnou cestu ke knihovnám nebo špatné SteamAppId. Kód pro připojení se objeví jen s -crossplay.
Zastav ho přes Ctrl+C a počkej. Měl bys vidět uložení světa dřív, než proces skončí. Právě chování „ulož při SIGINT“ je důvod, proč je všechno dál v tomto článku uspořádané tak, jak je. Pokud server nenastartuje vůbec, pády Valheim serveru při startu projdou selhání podle hlášek v logu.
Firewall a porty#
Valheim používá UDP 2456 pro herní provoz a UDP 2457 pro dotazy Steamu a komentář v ukázkovém skriptu zmiňuje 2456-2458. Otevřít celý rozsah tří portů nic nestojí a pokryje starší buildy, které používaly třetí:
$ sudo ufw allow 2456:2458/udp comment 'Valheim'$ sudo ufw statusVšimni si dvojtečky v syntaxi rozsahu u ufw a /udp: pravidlo pro TCP pro Valheim nedělá nic a je to nejčastější důvod, proč server běží v pořádku, ale nikdo ho nenajde. U cloudového VPS bývá v ovládacím panelu poskytovatele ještě druhý firewall (security group), který potřebuje stejné pravidlo. Doma přesměruj stejný rozsah UDP na routeru na adresu stroje v LAN. Průvodce firewallem ufw popisuje výchozí nastavení, které je třeba udělat před zapnutím ufw na vzdáleném stroji - zapneš-li ho bez povolení SSH, zamkneš se venku.
Když změníš -port, posune se s ním všechno: port pro dotazy je vždy herní port plus jedna. Dva servery na jednom stroji znamenají dva nepřekrývající se rozsahy, třeba 2456-2458 a 2466-2468. Podrobnosti jsou v článku porty Valheimu 2456-2458 vysvětlené.
Otestuj to zvenčí své sítě: ve hře se připoj přes IP jako your.address:2456. Pokud to funguje a server přesto chybí v seznamu komunitních serverů, server je v pořádku a seznam je pomalý - viz Valheim server se nezobrazuje v seznamu.
Provoz jako služba systemd#
Server spuštěný z relace SSH zemře s relací. tmux nebo screen ho udrží naživu, ale ne přes restart, a ani jedno ho po pádu znovu nenastartuje. Jednotka systemd umí obojí a - správně nastavená - ho i čistě zastaví.
[Unit]Description=Valheim dedicated serverWants=network-online.targetAfter=network-online.target[Service]Type=simpleUser=valheimGroup=valheimWorkingDirectory=/home/valheim/serverExecStartPre=/usr/games/steamcmd +force_install_dir /home/valheim/server +login anonymous +app_update 896660 +quitExecStart=/home/valheim/server/start_valheim.shKillSignal=SIGINTTimeoutStopSec=120Restart=on-failureRestartSec=15[Install]WantedBy=multi-user.target$ sudo systemctl daemon-reload$ sudo systemctl enable --now valheim$ journalctl -u valheim -fŘádky, na kterých záleží:
KillSignal=SIGINTzpůsobí, že sesystemctl stopchová jako Ctrl+C, takže se svět uloží. VýchozíSIGTERMnezaručuje stejné čisté ukončení a po vypršení časového limitu pošle systemdSIGKILL, který neuloží nic.TimeoutStopSec=120dává velkému světu čas dopsat data. Výchozích 90 sekund obvykle stačí; zvýšení nic nestojí.ExecStartPreaktualizuje server při každém startu, takže restart po patchi Valheimu tě dostane na aktuální verzi. Pokud provozuješ mody BepInEx, ten řádek vyhoď - automatická aktualizace v den patche rozbije mody dřív, než je autoři stihnou dohnat, a ten okamžik si chceš zvolit sám. Také každý start zpomalí o dobu, kterou kontrola SteamCMD trvá.Restart=on-failurevrátí server po pádu, ale ne po úmyslném zastavení.
Výstup jde do žurnálu, takže journalctl -u valheim je log serveru, v němž se dá hledat přes --since a -g. Pokud dáváš přednost souboru, přidej na startovací řádek -logFile /home/valheim/valheim.log. Služby systemd pro tvoje aplikace rozebírá jednotky podrobněji, včetně limitů zdrojů přes MemoryMax=.
Pro týdenní restart stačí timer nebo záznam v cronu roota, který v klidnou hodinu spustí systemctl restart valheim. Restart vyčistí růst paměti dlouho běžícího světa a s řádkem ExecStartPre zároveň natáhne aktualizace.
Zálohy, které instalace nedává#
Příznak -backups serveru udržuje rotující kopie světa vedle světa, na stejném disku. Chrání před špatným uložením, ne před mrtvým diskem nebo smazaným adresářem. Celý adresář s uloženými daty kopíruj jinam podle plánu:
$ tar -czf /backup/valheim-$(date +%F).tar.gz \ -C /home/valheim/.config/unity3d/IronGate ValheimSpuštění z cronu za běhu serveru může zachytit svět uprostřed ukládání; bezpečnější je kopírovat poslední kompletní dvojici .db a .fwl, nebo archiv spustit hned po plánovaném restartu. Celá strategie, včetně obnovy a rozpoznání poškozeného světa, je v článku zálohy Valheim serveru a poškození světa.
Pokud nic z toho nechceš dělat sám, panelový hosting dělá totéž za formulářem: na RE:NODE drží záložka Startup argumenty z tvého startovacího řádku, oba porty UDP se přidělují s tarifem, Restart pošle čisté zastavení, aby se svět uložil, a zálohy odcházejí mimo stroj a obnovují se tlačítkem.
FAQ#
Musím vlastnit Valheim, abych stáhl server?
Ne. App 896660 se stahuje přes +login anonymous. Kopii hry potřebuješ, abys na serveru hrál, ne abys ho hostoval.
Proč server potřebuje SteamAppId 892970, když jeho vlastní app id je 896660?
Server používá Steam API jménem hry a API identifikuje hru podle id klienta. 896660 je jen depot, který SteamCMD stahuje. Nastavíš-li SteamAppId na cokoli jiného, registrace u Steamu selže.
Můžu upravit start_server.sh přímo?
Můžeš, ale další app_update ... validate nebo patch hry vrátí originál a tvoje nastavení s ním. Drž si kopii pod jiným jménem a spouštěj ji.
Mám server provozovat uvnitř screen nebo tmux?
Jen na rychlý test. Multiplexer drží proces naživu po odhlášení, ale po restartu nebo pádu nic nedělá a snadno zabiješ relaci místo zastavení serveru. Jednotka systemd s KillSignal=SIGINT je nastavení, které o uložená data nepřichází.
Jak přidám adminy na linuxovém serveru?
Dej ID každého hráče na samostatný řádek do adminlist.txt v adresáři s uloženými daty, pro uživatele valheim ve výchozím stavu ~/.config/unity3d/IronGate/Valheim. Soubor se za běhu serveru načítá znovu. Formáty ID, včetně prefixů pro crossplay, jsou v průvodci soubory seznamů Valheimu.
Je linuxový server výkonnostně horší než windowsový?
Ne tak, aby si toho parta všimla. Oba jsou stejný build Unity pro různé platformy a Linux má na malém stroji menší režii na pozadí. Linux vs Windows herní servery rozebírá případy, kdy na platformě záleží.


