Midgard - Linux

Setting up Midgard on Linux

The steps shown here are tested on Ubuntu 24.04, different distributions may need adjustments to the commands.

All commands are meant to be run as root user, if not specified otherwise. Depending on the server installation, they may need to be run from a different user via sudo.

Prerequisites

Install all needed packages for building and running midgard

apt install -y --no-install-recommends apt-transport-https gcc gnupg lsb-release postgresql postgresql-common wget

Application user

Add the application user that is used to run the thornode daemon

useradd -m midgard -s /bin/bash

Database

Install TimescaleDB

Run the PostgreSQL package setup script

/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh

Add the TimescaleDB package

echo "deb https://packagecloud.io/timescale/timescaledb/ubuntu/ $(lsb_release -c -s) main" | sudo tee /etc/apt/sources.list.d/timescaledb.list

Install the TimescaleDB GPG key

wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg

Update your local repository list and install TimescaleDB

apt update
sudo apt install timescaledb-2-postgresql-16 postgresql-client-16

Tune your PostgreSQL instance for TimescaleDB

timescaledb-tune

Restart PostgreSQL

systemctl restart postgresql

Create midgard database

su - postgres

psql

CREATE USER midgard WITH ENCRYPTED PASSWORD 'password';
CREATE DATABASE midgard OWNER midgard;

exit

Install TimescaleDB extension

Connect to the database

psql -d "postgres://midgard:password@localhost:5432/midgard"

Add TimescaleDB to the database

CREATE EXTENSION IF NOT EXISTS timescaledb;

Check that TimescaleDB is installed

\dx
                                                List of installed extensions
    Name     | Version |   Schema   |                                      Description                                      
-------------+---------+------------+---------------------------------------------------------------------------------------
 plpgsql     | 1.0     | pg_catalog | PL/pgSQL procedural language
 timescaledb | 2.16.1  | public     | Enables scalable inserts and complex queries for time-series data (Community Edition)
(2 rows)

Install

As midgard user run:

git clone --branch 2.24.4 https://gitlab.com/thorchain/midgard.git $HOME/build

cd $HOME/build

export ENV CGO_ENABLED=1

go install -v -installsuffix cgo ./cmd/blockstore/dump
go install -v -installsuffix cgo ./cmd/midgard
go install -v -installsuffix cgo ./cmd/trimdb
go install -v -installsuffix cgo ./cmd/statechecks

mkdir -p $HOME/{config,openapi/generated}
cp openapi/generated/doc.html $HOME/openapi/generated/

Configuration

As midgard user run:

mkdir $HOME/config

# get genesis.json
curl https://storage.googleapis.com/public-snapshots-ninerealms/genesis/17562000.json -o $HOME/config/genesis.json

Add midgard config

/home/midgard/config/midgard.json
{
  "listen_port": 8080,
  "max_block_age": "60s",
  "shutdown_timeout": "5s",
  "thorchain": {
    "last_chain_backoff": "7s",
    "fetch_batch_size": 100,
    "parallelism": 4,
    "read_timeout": "60s",
    "tendermint_url": "https://rpc.ninerealms.com/websocket",
    "thornode_url": "https://thornode.ninerealms.com/thorchain",
    "fork_infos": [
      {
        "chain_id": "thorchain-1",
        "earliest_block_hash": "0B3C8F9E3EA7E9B1C10CAC5217ED771E0540671EFB9C5315BF01167266BCBEDF",
        "earliest_block_height": 17562001
      }
    ]
  },
  "timescale": {
    "user_name": "midgard",
    "password": "password",
    "database": "midgard",
    "sslmode": "disable",
    "commit_batch_size": 100,
    "max_open_conns": 100,
    "no_auto_update_ddl": true,
    "host": "localhost",
    "port": 5432
  },
  "websockets": {
    "enable": false,
    "connection_limit": 100
  },
  "usdpools": [
    "BNB.BUSD-BD1",
    "BNB.BUSD-BAF",
    "BNB.USDT-DC8",
    "ETH.USDT-0X62E273709DA575835C7F6AEF4A31140CA5B1D190",
    "ETH.USDT-0XDAC17F958D2EE523A2206206994597C13D831EC7",
    "AVAX.USDC-0XB97EF9EF8734C71904D8002F8B6BC66DD9C48A6E",
    "ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48"
  ],
  "genesis": {
    "local": "/home/midgard/config/genesis.json",
    "initial_block_height": 17562001,
    "initial_block_hash": "0B3C8F9E3EA7E9B1C10CAC5217ED771E0540671EFB9C5315BF01167266BCBEDF"
  },
  "blockstore": {
    "local": "./tmp/blockstore",
    "remote": "https://snapshots.ninerealms.com/snapshots/midgard-blockstore/"
  }
}

Systemd

Create a service file to be able to manage the Midgard process via systemd

/etc/systemd/system/midgard.service
[Unit]
Description=Midgard Daemon
After=network-online.target

[Service]
User=midgard
WorkingDirectory=/home/midgard
ExecStart=/home/midgard/go/bin/midgard /home/midgard/config/midgard.json
Restart=on-abort
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

Reload systemd config

systemctl daemon-reload

Start

Start the daemon

systemctl start midgard.service

Last updated