Skip to content

Provider 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

KVM is mandatory

Provider mode runs Lima/QEMU VMs with KVM acceleration. Without /dev/kvm, VM provisioning will fail. Standard cloud VPS instances typically do not expose KVM — use bare metal or a provider that supports nested virtualisation.

Timekeepers required

Provider nodes refuse to start if sys.timekeepers is not configured in the state chain. Timekeeper attestations are mandatory for lease acceptance and settlement. See Attestations.

Performance certificate

On startup, the provider generates a performance certificate by running a ~60 second benchmark with attested timestamps. This certificate is required for accepting leases and is broadcast to all nodes via gossip. The GET /certificate endpoint serves the provider's current certificate.

Setup

1. Install QEMU

sudo apt-get update
sudo apt-get install -y qemu-system-x86 qemu-utils

2. Install Lima

Lima manages VM lifecycle on top of QEMU.

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.

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

4. Install the xe-node binary

Copy the binary from CI artifacts or another node:

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

Verify: xe-node -version.

5. Create data directory

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

6. Create systemd service

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

[Unit]
Description=XE Provider Node
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=xe
Group=xe
ExecStart=/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-failure
RestartSec=5
StandardInput=null
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Replace the placeholders:

Placeholder Description Example
<VCPUS> vCPUs to advertise for leasing 4
<MEMORY_MB> Memory in MB to advertise 8192
<DISK_GB> Disk in GB to advertise 50
<BOOTSTRAP_PEERS> Comma-separated multiaddrs of existing nodes See Bootstrap peers

Resource sizing

Don't advertise your machine's full resources. The node itself uses some CPU/memory, and the system needs headroom for the OS, Lima overhead, and benchmark re-evaluation (1 GB reserved). As a rule of thumb, advertise 60-70% of your physical resources.

7. Open firewall ports

sudo ufw allow 9000/tcp   # libp2p p2p
sudo ufw allow 8080/tcp   # HTTP API

8. Start the node

sudo systemctl daemon-reload
sudo systemctl enable xe-node
sudo systemctl start xe-node

Check status:

sudo systemctl status xe-node
sudo 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:

/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
Node Location IP
ldn London 45.77.226.208
ffm Frankfurt 192.248.176.245
nyc New York 144.202.4.117

Verification

After starting, verify the node is healthy:

# Check the node is running
sudo systemctl status xe-node

# Check it synced with the network
curl -s http://localhost:8080/frontiers

# Check the node's identity
curl -s http://localhost:8080/node

# Check provider advertisement is visible from another node
curl -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:

sudo cp xe-node-new /usr/local/bin/xe-node
sudo chmod +x /usr/local/bin/xe-node
sudo 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

Host IP vCPUs Memory Disk Peer ID
bm1 (Frankfurt) 189.1.171.51 4 8 GB 50 GB 12D3KooWKk9w...jKnHpc
bm2 (London) 67.213.117.123 8 16 GB 100 GB 12D3KooWKSTg...Q8GzCF

Differences from full-stack deployment

Concern Full stack Provider only
Process manager pm2 systemd
Reverse proxy Caddy (TLS, static files) None
Web interfaces Explorer, wallet, docs None
TLS Automatic via Caddy/LE None (API is HTTP only)
Domains Required (Caddy needs them) Not required
Setup script setup-node.sh Manual (this guide)

See also