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/kvmavailable (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.timekeepersis 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 /certificateendpoint serves the provider's current certificate.
Setup
1. Install QEMU
sudo apt-get update
sudo apt-get install -y qemu-system-x86 qemu-utils2. 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/localVerify: 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 xe4. 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-nodeVerify: xe-node -version.
5. Create data directory
sudo mkdir -p /var/lib/xe-node
sudo chown xe:xe /var/lib/xe-node6. 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.targetReplace 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
[!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.
7. Open firewall ports
sudo ufw allow 9000/tcp # libp2p p2p
sudo ufw allow 8080/tcp # HTTP API8. Start the node
sudo systemctl daemon-reload
sudo systemctl enable xe-node
sudo systemctl start xe-nodeCheck status:
sudo systemctl status xe-node
sudo journalctl -u xe-node -fOn first start the node will:
- Generate a libp2p host key and node account key
- Connect to bootstrap peers and sync the ledger
- Download the Ubuntu 24.04 cloud image (~600 MB) for VM provisioning
- 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/12D3KooWDBc6s7pPW8jhix5LsG9wRgzuGN1Ur8zcbE2T94aJSnsDNode
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/providersThe 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-nodeThe 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
- Configuration — all node flags and data directory layout
- VM Management — Lima VM lifecycle
- SSH Gateway & Tunnel — consumer SSH access to VMs