⚒️Installation

Quick start guide for installing and configuring a production-ready Monad full node on bare-metal servers.

Node Requirements

CPU:

  • 16 cores, 4.5+ GHz base clock (e.g., AMD Ryzen 9950X / 7950X, EPYC 4584PX)

RAM:

  • 32 GB+

Storage:

  • 2 TB NVMe (PCIe Gen4x4) — TrieDB

  • 500 GB NVMe (PCIe Gen4x4) — MonadBFT + OS

Bandwidth:

  • Validators: 300 Mbit/s

  • Full Nodes: 100 Mbit/s

SSD Reliability Notes:

  • Recommended: Samsung 980/990 Pro, Samsung PM9A1

  • Acceptable: Micron 7450 (occasional slowdowns)

  • Avoid: Nextorage SSDs — can freeze under load


  1. Update packages and install useful tools.


  1. Install Monad Debian Package.


  1. Install the monad package.


  1. Create the monad User and Directories.


  1. Configure TrieDB NVMe Device

    Use a dedicated NVMe with no filesystem / RAID on it.

Create GPT and a full-disk partition:

Create a udev rule and /dev/triedb symlink:


  1. Ensure 512-byte LBA.

Check active LBA format:

Expected: Data Size: 512 bytes ... (in use). If not, switch to 512-byte LBA:


  1. Initialize TrieDB (monad-mpt).

You should see output showing the MPT database on /dev/nvme… and monad-mpt.service: Deactivated successfully.


  1. Firewall Configuration.

Open SSH and P2P port 8000 (TCP+UDP):

Recommended extra protection against spammy small UDP packets:

Remember: iptables rules are lost after reboot unless you persist them (e.g. iptables-persistent).

To make the mitigation rule permanent under UFW, modify before.rules.

  1. Open the UFW pre-rules file:

  1. Just below this line:

add:

  1. Reload UFW:

  1. Verify that the rule is active:

Expected output:

This ensures the anti-spam rule survives reboots and operates consistently.


Monad metrics will be exposed at http://0.0.0.0:8889/metrics.


  1. Fetch Monad Config Files.


  1. Set Keystore Password.

Generate a strong random password and store it in .env:


  1. Generate Keystores (SECP + BLS).

Back up off-node:

  • /opt/monad/backup/secp-backup

  • /opt/monad/backup/bls-backup docs.monad.xyz


  1. Update node.toml for a Public Full Node.

Edit:

Key fields:


  1. Node Signature Record (Peer Discovery).

Sign your node’s name record with the SECP key:

The command prints self_address, self_record_seq_num and self_name_record_sig. Put them into the peer_discovery section of node.toml, for example:

In /home/monad/.env you can let the node auto-fetch the latest validators.toml and forkpoint.toml on startup:


  1. Optional: Enable Call Traces (Archive / RPC Nodes).

For archive / RPC workloads add --trace_calls to the monad-execution service:

Drop-in override:


  1. Optional: Tune Monad Cruft Retention.

To control how long artifacts are kept (minutes), append to /home/monad/.env:

monad-cruft runs hourly and will pick up changes automatically.


  1. Start the Full Node.

Fix ownership:

Enable services at boot:

Before first start, follow the Hard Reset Guide to seed the node with a recent database.

Start services:

Check status and logs:

Last updated