Provider Node Setup

Provider Node Setup

How to set up a bare-metal machine as an XE compute provider. This is a provider-only deployment — no web interfaces, no Caddy, no static sites. The node joins the network and advertises compute resources for leasing.

#Requirements

  • Bare metal server (or VPS with nested virtualisation / KVM passthrough)
  • Ubuntu 24.04 LTS x86_64
  • /dev/kvm available (hardware virtualisation extensions)
  • Ports 9000 (p2p) and 8080 (API) open in firewall
  • SSH access as a user with sudo

#Setup

#1. Install QEMU

shell
sudo apt-get updatesudo apt-get install -y qemu-system-x86 qemu-utils

#2. Install Lima

Lima manages VM lifecycle on top of QEMU.

shell
LIMA_VERSION="1.0.6"curl -fsSL "https://github.com/lima-vm/lima/releases/download/v${LIMA_VERSION}/lima-${LIMA_VERSION}-Linux-x86_64.tar.gz" | \    sudo tar xz -C /usr/local

Verify: limactl --version should print limactl version 1.0.6.

#3. Create service user

The node runs as a dedicated xe user with KVM access. Lima refuses to run as root.

text
sudo groupadd -r xesudo useradd -r -g xe -s /usr/sbin/nologin xesudo usermod -aG kvm xe

#4. Install the xe-node binary

Copy the binary from CI artifacts or another node:

shell
sudo cp xe-node /usr/local/bin/xe-nodesudo chmod +x /usr/local/bin/xe-node

Verify: xe-node -version.

#5. Create data directory

shell
sudo mkdir -p /var/lib/xe-nodesudo chown xe:xe /var/lib/xe-node

#6. Create systemd service

Create /etc/systemd/system/xe-node.service:

text
[Unit]Description=XE Provider NodeAfter=network-online.targetWants=network-online.target[Service]Type=simpleUser=xeGroup=xeExecStart=/usr/local/bin/xe-node \  -port 9000 \  -api-port 8080 \  -api-bind 0.0.0.0 \  -data /var/lib/xe-node \  -provide \  -vcpus <VCPUS> \  -memory <MEMORY_MB> \  -disk <DISK_GB> \  -dial <BOOTSTRAP_PEERS>Restart=on-failureRestartSec=5StandardInput=nullStandardOutput=journalStandardError=journal[Install]WantedBy=multi-user.target

Replace the placeholders:

PlaceholderDescriptionExample
<VCPUS>vCPUs to advertise for leasing4
<MEMORY_MB>Memory in MB to advertise8192
<DISK_GB>Disk in GB to advertise50
<BOOTSTRAP_PEERS>Comma-separated multiaddrs of existing nodesSee Bootstrap peers

#7. Open firewall ports

usage
sudo ufw allow 9000/tcp   # libp2p p2psudo ufw allow 8080/tcp   # HTTP API

#8. Start the node

shell
sudo systemctl daemon-reloadsudo systemctl enable xe-nodesudo systemctl start xe-node

Check status:

shell
sudo systemctl status xe-nodesudo journalctl -u xe-node -f

On first start the node will:

  1. Generate a libp2p host key and node account key
  2. Connect to bootstrap peers and sync the ledger
  3. Download the Ubuntu 24.04 cloud image (~600 MB) for VM provisioning
  4. Register in the network directory and begin advertising resources

#Bootstrap peers

Current test network bootstrap nodes:

text
/ip4/45.77.226.208/tcp/9000/p2p/12D3KooWSm1c8hj3EfnBFNXSW8ELcFN2fxqigDn5FTeQwSVoa4LC,/ip4/192.248.176.245/tcp/9000/p2p/12D3KooWJgnFGZZ5y8zKJ64yV9hT8WqctCnWXvbzcNiowoRzEr9w,/ip4/144.202.4.117/tcp/9000/p2p/12D3KooWDBc6s7pPW8jhix5LsG9wRgzuGN1Ur8zcbE2T94aJSnsD
NodeLocationIP
ldnLondon45.77.226.208
ffmFrankfurt192.248.176.245
nycNew York144.202.4.117

#Verification

After starting, verify the node is healthy:

shell
# Check the node is runningsudo systemctl status xe-node # Check it synced with the networkcurl -s http://localhost:8080/frontiers # Check the node's identitycurl -s http://localhost:8080/node # Check provider advertisement is visible from another nodecurl -s https://ldn.core.test.network/providers

The node's account address is printed in the logs on first start (Address: <hex>). This address needs XUSD to stake against leases — without XUSD the node will skip incoming lease requests.

#Updating

To update the binary:

shell
sudo cp xe-node-new /usr/local/bin/xe-nodesudo chmod +x /usr/local/bin/xe-nodesudo systemctl restart xe-node

The data directory is preserved across restarts. The node identity (peer ID and account address) persists via host.key and node.key.

#Current providers

HostIPvCPUsMemoryDiskPeer ID
bm1 (Frankfurt)189.1.171.5148 GB50 GB12D3KooWKk9w...jKnHpc
bm2 (London)67.213.117.123816 GB100 GB12D3KooWKSTg...Q8GzCF

#Differences from full-stack deployment

ConcernFull stackProvider only
Process managerpm2systemd
Reverse proxyCaddy (TLS, static files)None
Web interfacesExplorer, wallet, docsNone
TLSAutomatic via Caddy/LENone (API is HTTP only)
DomainsRequired (Caddy needs them)Not required
Setup scriptsetup-node.shManual (this guide)

#See also