Linux Host-Native Installation
This guide covers installing and running monod natively on a Linux host using systemd for process management. This is the recommended approach for production validators.
For a streamlined setup experience, use Monarch CLI which handles installation, configuration, and process management automatically.
Prerequisites
Before installing Monolythium, ensure your system meets these requirements:
System Requirements
- OS: Ubuntu 24.04 LTS or later (other distributions supported)
- Architecture: x86_64 (amd64) or ARM64
- CPU: 4+ cores recommended for validators
- RAM: 16GB+ recommended
- Storage: 500GB+ SSD (NVMe recommended for validators)
Software Prerequisites
If downloading pre-built binaries:
- No additional dependencies required
If building from source:
- Go 1.24.2+ (required for building
monod)
Use Go 1.24.2 or later. Go 1.24.0 has compatibility issues with some dependencies.
Install Go:
# Download Go 1.24.2 (or latest 1.24.x from https://go.dev/dl/)
wget https://go.dev/dl/go1.24.2.linux-amd64.tar.gz
# Remove old Go installation (if exists)
sudo rm -rf /usr/local/go
# Extract new Go
sudo tar -C /usr/local -xzf go1.24.2.linux-amd64.tar.gz
# Add to PATH
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bashrc
source ~/.bashrc
# Verify installation
go version
# Expected: go version go1.24.2 linux/amd64
Network Requirements
Ensure the following ports are open:
| Port | Protocol | Purpose |
|---|---|---|
| 26656 | TCP | P2P (LythiumBFT) |
| 26657 | TCP | RPC (LythiumBFT) |
| 1317 | TCP | REST API (Cosmos SDK) |
| 9090 | TCP | gRPC |
| 8545 | TCP | EVM JSON-RPC |
| 8546 | TCP | EVM WebSocket |
Create Dedicated User (Recommended)
For production deployments, run monod as a dedicated non-root user:
# Create monod user with no login shell
sudo useradd -r -s /bin/false monod
# Create home directory
sudo mkdir -p /home/monod
sudo chown monod:monod /home/monod
# Create data directory
sudo mkdir -p /home/monod/.monod
sudo chown -R monod:monod /home/monod/.monod
This isolates the node process and improves security.
If using a dedicated user, all monod commands must be run as that user:
sudo -u monod monod <command>
Alternatively, set up sudo access or use su - monod for interactive sessions.
Monarch CLI (Recommended)
Monarch CLI is the recommended tool for node operators. It replaces the deprecated Mono Commander and provides a complete node management experience with built-in process management via OxidePM.
Install Monarch
# Download binary
```bash
curl -fsSL https://raw.githubusercontent.com/monolythium/monarch-cli/prod/scripts/install.sh | bash
Or build from source:
```bash
Monarch handles:
- Joining networks with automatic genesis verification
- Process management via OxidePM (replaces manual systemd management)
- Node health monitoring with
monarch doctor - Validator operations (register, edit, unjail)
See the Monarch CLI documentation for complete usage.
monod Binary
Download Binary
Download the official pre-built binary:
# Check latest release
LATEST=$(curl -s https://api.github.com/repos/mono-experimental/mono-core/releases/latest | jq -r '.tag_name')
# Download for Linux amd64
curl -LO https://github.com/mono-experimental/mono-core/releases/download/${LATEST}/monod-linux-amd64
# Make executable
chmod +x monod-linux-amd64
# Move to path
sudo mv monod-linux-amd64 /usr/local/bin/monod
# Verify
monod version
Build from Source
Prerequisites
# Install Go 1.24+
wget https://go.dev/dl/go1.24.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.24.0.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
# Verify
go version
Build
# Clone repository
git clone https://github.com/mono-experimental/mono-core.git
cd mono-core
# Checkout release
git checkout <release-tag>
# Build
make build
# Install
sudo mv build/monod /usr/local/bin/
# Verify
monod version
Verify Installation
# Check version
monod version
# Check available commands
monod --help
systemd Service Configuration
systemd manages the monod process, ensuring it starts on boot and restarts on failure.
For standard deployments:
sudo tee /etc/systemd/system/monod.service > /dev/null <<EOF
[Unit]
Description=Monolythium Node
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=monod
Group=monod
WorkingDirectory=/home/monod
ExecStart=/usr/local/bin/monod start --home /home/monod/.monod
# Restart configuration
Restart=on-failure
RestartSec=3
StartLimitInterval=0
# Resource limits
LimitNOFILE=65535
LimitNPROC=4096
# Environment
Environment="HOME=/home/monod"
# Security hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/home/monod/.monod
[Install]
WantedBy=multi-user.target
EOF
Enable and Start Service
# Reload systemd to pick up new unit file
sudo systemctl daemon-reload
# Enable service to start on boot
sudo systemctl enable monod
# Start service now
sudo systemctl start monod
# Check status
sudo systemctl status monod
# View logs
sudo journalctl -u monod -f
systemd Unit File Explained
| Directive | Purpose |
|---|---|
User=monod | Run as dedicated user (not root) |
WorkingDirectory=/home/monod | Set process working directory |
ExecStart=... | Command to start the node |
Restart=on-failure | Auto-restart on crashes |
LimitNOFILE=65535 | Increase file descriptor limit |
ProtectSystem=strict | Read-only system directories |
ReadWritePaths=/home/monod/.monod | Allow writes only to data directory |
If not using a dedicated monod user, replace:
User=monodwithUser=$USERGroup=monodwithGroup=$USER/home/monodwith$HOME
Service Management Commands
# Start node
sudo systemctl start monod
# Stop node
sudo systemctl stop monod
# Restart node
sudo systemctl restart monod
# Check status
sudo systemctl status monod
# Enable auto-start on boot
sudo systemctl enable monod
# Disable auto-start
sudo systemctl disable monod
# View logs (last 100 lines)
sudo journalctl -u monod -n 100
# Follow logs in real-time
sudo journalctl -u monod -f
# View logs since last boot
sudo journalctl -u monod -b
Verify Checksums
Always verify binary checksums:
# Download checksum file
curl -LO https://github.com/mono-experimental/mono-core/releases/download/${LATEST}/checksums.txt
# Verify
sha256sum -c checksums.txt --ignore-missing
Updating
Manual Update
# Stop service
sudo systemctl stop monod
# Download new binary
# ... (same as initial download)
# Start service
sudo systemctl start monod
Troubleshooting
Permission Denied
Symptom: bash: /usr/local/bin/monod: Permission denied
Solution:
# Make binary executable
chmod +x /usr/local/bin/monod
# Verify permissions
ls -l /usr/local/bin/monod
# Should show: -rwxr-xr-x
Command Not Found
Symptom: monod: command not found
Solution:
# Check if binary exists
ls -l /usr/local/bin/monod
# Check PATH
echo $PATH
# Find monod
which monod
# If not in PATH, add to ~/.bashrc
echo 'export PATH=$PATH:/usr/local/bin' >> ~/.bashrc
source ~/.bashrc
Wrong Architecture
Symptom: cannot execute binary file: Exec format error
Solution:
# Check your architecture
uname -m
# x86_64 = amd64
# aarch64 = arm64
# Verify binary architecture
file /usr/local/bin/monod
# Expected: ELF 64-bit LSB executable, x86-64
# Download correct binary for your architecture
systemd Service Fails to Start
Symptom: systemctl status monod shows "failed" or "inactive (dead)"
Solution:
# Check detailed status
sudo systemctl status monod
# View recent logs
sudo journalctl -u monod -n 50 --no-pager
# Common issues:
# 1. Wrong user - verify User= matches existing user
# 2. Wrong home directory - verify paths exist
# 3. Binary not found - verify ExecStart= path is correct
# Test command manually
sudo -u monod /usr/local/bin/monod start --home /home/monod/.monod
Permission Issues with Data Directory
Symptom: permission denied errors in logs when accessing ~/.monod/
Solution:
# Fix ownership (if using dedicated user)
sudo chown -R monod:monod /home/monod/.monod
# Fix permissions
sudo chmod 700 /home/monod/.monod
sudo chmod 600 /home/monod/.monod/config/priv_validator_key.json
sudo chmod 600 /home/monod/.monod/config/node_key.json
# Verify
sudo -u monod ls -la /home/monod/.monod/config/
Port Already in Use
Symptom: bind: address already in use
Solution:
# Find process using port 26656 (or other ports)
sudo lsof -i :26656
# Kill conflicting process (if safe)
sudo kill <PID>
# Or change port in config.toml
vim ~/.monod/config/config.toml
# Find: laddr = "tcp://0.0.0.0:26656"
# Change to: laddr = "tcp://0.0.0.0:26666"
Out of Disk Space
Symptom: no space left on device
Solution:
# Check disk usage
df -h
# Check monod directory size
du -sh ~/.monod/data
# Prune old data (if running archive node)
# WARNING: This removes historical state
monod prune --home ~/.monod
# Or increase disk size (recommended)
Sync Stuck or Very Slow
Symptom: Node syncing slowly or stuck at specific height
Solution:
# Check peer count
curl localhost:26657/net_info | jq '.result.n_peers'
# Should be > 5 for good sync performance
# Update peers
monarch peers update --network Testnet
# Restart to pick up new peers
sudo systemctl restart monod
# Consider using state-sync instead
# See: https://docs.monolythium.com/operators/state-sync
SELinux Blocking Access (RHEL/CentOS)
Symptom: Permission errors despite correct ownership/permissions
Solution:
# Check SELinux status
getenforce
# Temporarily set to permissive (for testing)
sudo setenforce 0
# Permanently disable (if needed)
sudo vim /etc/selinux/config
# Set: SELINUX=permissive
# Or configure proper SELinux policies (recommended)
Next Steps
After successful installation:
- Monarch CLI - Recommended operator tool
- Join Network - Connect to a network
- Configure Node - Set up peers
- Monitoring - Set up observability