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 (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-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 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]
nodeis a subcommand, not a defaultxe-nodedispatches on its first argument.ExecStartmust name thenodesubcommand before any flags, or the process exits immediately withunknown command: -port.
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 |
[!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 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
[!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 fromGET /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| 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/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
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.
| Host | IP | Process |
|---|---|---|
| bm1 | 189.1.171.51 | systemd xe-node |
| bm2 | 67.213.117.123 | systemd xe-node |
Differences from a bootstrap deployment
| Concern | Bootstrap node | Provider only |
|---|---|---|
| Process manager | pm2 | systemd |
| Reverse proxy | Caddy (TLS) | None |
| Web UI | -ui enabled behind Caddy | Not served |
| TLS | Automatic via Caddy/Let's Encrypt | None (API is HTTP only) |
| Domains | Required (Caddy needs them) | Not required |
| Setup | Host setup script | 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