Node: Monero
Tip jar 🫙 expatriotic@walletofsatoshi.com
Donations
Bitcoin paynym = +expatriotic
Monero QR

88D6SZFBA6fFhYGdnY4c57dTAJD6jyqRTfCKwHjZrfdnhd8phAMYnDQWSJrqyAmgVHV7mDU6soaHogZvno1AUXp79DwtWvK
Monero Node on Bare-Metal Ubuntu (without Docker)
This guide will walk you through setting up a Monero node (monerod) directly on your Ubuntu server, assuming you're brand new to the command line. No Docker, just pure Ubuntu and Monero.
Why Run Your Own Node?
- Privacy: When you use a remote node (the default in many wallets), that node operator can potentially see your IP address and link it to your transaction activity. Running your own node means your wallet only talks to your server on your hardware.
- Network Strength: Full nodes are the backbone of the Monero network. They validate transactions and blocks, ensuring the rules are followed. Running one makes the network more decentralized and resilient.
- Control: You are your own source of truth for the Monero blockchain.
What We'll Do:
We'll download the official Monero software, verify it's legitimate, configure it, and set it up to run automatically using systemd (Ubuntu's service manager).
Prerequisites:
- Ubuntu Server: You have Ubuntu Server (ideally 22.04 LTS or newer) installed and running. (If you aren't ready, follow my guide https://expatriotic.me/ubuntu and then come back).
- SSH Access: You know how to connect to your server's command line using SSH from your regular computer. All commands below are typed into that SSH terminal window.
- Basic Terminal Concepts: We'll explain commands as we go, but know that you type commands and press
Enterto run them. Commands are case-sensitive!
Let's begin!
Phase 1: Preparation & Downloading
First, we need to connect to our server via SSH. Once logged in, you'll see a command prompt, likely ending in $. I use Tailscale to manage my SSH, but you don't have to.
1. Navigate to Downloads Directory:
It's good practice to download software into a specific folder. Let's create one called downloads in your home directory (~) and move into it.
# Create the directory if it doesn't exist (-p prevents errors if it's already there)
mkdir -p ~/downloads
# Change directory into downloads
cd ~/downloads
mkdir -p: Makes a directory.-pmeans "make parent directories if needed and don't complain if it exists."cd: Changes directory.~/downloadsmeans thedownloadsfolder inside your home directory. Your prompt might change slightly to show you're now in~/downloads.
2. Set the Monero Version (The Shortcut!)
To make things easier and less prone to typos, we'll store the version number we want in a variable. Check the Monero Downloads page for the latest CLI version. As of late October 2025, it's 0.18.4.3.
MONERO_VERSION=0.18.4.3
(Remember: No spaces around the =! If a new version is out, just change the number here.)
3. Download Monero Software:
Now we use the wget command (a tool for downloading files from the internet) along with our variable to get the Monero software and the file containing official checksums (hashes).
# Download the 64-bit Linux Command Line Tools (CLI)
wget https://downloads.getmonero.org/cli/monero-linux-x64-v${MONERO_VERSION}.tar.bz2
# Download the file containing official hashes (checksums)
wget https://www.getmonero.org/downloads/hashes.txt
You'll see progress bars as the files download.
Phase 2: Verification (Is This Software Legit?)
This is the most important security step. Do not skip it. We need to be sure the software we downloaded hasn't been tampered with. We'll use two methods: GPG signatures and SHA256 hashes.
1. Get the Developer's GPG Key:
GPG is like a digital signature system. We need the public key of a trusted Monero developer to verify the signature on the hashes.txt file. 'binaryFate' is a core developer whose key is commonly used.
# Download binaryFate's public GPG key
wget -O binaryfate.asc https://raw.githubusercontent.com/monero-project/monero/master/utils/gpg_keys/binaryfate.asc
# Import the key into your GPG keychain
gpg --import binaryfate.asc
wget -O: Downloads the file but saves it with a specific name (binaryfate.asc).gpg --import: Adds the downloaded key to your list of known keys. You only need to do this once per key.
2. Verify the hashes.txt File:
Now, use GPG to check if the hashes.txt file we downloaded was actually signed by the key we just imported.
gpg --verify hashes.txt
Look closely at the output! You need to see a line like:
gpg: Good signature from "binaryFate <binaryfate@getmonero.org>" ...
Ignore warnings like "This key is not certified with a trusted signature". The "Good signature" part confirms the file is authentic. If you don't see "Good signature", STOP. Something is wrong.
3. Verify the Downloaded Monero Software:
The hashes.txt file contains a list of unique "fingerprints" (SHA256 hashes) for the official Monero files. Now that we trust hashes.txt (because it had a good signature), we can check if the fingerprint of the file we downloaded matches the fingerprint listed inside hashes.txt.
# Check the SHA256 hash of our download against the list in hashes.txt
sha256sum --check --ignore-missing hashes.txt
sha256sum --check: Tells the tool to read expected hashes from the file (hashes.txt) and compare them to the actual files in the current directory.--ignore-missing:hashes.txtlists many files; this tellssha256sumnot to complain about files we didn't download (like the Windows or Mac versions).
You are looking for one specific line in the output (it must match the version you downloaded):
monero-linux-x64-v${MONERO_VERSION}.tar.bz2: OK
If you see "OK", the file is verified! If you see "FAILED" or any errors, STOP. Do not proceed. Your download might be corrupt or tampered with. Delete it and try downloading again.
Phase 3: Installation
With the software verified, we can install it.
1. Install bzip2:
The downloaded file is compressed using bzip2. We need that tool to extract it.
# Update package list and install bzip2
sudo apt update
sudo apt install -y bzip2
sudo: Runs the command with administrator privileges (needed for installing software). You'll likely be asked for your password.apt update: Refreshes the list of available software packages.apt install -y bzip2: Installs thebzip2package.-yautomatically says "yes" to prompts.
2. Extract the Archive:
Now we use the tar command to unpack the downloaded file.
# Extract the contents of the Monero archive
tar -xjvf monero-linux-x64-v${MONERO_VERSION}.tar.bz2
tar: The archive utility.-xjvf: Options tellingtarto eXtract, use bzip2 (j), be Verbose (show files), using Filemonero...tar.bz2.
This will create a new directory, likely named something like monero-x86_64-linux-gnu-v0.18.4.3.
3. Install the Main Program (monerod):
We only need the main Monero daemon program right now (monerod). We'll move it to a standard location where the system looks for executable programs.
# Find the exact name of the folder tar created
# (ls -d lists directories, */ matches any directory, head -n 1 picks the first)
EXTRACTED_FOLDER=$(ls -d monero-*/ | head -n 1)
# Move the monerod program to /usr/local/bin
sudo mv ${EXTRACTED_FOLDER}monerod /usr/local/bin/
# Optional: Move the wallet CLI too if you want to use it from this server later
sudo mv ${EXTRACTED_FOLDER}monero-wallet-cli /usr/local/bin/
mv: Moves a file. We usesudobecause/usr/local/binis a system directory.
4. Clean Up: Let's remove the files we no longer need.
# Remove the extracted folder
rm -r ${EXTRACTED_FOLDER}
# Optional: Remove the downloaded archive and verification files
rm monero-linux-x64-v${MONERO_VERSION}.tar.bz2 hashes.txt binaryfate.asc
rm -r: Removes a directory and its contents.rm: Removes files.
Phase 4: Configuration
Monero needs a place to store the blockchain data and a configuration file.
1. Create Monero Directory:
By default, Monero uses a hidden directory called .bitmonero in your home directory.
mkdir -p ~/.bitmonero
- The
.at the start makes it a hidden directory (won't show up with a plainls).
2. Create Configuration File:
We use a simple text editor called nano to create the file.
nano ~/.bitmonero/monerod.conf
This opens an empty editor. Paste the following basic configuration using your mouse or keyboard shortcuts (like Shift+Insert or Cmd+V):
# Basic Monero config file in ~/.bitmonero/monerod.conf
# === Network Settings ===
# Don't try to auto-configure router (can be unreliable)
no-igd=1
# Use a public list to block known malicious nodes
enable-dns-blocklist=1
# === Log Settings ===
# Set a log file path and a minimal log level (0)
# IMPORTANT!!! Change satoshis to your user name!
log-file=/home/satoshis/.bitmonero/bitmonero.log
log-level=0
# === RPC Settings (How programs talk to the node) ===
# Enable the read-only "restricted" RPC interface
rpc-restricted-bind-ip=127.0.0.1 # Only allow connections from the server itself (localhost)
rpc-restricted-bind-port=18089 # Standard port for restricted RPC
# === Blockchain Data ===
# Default location is ~/.bitmonero/lmdb
# If you want to put it elsewhere (like your HDD), uncomment and change below:
# data-dir=/mnt/backups/monero-blockchain # Example for HDD
# === Optional: Pruning (Saves disk space, less helpful to network) ===
# If you are low on NVMe space, you can enable pruning.
# The blockchain will take ~95GB instead of ~230GB+.
# prune-blockchain=1
# sync-pruned-blocks=1 # Needed if pruning
3. Save and Exit nano:
- Press
Ctrl+X. - Nano will ask "Save modified buffer?". Press
Yfor Yes. - It will ask "File Name to Write: ...". Press
Enterto confirm.
Phase 5: Running as a Service (systemd)
We want monerod to start automatically when the server boots and restart if it crashes. systemd handles this.
1. Create the Service File:
We need sudo because this file lives in a system directory.
sudo nano /etc/systemd/system/monerod.service
2. Paste the Service Configuration:
Paste the following text into nano. Carefully replace YOUR_USERNAME with your actual Linux username (e.g., satoshis).
[Unit]
Description=Monero Full Node Daemon
After=network-online.target
Wants=network-online.target
[Service]
# IMPORTANT!! Replace "satoshis" with your actual username!
User=satoshis Group=satoshis
Type=forking PIDFile=/home/satoshis/.bitmonero/monerod.pid
# Run monerod using the config file, run in background (--detach), and record its process ID
ExecStart=/usr/local/bin/monerod --config-file /home/satoshis/.bitmonero/monerod.conf --detach --pidfile /home/satoshis/.bitmonero/monerod.pid
Restart=on-failure RestartSec=30
# Add some basic security hardening
PrivateTmp=true ProtectSystem=full NoNewPrivileges=true PrivateDevices=true MemoryDenyWriteExecute=true
[Install]
WantedBy=multi-user.target
3. Save and Exit nano: (Ctrl+X, Y, Enter).
4. Enable and Start the Service:
Tell systemd about the new file and start the Monero node.
# Reload systemd to recognize the new file
sudo systemctl daemon-reload
# Enable the service (start on boot) AND start it now
sudo systemctl enable --now monerod.service
enable: Creates a link so the service starts automatically after rebooting.--now: Also starts the service immediately.
Phase 5.5: (Recommended) Open Firewall for Peers
Your node is running, but your server's firewall (ufw) is likely blocking other Monero nodes from connecting to you. To be a full participant and help strengthen the network, you need to allow incoming connections on the Monero P2P port (18080).
# Allow incoming TCP connections on port 18080
sudo ufw allow 18080/tcp
Note: We are not opening port 18089 (the RPC port). Our monerod.conf file correctly sets this to rpc-restricted-bind-ip=127.0.0.1, meaning it's only accessible from the server itself. This is much more secure.
Phase 6: Monitoring the Sync
Your Monero node is now running in the background! But it needs to download and verify the entire Monero blockchain, which is over 230GB and will take hours or days.
1. Watch the Live Logs:
See what monerod is doing right now.
journalctl -fu monerod.service
journalctl: The tool for viewing system logs.-f: "Follow" the log, showing new lines as they appear.-u monerod.service: Only show logs for our Monero service.
You'll see messages about connecting to peers and syncing blocks. Heights will increase, e.g., Synced 123456/3XXXXXX.
To stop following the log, press Ctrl+C. This only stops the viewer, not the Monero node itself.
2. Check Sync Status: Get a quick summary of the sync progress.
monerod status
This will show the current height and the target height.
For more details:
monerod sync_info
Just let it run. The sync is automatic. You can log out of SSH, and it will continue. Check back periodically using monerod status or journalctl.
Conclusion
Congratulations! You've successfully installed, verified, configured, and launched your own Monero full node directly on your Ubuntu server. You're enhancing your privacy and supporting the Monero network. Once the sync is complete, you can configure Monero wallets (like the official GUI wallet, Cake Wallet, or Monerujo) to connect directly to your node's restricted RPC port (18089 on 127.0.0.1 by default, usually requires SSH tunneling or Tor for external access).