Skip to main content
This guide takes a fresh Ubuntu server to a fully synced mainnet node running under systemd. Follow the steps in order. When the node reports catching_up: false, continue to create validator.

Step 1. Install dependencies

SSH into your server, update the system, and install the required packages.

Step 2. Install Go

Use the version pinned in the chain’s go.mod, currently Go 1.26.2.

Step 3. Install lumerad

Lumera publishes a prebuilt linux/amd64 binary for every release, so there is nothing to compile. Run the version mainnet is on, currently v1.12.0.
Verify the download before you install it. Never skip this on mainnet.
If this prints FAILED, stop. Delete the files and download them again. Do not install an unverified binary on a machine that will hold a consensus key.
Extract the archive and run the bundled installer. It copies lumerad into /usr/local/bin, installs libwasmvm.x86_64.so into /usr/lib, and refreshes the linker cache.
Confirm the binary runs. The version must match what the chain reports above.

Step 4. Initialize the node

Pick a moniker. This is the public name for your validator. Replace my-validator with your own name, then initialize.
This creates ~/.lumera with a config/ directory. It generates your node key and consensus key, and writes default config.toml, app.toml, and client.toml. Back up your keys right away.
priv_validator_key.json is your validator identity. Anyone who holds it can double-sign on your behalf. That is punished by permanent tombstoning and a slash of your stake. Copy these files off the server to encrypted offline storage now. Verify you can restore them. Never run two nodes with the same key.

Step 5. Download and verify genesis

Download the mainnet genesis file and check its hash.
Confirm the chain ID inside the file.

Step 6. Configure the node

Set the seed nodes and the minimum gas price.
Load a maintained address book so a new node has peers to dial if the seeds are unreachable.
Enable pruning so disk usage stays under control. Skip this only if you specifically need an archive node.
indexer = "null" turns off the transaction indexer and saves disk. Leave it as "kv" if you need to query historical transactions by hash from this node.
Turn on Prometheus metrics.
Bind the RPC to localhost. A validator only needs the P2P port reachable.
lumerad can listen on the ports below. Everything except 26656 should be firewalled or bound to 127.0.0.1.
Do not open 26657 (RPC), 1317 (LCD), 9090 (gRPC), or 8545 and 8546 (EVM JSON-RPC) on a validator. Exposing RPC publicly is a common cause of DDoS-induced downtime and jailing. Run a separate full node if you need to serve those endpoints. In a sentry setup, the validator should accept inbound connections only from its sentries.

Step 7. Harden the server

Firewall

Allow SSH and the P2P port. Deny everything else inbound.

Dedicated user

Run the node as its own user rather than root.
Confirm ssh validator@YOUR_SERVER_IP and sudo -v both work from a second terminal now. The next section disables root SSH, so if this account is not reachable you lose access to the server.
Move the node directory from Step 4 across, so ~/.lumera resolves to the same data before and after the switch.
Switch users. Steps 8 to 10 and the whole of create validator run as validator, and $HOME must already be /home/validator when you write the systemd unit in Step 9.
Do the move before Step 8. Migrating afterwards means shifting the whole synced database instead of a few config files.

SSH

Harden SSH on a machine that holds a consensus key. Disable password logins and root SSH. Drop-ins in /etc/ssh/sshd_config.d/ override the main file. Check for conflicting values first.
Verify the settings actually took effect.
Keep your current session open and confirm you can log in from a second terminal before closing it. The new config applies to the next connection. Locking yourself out of a validator means downtime and eventual jailing.

Step 8. Sync the chain

Pick one of the two options below. The snapshot is fastest and is the recommended path. Copy the current URL from Polkachu’s Lumera snapshots, currently about 11 GB.
Reset local state, then stream the snapshot straight into the data directory.

Option B. State sync

State sync fetches a verified state snapshot over the P2P layer instead of downloading a database. It uses no third-party storage. It depends on the RPC provider having snapshots enabled.
The edit is scoped to the [statesync] section. Confirm the result before you start.
If state sync stalls at “discovering snapshots” for more than a few minutes, no peer is serving snapshots. Fall back to Option A.
Do not try to replay mainnet from block 1 with a single current binary. The chain has passed through many governance upgrades. Replaying historical blocks needs the binary that was live at each height. Use a snapshot or state sync.

Step 9. Create the systemd service

Create the service unit. $USER and which lumerad resolve on their own, so you can paste this as is.
Before your first upgrade, switch this unit to run under Cosmovisor so binary swaps happen automatically at the upgrade height. See the chain upgrades section of operations.

Step 10. Start and verify

Start the node and watch the logs.
You should see blocks being committed.
Press Ctrl+C to stop tailing. This does not stop the node. Wait 30 seconds to a minute, then check the node’s sync status.
Wait until catching_up is false. Confirm you have peers.

Verification checklist

Everything below should pass before you create your validator.

Next steps

Once catching_up is false, register your validator.

Create validator

Create a secured wallet, fund it, and submit the validator transaction.

Operations

Day-to-day commands, upgrades, monitoring, and troubleshooting.