Skip to content

Setting up a VPS host

Oznogon edited this page Jul 21, 2026 · 2 revisions

For general internet play information, see Internet play.

If port forwarding doesn't work for you, you can create an inexpensive virtual private server (VPS) and run your EmptyEpsilon host on it. The game's low system requirements mean you can run games for less than US$0.01/hour.

You can use several VPS hosts to host an EmptyEpsilon game, such as:

Vultr

Vultr is a VPS provider that offers servers for as little as $0.007/hour, with hosts located around the world.

Create a server on Vultr

After signing up for a Vultr account:

  1. Create a new server.

  2. Select the "Cloud Compute" (Shared vCPU) server type.

  3. Select the "Regular Performance" CPU & Storage Technology option.

  4. For best performance, select a server location that's close to you and all of your players.

  5. Select a Linux operating system image.

    • The easiest option for running the GM interface is "Ubuntu Desktop with XFCE".
      1. Select the "Marketplace Apps" tab under "Server Image".
      2. Search for "Ubuntu Desktop".
      3. Select "Ubuntu Desktop (XFCE)".
    • The easiest option for running a headless server is "Ubuntu".
      1. Select the "Operating System" tab under "Server Image".
      2. Select "Ubuntu".
      3. Select the latest LTS version from the dropdown.
  6. Under Server Size, select the cheapest option, which as of Jan. 2023 is either $2.50/month ("1 vCPU/512 MB Memory") or $5/month ("1 vCPU/1 GB Memory").

    If you destroy the server after the end of your game, you won't have to pay for the full month, only the time that the server's running.

  7. Disable Auto Backups to save a little money.

  8. If you selected the "Ubuntu Desktop (XFCE)" server image, enter a user name that you'll use to log in.

  9. Optionally add a SSH public key, if you have one.

    The server uses this key instead of a password to authenticate you if you login via secure shell (SSH), which is the only login option for "Ubuntu" without a desktop running a headless server.

  10. Select the "Deploy Now" button.

    This initializes the server, which can take a few minutes.

    image

Install and run EmptyEpsilon on Ubuntu Desktop (XFCE)

If you selected the "Ubuntu Desktop (XFCE)" server image, you can connect to the running server using a VNC client and control its desktop. This is ideal for running the Game Master screen directly on the server.

  1. When the server is finished installing, click the name of the server from the list of running servers.

    If you closed the tab or navigated away from that list, you can return to it by selecting the "Products" tab in the left sidebar of the vultr interface.

  2. Read the contents of the "App Instructions" section, which contains your desktop username and password, and a VNC address and password.

  3. Install a VNC client.

    • If you use Windows, download and install TightVNC.
    • If you use macOS, open Safari and enter vnc://<VNC ADDRESS>:5900 in the address bar, replacing <VNC ADDRESS> with the listed VNC address. If prompted, allow Safari to open "Screen Sharing".
  4. Connect to your server at the VNC address from the server's "App Instructions".

    If your VNC client takes the address and port separately, remove :5900 from the end of the address and enter 5900 as the port.

  5. Enter the VNC password from the server's "App Instructions" when prompted.

    Upon connection, you should see a login screen with a password prompt.

  6. Enter the Desktop password from the server's "App Instructions" to login.

    Wait a moment while the desktop loads.

  7. Open a web browser by clicking the globe icon in the bottom application dock.

    Wait a moment while the browser loads. If you click multiple times while waiting, multiple browser windows will open.

  8. In the browser's address bar, go to the EmptyEpsilon website at https://daid.github.io/EmptyEpsilon.

  9. Select the "Download" tab from the EmptyEpsilon website.

  10. Select the "Linux" .deb file for the EmptyEpsilon version you want to host.

    This downloads the file to the server's Downloads directory.

  11. Open a terminal window by clicking the black square with a $_ symbol in the bottom applications dock.

  12. Open EmptyEpsilon's port 35666 in the server's firewall. Enter:

    sudo ufw allow 35666
    

    If prompted, enter the Desktop password from the server's "App Instructions".

  13. Install EmptyEpsilon and its dependencies. In the terminal, enter:

    cd ~/Downloads
    sudo dpkg -i Linux_EmptyEpsilon_EE-2022.10.28.deb
    sudo apt -f install
    

    replacing the .deb file above with the EE version you downloaded. If prompted, enter the Desktop password from the server's "App Instructions".

  14. Run EmptyEpsilon. In the terminal, enter:

    EmptyEpsilon
    

    The command is case-sensitive.

The EmptyEpsilon interface should appear. You can start a server, select a scenario, and enter the GM screen. Players can connect by using the server's IP address, which is listed in the server's "Overview" tab on Vultr or in the server creation screen in the server's EmptyEpsilon instance.

Install and run EmptyEpsilon without a desktop

If you selected "Ubuntu" under "Server Image" while creating the server, Vultr installs Ubuntu without a desktop environment and provides only secure shell (SSH) command-line access to the server. You can use this to run EmptyEpsilon in Headless server mode.

If you provided an SSH public key during server creation, you can login from any system with the corresponding private key without needing the root password.

  1. Find the server's IP address and root password.

    • The IP address is listed next to the server name in the "Products" tab of Vultr's interface, or next to "IP Address" in the "Overview" tab of the server details in Vultr.
    • The root password is listed as "Password", under "IP Address", in the "Overview" tab of the server details in Vultr. It's obscured by default, but you can view it by clicking the eye icon next to the obscured password, or copy it to your clipboard by clicking the copy icon.
  2. SSH to the server.

    • On macOS, an SSH client is built in.
      1. Open the Terminal app (Applications > Utilities > Terminal).
      2. In Terminal, run ssh root@<IP ADDRESS>, replacing <IP ADDRESS> with the server address.
      3. Enter the root password if prompted.
    • On recent versions of Windows 11, ssh is built in.
      1. Open the PowerShell app.
      2. In PowerShell, run ssh root@<IP ADDRESS>, replacing <IP ADDRESS> with the server address.
      3. Enter the root password if prompted.
    • On older versions of Windows, download and install PuTTY, an SSH client.
      1. Open the PuTTY app.
      2. In the "Host Name" box, enter the server's IP address.
      3. Select the SSH connection type.
      4. Click "Open" to connect.
      5. If prompted, click "Accept" to trust the server's host key.
      6. If prompted to login as:, enter root.
      7. If prompted for a password, enter the root password from the server's "Overview" tab.
      8. Enter the root password if prompted.

    After connecting, the server will output a welcome message and end with a prompt that looks like:

    root@EmptyEpsilon:~#
    

    replacing EmptyEpsilon with whatever name you gave the server during creation, or a random hostname.

  3. Download the EmptyEpsilon installation package. TODO: Update for fork

  4. Install EmptyEpsilon and its dependencies. Run:

    dpkg -i Linux_EmptyEpsilon_EE-2024.12.04.deb
    apt -f install

    replacing the .deb file above with the EE version you downloaded. If prompted, enter the Desktop password from the server's "App Instructions".

  5. Open EmptyEpsilon's port 35666 in the server's firewall. Run:

    ufw allow 35666
  6. Run EmptyEpsilon:

    EmptyEpsilon headless=scenario_10_empty.lua

    replacing scenario_10_empty.lua with the name of the scenario script you want to run. The command is case-sensitive. For more headless options, see Headless server.

    For a list of all available scenario scripts, run:

    ls /usr/local/share/emptyepsilon/scripts/scenario_*

At this point the EmptyEpsilon server is running the selected scenario. Players can connect by using the server's IP address.

Take a snapshot

To make future setup easier, you can optionally take a snapshot of the server after installation. You should take a snapshot only when EmptyEpsilon isn't actively running on your server. As of Jan. 2023, Vultr snapshot storage costs US$0.05 per GB per month.

  1. On the server, exit EmptyEpsilon and any other running apps.

  2. Select the "Products" tab in the left sidebar of the Vultr interface.

  3. Click the name of the server you created that's running the EmptyEpsilon server.

    This opens the server overview page and adds new tabs above it.

  4. Select the "Snapshots" tab.

  5. Enter a label to help you identify the snapshot later.

  6. Select "Take Snapshot".

When the snapshot is complete, you can destroy the running server, which stops billing.

To run the server again, follow the instructions to create a new server until you reach the step to select a server image. Then:

  1. Select the "Snapshot" tab under "Server Image".
  2. Select the snapshot you created.
  3. Select "Deploy Now".

When the server deploys the snapshot, it'll contain everything you had previously installed at the time of the snapshot, with the same user accounts and passwords to log in, same SSH keys (if added), and same stored settings and files, just how you left it.

Hetzner

This section last updated 13 Feburary 2026.

Hetzner is a VPS provider based in Germany, with servers available in several parts of the world.

Create a server using the Hetzner Console

  1. Create a Hetzner account.

  2. In the Hetzner Console, create a new project if none exists, or use the Default project.

  3. Click the +^ button at bottom right, then click Servers to create a new server.

  4. For Type, select either Cost-Optimized (cheaper) or Regular Performance. If your players aren't based in Europe, select Regular Performance, which is available in more regions.

  5. For Cost-Optimized Architecture, select x86.

  6. Select a server with 1-2 VCPU, at least 1-2GB of RAM, and at least 10GB of storage. Every Hetzner Cloud server, regardless of performance or region selection, should meet these requirements. For example, a €2.99/mo CX23 server (2 VCPU, 4GB RAM) is sufficient even for large player counts or multiple player ships.

  7. For Location, select the region closest to most of your players. If no cost-optimized server is available in that region, return to step 4 and select a shared regular performance server.

  8. For Image, select Debian 13. (If a newer version is available, select that and consider updating this wiki page.)

  9. For Networking, optionally select Public IPv4 for easy addressing. You can save a small amount of money by selecting only Public IPv6, but the address will be more complex and difficult to enter.

  10. For SSH Keys, optionally Add SSH key or select an SSH key you previously added to avoid being emailed the server's root account credentials.

    If you don't have an SSH key, see Generating a new SSH key. If you're on Windows and don't have an SSH client installed, install one, such as PuTTY.

  11. Ignore the Volumes and Firewalls sections.

  12. Do not enable Backups, which will add to the cost but not provide any benefits.

  13. Ignore the Placement Groups and Labels sections.

  14. For Cloud Config, change the following cloud-init configuration to use your name, ssh_authorized_keys, and AllowUsers values, then paste it into the text field: TODO: Update for fork

    users:
      - name: <YOUR USERNAME>
        groups: users, admin
        sudo: ALL=(ALL) NOPASSWD:ALL
        shell: /bin/bash
        ssh_authorized_keys:
          - <YOUR SSH PUBLIC KEY>
    packages:
      - fail2ban
      - ufw
      - wget
    package_update: true
    package_upgrade: true
    write_files:
      - path: /etc/ssh/sshd_config.d/ssh-hardening.conf
        content: |
          PermitRootLogin no
          PasswordAuthentication no
          Port 2222
          KbdInteractiveAuthentication no
          ChallengeResponseAuthentication no
          MaxAuthTries 2
          AllowTcpForwarding no
          X11Forwarding no
          AllowAgentForwarding no
          AuthorizedKeysFile .ssh/authorized_keys
          AllowUsers <YOUR USERNAME>
    runcmd:
      - printf "[sshd]\nenabled = true\nport = ssh, 2222\nbanaction = iptables-multiport" > /etc/fail2ban/jail.local
      - systemctl enable fail2ban
      - ufw allow 2222
      - ufw allow 35666
      - ufw enable
      - wget https://github.com/daid/EmptyEpsilon/releases/download/EE-2024.12.08/Linux_EmptyEpsilon_EE-2024.12.08.deb
      - apt -y install ./Linux_EmptyEpsilon_EE-2024.12.08.deb
      - reboot

    This downloads and installs the 2024.12.08 Debian installation package from EmptyEpsilon's releases, implements some security measures for remote access, and opens ports for remote access (2222) and EmptyEpsilon (35666) in the server's firewall.

    To download and install a different version, change the values in the wget and apt -y install lines near the end of the cloud-init configuration.

  15. In the Name section, optionally set a descriptive server name.

  16. Click Create & Buy now.

  17. Wait several minutes for the server to be provisioned and set up.

  18. From the Hetzner Console's Dashboard, click Servers.

  19. Click the server you created.

  20. Click the IP address at top left to copy it.

  21. Use your SSH client to connect to the server at that IP address, with the username and port (2222 in this example) you provided in the server's cloud-init.

    For example, from macOS or Linux, run:

    ssh -p 2222 my_username@40.50.60.70

    where 2222 is the SSH port, my_username is the username, and 40.50.60.70 is the server's IP address.

You should be connected to the server via the command line.

Create a server using the hcloud CLI

  1. Install and setup the hcloud CLI.

  2. Change the cloud-init configuration in the previous section to use your name, ssh_authorized_keys, and AllowUsers values, then save it to a file. For this example, the file is ~/ee-cloud-init.yaml.

  3. Run:

    hcloud server create \
        --image debian-13 \
        --name <YOUR SERVER NAME> \
        --type cx23 \
        --ssh-key <YOUR SSH PUBLIC KEY> \
        --user-data-from-file ~/ee-cloud-init.yaml

    Replace:

    • <YOUR SERVER NAME> is a descriptive server name
    • <YOUR SSH PUBLIC KEY> with your public key
  4. Note the IP address reported by hcloud. This is your server's IP address.

  5. Wait several minutes for the server to be provisioned and set up.

  6. Use your SSH client to connect to the server at that IP address, with the username and port (2222 in this example) you provided in the server's cloud-init.

    For example, from macOS or Linux, run:

    ssh -p 2222 my_username@40.50.60.70

    where 2222 is the SSH port, my_username is the username, and 40.50.60.70 is the server's IP address.

You should be connected to the server via the command line.

Run a headless EmptyEpsilon scenario

After connecting to the Hetzner server with your SSH client, run:

EmptyEpsilon headless=scenario_00_basic.lua

where scenario_00_basic.lua is one of the scenario scripts in EmptyEpsilon's scripts directory. This launches EmptyEpsilon directly into the scenario as a Headless server.

Players can connect to the Hetzner server's IP address to play, and you don't need to forward ports on your network.

Serve as a reverse proxy to a local server

When using a reverse proxy, players can connect to the Hetzner server's IP address to play, and you don't need to forward ports on your network. You can also control the scenario via the GM screen on your local system.

  1. On the Hetzner server, launch EmptyEpsilon as a reverse proxy server:

    EmptyEpsilon proxy=listen
  2. On your local computer, run the same version of EmptyEpsilon that you installed on the server with the serverproxy Preferences file setting set to the server's IP address.

    For example, using our example server IP from before, either add or set serverproxy=40.50.60.70 in your EmptyEpsilon options.ini file or run:

    EmptyEpsilon serverproxy=40.50.60.70

    If your local EmptyEpsilon is installed on Linux via flatpak, launch it with that option from the command line:

    flatpak run --branch=stable --arch=x86_64 --command=EmptyEpsilon-wrapper io.github.daid.EmptyEpsilon serverproxy=40.50.60.70
  3. Click Start server.

  4. Confirm that the reverse proxy is set in the Server was configured to connect to reverse proxy panel under the Server info section.

  5. Click Start server to connect your server to the remote proxy.

  6. Select and configure your scenario.

Clone this wiki locally