> For the complete documentation index, see [llms.txt](https://service.block-pro.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://service.block-pro.net/mainnet/nolus/installation.md).

# Installation

Install and synchronize Nolus Mainnet, one command at a time.

**Mainnet · `pirin-1` · Ubuntu 24.04 / x86-64**

Use a normal Linux account with sudo access. Commands assume a new node and the same shell session. Existing operators should use [Upgrade](/mainnet/nolus/upgrade.md).

This guide builds **v0.8.7** for `pirin-1` and uses a snapshot from after the upgrade at height **28,636,850**. For a recent snapshot from the `v0.8.6-patch` era, run that release until the upgrade halt, then switch using [Upgrade](/mainnet/nolus/upgrade.md). Proposal [#379](https://lens.nolus.io/proposal/379) has passed.

### 1. Prepare packages

Refresh package metadata.

```bash
sudo apt update
```

### Install dependencies

Install download, build and snapshot tools.

```bash
sudo apt install -y ca-certificates curl jq git make build-essential golang-go lz4 tar
```

## Install the binary

### Download the release source

Clone the tagged release into a new directory. Keep any existing checkout intact.

```bash
git clone --branch v0.8.7 --depth 1 https://github.com/nolus-protocol/nolus-core.git "$HOME/nolus-core-v0.8.7"
```

### Open the source tree

Run the following build commands from this directory.

```bash
cd "$HOME/nolus-core-v0.8.7"
```

### Check the required Go toolchain

The v0.8.7 release uses **Go 1.27.3**. Read the checkout's Go directives; with `GOTOOLCHAIN=auto`, Go 1.21+ can download the required toolchain.

```bash
awk '/^go |^toolchain / {print}' go.mod
```

### Build and install

Build the selected release; the Go toolchain is selected from its go.mod.

```bash
GOTOOLCHAIN=auto make install
```

### Install in the service path

Copy the built executable to the path used by systemd.

```bash
sudo install -m 0755 "$(go env GOPATH)/bin/nolusd" /usr/local/bin/nolusd
```

### Locate the release’s Wasm library

Resolve the WasmVM module used by this exact checkout.

```bash
WASM_DIR=$(GOTOOLCHAIN=auto go list -m -f '{{.Path}} {{.Dir}}' all | awk '$1 ~ /^github.com\/CosmWasm\/wasmvm(\/v[0-9]+)?$/ {print $2}')
```

### Install its runtime library

Use the matching x86-64 library from the downloaded module.

```bash
find "$WASM_DIR" -name libwasmvm.x86_64.so -exec sudo install -m 0755 {} /usr/local/lib/ \;
```

### Refresh the linker cache

Make the shared library discoverable to the service.

```bash
sudo ldconfig
```

### Verify the binary

Confirm the new installation's service executable starts and reports v0.8.7.

```bash
/usr/local/bin/nolusd version --long
```

## Initialize and connect

### Initialize once

Replace MY\_NODE with your own moniker. Do not rerun this over an existing validator home.

```bash
nolusd init "MY_NODE" --chain-id pirin-1
```

### Download genesis

Save network genesis to the node configuration.

```bash
curl -fL https://raw.githubusercontent.com/nolus-protocol/nolus-networks/main/mainnet/pirin-1/genesis.json -o "$HOME/.nolus/config/genesis.json"
```

### Verify the network

Continue only if the file is valid JSON and this check returns true.

```bash
jq -e '.chain_id == "pirin-1"' "$HOME/.nolus/config/genesis.json"
```

### Download the address book

Load BlockPro’s published peer discovery file.

```bash
curl -fL https://raw.githubusercontent.com/Shoni-O/files/main/mainnet-files/nolus/addrbook.json -o "$HOME/.nolus/config/addrbook.json"
```

### Check the address book

Ensure the download contains peer records, not an HTML error page.

```bash
jq -e '.addrs | type == "array"' "$HOME/.nolus/config/addrbook.json"
```

### Set minimum gas prices

Set this node’s local transaction admission policy using the [official Nolus configuration example](https://docs.nolus.io/docs/network/run-a-node/configure#minimum-gas-price). This setting controls the minimum fee per gas accepted by this node; transaction gas limits are set separately.

```bash
sed -i 's/^minimum-gas-prices *=.*/minimum-gas-prices = "0.025unls"/' "$HOME/.nolus/config/app.toml"
```

### Use bounded pruning

Keep the application’s standard pruning policy; archive operation needs more disk space.

```bash
sed -i 's/^pruning *=.*/pruning = "default"/' "$HOME/.nolus/config/app.toml"
```

## Run with systemd

### Create the service

Run the node as the current non-root account, with automatic restart after a process failure.

```bash
sudo tee /etc/systemd/system/nolusd.service > /dev/null <<EOF
[Unit]
Description=Nolus Mainnet node
After=network-online.target
Wants=network-online.target

[Service]
User=$(id -un)
WorkingDirectory=$HOME/.nolus
ExecStart=/usr/local/bin/nolusd start --home $HOME/.nolus
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
```

### Load the unit

Tell systemd about the new service.

```bash
sudo systemctl daemon-reload
```

### Enable on boot

Enable the service without starting it yet.

```bash
sudo systemctl enable nolusd
```

### Restore recent state

Follow [Snapshots](/mainnet/nolus/snapshots.md) before starting. The current binary may not replay every historical upgrade from genesis. Choose a snapshot compatible with the installed release.

### Start

Start the node after restoration.

```bash
sudo systemctl start nolusd
```

### Follow logs

Look for advancing blocks; Ctrl+C leaves the service running.

```bash
sudo journalctl -u nolusd -f -o cat
```

### Check synchronization

Wait for catching\_up to become false and compare the height with the explorer.

```bash
curl -fsS http://127.0.0.1:26657/status | jq '.result.sync_info'
```

Next: [Validator](/mainnet/nolus/validator.md) or [Useful Commands](/mainnet/nolus/useful-commands.md).

[Upstream reference](https://github.com/nolus-protocol/nolus-core).
