Node Setup
Install dependencies, build lumerad, and sync your lumera mainnet node using a snapshot.
Step 1: Install Dependencies
SSH into your server then 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.
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 node 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.
| Strategy | Keeps | Disk usage |
|---|---|---|
default | Last 362,880 states | Medium |
nothing | Everything (full archive) | Very high |
everything | Last 2 states only | Lowest |
custom | Whatever you set above | Configurable |
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.
| Port | Service | Config key |
|---|---|---|
| 26656 | P2P (must be reachable) | config.toml → [p2p].laddr |
| 26657 | CometBFT RPC | config.toml → [rpc].laddr |
| 1317 | REST API (LCD) | app.toml → [api].address |
| 9090 | gRPC | app.toml → [grpc].address |
| 8545 | EVM JSON-RPC (HTTP) | app.toml → [json-rpc].address |
| 8546 | EVM JSON-RPC (WebSocket) | app.toml → [json-rpc].ws-address |
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.
Option A: Snapshot (recommended)
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 Operations, Chain Upgrades.
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.