Use case · Game server

Eco dedicated server on Linux: install, configs, ports and saves

An Eco dedicated server on Linux is Strange Loop Games' native EcoServer binary, installed through SteamCMD as app 739590 with an anonymous login, taking game traffic on 3000 UDP and serving its web pages on 3001 TCP. The official wiki states that the server is available and supported on Linux from Eco version 9; the world lives in the Storage folder next to the binary, and every setting lives in a .eco file under Configs.

See the game servers

What the server asks of the machine

The wiki publishes one set of server figures, labelled as minimum requirements for Windows on the default 72x72 world, and notes that requirements vary with the world size you choose. There is no separate Linux table.

ItemOfficial figureScope
ProcessorIntel Core i5 or AMD equivalentMinimum; the wiki adds that the process uses a single CPU core, citing an answer from a Strange Loop developer
Memory4 GB of RAMMinimum, default world size
Disk1 GB of spaceSSD recommended for a complex law system with heavy database access
Linux supportNative binary, supported from version 9FAQ on wiki.play.eco
Linux packageslibgdiplus, libc6-devWhat the bundled install.sh installs

Our reading of those figures: a bigger map, more citizens and a busier law and economy system all add work to the one core that runs the simulation, so the minimum is a floor rather than a target. Size memory with headroom, put the world on SSD, and watch real load once your group settles in. The wiki's Server Troubleshooting page, which the wiki marks Unchecked, points to its Server Profiling tools when a world starts to lag.

Ports and what listens on them

All four ports are set in Configs/Network.eco. The defaults and protocols below are from the wiki's Network.eco reference.

SettingDefaultProtocolOpen it?
GameServerPort3000UDP onlyYes: players connect to IP:3000
WebServerPort3001TCP onlyYes: the web server for the law system and the Web UI
RconServerPort3002TCP onlyNo: RCON stays off until RconPassword is set
SteamServerPort3003Steam game server trafficNo: the wiki says to use it only in offline mode

The wiki's Linux firewall example also opens 3000 over TCP, and its setup guide says 3000/TCP might be used for mod downloads from the server, while calling that not totally confirmed. The commands below open it as well; drop that rule if you run no mods and want the smallest surface.

Installing on Ubuntu 24.04

Valve's SteamCMD page says Ubuntu needs the multiverse repository and x86 (i386) packages enabled, and recommends setting the install directory before logging in. The firewall comes first, in this order: IPv6 rules on, SSH allowed, firewall enabled, then the game ports. The last line installs steamcmd and stops on Valve's licence prompt, which is why it is last.

sudo sed -i 's/^IPV6=.*/IPV6=yes/' /etc/default/ufw
sudo ufw allow OpenSSH
sudo ufw --force enable
sudo ufw allow 3000/udp
sudo ufw allow 3000/tcp
sudo ufw allow 3001/tcp
sudo add-apt-repository -y multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y libgdiplus libc6-dev
sudo useradd -m -s /bin/bash eco
sudo apt install steamcmd

Next, download the server as the eco user, create the three config files from their templates with mode 600 before any password goes in, and write the unit. The wiki's install.sh would install the same two packages; we install them with apt above instead. Every line after the download starts only if EcoServer is there. The template names follow the wiki's rule (a config file plus a .template copy); check them with sudo ls /home/eco/server/Configs after the download. The loop skips a file that already exists, so a second run does not reset your settings, and it stops, naming the file, if a template is missing. The block ends by opening Network.eco in nano.

sudo -u eco bash -c 'cd /home/eco && /usr/games/steamcmd +force_install_dir /home/eco/server +login anonymous +app_update 739590 validate +quit'
sudo test -x /home/eco/server/EcoServer && sudo -u eco bash -c 'cd /home/eco/server/Configs && for f in Network Users Difficulty; do [ -e $f.eco ] && continue; [ -e $f.eco.template ] || { echo "missing $f.eco.template: stop"; exit 1; }; install -m 600 $f.eco.template $f.eco; done && mkdir -p ../Mods/UserCode && ls -l *.eco'
sudo test -x /home/eco/server/EcoServer && sudo tee /etc/systemd/system/eco.service > /dev/null <<'EOF'
[Unit]
Description=Eco dedicated server
Wants=network-online.target
After=network-online.target

[Service]
User=eco
Group=eco
WorkingDirectory=/home/eco/server
Environment=DOTNET_BUNDLE_EXTRACT_BASE_DIR=/home/eco/.net
ExecStartPre=-/usr/games/steamcmd +force_install_dir /home/eco/server +login anonymous +app_update 739590 +quit
ExecStart=/home/eco/server/EcoServer
TimeoutStartSec=1800
TimeoutStopSec=300
Restart=always
RestartSec=15
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo test -e /home/eco/server/Configs/Network.eco && sudo -u eco nano /home/eco/server/Configs/Network.eco
  • The unit follows the wiki's Linux examples (working directory, full path to EcoServer, LimitNOFILE, the SteamCMD update before start). We spelled the home path out in DOTNET_BUNDLE_EXTRACT_BASE_DIR because %h in a system unit points at root's home, not the service user's.
  • If SteamCMD exits with an error code, the - in front of ExecStartPre lets EcoServer start anyway. It does not cover an update that hangs: TimeoutStartSec=1800 bounds that (our margin, not an official figure), and a timeout still fails the start.
  • systemctl stop sends SIGTERM, which the wiki says saves the world; SIGINT stops at once without saving. TimeoutStopSec=300 is our margin for a large save, not an official figure.
  • We chose Restart=always; the wiki's units use on-failure. Watch the log with journalctl -u eco -f.

Start it only if the binary and both edited files are there and the firewall is on: sudo test -x /home/eco/server/EcoServer && sudo test -e /home/eco/server/Configs/Users.eco && sudo ufw status | grep -q 'Status: active' && sudo systemctl enable --now eco. The first start generates the world, and the wiki warns that this can take a while.

Network.eco, Users.eco and Difficulty.eco

Edit the files with the server stopped. The wiki says file edits take effect only after a restart, and its Server Troubleshooting page (marked Unchecked, so not yet reviewed by the wiki's admins) adds that the server writes settings back to the .eco files when it shuts down, overwriting changes made while it ran. Never edit the .template copies: an update replaces them.

  • Network.eco: Name (up to 250 characters), PublicServer (false by default; true lists it in Strange Loop's public listings), Password, DefaultSlots (-1 for no cap), ReservedSlots (5), WebServerUrl if the web server should be reached by a DNS name or through a proxy.
  • Users.eco: put your SLG ID or Steam64 ID in the Admins list, keeping the layout the template uses. A user name does not work. Players on WhiteList skip the password, and the wiki notes whitelisting only matters once a password is set.
  • Difficulty.eco: the settings the in-game Host a World screen exposes, such as HasMeteor (true) and MeteorImpactInDays (30), ExhaustionEnabled and HoursPlayedPerDay, plus crafting, weight and growth multipliers.

Once you are an admin, /manage whoami and /manage whois name show the IDs other players need for these lists (the current command list; the older advanced guide writes them as /whoami and /whois). /serverui opens the server GUI only for a local user, per the wiki's command list, so on a remote Linux machine the files are the interface.

The web server and RCON

Port 3001 serves the files in the WebClient folder, which the wiki describes as the law system's web server; Strange Loop's 14.1.1 notes also refer to a map on the Web UI. It is meant to be public. What must stay private are the keys behind it: APIAuthToken and APIAdminAuthToken in Users.eco grant Web UI access without a game user, the second as an admin. The wiki says to keep them secret and notes they are absent from a clean 14.1.1 config, so leave them empty, and leave AllowDebugCalls false.

RCON accepts admin commands over TCP, without the leading slash, and every command runs with server admin permissions. It is off until RconPassword is set, and it takes one client at a time. In the wiki's packet layout the auth packet carries that password as a plain ASCII string; we read it as crossing the network unencrypted. If you turn it on, set RconIPAddress to 127.0.0.1, leave 3002 closed in ufw, and run the client on the server over your own SSH login. A password typed as a command-line argument shows in ps and in shell history.

Saves, backups and updates

Storage holds the world (Game.eco, Game.db) and a backups folder. Backup.eco runs the server's own rotation: enabled, every 0.5 hours, keeping 2 from the last hour, 24 hourly, 3 daily and 10 weekly. Those copies share the server's disk, so take a second copy off the machine. The cron file below stops the server (SIGTERM, so it saves), archives Storage, Configs and your own mods in Mods/UserCode, and starts it again. That restart briefly drops players and runs the SteamCMD update step too.

# /etc/cron.d/eco-backup  (first: sudo install -d -m 700 /var/backups/eco)
30 4 * * * root bash -c 'umask 077; systemctl stop eco && tar -czf /var/backups/eco/eco-$(date +\%F).tar.gz -C /home/eco/server Storage Configs Mods/UserCode; systemctl start eco' > /var/backups/eco/last-run.log 2>&1
50 4 * * * root find /var/backups/eco -name 'eco-*.tar.gz' -mtime -1 | grep -q . && find /var/backups/eco -name 'eco-*.tar.gz' -mtime +14 -delete

The prune line deletes nothing unless an archive from the last day exists. Pull the archives to another machine with plain rsync -a, never --delete, and prune there with its own job. To restore:

  1. List the archives with sudo ls -l /var/backups/eco/ and pick one; DATE below stands for its date.
  2. sudo systemctl stop eco. The next command is all one line: it checks the chosen archive, saves the current state as current-state.tar.gz and tests that copy, and only then deletes and unpacks.
  3. `sudo bash -o pipefail -c 'B=/var/backups/eco; cd /home/eco/server && test -s $B/eco-DATE.tar.gz && tar -tzf $B/eco-DATE.tar.gz > /dev/null && tar -czf $B/current-state.tar.gz Storage Configs Mods/UserCode && gzip -t $B/current-state.tar.gz && tar -tzf $B/current-state.tar.gz > /dev/null && rm -rf Storage Configs Mods/UserCode && tar -xzf $B/eco-DATE.tar.gz && chown -R eco:eco /home/eco/server && echo restored'`. If it does not print restored, read the error: a failure before the unpack leaves the folders untouched, and if the unpack itself failed, current-state.tar.gz holds what was there.
  4. sudo systemctl start eco, join and check the world. Delete current-state.tar.gz only when it is right.

Updates arrive at every start through ExecStartPre. The wiki says updates are usually compatible with saved worlds and that Strange Loop announces any special migration step; the 14.2 notes state that migration for 14.1 worlds is fully supported, and 14.1.1 fixed an issue that let malicious actors manipulate bank account data on servers. The wiki also warns that updating may wipe configurations, which is one more reason for the archive above. A restore brings back the world and settings, not an older server build. To hold a version through a major update, comment out the ExecStartPre line and run daemon-reload.

Which of our machines fit

Our game server hosting on bare metal gives the simulation a machine nobody else runs anything on, so the one busy core and the database writes are yours alone. Every dedicated server has an unmetered port (1 Gbps or 500 Mbps, depending on the line) and one IPv4, with IPv6 added at checkout at no charge. Ubuntu up to 26.04 installs in one click on the lines that carry it; our Linux dedicated servers page lists the other distributions.

Choose a rack server or blade: each has an out-of-band controller (iLO, iDRAC or a Supermicro BMC) with a browser console once you add a console login, which is how you get back in after a bad firewall rule. Among the cartridges, only the m510 and m710x carry a console. The official pages describe no ARM build of the server, and Valve's Ubuntu instructions for SteamCMD require x86 packages; our inference from both is to pick an x86-64 line. The network is ours, AS19624, in New York, Miami, San Francisco, Amsterdam and Bucharest; our data center list has a test IP for each city. Expect a ready server about 30 minutes from payment approval; builds to order take 4-24 hours.

For a small group that plays together while the host is online, Host a World from the game client does the job without a server. Rent one when the world has to keep running with nobody at home. Another long-running build world on the same pattern: our Factorio server notes.

Questions

Does the Eco server have a GUI on Linux?

Not one you can use remotely. The wiki's command list says /serverui opens the server GUI only for a local user. On a rented Linux machine, stop the service, edit the .eco files in Configs, and start it again.

How do I make myself an admin?

Add your SLG ID or Steam64 ID to the Admins list in Users.eco while the server is stopped, then start it. A player name does not work. After that, /manage whois shows other players' IDs, and /manage admin can add more admins from the chat.

Which ports does the firewall need?

3000 over UDP for the game and 3001 over TCP for the web server. The firewall example on the wiki's Linux page also opens 3000 over TCP; the main setup page says that port might be used for mod downloads, without confirming it. Leave 3002 (RCON) and 3003 (Steam, offline mode only) closed.

Can one machine run two Eco worlds?

Yes, as two installs: a second force_install_dir, its own Configs, its own unit, and its own GameServerPort, WebServerPort, RconServerPort and SteamServerPort in Network.eco, for example 3010 to 3013. Open the new game and web ports in ufw. Both worlds then share the one IP.

Players cannot find the server in the list. What now?

Check PublicServer is true in Network.eco if you want it listed. The wiki's Linux page adds that a server can still be missing from the list outside your network; players can press the + in Your Worlds and enter the IP with port 3000.

Do updates put the world at risk?

Usually not: the wiki says updates are normally compatible with saved worlds, and Strange Loop's notes say when a migration needs special steps. The same wiki warns that configurations may be wiped, so keep the nightly archive of Storage and Configs and read the release notes before a major version.

A machine for the world

Pick a city near your players, install Ubuntu 24.04, and work through the install, config and backup steps above.

See the game servers

Related on Server Room

Other use cases