RE:NODE

Provoz11 min čtení

Automatické aktualizace herních serverů bezpečně

Update on restart, plánované aktualizace přes SteamCMD a validate vysvětleny: které servery se mohou aktualizovat samy, které ne a jak řešit ostatní.

1 čtenář

Na vanilla serverech aktualizace automatizuj, na modovaných je dělej ručně. Vanilla herní server na Steamu se může bezpečně aktualizovat sám při každém restartu, protože server musí odpovídat klientům a ti se aktualizují sami ve chvíli, kdy patch vyjde; když server zůstane pozadu, nikdo se na něj nepřipojí. U modovaného serveru je to přesně naopak: patch hry mody běžně rozbije a automatická aktualizace ve čtyři ráno znamená server, který nenastartuje, když se lidé po práci připojí. Mezi tím jsou ještě detaily - kdy použít validate, jak aktualizaci naplánovat, aby nepřistála uprostřed hraní, a jak poznat, že proběhla - a právě o tom je zbytek tohoto článku.

Co je SteamCMD samotné a jak fungují jeho argumenty, najdeš v článku SteamCMD vysvětlené. Tento článek předpokládá, že instalační řádek znáš a rozhoduješ se, jak často ho spouštět a s jakými pojistkami.

Proč se herní servery vůbec musí aktualizovat#

Dedikovaný server musí běžet na úplně stejné verzi hry jako klienti, kteří se k němu připojují. U většiny her na Steamu se to vynucuje: klient při připojení pošle číslo svého buildu a server odmítne cokoli jiného, obvykle málo užitečnou hláškou typu „Incompatible version“ nebo „Server is running a different version“. Když vývojář vydá patch, každý Steam klient si ho stáhne během několika hodin a od té chvíle se na starý server nedá připojit.

U většiny her tedy nejde o to, jestli aktualizovat, ale jak rychle. Výjimky stojí za to znát:

  • Minecraft Java nic automaticky neaktualizuje a hráči si verzi klienta vybírají v launcheru. Server na verzi 1.21.1 zůstane pro klienty 1.21.1 dostupný neomezeně dlouho a pluginy jako ViaVersion umožní připojit se i novějším klientům ke starému serveru.
  • Factorio nechává hráče vybrat starší verzi hry v záložce betas na Steamu a nikoho k aktualizaci nenutí, takže server může zůstat na jedné verzi, dokud se na tom parta shodne.
  • FiveM odděluje build serveru („artifact“) od hry. Klienti se připojují k tomu, co server provozuje, v rozsahu buildů, které platforma ještě podporuje.
  • Terraria: klienti se aktualizují přes Steam, ale dedikovaný server je samostatné stažení, takže novou verzi musí někdo stáhnout ručně.

Všechno ostatní - Valheim, Rust, Palworld, Project Zomboid, 7 Days to Die, Counter-Strike 2, Unturned, Satisfactory, DayZ, Arma 3 - potřebuje server na stejném buildu jako klienty a zpoždění o den znamená den, kdy se nikdo nemůže připojit.

Update on restart: výchozí volba pro vanilla servery#

Nejjednodušší automatizace je spouštět aktualizaci při každém startu serveru. Na vlastním stroji to znamená, že startovací skript zavolá SteamCMD dřív, než spustí hru:

start.sh
#!/bin/shset -e/home/steam/steamcmd/steamcmd.sh +force_install_dir /srv/valheim \    +login anonymous +app_update 896660 +quitcd /srv/valheimexec ./valheim_server.x86_64 -nographics -batchmode \    -name "Longship Crew" -port 2456 -world "Midgard" -password "$PASS"

V panelu postaveném na Pterodactylu nabízí většina Steam eggů totéž jako startovací proměnnou - obvykle přepínač s názvem podobným auto-update - která spustí SteamCMD před každým bootem. Název i výchozí hodnota se mezi eggy liší, takže se podívej do záložky Startup na svém serveru a nespoléhej na domněnky.

Update on restart funguje na vanilla serverech ze tří důvodů. SteamCMD stahuje jen změněné části, takže restart bez dostupné aktualizace přidá pár sekund. Aktualizace proběhne ve chvíli, kdy server stejně neběží, takže nepřináší žádný další výpadek. A noční restart, který už má spousta serverů, se vedlejším efektem změní na noční kontrolu aktualizací.

Slabina je v tom, že je bezpodmínečná. Spustí se po pádu ve tři odpoledne stejně ochotně jako při plánovaném restartu v pět ráno, takže patch vydaný v poledne se aplikuje při dalším zastavení serveru - což může být uprostřed raidu. Pro většinu vanilla serverů je to v pořádku, protože alternativou je server, na který se stejně nikdo nepřipojí.

Kdy automaticky neaktualizovat#

Automatické aktualizace vypni, pokud platí cokoli z tohoto:

  1. Server používá mody nebo pluginy, které zasahují do kódu hry. BepInEx na Valheimu, Oxide nebo Carbon na Rustu, UE4SS na Palworldu, Harmony mody na 7 Days to Die a Rimworldu, skriptové mody pro DayZ, RocketMod pro Unturned. Ty za běhu upravují kód samotné hry a patch hry ten kód posune. Mod se buď nenačte, nebo, což je horší, načte se a něco poškodí.
  2. Server je záměrně na připnuté nebo beta větvi. Automatická aktualizace s nesprávným argumentem větve tě přepne zpět na public.
  3. S aktualizací se mění formát světa. Velké aktualizace někdy při prvním načtení převedou save. Po převodu se v nižší verzi většinou už nenačte. Backup chceš udělat ručně minutu předtím.
  4. Probíhá soutěžní akce. Turnajový víkend není vhodná doba zjišťovat, že patch změnil výchozí hodnotu nějakého cvaru.

Pro tyto servery platí postup z kontrolního seznamu pro den aktualizace: přečti si poznámky k patchi, počkej na autory modů, vytvoř zamčený backup, aktualizuj nejdřív testovací kopii a teprve potom ostrý server.

Validate: co opravuje a proč ho nespouštět pokaždé#

validate přiměje SteamCMD spočítat hash každého souboru v instalaci a nahradit všechno, co neodpovídá zveřejněnému manifestu. Je to správný nástroj po:

  • přerušené aktualizaci - zaplnil se disk, kontejner byl zabit, spadlo připojení;
  • pádu při startu s chybami o chybějících nebo poškozených herních souborech;
  • pokynu od vývojáře ověřit soubory po nepovedeném patchi.

Při každém restartu je to nesprávný nástroj, a to ze dvou důvodů. U velké instalace - Arma 3, DayZ a Rust i s obsahem dosahují desítek gigabajtů - hashování všeho přečte celou instalaci z disku a může každému bootu přidat minuty. A validate vrátí do původního stavu každý soubor dodaný aplikací, který jsi upravil: startovací skript, výchozí konfigurační soubor v instalačním adresáři, upravený .json, který hra dodává a ty jsi ho vyladil. Úprava se tiše přepíše originálem.

Osvědčený postup je obyčejná aktualizace při každém restartu a validate jen tehdy, když je něco špatně:

code
app_update 896660            # normal: changed files onlyapp_update 896660 validate   # repair: hash and replace everything

Důležité je, kde tvoje úpravy leží. Většina her si své konfigurační soubory zapíše při prvním startu do složky se savy nebo s konfigurací mimo instalaci - ty jsou před validate v bezpečí. Několik her čeká, že upravíš soubor uvnitř instalačního adresáře; kopii takových souborů si schovej tam, kam validate nedosáhne, nebo je po opravě znovu aplikuj.

Naplánuj aktualizaci tak, aby nepřistála uprostřed hraní#

U aktivní komunity je lepší vzor, kdy aktualizace probíhají v čase, který si zvolíš. Na RE:NODE je to záložka Schedules: cron výraz a uspořádaný seznam úkolů se zpožděním - příkaz do konzole, backup, akce napájení. Noční aktualizace s restartem pro vanilla server se zapnutým update on restart vypadá takto:

Nightly update window, 05:00
Cron     0 5 * * *Task 1   command  say Restarting for updates in 5 minutes      (delay 0)Task 2   command  say Restarting in 1 minute                   (delay 240 s)Task 3   command  save                                         (delay 60 s)Task 4   backup                                                (delay 30 s)Task 5   power    restart                                      (delay 60 s)

Restart spustí aktualizaci, backup před ním znamená, že špatný patch se dá vzít zpět, a varování zajistí, že nikdo není překvapený. Příkazy pro ukládání a oznámení dosaď podle své hry; seznam najdeš v článku plánované úlohy, které stojí za to mít a syntaxi cronu včetně časových pásem vysvětluje cron výrazy vysvětlené.

Na vytíženém serveru stojí za to přidat dvě vylepšení:

  • Zkontroluj, než restartuješ. Pokud provozuješ vlastní stroj, porovnej nainstalovaný build s nejnovějším a restart přeskoč, když se shodují. Nainstalovaný build je v steamapps/appmanifest_<appid>.acf jako "buildid"; nejnovější vypíše +app_info_update 1 +app_info_print <appid> pod branches a pak public. Výstupní formát app_info_print není stabilní rozhraní, takže skript, který ho parsuje, po každé aktualizaci SteamCMD zkontroluj.
  • Nebojuj s pravidly restartů. Plán, který restartuje každou noc, a plugin, který restartuje server podle časovače, se dřív nebo později střetnou. Vyber si jedno.

Jak poznat, že aktualizace zabrala#

Neúspěšná aktualizace vypadá přesně jako úspěšná: server nastartuje, na staré verzi, a hráči dostanou nesoulad verzí. Zachytí to tři kontroly.

  1. Úspěšný řádek SteamCMD. Dokončená aktualizace vypíše Success! App '<appid>' fully installed.. Chyby jako Error! App '<appid>' state is 0x202 after update job. (obvykle nedostatek místa na disku) nebo 0x6 / 0x602 (zaseknuté stahování) znamenají, že se nepovedla. Pokud aktualizace skriptuješ, hledej úspěšný řádek a nespoléhej na návratový kód, který nebyl vždy spolehlivý.
  2. Vlastní řádek s verzí ve hře. Téměř každý server vypíše verzi brzy po startu do logu. Valheim vypíše řádek Valheim version:, Minecraft Starting minecraft server version, hry na Source enginu vypíšou číslo buildu v odpovědi na version. Po aktualizaci ověř, že se změnila.
  3. Jedno skutečné připojení. Připojení klienta je jediná kontrola, která dokáže, že klient a server se shodují.
bash
$ grep -E "Success! App|Error! App" steamcmd-update.logSuccess! App '896660' fully installed.

Když aktualizace na panelovém serveru selže, první, na co se podívej, je místo na disku. SteamCMD ukládá nové soubory na stejný svazek, než je prohodí, takže potřebuje volné místo zhruba rovné změněnému obsahu navíc k nainstalované hře. Disk plný z 95 % je disk, na kterém příští velký patch selže - co uvolnit, najdeš v článku plný disk herního serveru.

Hry, které SteamCMD nepoužívají#

Poměrně dost oblíbených serverů má vlastní cestu aktualizací a přepínač update on restart pro SteamCMD jim nepomůže.

HraJak se server aktualizujeAutomatizovat?
Minecraft (Paper)Nahradit jar serveru novým buildemBuildy v rámci jedné verze: opatrně. Nové verze: nikdy
FiveMNahradit artifact serveruPřipnout doporučený build; aktualizovat ručně
FactorioStáhnout nový headless build z factorio.comJen pokud se parta shodne na verzi
TerrariaSoubory dedikovaného serveru nahradit ručněRučně, až tModLoader nebo TShock dohoní
Minecraft BedrockNahradit build Bedrock Dedicated ServeruRučně; klienti na mobilech a konzolích se aktualizují automaticky

U Minecraftu je aktualizace buildu Paperu v rámci stejné verze Minecraftu obvykle oprava chyb a dá se bezpečně aplikovat podle plánu - i když občasný build změní chování, na které pluginy spoléhají. Přechod mezi verzemi Minecraftu, třeba z 1.21.4 na 1.21.5, při prvním načtení převede svět a může rozbít polovinu pluginů. To je vždy ruční operace se zálohou, popsaná v článku upgrady verzí Minecraftu. Bezpečný postup aktualizace FiveM je v článku aktualizace FiveM serveru a artifacty.

Aktualizují se i obsah z Workshopu#

Mody ze Steam Workshopu se aktualizují podle vlastního rozvrhu, nezávisle na hře, a server, který při startu stahuje položky z Workshopu, si novou verzi modu vezme při dalším restartu, ať chceš, nebo ne. Je to tišší verze téhož problému: autor modu vydá změnu, server se v noci restartuje a ráno buď spadne při načítání, nebo se klienti nemohou připojit, protože jejich kopie modu se ještě neaktualizovala.

Různé hry to řeší různě. Project Zomboid kontroluje položky z Workshopu, když se hráč připojí, a vyhodí hráče s odlišnými verzemi; Garry's Mod, Arma 3 a DayZ stahují obsah z Workshopu přes SteamCMD nebo vlastní loader hry. Obecná obrana je stejná jako u hry: večerní okno pro aktualizace, backup před ním a testovací server pro všechno s dlouhým seznamem modů. Mody ze Steam Workshopu na dedikovaných serverech popisuje, jak každá hra obsah stahuje a kde ho ukládá do cache.

Rozumná politika podle typu serveru#

Shrnutí:

ServerAktualizace hryAktualizace modůValidate
Vanilla, malá partaUpdate při každém restartun/aJen po selhání
Vanilla, aktivní komunitaNoční plánované okno s varováním a backupemn/aJen po selhání
Lehce modovaný (jen na straně serveru)Plánované okno, nejdřív přečíst poznámky k patchiMěsíčně, ručněJen po selhání
Silně modovanýRučně, až mody dohoní, nejdřív otestovánoRučně, jeden po druhémPo přerušené aktualizaci
Událost nebo soutěžZmrazeno během akcíZmrazenoNikdy uprostřed akce

Řádek se silně modovaným serverem je místo, kde je nejvíc práce a kde se druhý server vyplatí. Jak ho zřídit, popisuje testovací server vedle produkčního a jak zůstat na starém buildu nebo se k němu vrátit, když aktualizaci nelze vzít zpět jinak, vysvětluje připínání verzí herního serveru a rollbacky.

FAQ#

Mám u herního serveru zapnout auto-update?

Ano u vanilla serveru, protože se klienti aktualizují sami a zastaralý server je nedostupný. Ne u serveru s mody, které zasahují do kódu hry, protože další patch je rozbije a ty chceš určit, kdy se to stane.

Zpomaluje update on restart každý restart?

Jen nepatrně, když se nic nezměnilo - SteamCMD porovná manifesty a skončí. Pomalý je až validate, protože čte každý soubor. Pro běžné starty ho nech vypnutý.

Proč se server aktualizoval, ale hráči pořád vidí nesoulad verzí?

Buď aktualizace selhala a server nastartoval na starém buildu, nebo jsou server a klienti na různých větvích. Zkontroluj řádek s verzí v logu při startu a pak ověř, jestli není beta větev nastavená na jedné straně a na druhé ne.

Můžu aktualizaci odložit, dokud nebudou mody připravené?

Jen u her, které to umožňují. Hry na Steamu nutí klienty na nový build, takže odložení serveru znamená, že se nikdo nepřipojí. Někteří vydavatelé nechávají předchozí verzi dostupnou jako beta větev, takže na ní můžeš běžet o něco déle s hráči, kteří si přepnou vlastního klienta na stejnou větev.

Co se stane, když se server restartuje během stahování aktualizace?

Aktualizace se přeruší a instalace zůstane částečně aktualizovaná. Další start obvykle naváže, ale pokud pak server selže kvůli chybějícím nebo poškozeným souborům, proveď jednu aktualizaci s validate, která to opraví.


Komentáře

Zcela anonymně: žádný účet, žádný e-mail, žádné cookie. Ukládáme jen jméno, které napíšeš, text a čas - nic dalšího. Počet odkazů je omezený a značkování se nevykresluje.

0/2000