> 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).

### 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.4 --depth 1 https://github.com/nolus-protocol/nolus-core.git "$HOME/nolus-core-v0.8.4"
```

### Open the source tree

Run the following build commands from this directory.

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

### Check the required Go toolchain

Read the release’s own Go requirement. Go 1.21+ can obtain the requested toolchain automatically.

```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 selected version starts successfully.

```bash
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.

```bash
sed -i 's/^minimum-gas-prices *=.*/minimum-gas-prices = "0.0025unls"/' "$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).
