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/kvmavailable (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¶
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.
4. Install the xe-node binary¶
Copy the binary from CI artifacts or another node:
Verify: xe-node -version.
5. Create data directory¶
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¶
8. Start the node¶
Check status:
On 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 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¶
- Configuration — all node flags and data directory layout
- VM Management — Lima VM lifecycle
- SSH Gateway & Tunnel — consumer SSH access to VMs