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

[!WARNING] 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.

[!DANGER] 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.

[!INFO] 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 (the version is a subcommand, not a flag).

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

[!IMPORTANT] node is a subcommand, not a default xe-node dispatches on its first argument. ExecStart must name the node subcommand before any flags, or the process exits immediately with unknown command: -port.

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

[!TIP] 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.

[!NOTE] Optional auto-accept policy A provider can also filter which leases it accepts automatically with -min-lease-duration, -max-lease-duration, -min-lease-cost, -max-lease-cost, and -max-concurrent-leases. All are unset by default, which is fully permissive. See Configuration.

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

[!WARNING] Testnet values, and they change on every wipe The multiaddrs below are the test network bootstrap nodes. Peer IDs are derived from each node's host.key, so a full data wipe regenerates them. Always read the live value from GET /node (.id) rather than copying a stale list.

/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:

# 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

The test network's two baseline providers. Advertised capacity and peer IDs are whatever the hosts are configured with at the time — query GET /providers on any node for live values.

HostIPProcess
bm1189.1.171.51systemd xe-node
bm267.213.117.123systemd xe-node

Differences from a bootstrap deployment

ConcernBootstrap nodeProvider only
Process managerpm2systemd
Reverse proxyCaddy (TLS)None
Web UI-ui enabled behind CaddyNot served
TLSAutomatic via Caddy/Let's EncryptNone (API is HTTP only)
DomainsRequired (Caddy needs them)Not required
SetupHost setup scriptManual (this guide)

See also