Veloren Server on Ubuntu 24.04 on Azure User Guide
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.servicesystemd unit that starts the server on boot, running as an unprivilegedvelorenuser - A unique world generated on first boot from a per-VM random seed (no shared or pre-baked world)
- The game port
14004/tcpopen 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/tcpfrom your management network (SSH administration)14004/tcpfrom 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 }]

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",

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

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.

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/tcpshould 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.