WARHOST

WARHOST

Docker app from suchamoneypit's Repository

Overview

WARHOST runs Eugen's official WARNO dedicated server and writes login.ini, variables.ini, and params_for_ai.json from this form. WARNO was a game made in France, but WARHOST was created in the United States. Request a login and key from eugsupport@eugensystems.com (one pair runs five servers); the preset is the base-game map Hesse 2v2 with no workshop mods, the Map and Workshop Mod List descriptions show the Red Dragon map pack values, map and mod IDs are in the project README, and each server's game port must be forwarded to this Unraid server as TCP and UDP. The next container uses that port plus 1, and its settings folder uses that new port, for example /mnt/user/appdata/warno/10401/settings. The image is built FROM eugensystems/warno:latest and its license is left unlabeled. The Docker WebUI button is http://[IP]:[PORT:11400]/; do not forward that port. ghcr.io/suchamoneypit/warhost:latest has no lobby page until dev is published to main and the image rebuild finishes.

WARHOST — WARNO Dedicated Server for Unraid

A mod-friendly, multi-instance capable WARNO dedicated server manager for Unraid. One WARNO dedicated server per container. The install form takes your Eugen login and dedicated key (provided by Eugen upon request) and writes login.ini, variables.ini, and params_for_ai.json. The container then runs the entrypoint from the official eugensystems/warno image.

The preset is a 2v2 Conquest server on the base-game map Hesse (_2x2_Hesse_2vs2_CONQ) with no workshop mods, so players need only the game. To host the Red Dragon map pack (Steam Workshop item 3811913066) instead, set Workshop Mod List to 3811913066 and choose a scenario ID from the scenario lists. Each start reads that mod's current Version from Steam, so after the author publishes an update, restart the container.

If you've used other game servers before you likely can toll the unraid template tooltips only, and setup your standard port forward and you are done. Looking for more info? Follow docs/INSTALL-UNRAID.md. It covers the Eugen key request, router setup, the Unraid 7 install route, every field, how to confirm the server works, and troubleshooting. This README is the reference.

What you need

  • A dedicated-server login and key from Eugen. Email eugsupport@eugensystems.com with the email address of your EugNet account politely requesting a dedicated servery key; Eugen replies with a login and key pair (Docker Hub). A dedicated key from another Eugen game also works. One pair can run up to five servers.
  • Your public WAN IP, and the game port forwarded on your router as both TCP and UDP to the Unraid server. Eugen recommends host networking and this container uses it, so Unraid shows no Docker port mapping.
  • Outbound internet from the Unraid server, so the game server can reach Eugen's master server (no offline LAN play), and so each start can read a Workshop mod's Version from Steam.

Install

Community Applications listing comes after this template has been tested on a running server. Until then, Unraid 7 has no field for a template URL (Unraid 6.10 removed it), so copy the template to the flash drive and pick it from the Template dropdown. APPROVED, PENDING PUBLISH AS OF 10/9/26

In a checkout of this repository, sh scripts/print_template_fetch.sh prints the command in step 1. In Cursor, /unraid-script prints that command for main, a separate command for dev (my-WARHOST-dev.xml), and a clean-slate command. Paste only the branch you are about to add. The download URL uses the repository name WARHOST and the template file on that branch. Applying a branch template still writes my-WARHOST.xml, because <Name> on each branch is WARHOST, and leaves the suffixed file in the dropdown. The clean-slate command removes the WARHOST and WARHOST-dev containers and those template files. It also drops those names from /var/lib/docker/unraid-autostart and deletes the two private files under /boot/config/plugins/community.applications/private/suchamoneypit/. It removes ghcr.io/suchamoneypit/warhost:latest only when no container is still using it. It also removes /mnt/user/appdata/warno/<port>/settings for those containers, which holds the login and key. A folder still mounted by another container is left in place.

  1. Unraid web UI → terminal icon (>_):

    mkdir -p /boot/config/plugins/dockerMan/templates-user
    curl -fsSL -o /boot/config/plugins/dockerMan/templates-user/my-WARHOST.xml \
      https://raw.githubusercontent.com/suchamoneypit/WARHOST/main/templates/warhost.xml
    
  2. Docker → Add Container → Template → User templates, choose WARHOST, fill in the fields below, Apply.

The dropdown label is the flash filename with my- removed, so my-WARHOST.xml shows WARHOST. On Apply, Unraid writes /boot/config/plugins/dockerMan/templates-user/my-<Name>.xml from the Name on the form. With Name left as WARHOST, that is this download. A different Name leaves this file in the dropdown as a second entry, still labeled WARHOST. Delete an earlier download if it is still in that folder: warno-dedicated-server.xml or my-WARNO-Dedicated-Server.xml. This route is the one the Community Applications author gives for Unraid 6.10 and later. On 2026-10-09 Unraid 7.3.3 showed my-WARHOST.xml in that dropdown as WARHOST. The install guide records what that try did and did not prove. sh scripts/print_template_fetch.sh --private saves warhost.xml under /boot/config/plugins/community.applications/private/suchamoneypit/. The full command is in the install guide.

The template installs ghcr.io/suchamoneypit/warhost:latest. That tag is published when Rebuild WARHOST image runs on main. The pull check is in the install guide, step 2. The first server's settings folder is /mnt/user/appdata/warno/10400/settings. Every container shares that one image. Extra search terms are WARNO WARNO server dedicated server game server mods modded.

Fill in:

Field What to enter
Eugen Login The login from Eugen's reply, exactly as written, not your Steam name. This login and the key are a matching pair good for five containers.
Eugen Dedicated Key The key from the same reply. Shown in clear text on this form so servers can be told apart.
Public WAN IP The address Eugen's lobby should advertise to players. Look it up at https://www.whatismyip.com/ from a device on that network if you do not know it.
Settings Folder /mnt/user/appdata/warno/10400/settings for the first server. The next container uses this path with the port number plus 1, for example /mnt/user/appdata/warno/10401/settings. The folder holds the ini files only.
Game Port 10400 for the first server. The next container uses that number plus 1. Forward each number to this Unraid server as TCP and UDP. Players join by Server Name.
Server Name WARHOST - Hesse 2v2 on the first server. Give each container a different name. No = sign.
Map _2x2_Hesse_2vs2_CONQ, a base-game map that needs no mod. A scenario ID, not the display name. Base-game and workshop lists are in the tables below.
Max Players 4 for this 2v2 preset. Usual sizes are in the Map section below. The lobby is not locked to the size in the scenario ID.
Minimum Players 2, and not above Max Players
Team Size 2 for this 2v2 preset. Slots on one side, usually half of Max Players.
Combat Rule 2 for Conquest, 1 for Destruction. The scenario lists below give the mode of each map.
Workshop Mod List (Show more settings) Empty for a base-game map, which is the preset. For the Red Dragon pack, 3811913066. Each start reads the mod's current Version from Steam and writes the pair, for example 3811913066/27. Typing 3811913066/27 pins that number. none also means empty. Named mods are in the tables below.
Write Config From Form (Show more settings) true. Rewrites the settings files from this form on every start. With WebUI true, an existing variables.ini stays. false leaves those files and sets login.ini to mode 600.
WebUI (Show more settings) false. While WebUI is false, the Docker WebUI button still opens that port and the browser connection is refused. The log says WebUI is off. Nothing is listening on port 11400. If that port is already taken, it says WebUI is off. Port 11400 is already in use. true serves the WebUI on this Unraid host at the game port plus 1000, so 10400 uses http://<unraid>:11400/. Do not forward that port. The log says WebUI listening on port 11400. Saving writes variables.ini; restart the container to load it. The Docker WebUI button opens 11400, which is the first server only.
Workshop Mod Tags (Show more settings) Empty for a base-game map. Maps-Scenarios for a map pack such as Red Dragon. Browser icons only. These tags do not download mods. none also means empty.

Map is on the main form, under Server Name and before Max Players. Show more settings holds Workshop Mod List, Write Config From Form, WebUI, and Workshop Mod Tags, in that order. The preset is Hesse 2v2 (_2x2_Hesse_2vs2_CONQ) with both workshop fields empty. Scenario IDs and named mods are in the tables below.

Unraid refills a cleared field from the template default (Helpers.php). A container added from an earlier version of this template still holds the old Red Dragon defaults, so type none in both workshop fields there.

Map

Map takes a scenario ID from the lists below. Base-game maps need no mod, so leave Workshop Mod List and Workshop Mod Tags empty for them. A workshop map also needs its mod in those two fields, from the workshop mods table. When the startup log warns about the map or the mod list, the troubleshooting table in the install guide says what to change.

The size in the ID is the usual lobby. Eugen's variables.ini page does not tie player count to that size. The usual settings are Max Players 2 and Team Size 1 for 1v1, 4 and 2 for 2v2, 6 and 3 for 3v3, 8 and 4 for 4v4, and 20 and 10 for 10v10.

Workshop mods

Workshop Mod List loads the mod that contains the maps. Enter the Workshop id from the table; each start reads that mod's current Version and writes id/version. Pick Map from that mod's scenario list below. Red Dragon is the first row: Workshop Mod List 3811913066, Workshop Mod Tags Maps-Scenarios, and Map RDPort_JungleLaw_2v2_CONQ for Jungle Law.

Mod Workshop Mod List Pin as read Workshop Mod Tags
WARNO: Red Dragon - Map Pack 3811913066 3811913066/27 Maps-Scenarios
WEST FULDA 1.0 3363584349 3363584349/1023 Maps-Scenarios
Highway to Oslo 3474588989 3474588989/14 Maps-Scenarios
Ramstein Air Base 3705706772 3705706772/9 Maps-Scenarios
Arsenal 3415339374 3415339374/20 Maps-Scenarios
Helbe 3762638679 3762638679/36 Maps-Scenarios
Galactic Divide 3595948209 3595948209/16 Gameplay-Interface-Sound-Scenarios-Maps
A World in Flames 3388575848 3388575848/7 Gameplay-Interface, or Gameplay-Interface-Maps-Scenarios with a map pack

The pin column is each mod's Version from its Config.ini, read on 2026-10-09 (Red Dragon on 2026-10-10). A pin holds that number, so players are refused once the author increments Version. Enter the bare id unless you need to hold a number.

Galactic Divide is a total conversion and A World in Flames is a modern-day overhaul. Neither has scenario IDs of its own, so Map comes from the base game or a map pack. Join a conversion and a map pack with a hyphen, for example 3595948209-3811913066.

Joining players subscribe to each Workshop item in the list and enable it in WARNO's Mod Center. Eugen's variables.ini page says a joining player who is missing a ModList mod is prompted to download and enable it. To read Version, the container downloads just the mod's Config.ini from Steam with DepotDownloader, on the first start and after each update the author publishes.

Scenario IDs

Map packs come first and the base game is last. Copy the value from the Scenario ID column into Map. The SM_ names under some packs are Army General files; pick Map from the tables. For a mod not listed here, step 4 of the install guide shows how to find its IDs.

Red Dragon map pack (28 scenario IDs)

Workshop Mod List 3811913066. Every map is Conquest, so Combat Rule stays 2.

Map Scenario ID Size
Hell in a Very Small Place RDPort_HellInAVerySmallPlace_1v1_CONQ 1v1
Mud Fight RDPort_MudFight_1v1_CONQ 1v1
Paddy Field RDPort_PaddyField_1v1_CONQ 1v1
Strait to the Point (file name StraitSmall) RDPort_StraitSmall_1v1_CONQ 1v1
Tropic Thunder RDPort_TropicThunder_1v1_CONQ 1v1
Wonsan Harbour Land & Sea (file name WonsanLandSea) RDPort_WonsanLandSea_1v1_CONQ 1v1
Another D-Day RDPort_AnotherDDay_2v2_CONQ 2v2
Apocalypse Imminent RDPort_ApocalypseImminent_2v2_CONQ 2v2
Chosin Reservoir RDPort_ChosinReservoir_2v2_CONQ 2v2
Gunboat Diplomacy RDPort_GunboatDiplomacy_2v2_CONQ 2v2
Hop and Glory RDPort_HopAndGlory_2v2_CONQ 2v2
Jungle Law RDPort_JungleLaw_2v2_CONQ 2v2
Operation Chromite RDPort_OperationChromite_2v2_CONQ 2v2
Paddy Field RDPort_PaddyField_2v2_CONQ 2v2
Strait to the Point Land & Sea (file name StraitSmallLandSea) RDPort_StraitSmallLandSea_2v2_CONQ 2v2
Wonsan Harbour (file name WonsanNative) RDPort_WonsanNative_2v2_CONQ 2v2
38th Perpendicular RDPort_38thPerpendicular_3v3_CONQ 3v3
Another D-Day in Paradise Land & Sea RDPort_AnotherDDayLandSea_3v3_CONQ 3v3
Back to Inchon RDPort_BackToInchon_3v3_CONQ 3v3
Gunboat Diplomacy Land & Sea RDPort_GunboatLandSea_3v3_CONQ 3v3
Strait to the Point RDPort_StraitToThePoint_3v3_CONQ 3v3
38th Parallel RDPort_38thParallel_4v4_CONQ 4v4
Battle of Yuchalnok Pass RDPort_BattleOfYuchalnokPass_4v4_CONQ 4v4
Final Meltdown RDPort_FinalMeltdown_4v4_CONQ 4v4
Floods RDPort_Floods_4v4_CONQ 4v4
Strait to the Point Land & Sea (file name StraitLandSea) RDPort_StraitLandSea_4v4_CONQ 4v4
Sun of Juche RDPort_SunOfJuche_4v4_CONQ 4v4
Asgard RDPort_Asgard_10v10_CONQ 10v10
WEST FULDA 1.0 (16 scenario IDs)

Workshop Mod List 3363584349.

Map Scenario ID Size
West Fulda _3x3_WFulda_4v4_CONQ 4v4 Conquest
West Fulda _3x3_WFulda_4v4_DEST 4v4 Destruction
West Fulda _3x3_WFulda_10v10_CONQ 10v10 Conquest
West Fulda _3x3_WFulda_10v10_DEST 10v10 Destruction
Bimbach _3x3_WFuldaBimbach_2v2_CONQ 2v2 Conquest
Bimbach _3x3_WFuldaBimbach_2v2_DEST 2v2 Destruction
Grossenluder _3x3_WFuldaGrossen_1v1_CONQ 1v1 Conquest
Grossenluder _3x3_WFuldaGrossen_2v2_DEST 2v2 Destruction
Kammerzell _3x3_WFuldaKammerzell_1v1_CONQ 1v1 Conquest
Kammerzell _3x3_WFuldaKammerzell_2v2_CONQ 2v2 Conquest
Kammerzell _3x3_WFuldaKammerzell_2v2_DEST 2v2 Destruction
Malkes _3x3_WFuldaMalkes_3v3_CONQ 3v3 Conquest
Malkes _3x3_WFuldaMalkes_3v3_DEST 3v3 Destruction
Neuenberg _3x3_WFuldaNeuen_1v1_CONQ 1v1 Conquest
Neuenberg _3x3_WFuldaNeuen_2v2_CONQ 2v2 Conquest
Neuenberg _3x3_WFuldaNeuen_2v2_DEST 2v2 Destruction

Army General file names:

  • SM_FO_3x3_WestFulda_01
  • SM_FO_3x3_WestFulda_02
  • SM_PL_3x3_WestFulda_01
  • SM_PL_3x3_WestFulda_02
  • SM_PL_3x3_WestFulda_03
  • SM_PL_3x3_WestFulda_04
  • SM_SU_3x3_WestFulda_01
  • SM_SU_3x3_WestFulda_02
  • SM_SU_3x3_WestFulda_03
Highway to Oslo (4 scenario IDs)

Workshop Mod List 3474588989. The Workshop page lists these as 1v1.

Map Scenario ID Size
Highway to Oslo _2x2_Oslo_Conquest Conquest
Highway to Oslo _2x2_Oslo_Destruction Destruction
Highway to Oslo _2x2_Oslo_ConquestNS Conquest, no sidespawn
Highway to Oslo _2x2_Oslo_DestructionNS Destruction, no sidespawn
Ramstein Air Base (2 scenario IDs)

Workshop Mod List 3705706772. The Workshop page lists these as 3v3.

Map Scenario ID Size
Ramstein Air Base _2x2_Ramstein_Conquest Conquest
Ramstein Air Base _2x2_Ramstein_Destruction Destruction
Arsenal (4 scenario IDs)

Workshop Mod List 3415339374. The Workshop page lists 2v2 and 3v3 layouts, each in Conquest and Destruction.

Map Scenario ID Size
Two Hills _2x3_TwoHills_Conquest Conquest
Two Hills _2x3_TwoHills_Destruction Destruction
Two Hills _2x3_TwoHills_Conquest_6P Conquest, file suffix _6P
Two Hills _2x3_TwoHills_Destruction_6P Destruction, file suffix _6P
Helbe (12 scenario IDs)

Workshop Mod List 3762638679.

Map Scenario ID Size
Helbe _5x3_Helbe_4v4_CONQ 4v4 Conquest
Helbe _5x3_Helbe_10v10_CONQ 10v10 Conquest
Hochland _5x3_HelbeHochland_2v2_CONQ 2v2 Conquest
Norden _5x3_HelbeNorden_2v2_CONQ 2v2 Conquest
Stream _5x3_HelbeStream_2v2_CONQ 2v2 Conquest
Stream _5x3_HelbeStream_3v3_CONQ 3v3 Conquest
Stream _5x3_HelbeStream_10v10_CONQ 10v10 Conquest
Suden _5x3_HelbeSuden_1v1_CONQ_DUEL 1v1 Conquest duel
Wide _5x3_HelbeWide_4v4_CONQ 4v4 Conquest
Wide _5x3_HelbeWide_10v10_CONQ 10v10 Conquest
Zentrum _5x3_HelbeZentrum_3v3_CONQ 3v3 Conquest
Zentrum _5x3_HelbeZentrum_10v10_CONQ 10v10 Conquest

Army General file names:

  • SM_FO_5x3_Helbe_01
  • SM_FO_5x3_Helbe_02
  • SM_FO_5x3_Helbe_03
  • SM_PL_5x3_Helbe_01
  • SM_PL_5x3_Helbe_02
  • SM_PL_5x3_Helbe_03
  • SM_PL_5x3_Helbe_04
  • SM_PL_5x3_Helbe_05
Base game (102 scenario IDs)

Leave Workshop Mod List and Workshop Mod Tags empty. These are the Map Base Id values from Eugen's Docker Hub page.

Map Scenario ID Size
Airport (duel) _3x3_Airport_1vs1_CONQ_DUEL 1v1 Conquest
Black Forest Storm (duel) _2x3_BlackForestStorm_1vs1_CONQ_DUEL 1v1 Conquest
Chemical (duel) _4x2_Chemical_1vs1_CONQ_DUEL 1v1 Conquest
Death Row (training) _2x3_Death_Row_1vs1_CONQ_TRAINING 1v1 Conquest
Geisa (training) _4x3_geisa_1vs1_CONQ_TRAINING 1v1 Conquest
Hesse (duel) _2x2_Hesse_1vs1_CONQ_DUEL 1v1 Conquest
Kreide (duel) _3x3_Kreide_1vs1_CONQ_DUEL 1v1 Conquest
Mount River (duel) _3x3_MountRiver_1vs1_CONQ_DUEL 1v1 Conquest
Mount River (training) _3x3_MountRiver_1vs1_CONQ_TRAINING 1v1 Conquest
Ohmen (duel) _2x3_Ohmen_1vs1_CONQ_DUEL 1v1 Conquest
Two Lakes (duel) _2x3_Two_lakes_1vs1_CONQ_DUEL 1v1 Conquest
Urban Frontlines (duel) _3x3_UrbanFrontlines_1vs1_CONQ_DUEL 1v1 Conquest
Vertigo (duel) _2x3_Vertigo_1vs1_CONQ_DUEL 1v1 Conquest
Albion Military Base _2x3_Albion_Military_Base_2vs2_CONQ 2v2 Conquest
Black Forest Storm _2x3_BlackForestStorm_2vs2_CONQ 2v2 Conquest
Chemical (training) _4x2_Chemical_2vs2_CONQ_TRAINING 2v2 Conquest
Death Row _2x3_Death_Row_2vs2_CONQ 2v2 Conquest
Hesse _2x2_Hesse_2vs2_CONQ 2v2 Conquest
Loop _5x2_Loop_2vs2_CONQ 2v2 Conquest
Mount River (assault) _3x3_MountRiver_2vs2_CONQ_ASSAULT 2v2 Conquest
Ripple _2x3_Ripple_2vs2_CONQ 2v2 Conquest
Tension _2x2_Tension_2vs2_CONQ 2v2 Conquest
Teufelsmoor _2x2_Teufelsmoor_2vs2_CONQ 2v2 Conquest
Two Lakes _2x3_Two_lakes_2vs2_CONQ 2v2 Conquest
Two Ways _2x3_TwoWays_2vs2_CONQ 2v2 Conquest
Urban Frontlines _3x3_UrbanFrontlines_2vs2_CONQ 2v2 Conquest
Vertigo _2x3_Vertigo_2vs2_CONQ 2v2 Conquest
Death Row _2x3_Death_Row_2vs2_DEST 2v2 Destruction
Ripple _2x3_Ripple_2vs2_DEST 2v2 Destruction
Two Lakes _2x3_Two_lakes_2vs2_DEST 2v2 Destruction
Two Ways _2x3_TwoWays_2vs2_DEST 2v2 Destruction
Vertigo _2x3_Vertigo_2vs2_DEST 2v2 Destruction
Airport _3x3_Airport_3vs3_CONQ 3v3 Conquest
Cliff _4x3_Cliff_3vs3_CONQ 3v3 Conquest
Cyrus _3x3_Cyrus_3vs3_CONQ 3v3 Conquest
Danger Hills _3x3_DangerHills_3vs3_CONQ 3v3 Conquest
Eiche _3x3_Eiche_3vs3_CONQ 3v3 Conquest
Factory _3x3_Factory_3vs3_CONQ 3v3 Conquest
Kreide _3x3_Kreide_3vs3_CONQ 3v3 Conquest
Mount River _3x3_MountRiver_3vs3_CONQ 3v3 Conquest
Railway _3x3_Railway_3vs3_CONQ 3v3 Conquest
Rift _3x3_Rift_3vs3_CONQ 3v3 Conquest
Rocks _3x3_Rocks_3vs3_CONQ 3v3 Conquest
Rocks (assault) _3x3_Rocks_3vs3_CONQ_ASSAULT 3v3 Conquest
Stoneware _3x3_Stoneware_3vs3_CONQ 3v3 Conquest
Surrounded _3x3_Surrounded_3vs3_CONQ 3v3 Conquest
Triple Strike _3x3_TripleStrike_3vs3_CONQ 3v3 Conquest
Twin Cities _3x3_TwinCities_3vs3_CONQ 3v3 Conquest
Two Ways _2x3_TwoWays_3vs3_CONQ 3v3 Conquest
Urban Frontlines _3x3_UrbanFrontlines_3vs3_CONQ 3v3 Conquest
Valley _3x3_Valley_3vs3_CONQ 3v3 Conquest
Volcano _3x3_Volcano_3vs3_CONQ 3v3 Conquest
Airport _3x3_Airport_3vs3_DEST 3v3 Destruction
Cyrus _3x3_Cyrus_3vs3_DEST 3v3 Destruction
Danger Hills _3x3_DangerHills_3vs3_DEST 3v3 Destruction
Eiche _3x3_Eiche_3vs3_DEST 3v3 Destruction
Factory _3x3_Factory_3vs3_DEST 3v3 Destruction
Kreide _3x3_Kreide_3vs3_DEST 3v3 Destruction
Mount River _3x3_MountRiver_3vs3_DEST 3v3 Destruction
Railway _3x3_Railway_3vs3_DEST 3v3 Destruction
Rift _3x3_Rift_3vs3_DEST 3v3 Destruction
Rocks _3x3_Rocks_3vs3_DEST 3v3 Destruction
Stoneware _3x3_Stoneware_3vs3_DEST 3v3 Destruction
Surrounded _3x3_Surrounded_3vs3_DEST 3v3 Destruction
Triple Strike _3x3_TripleStrike_3vs3_DEST 3v3 Destruction
Twin Cities _3x3_TwinCities_3vs3_DEST 3v3 Destruction
Urban Frontlines _3x3_UrbanFrontlines_3vs3_DEST 3v3 Destruction
Valley _3x3_Valley_3vs3_DEST 3v3 Destruction
Volcano _3x3_Volcano_3vs3_DEST 3v3 Destruction
Chemical _4x2_Chemical_4vs4_CONQ 4v4 Conquest
Dark Stream _4x2_DarkStream_4vs4_CONQ 4v4 Conquest
Chemical _4x2_Chemical_4vs4_DEST 4v4 Destruction
Airport _3x3_Airport_10vs10_CONQ 10v10 Conquest
Crown _5x2_crown_10vs10_CONQ 10v10 Conquest
Cyrus _3x3_Cyrus_10vs10_CONQ 10v10 Conquest
Danger Hills _3x3_DangerHills_10vs10_CONQ 10v10 Conquest
Dark Stream _4x2_DarkStream_10vs10_CONQ 10v10 Conquest
Factory _3x3_Factory_10vs10_CONQ 10v10 Conquest
Geisa _4x3_geisa_10vs10_CONQ 10v10 Conquest
Iron Waters _3x3_IronWaters_10vs10_CONQ 10v10 Conquest
Kreide _3x3_Kreide_10vs10_CONQ 10v10 Conquest
Loop _5x2_Loop_10vs10_CONQ 10v10 Conquest
Railway _3x3_Railway_10vs10_CONQ 10v10 Conquest
Rift _3x3_Rift_10vs10_CONQ 10v10 Conquest
Rocks _3x3_Rocks_10vs10_CONQ 10v10 Conquest
Stoneware _3x3_Stoneware_10vs10_CONQ 10v10 Conquest
Surrounded _3x3_Surrounded_10vs10_CONQ 10v10 Conquest
Triple Strike _3x3_TripleStrike_10vs10_CONQ 10v10 Conquest
Twin Cities _3x3_TwinCities_10vs10_CONQ 10v10 Conquest
Urban Frontlines _3x3_UrbanFrontlines_10vs10_CONQ 10v10 Conquest
Valley _3x3_Valley_10vs10_CONQ 10v10 Conquest
Volcano _3x3_Volcano_10vs10_CONQ 10v10 Conquest
Airport _3x3_Airport_10vs10_DEST 10v10 Destruction
Crown _5x2_crown_10vs10_DEST 10v10 Destruction
Cyrus _3x3_Cyrus_10vs10_DEST 10v10 Destruction
Danger Hills _3x3_DangerHills_10vs10_DEST 10v10 Destruction
Geisa _4x3_geisa_10vs10_DEST 10v10 Destruction
Iron Waters _3x3_IronWaters_10vs10_DEST 10v10 Destruction
Kreide _3x3_Kreide_10vs10_DEST 10v10 Destruction
Loop _5x2_Loop_10vs10_DEST 10v10 Destruction
Rocks _3x3_Rocks_10vs10_DEST 10v10 Destruction
Volcano _3x3_Volcano_10vs10_DEST 10v10 Destruction

A second server

Each server is its own container. Add another one from this same template. Do not use Unraid's reinstall action. Reinstall replaces the container you already have.

The container name, Game Port, Settings Folder, and Server Name are unique. The directory before /settings is that container's Game Port. The next container adds 1 to that port, in both the Game Port field and that directory.

Field First server Second server
Name WARHOST WARHOST2
Game Port 10400 10401
Settings Folder /mnt/user/appdata/warno/10400/settings /mnt/user/appdata/warno/10401/settings
Server Name WARHOST - Hesse 2v2 a different name

Map, Workshop Mod List, and Workshop Mod Tags also belong to each container, so one server can run the Red Dragon map pack while another runs a base-game map. Public WAN IP, Eugen login, and Eugen dedicated key stay the same for up to five servers. A sixth container needs another login and key pair. Forward each Game Port to this Unraid server as TCP and UDP. Players join from the WARNO server browser by Server Name. They are not given a port to type.

Every container uses the same image, stored once. The settings folder holds login.ini, variables.ini, and params_for_ai.json. The wrapper also creates warhost.lock there so two running containers cannot share the folder. Do not copy WARNO or a Workshop folder into it. If the folder is already in use, or the game port is already taken, the start stops and the log says what to change. One pair runs five servers: fifteen servers need three pairs, fifty need ten, and one hundred needs twenty.

Settings files

On each start, Write Config From Form (true) rewrites these files in the settings folder:

  • login.ini
  • variables.ini
  • params_for_ai.json

When Workshop Mod List holds a bare Workshop id, the start also writes warhost-workshop-versions.txt: one line per id with Steam's update time and the Version written. Delete it to make the next start read each Config.ini again.

The wrapper writes those files in a private .warhost-stage.* folder first, then moves them into place. The next start that locks the settings folder removes one left by a crash or power loss, so do not keep anything under that name.

samples/ shows the shape of those files with placeholders only. Do not replace the placeholders in this repository.

The faction matchup is NATO vs PACT (GameType = 0). Teams must stay the same size (DeltaMaxTeamSize = 0). AI decks are empty. RCON is not configured.

Set Write Config From Form to false only when you need to edit those files by hand. While it is true and WebUI is false, the next start overwrites hand edits. While WebUI is true and variables.ini already exists, the next start leaves that file and still rewrites login.ini and params_for_ai.json. Set WebUI back to false to make the form the source of variables.ini again. While Write Config From Form is false, the three files stay as edited, login.ini is set to mode 600, and no Workshop id is looked up on Steam. Any other file the server itself creates in that folder (for example admins.ini or banned_clients.ini, if it creates them) is left alone.

WebUI

WebUI defaults to false. The dedicated server starts the same way with it off, and no extra process listens. The log says WebUI is off. Nothing is listening on port 11400. If that port is already taken, the log says WebUI is off. Port 11400 is already in use. The Docker WebUI button still opens that port, so the browser reports that the address refused to connect until WebUI is true.

Set it to true and the container serves the WebUI at the game port plus 1000. That is the page the Docker WebUI button opens. Game port 10400 is http://<unraid>:11400/. The next server, on 10401, is http://<unraid>:11401/. Do not forward the page port. The game port stays the one you forward as TCP and UDP. The Docker WebUI button uses http://[IP]:[PORT:11400]/. On host networking that button opens 11400, so it matches the first server only. When the page is accepting connections, the log says WebUI listening on port 11400. before the game server output.

The map list (scenario ID list) shows the base-game maps. When ModList already contains a workshop id from the named map packs, that pack's maps appear below in their own section. Two or more of those packs use a dropdown to switch packs. A workshop id with no maps in the list, such as Galactic Divide or A World in Flames, is named and does not add rows. Workshop mod tags do not add maps. Filters cover the map name, the size, and Conquest or Destruction. The match dropdowns are command and control, combat rules, opposition, starting resources, income, score limit, and time limit. Save writes the selected map and those dropdowns into variables.ini. Save keeps the existing ModList and ModTagList and does not add a workshop id; a modded map whose pack is absent is rejected. It keeps the previous copy as variables.ini.bak and does not signal the game. Restart that container in Unraid to load the save. Reset from Unraid form writes the form's current map, name, slots, combat rule, and mods, including the seeded match values (InitMoney 750 and a 20 minute limit), and also waits for that restart.

If the page fails to start, or its port is already taken, the log warns and the game server still starts. A privilege drop that fails leaves the page running and the container log warns that it stayed root. The page does not show the Eugen login or dedicated key. ghcr.io/suchamoneypit/warhost:latest has no WebUI until this work is published to main and the image rebuild finishes; until then the Docker WebUI button still opens port 11400 and the browser connection is refused.

Keys

Login from Eugen's reply, exactly as written. Not your Steam name; this login and the key are a matching pair good for five containers.

The dedicated key belongs in the Unraid form, which stores it for that container and writes login.ini on the server. The form shows the key in clear text so servers can be told apart. The startup log names only the last 4 characters. The key does not belong in this git repository, in an example file, or in a GitHub issue. If a key is ever committed, treat it as compromised even after a later delete, because git history keeps it. .gitignore ignores login.ini and a local settings/ directory.

Updates

Eugen publishes game updates as eugensystems/warno:latest. This repo does not copy their server launch arguments. entrypoint-unraid.sh writes the settings files and then runs /server/entrypoint2.sh from their image.

.github/workflows/rebuild-image.yml checks Eugen's image once a day, and also runs when the Dockerfile or entrypoint changes. If the digest changed, it builds ghcr.io/suchamoneypit/warhost:latest. In Unraid, update each server container. A failed Action leaves the previous image in place. Fix the Action and run it again. Players on a new WARNO patch need that rebuild before the dedicated server will match the client.

Change the entrypoint only if Eugen renames entrypoint2.sh or the settings filenames. A normal game patch does not require an edit here.

Workshop mods update apart from the image. Each start reads the current Version of every bare id in Workshop Mod List, so after a mod author publishes, restart the container. Until that restart, players who have the update are refused. A pinned id/version keeps its number until you change the field.

Publishing the image (maintainers)

The image is already published. If you fork this repository, repeat these steps once your files are on main:

  1. In the GitHub repository settings, enable Issues.
  2. Under Actions, allow GitHub Actions, and set workflow permissions to read and write.
  3. Run the Rebuild WARHOST image workflow.
  4. Open the package warhost and set its visibility to Public. Unraid cannot pull a private package. The workflow tries to do this for warhost, and the package page is the place to confirm it.

Then install the template on your Unraid server and confirm the container stays up, the settings files contain your key only on that server, and the preset Hesse map is the running scenario. Submit the repository to Community Apps after that test.

Community Apps reads the default branch, main. A first submission needs that branch to be a public, active repository, with the MIT LICENSE at the root, ca_profile.xml with a non-empty Profile, and templates/warhost.xml. Open https://ca.unraid.net/submit, run Validate, then Scan, and submit when the scan is clean. Those two buttons need your Community Apps login. The help pages are submission help, repository XML, and repository information XML.

License

Templates, metadata, documentation, entrypoint-unraid.sh, and webui/ are under the MIT license in LICENSE. Copyright 2026 suchamoneypit. GitHub detects that file as MIT, an OSI-approved license. Community Apps asks for that license on the repository contents: the templates, metadata, and docs. The template <License> tag is https://raw.githubusercontent.com/suchamoneypit/WARHOST/main/LICENSE. The template <ReadMe> tag is https://raw.githubusercontent.com/suchamoneypit/WARHOST/main/README.md.

The image is built FROM eugensystems/warno. The Docker Hub page, read on 2026-10-09, states no license for that image. Community Apps treats the container image license as separate from this repository's LICENSE. The Dockerfile leaves the image license unlabeled.

The image also contains DepotDownloader 3.4.0, unmodified, under GPL-2.0. Its LICENSE is in /opt/depotdownloader in the image, and its source is at that release tag.

Documentation

File Contents
docs/INSTALL-UNRAID.md First install, step by step, with verification and troubleshooting
docs/ARCHITECTURE.md What the repository contains and what was verified, with sources
docs/DECISIONS.md Why things are the way they are
docs/ROADMAP.md Goals and known issues
docs/UNRAID-TEMPLATE-GUIDE.md Generic Unraid template guidance, reusable for other game servers
docs/CURSOR-QUICKSTART.md Working on this repository with Cursor's agents

Made with AI tools

This project was built with AI coding assistants (mainly Cursor). Humans directed the work, reviewed what shipped, and remain responsible for it. Treat the template like any other community Docker or Unraid project: verify on your own server, and open an issue if something is wrong. Notes for working on the Cursor setup in this repository are in docs/CURSOR-QUICKSTART.md.

WARNO was a game made in France, but WARHOST was created in the United States.

Support

Questions and problems go to GitHub issues. Leave the Eugen key out of the issue.

Requirements

An Eugen Systems WARNO dedicated-server login and key for the person hosting. Joining players need the game, plus each Steam Workshop mod in Workshop Mod List, for example item 3811913066 for the Red Dragon map pack. With a Workshop id in that list, the server also reaches Steam at each start to read the mod's Version.

Categories

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/suchamoneypit/warhost:latest
Last Updated2026-10-11
First Seen2026-10-11

Runtime arguments

Web UI
http://[IP]:[PORT:11400]/
Network
host
Shell
sh
Privileged
false

Template configuration

Settings FolderPathrw

Ini files for this container only. Use /mnt/user/appdata/warno/10400/settings. The next container uses this path with the port number plus 1, for example /mnt/user/appdata/warno/10401/settings.

Target
/server/settings
Default
/mnt/user/appdata/warno/10400/settings
Value
/mnt/user/appdata/warno/10400/settings
Eugen LoginVariable

Login from Eugen's reply, exactly as written. Not your Steam name; this login and the key are a matching pair good for five containers.

Target
EUGEN_LOGIN
Eugen Dedicated KeyVariable

Key from the same reply. Shown in clear text on this form so servers can be told apart.

Target
EUGEN_DEDICATED_KEY
Public WAN IPVariable

Public address players connect to. Not a hostname, and not this Unraid server's LAN address.

Target
EXPOSEDIP
Game PortVariable

Forward this number to the Unraid host as TCP and UDP. The next container uses this number plus 1. Players join by Server Name in the browser.

Target
EXPOSEDPORT
Default
10400
Value
10400
Server NameVariable

Name in the WARNO browser. Give each container a different name. No equals sign.

Target
SERVER_NAME
Default
WARHOST - Hesse 2v2
Value
WARHOST - Hesse 2v2
MapVariable

Scenario ID, not the display name. Preset _2x2_Hesse_2vs2_CONQ, a base-game map. Red Dragon example: RDPort_JungleLaw_2v2_CONQ with Workshop Mod List 3811913066. Full lists are in the project README.

Target
MAP
Default
_2x2_Hesse_2vs2_CONQ
Value
_2x2_Hesse_2vs2_CONQ
Max PlayersVariable

Total slots, both sides. Preset 4, maximum 20, not locked to the map; 8 on a 2v2 map is untested.

Target
NB_MAX_PLAYER
Default
4
Value
4
Minimum PlayersVariable

Players needed before the countdown starts. Cannot be higher than Max Players.

Target
NB_MIN_PLAYER
Default
2
Value
2
Team SizeVariable

Slots on one side. Preset 2, usually half of Max Players.

Target
MAX_TEAM_SIZE
Default
2
Value
2
Combat RuleVariable

1 is Destruction and 2 is Conquest. Use 2 when the scenario ID contains CONQ or Conquest, and 1 when it contains DEST or Destruction.

Target
COMBAT_RULE
Default
2
Value
2
Workshop Mod ListVariable

Empty for a base-game map. Red Dragon map pack example: 3811913066. Each start reads that mod's current Version from Steam; id/version pins a number. Join mods with a hyphen. none also means empty. Named mods are in the project README.

Target
MOD_LIST
Write Config From FormVariable

true rewrites the settings files from this form on every start. With Lobby Page true, an existing variables.ini stays. false leaves the files and sets login.ini to mode 600.

Target
WRITE_CONFIG
Default
true
Value
true
Lobby PageVariable

false starts no lobby page. true serves it at the game port plus 1000, so 10400 uses 11400. Do not forward that port. The log names the port. The WebUI button stays on 11400. Saving writes variables.ini; restart to load it.

Target
WEB_UI
Default
false
Value
false
Workshop Mod TagsVariable

Empty for a base-game map. Map pack example: Maps-Scenarios. Browser icons only; words are Gameplay, Interface, Maps, Scenarios, Music, and Sound, joined with hyphens. none also means empty.

Target
MOD_TAG_LIST