Deployment guide

Veloren server

Overview

Veloren is an open-source multiplayer voxel RPG. This SecureAnyCloud 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 SecureAnyCloud 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.

What you get:

  • 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, with no shared or pre-baked world
  • The game port 14004/tcp open for players, and the web and metrics interface bound to loopback only
  • Player and world state persisted on a dedicated Azure data disk mounted at /opt/veloren/userdata
  • 24/7 SecureAnyCloud 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

You need an active Azure subscription, an SSH key pair, and a VNet with a 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.

Configure these NSG inbound rules:

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

The web and metrics interface does not need an inbound rule. You reach it 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 SecureAnyCloud, and select Create.

On the Basics tab, 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 that players can connect.

Step 2 - Deploy from the Azure CLI

Accept the Marketplace terms, create the VM, then open the game port to your players:

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:veloren:default:latest
az vm create \
  --resource-group <your-rg> \
  --name veloren \
  --image sac1647283583153:veloren:default:latest \
  --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

Connect to the VM over SSH:

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. When it finishes, 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"

The output shows the service as active and prints 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 with the commands below. Port 14004 is bound on all interfaces for players, the web and 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: "sac 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 the server 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 the game you then have admin commands such as /build, /tp, /kick, /ban and /whitelist.

The VM saves the full connection details, including how to become admin, at /root/veloren-connection.txt:

sudo cat /root/veloren-connection.txt

Step 7 - Reach the web and 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. The command below runs locally on the VM, where the endpoint 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 and stores them in /root/veloren-connection.txt. 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. You can resize it independently as your world grows.

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

The server regenerates the base terrain 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 SecureAnyCloud image ships the stock upstream server unmodified. The corresponding source is at gitlab.com/veloren/veloren (tag v0.18.0).
  • Security: open only 14004/tcp to players. Keep the web and metrics interface loopback-only and reach it over SSH. To run a private server, enable the whitelist with /whitelist add <username> in the game, after you add yourself as admin.
  • Support: every SecureAnyCloud image includes 24/7 support.

Deploy on Azure

Launch Veloren Server on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure