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
#Setup
#1. Install QEMU
sudo apt-get updatesudo 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/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 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:
sudo cp xe-node /usr/local/bin/xe-nodesudo chmod +x /usr/local/bin/xe-nodeVerify: xe-node -version.
#5. Create data directory
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:
[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.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 |
#7. Open firewall ports
sudo ufw allow 9000/tcp # libp2p p2psudo ufw allow 8080/tcp # HTTP API#8. Start the node
sudo systemctl daemon-reloadsudo systemctl enable xe-nodesudo systemctl start xe-nodeCheck status:
sudo systemctl status xe-nodesudo 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/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 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/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-nodesudo chmod +x /usr/local/bin/xe-nodesudo 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