Automating a Factorio Server with Docker Containerization

Factorio Gameplay Trailer Thumbnail

I recently began playing Factorio earlier this year, a game about building and creating automated factories to produce items of increasing complexity. I have had a love for real-time strategy and simulation games since I was a kid, and this game has been a joy to play. Here’s a link to the gameplay trailer of the older 0.16.x branch of the game.

It only seems more enjoyable then to gather friends and family and play this game on multiplayer, with everyone collaborating to build a bigger, faster factory in shorter time. The first step to do that is getting a Factorio server setup. The current 0.17.x branch is the latest version of the game. This is how I went about setting up for that.

Setup a Cloud Server

First, create a cloud server that will be used to install docker and will host the factorio server container. I already have a few servers with a variety of cloud hosting providers, but if you need one, I recommend Vultr Cloud (use this link to receive $50 to test out their platform).

Alternatively, if you use Kubernetes or already have a container platform, you may use that. Keep in mind, Factorio needs to be able to resolve its public IP address from inside the container, in order to let people play on it. If behind a NAT, there may be some difficulties getting the server working, including port forwarding through the firewall. Viewing the server logs after creating the container will help identify if there’s an issue.

The OS I chose for my cloud server was Fedora 30. I’m personally not a fan of Debian/Ubuntu or the DEB-formatted packages, especially how services automatically start after apt-get’ing them. I prefer RPM-formatted packages, but CentOS is too old for what I feel I need, so Fedora is the best choice for me. I’m also not widely supportive of CoreOS, so that was a non-starter.

After the cloud server provider gives you root access to the host, login as root and immediately configure it as you would any of your other servers. At minimum, do a full package update: dnf upgrade -y --refresh --setopt=install_weak_deps=False --best. Also note that it is assumed all further actions will be done as root, if that’s not the case then prefix sudo to each command further below.

Install Docker

The next step is to install docker. The version that comes with the OS is typically too old to be of any practical use, but luckily the Docker Team maintains their own repository with better packages. Follow the Docker Engine Install Guide, or run: dnf install -y --releasever=29 docker-ce docker-ce-cli containerd.io. At time of this post, they don’t have a Fedora 30 version of Docker, so adding --releasever=29 is required during the dnf install step. This extra step shouldn’t be required for too long, once they support the newer Fedora version.

Make sure after installing Docker that you do another full package update (dnf update -y) to ensure any dependent packages it installed get updated to the Fedora 30 release version.

Note: Installing the previous Fedora release’s Docker packages has had no ill effects for me. It’s not recommended to do this for just any package that you can’t install otherwise. I’ve tested this out and it’s been working stable enough for me to justify doing it. Definitely use your best judgment here and do what makes you comfortable, even if that means using Fedora 29 instead for your OS with the cloud server provider.

Once everything’s installed and updated, enable and start docker: systemctl enable --now docker.service.

Install Factorio

This step’s pretty quick and simple. These steps are copied directly from the factoriotools/factorio-docker Readme and will install the latest 0.17.x branch of the Factorio server.

mkdir -p /opt/factorio
chown 845:845 /opt/factorio
docker run -d \
  -p 34197:34197/udp \
  -p 27015:27015/tcp \
  -v /opt/factorio:/factorio \
  --name factorio \
  --restart=always \
  factoriotools/factorio

Note: You can omit port 27015 if you have no plan to use the RCON commands. More info here: https://wiki.factorio.com/Console

The container will start but it won’t be playable yet. We’ll need to do a few more steps before we can start playing on it. Next, shutdown the container: docker stop factorio.

Edit the server settings file here: /opt/factorio/config/server-settings.json. You will need to enter your Factorio username/password, or alternatively your token, and this is also where you’ll decide how to title and describe your new Factorio server. To get your server’s token, go to factorio.com/profile and copy it from there.

Once you’ve sufficiently changed that file, you’re pretty much ready to play. The only thing left would be to alter how the map is generated, but this is optional.

Change the Map Settings (optional)

When the container started, it generated a new map with the settings in /opt/factorio/config/map-gen-settings.json and /opt/factorio/config/map-settings.json.

Modify those two files to your own liking, then delete all zip files under /opt/factorio/saves.

The steps above will cause the server to regenerate a map with the new settings you’ve applied.

Play Factorio

The server’s setup and ready to go. All what’s left to do is start up the container again: docker start factorio.

One last note: If you’re using the Steam version of Factorio, you will need to switch your Factorio installation to the beta release. Right-click Factorio from the Steam Games Library, choose Properties, go to the Betas tab, and in the dropdown select the latest 0.17.x. This will let you match the version of Factorio you just installed on your new server.

You may now launch Factorio and connect to your new server. Share the name of it in the public server list with your friends and family, or ask them to enter the hostname/IP address directly, depending on the settings you chose.

Have fun!

Troubleshooting

If there’s an issue, the factoriotools/factorio-docker repository is a good place to start. There are sections in their Readme for certain scenarios you may encounter.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.