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.
| Item | Official figure | Scope |
|---|---|---|
| Processor | Intel Core i5 or AMD equivalent | Minimum; the wiki adds that the process uses a single CPU core, citing an answer from a Strange Loop developer |
| Memory | 4 GB of RAM | Minimum, default world size |
| Disk | 1 GB of space | SSD recommended for a complex law system with heavy database access |
| Linux support | Native binary, supported from version 9 | FAQ on wiki.play.eco |
| Linux packages | libgdiplus, libc6-dev | What 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.
| Setting | Default | Protocol | Open it? |
|---|---|---|---|
| GameServerPort | 3000 | UDP only | Yes: players connect to IP:3000 |
| WebServerPort | 3001 | TCP only | Yes: the web server for the law system and the Web UI |
| RconServerPort | 3002 | TCP only | No: RCON stays off until RconPassword is set |
| SteamServerPort | 3003 | Steam game server traffic | No: 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 inDOTNET_BUNDLE_EXTRACT_BASE_DIRbecause%hin a system unit points at root's home, not the service user's. - If SteamCMD exits with an error code, the
-in front ofExecStartPrelets EcoServer start anyway. It does not cover an update that hangs:TimeoutStartSec=1800bounds that (our margin, not an official figure), and a timeout still fails the start. systemctl stopsends SIGTERM, which the wiki says saves the world; SIGINT stops at once without saving.TimeoutStopSec=300is our margin for a large save, not an official figure.- We chose
Restart=always; the wiki's units useon-failure. Watch the log withjournalctl -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),WebServerUrlif 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
Adminslist, keeping the layout the template uses. A user name does not work. Players onWhiteListskip 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) andMeteorImpactInDays(30),ExhaustionEnabledandHoursPlayedPerDay, 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:
- List the archives with
sudo ls -l /var/backups/eco/and pick one; DATE below stands for its date. 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.- `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.
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.