Thanks for coming back with numbers, that’s a clean result. Going from 0.41/h to 0.12/h on failed checks is a big drop.
Since one of the three nodes simply died, it might be worth automating the swap next time: a small script that calls get_info on each wallet’s node every few minutes, checks that height is within a block or two of the others, and moves the wallet to the next node on a short list if it falls behind or stops answering. monero.fail’s list works as a source for that fallback list, as long as you only keep onion nodes with a long uptime.
Good luck with the shop.
Good write-up, and the two-way links are a nice touch. Two small additions for the clearnet page:
<meta http-equiv="onion-location" content="http://your-onion-address.onion/">to its head. Tor Browser then shows a “.onion available” button to visitors who arrive on the clearnet page, and since it’s a meta tag it works on a static host where you can’t set headers.For the frozen wallet, a cheap watchdog is a cron job or systemd timer that calls
get_heighton each monero-wallet-rpc with a short timeout and restarts that unit if it fails twice in a row. Running each wallet RPC as its own systemd service withRestart=on-failurealso covers the case where it crashes outright.