Rocketpool on Dappnode
August 13th, 2022

Introduction

At the time when this post is being written there is no official Dappnode RocketPool package which can be run.

Purpose of this article is not to guide you how to setup rocketpool minipool, but to guide you how to setup rocketpool on dappnode, where rocketpool will use Dappnode packages for Consensus and Execution layer. This means Rocketpool Consensus and Execution clients during rocketpool config setup will be chose as Externally managed.

Let’s start.

Setup

For this setup we will use Prater test network. Goerli-Geth as execution client and Prysm-Prater as consensus client.

FYI: if you want to use dns names like my.dappnode or dms.dappnode you will need to be connected to Dappnode WiFi or on Dappnode VPN

Dappnode packages install

We need to install Goerli Geth and Prysm Prater dappnode packages.

Goerli Geth package

After Goerli Geth package is installed we need to go to package dappnode page in Config section as we need to change run arguments in order to start metrics endpoints which will be used by prometheus to scrape metrics for Grafana dashboard.

In EXTRA_OPTION field you should put following:

--http.api eth,engine,net,web3,txpool --metrics --metrics.port 6060 --metrics.addr 0.0.0.0 --ws --ws.addr 0.0.0.0
Goerli Geth Config page
Goerli Geth Config page

After these config is saved Goerli Geth will be restarted and what is left is to wait until is fully synced, it will take some time.

Prysm Prater package

After Prysm Prater package is installed we need to go to Config page as well and at the bottom right corner click SHOW ADVANCED EDITOR to get list of advanced config.

Now we need to edit start arguments for Beacon Chain via. EXTRA_OPTS config where prometheus metrics will be enabled as well, also we will set CHECKPOINT_URL so our Consensus Client is synced fast and not to wait two days. This config was available before in package config but fr some reason was removed, so we need to use EXTRA_OPTS to handle it.

If you do not have available checkpoint url you can open infutura.io account, create key for free and copy HTTPS prater checkpoint url which you will use.

infura prater checkpoint url
infura prater checkpoint url

After we have this lets update EXTRA_OPTS and set it:

--monitoring-host 0.0.0.0 --monitoring-port 9100  --checkpoint-sync-url=https://xxxxxxxx:yyyyyyyyy@eth2-beacon-prater.infura.io//eth/v2/debug/beacon/states/finalized
Prysm-Prater package beacon chain extra options
Prysm-Prater package beacon chain extra options

Monitoring dappnode packages

We also need to install Dappnode monitoring packages where we will get Grafana for visualisation and Prometheus for scraping metrics.

We need to instal

  • Dms package
  • Metrics Tools package

Rocketpool installation

Once we have our dappnode packages ready and those packages are syncing we will take care of RP installation.

Prerequisite

We will need to SSH into dappnode machine via terminal and you will need you password which you’ve setup for you dappnode on first dappnode start, it was called host user password

After you have connected you dappnode to you local network there was ip assigned to it, my dappnode on local network is on 192.168.1.162

You can check you local ip by executing ping dappnode.local command in terminal.

Install Rocketpool

I was following this tutorial to install rocketpool on dappnode NUC.

Rocketpool service install

We do not need full docker service install, as we do not need dependencies as we already have docker installed and setup as part of Dappnode setup, we just need rocketpool configuration files which will be create at ~/.rocketpool location.

In order to only create confg files we need to run following command with -d flag as described here:

rocketpool service install -d

once service is installed you will have ~/.rocketpool created.

It will look something like this (without backup files I created):

~/.rocketpool
~/.rocketpool

Rocketpool service override

We will need to do few service overrides in order to rocketpool works with Dappnode external services (Geth and Prysm) , as we need to make sure rocketpool docker services can see dappnode docker service and to achive that we we need to put some rocketpool docker services also in dappnode docker network which is called dncore_network .

Rocketpool override or Customizing the Docker-Compose Definition Files and how it is done can be checked here

This will allow us to tweak services we need.

Empty docker compose override file looks like this:

version: "3.7"
services:
  eth1:
    x-rp-comment: Add your customizations below this line

rocketpool overrides:

  • ~/.rocketpool/override/node.yml
# Enter your own customizations for the node container here. These changes will persist after upgrades, so you only need to do them once.
#
# See https://docs.docker.com/compose/extends/#adding-and-overriding-configuration
# for more information on overriding specific parameters of docker-compose files.

version: "3.7"
services:
  node:
    x-rp-comment: Add your customizations below this lin
    networks:
      - dncore_network

networks:
  dncore_network:
    name: dncore_network
    external: true
  • ~/.rocketpool/override/prometheus.yml
# Enter your own customizations for the Prometheus container here. These changes will persist after upgrades, so you only need to do them once.
#
# See https://docs.docker.com/compose/extends/#adding-and-overriding-configuration
# for more information on overriding specific parameters of docker-compose files.

version: "3.7"
services:
  prometheus:
    x-rp-comment: Add your customizations below this line
    ports:
      - "8888:9091"
    networks:
      - dncore_network

networks:
  dncore_network:
    name: dncore_network
    external: true

We have expose RP prometheus to host port 8888 which will allow as to access RP prometheus dashboard to check our targets.

  • ~/.rocketpool/override/grafana.yml
# Enter your own customizations for the Grafana container here. These changes will persist after upgrades, so you only need to do them once.
#
# See https://docs.docker.com/compose/extends/#adding-and-overriding-configuration
# for more information on overriding specific parameters of docker-compose files.

version: "3.7"
services:
  grafana:
    x-rp-comment: Add your customizations below this line
    networks:
      dncore_network:
        ipv4_address: 172.33.0.88

networks:
  dncore_network:
    name: dncore_network
    external: true

In grafana override we have also set static IP so we can easily access it later to see RP Prysm dashboard

  • ~/.rocketpool/override/validator.yml
# Enter your own customizations for the validator container here. These changes will persist after upgrades, so you only need to do them once.
#
# See https://docs.docker.com/compose/extends/#adding-and-overriding-configuration
# for more information on overriding specific parameters of docker-compose files.

version: "3.7"
services:
  validator:
    x-rp-comment: Add your customizations below this lini
    networks:
      - dncore_network

networks:
  dncore_network:
    name: dncore_network
    external: true
  • ~/.rocketpool/override/watchtower.yml
# Enter your own customizations for the watchtower container here. These changes will persist after upgrades, so you only need to do them once.
#
# See https://docs.docker.com/compose/extends/#adding-and-overriding-configuration
# for more information on overriding specific parameters of docker-compose files.

version: "3.7"
services:
  watchtower:
    x-rp-comment: Add your customizations below this line
    networks:
      - dncore_network

networks:
  dncore_network:
    name: dncore_network
    external: true

Also we will need to update prometheus targets to match ones with dappnode services for eth1 and eth2 clients that we exposed on beginning of this tutorial.

  • ~/.rocketpool/prometheus.tmpl
# Default Prometheus configuration for Rocket Pool

global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  scrape_timeout:      12s # Timeout must be shorter than the interval
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:${PROMETHEUS_PORT:-9091}']

  - job_name: 'node'
    static_configs:
      # node-exporter is on the host network so it can get access to the actual machine's network info
      # We have to use 'hosts.docker.internal' to refer to it due to this configuration
      - targets: ['host.docker.internal:${EXPORTER_METRICS_PORT:-9103}']

  - job_name: 'geth'
    static_configs:
      - targets: ['goerli-geth.dappnode:6060']
    metrics_path: /debug/metrics/prometheus

  - job_name: 'eth1'
    static_configs:
      - targets: ['${EC_HOSTNAME:-eth1}:${EC_METRICS_PORT:-9105}']

  - job_name: 'eth2'
    static_configs:
      - targets: ['beacon-chain.prysm-prater.dappnode:9100']

  - job_name: 'validator'
    static_configs:
      - targets: ['validator:${VC_METRICS_PORT:-9101}']

  - job_name: 'rocketpool'
    scrape_interval: 5m
    scrape_timeout: 5m
    static_configs:
      - targets: ['node:${NODE_METRICS_PORT:-9102}']

and last one to edit is grafana template where prometheus URL will be updated to one form Rocketpool, as prometheus alias is not conflicting with dappnode prometheus which will cause wrong prometheus to be called.

  • ~/.rocketpool/templates/grafana-prometheus-datasource.tmpl
apiVersion: 1

deleteDatasources:
  - name: Prometheus
    orgId: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    orgId: 1
    url: http://rocketpool_prometheus:9091
    basicAuth: false
    isDefault: true
    version: 1
    editable: true

Rocketpool minipool

at this moment I already have setup minipool and I will not do tutorial hot to do it, but for Prater, you will need test goerli, etc,

RP tutorial:

Rocketpool config

One more thing is required before we start rocketpool service.

We need to run config command so we can choose rocketpool to connect on externally managed consensus and execution clients, one that we installed as dappnode packages.

ETH1 (Execution) client:

  • HTTP URL: http://goerli-geth.dappnode:8545
  • Web-socket URL: http://goerli-geth.dappnode:8551

EHT2 (Consensus) Client:

  • HTTP URL: http://beacon-chain.prysm-prater.dappnode:3500
  • JSON-RPC URL: http://beacon-chain.prysm-prater.dappnode:4000

Monitoring/metrics:

We need to enabled monitoring and metrics.

Rocketpool start service

After config is saved service should start immediately, but if not started execute command to start services

  • rocketpool service start command needs to be executed.
  • rocketpool service status will give you status

  • now we can check our prometheus dashboard. we go to our dappnode local ip on port 8888 in my case that is 192.168.1.162:8888 where we can see prometheus targets

    192.168.1.162:8888/targets?search=

RP prometheus
RP prometheus
  • also lets access RP Grafana
    • 172.33.0.88:3100

We need to import Prysm Rocketpool grafana dashboard and all details can be found here:

our dashboard to import:

and once we have imported it it will give us nice dashboard for minipool that is running:

Future observations

My plan was to reuse Dappnode grafana, but it did not work because of different grafana versions which makes RP Prysm grafana dashboard only to show few data.

I managed to add new DMS Grafana datasource for rocketpool prometheus and successfully imported dashboard we mentioned before but only part of dashboard was working.

I have investigated it and I can see Dappnode grafana has version of 8.1.8 and RP grafana has version 8.5.9 which I think caused issue as RP dashboard was written for higher version of grafana, but maybe in future we manage to solve it, I just did not have time and motivation as I am satisfied with this RP grafana, but it would be handy to have it in one place.

While I was playing I managed to use dappnode prometheus as well to scrape targets from RP but issue was again with grafana so I stayed on RP grafana.

Subscribe to mozzer
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from mozzer

Skeleton

Skeleton

Skeleton