I Built a Health Check Script for Evernode Validators — 61 Checks in One Command
Evernode Node Doctor is a bash script that validates everything needed to run an Evernode node on the Xahau blockchain — system requirements, Docker, networking, SSL, port scanning, account balances, and Xahau WSS connectivity. 750 lines, 15 phases, zero dependencies beyond standard Linux tools.
I run a couple of Evernode validator nodes. For anyone unfamiliar, Evernode is a decentralised hosting platform built on the Xahau blockchain (an XRPL sidechain). Running a node means keeping Docker containers healthy, ports open, SSL certificates valid, Xahau WebSocket connections alive, and XRPL accounts funded — all at once.
The problem is that when something goes wrong, the failure mode is usually silent. Your node just stops earning reputation, and you don’t notice until you check the dashboard days later. Debugging means SSH’ing in and manually checking a dozen different things: is Docker running? Are the sashimono containers up? Is port 22861 reachable from outside? Is the Xahau node in full state? Does the host account have enough EVR?
So I wrote a script that checks all of it in one go.
What It Does
Evernode Node Doctor is a ~750-line bash script that runs 61 individual checks across 15 validation phases. You run it, it tells you what’s healthy and what’s broken, colour-coded and with a summary at the end.
curl -sO https://raw.githubusercontent.com/Joshwaamein/evernode-node-doctor/main/evernode_health_check.sh
chmod +x evernode_health_check.sh
sudo ./evernode_health_check.sh
The 15 phases:
- System Requirements — CPU cores, RAM, free disk space
- System Uptime — uptime and load average
- Docker Infrastructure — Docker service status, container health, sashimono containers
- Evernode Installation — evernode CLI version, sashimono config
- Network Latency — ping to 8.8.8.8, 1.1.1.1, google.com
- SSH Security — root login, password auth, SSH port
- SSL Certificates — certificate validity, expiry, reverse proxy detection
- DNS Resolution — forward and reverse DNS for the node’s domain
- Firewall Rules — UFW status, required ports open
- Port Scanning — nmap external port scan, port usage analysis
- Port Purpose Documentation — explains what each port range is for
- Xahau WSS Connection — WebSocket connectivity to the Xahau blockchain
- Xahau Node State — verifies the node is in
fullstate (not justconnected) - XRPL Account Balances — host account XAH balance, EVR trust line, reputation account
- Log Analysis — recent error patterns in Evernode logs
The Three-Tier Xahau Validation
This was the trickiest part to get right. The script needs to verify that your node has a healthy connection to the Xahau blockchain, but there are multiple ways to check and each has different failure modes.
The v2.6 update implements a three-tier approach:
-
WebSocket (websocat) — direct WSS connection to the Xahau endpoint, sends a
server_inforequest and parses the response. This is the most reliable check but requireswebsocatto be installed. -
API v1 (HTTPS) — falls back to an HTTPS request with
api_version: 1for enhanced validation. Checks that the node state is specificallyfull(notvalidatingorproposing, which indicate the node is still syncing). -
Standard API (HTTPS) — final fallback using the standard Xahau API endpoint.
Each tier validates the node state and gracefully degrades to the next method if the current one fails. No hard dependencies — if websocat isn’t installed, it just moves to HTTPS.
Cron Mode
Running the script interactively is fine for debugging, but I wanted it to run automatically and alert me when something breaks. The --cron flag makes it fully non-interactive:
# Run every 6 hours, log output, email on failure
0 */6 * * * /root/evernode_health_check.sh --cron >> /var/log/evernode-doctor.log 2>&1
In cron mode, the script auto-detects everything it needs:
- Domain — parsed from
/etc/sashimono/mb-xrpl/mb-xrpl.cfg - Instance count — counted from running sashimono Docker containers
- Host account — extracted from the sashimono JSON config
- Reputation account — extracted from the sashimono JSON config
No prompts, no user input. It also supports --no-color for clean log output, --skip-accounts to skip balance checks, and --skip-logs to skip log analysis.
Port Usage Analysis
One thing that caught real issues on my own nodes was the port usage analysis. It’s not enough to check that a port is open in UFW — you need to verify something is actually listening on it. A port that’s open in the firewall but has nothing behind it is a security risk with no benefit.
The script cross-references UFW rules with netstat output and flags any mismatches:
⚠ WARNING: Port 22861 is open in firewall but nothing is listening
It also documents what each port range is for, which is useful because Evernode uses several non-standard ranges:
| Port Range | Purpose |
|---|---|
| 80, 443 | HTTP/HTTPS for SSL and API |
| 22861-22870 | Evernode peer communication |
| 26201-26210 | Sashimono instance ports |
| 36525-36540 | HotPocket consensus |
| 39064-39080 | User port mappings |
Account Balance Checks
The script queries the Xahau network to check:
- XAH balance on the host account (the native token needed for transaction fees)
- EVR trust line — verifies the trust line exists and shows the balance (EVR is the Evernode reward token)
- Reputation account — checks it exists and has sufficient XAH
This catches the annoying scenario where your node is running perfectly but you’ve run out of XAH for transaction fees, so it silently stops participating in consensus.
The Summary Report
At the end, you get a colour-coded summary:
═══════════════════════════════════════
HEALTH CHECK SUMMARY
═══════════════════════════════════════
✅ Successes: 52
⚠️ Warnings: 6
❌ Errors: 3
═══════════════════════════════════════
Errors are things that will prevent your node from working. Warnings are things that should be fixed but aren’t immediately critical. And the individual check output above tells you exactly what each issue is and how to fix it.
Why Bash?
I considered Python, but bash was the right choice here:
- Zero dependencies — every tool used (
curl,nmap,openssl,jq,ufw) is either already installed or can be installed viaapt - Runs anywhere — Evernode nodes run on Ubuntu, and bash is guaranteed to be there
- Root access — the script needs to read Docker state, UFW rules, and system configs. Bash makes this natural
- Single file —
curl | bashdeployment. No virtualenvs, no pip, no package managers
The tradeoff is that bash gets messy at 750+ lines. But for a diagnostic tool that just needs to check things and print results, it’s the right fit.
What It Found on My Nodes
When I first ran this against my own nodes, it caught:
- A node where the Xahau state had dropped from
fulltoconnectedafter a network hiccup (it wasn’t earning reputation) - Port 22861 open in UFW but the Evernode service had crashed, so nothing was listening
- An expired SSL certificate on one node (the auto-renewal cron had silently failed)
- Low XAH balance on a reputation account
All things I would have eventually noticed from the Evernode dashboard, but probably not for days.
The script is open source at Joshwaamein/evernode-node-doctor. It’s read-only — it doesn’t modify any configs or restart any services. Safe to run on production nodes.