Gaming Azure

Veloren Server on Ubuntu 24.04 on Azure User Guide

| Product: Veloren Server on Ubuntu 24.04 LTS on Azure

Overview

Veloren is an open-source multiplayer voxel RPG. This cloudimg image runs the headless dedicated server (veloren-server-cli) — the program that hosts the game world that players join from the separate Veloren client. It is not the graphical game client and it has no web interface; you administer it from the command line, and players connect over the game port.

The image installs the stock upstream Veloren v0.18.0 server and game assets, extracted unmodified from the official pinned container image (registry.gitlab.com/veloren/veloren/server-cli:v0.18.0, GPL-3.0). Every cloudimg customisation is external configuration only. On first boot the VM generates its own unique world from a per-VM random seed, generates per-VM web-interface secrets, and starts the server automatically. Backed by 24/7 cloudimg support.

What is included:

  • Veloren v0.18.0 dedicated server (veloren-server-cli) plus the full game assets
  • A veloren.service systemd unit that starts the server on boot, running as an unprivileged veloren user
  • A unique world generated on first boot from a per-VM random seed (no shared or pre-baked world)
  • The game port 14004/tcp open for players; the web/metrics interface bound to loopback only
  • Player and world state persisted on a dedicated Azure data disk mounted at /opt/veloren/userdata
  • 24/7 cloudimg support

Players authenticate against the official Veloren authentication server (auth.veloren.net), so anyone with a Veloren account can join unless you enable the whitelist. There is no web login — you make yourself a server admin with a single command.

Prerequisites

An active Azure subscription, an SSH key pair, and a VNet + subnet in the target region. Standard_B2ms (2 vCPU / 8 GiB RAM) is the recommended size for a live world with players; the server itself idles at well under 1 GiB. NSG inbound rules:

  • 22/tcp from your management network (SSH administration)
  • 14004/tcp from your players (the Veloren game port)

The web/metrics interface does not need an inbound rule — it is reachable only over an SSH tunnel.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Veloren Server by cloudimg, and select Create. On Basics pick your subscription, resource group, region and size (Standard_B2ms recommended); under Administrator account choose SSH public key and paste your key; under Inbound port rules allow SSH (22). After deployment, add an inbound rule for 14004/tcp so players can connect.

Step 2 - Deploy from the Azure CLI

az vm create \
  --resource-group <your-rg> \
  --name veloren \
  --image <marketplace-image-urn> \
  --size Standard_B2ms \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --vnet-name <your-vnet> --subnet <your-subnet> \
  --public-ip-sku Standard

# open the Veloren game port to your players
az vm open-port --resource-group <your-rg> --name veloren --port 14004 --priority 1010

Step 3 - Connect to your VM

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the server is running and ready

The server starts automatically on first boot. Generating the world takes roughly half a minute; once it is done the log prints "Server is ready to accept connections".

/opt/veloren/veloren-server-cli --version 2>/dev/null || systemctl show -p Description --value veloren
systemctl is-active veloren
journalctl -u veloren --no-pager | grep -m1 "ready to accept connections"

You should see the service active and the ready line for game port 14004:

active
INFO veloren_server_cli: Server is ready to accept connections. web_port=14005 gameserver_addresses=[Tcp { address: [::]:14004 }, Tcp { address: 0.0.0.0:14004 }]

Veloren server active and ready to accept connections

Step 5 - Review the network posture

Only the game port is public. Confirm the listeners: 14004 is bound on all interfaces for players, the web/metrics interface is bound to loopback (127.0.0.1:14005) only, and the public server-list query responder (14006) is disabled.

ss -tlnp | grep -E ':1400[0-9] '
grep -E 'query_address|max_players|server_name' /opt/veloren/userdata/server/server_config/settings.ron
LISTEN 0 4096  127.0.0.1:14005  0.0.0.0:*
LISTEN 0 1024    0.0.0.0:14004  0.0.0.0:*
LISTEN 0 1024       [::]:14004     [::]:*
    query_address: None,
    max_players: 40,
    server_name: "cloudimg Veloren Server",

Veloren network posture: game port public, web interface loopback only

Step 6 - Connect players and become an admin

Players open the Veloren client, go to the server list, choose Add server, and enter your VM's public IP and the game port:

<vm-public-ip>:14004

There is no web admin panel. To give your own Veloren account admin powers, stop the server, add yourself with the admin add subcommand, and start it again (replace <YourVelorenUsername> with your own account name):

sudo systemctl stop veloren
sudo -u veloren env VELOREN_ASSETS=/opt/veloren/assets \
  /opt/veloren/veloren-server-cli admin add <YourVelorenUsername> admin
sudo systemctl start veloren

The command resolves your username against the Veloren auth server and writes it to admins.ron. In-game you then have admin commands such as /build, /tp, /kick, /ban and /whitelist. The full connection details, including how to become admin, are saved on the VM at /root/veloren-connection.txt:

sudo cat /root/veloren-connection.txt

Veloren server address and admin-add command

Step 7 - Reach the web / metrics interface (loopback only)

Veloren's web interface (Prometheus metrics and the /ui_api) is bound to 127.0.0.1:14005 and is not exposed to the internet. Reach it from your workstation over an SSH tunnel:

ssh -L 14005:127.0.0.1:14005 azureuser@<vm-public-ip>

Then query the metrics endpoint (shown here run locally on the VM, where it is served on loopback):

curl -s --max-time 5 http://127.0.0.1:14005/metrics | sed -n '1,8p'

Each VM generates its own ui_api_secret and web_chat_secret on first boot (stored in /root/veloren-connection.txt), so no two deployments share a secret and nothing is baked into the image.

Veloren metrics over an SSH tunnel

Step 8 - World and player persistence

The world and player state live on a dedicated Azure data disk mounted at /opt/veloren/userdata (server/saves/db.sqlite plus the server configuration). The disk is captured into the image and re-provisioned on every VM, and can be resized independently as your world grows.

findmnt /opt/veloren/userdata
du -sh /opt/veloren/userdata

The base terrain is regenerated deterministically from the per-VM seed on each restart, while player-built structures and character data persist in the database. To change world size, player cap, day length or other options, edit /opt/veloren/userdata/server/server_config/settings.ron and restart veloren.

Notes

  • Licensing: Veloren is GPL-3.0. The cloudimg image ships the stock upstream server unmodified; corresponding source is at gitlab.com/veloren/veloren (tag v0.18.0).
  • Security: only 14004/tcp should be open to players. Keep the web/metrics interface loopback-only and reach it over SSH. Enable the whitelist (/whitelist add <username> in-game, after adding yourself as admin) to run a private server.
  • Support: every cloudimg image includes 24/7 support.