Telegram Service for Ethereum 2.0 Staking

ethereum logo

On the 1st of December, the first phase of the Ethereum 2.0 transition from Proof of Work to Proof of Stake will start - and we're happy to be part of the genesis. We  followed this guide to set up a lighthouse client (we love Rust) developed by Sigma Prime. But we have the feeling that we're too busy to monitor a Grafana Dashboard all the time (especially when shit hits the fan). So we've decided to add some nice Telegram messaging if something fails:

Setting up a Telegram Bot

The Telegram Bot notifies us when some of the services (Geth, Beacon Chain, Validator Client) cannot be started. The first thing you have to do is use @BotFather to create a new bot and give it the "/newbot" command. Provide the bot with a sounding name, and you'll get a message with an access token for the HTTP API.

After that, send the bot a message in your Telegram client and then use the following command to get the chat id.

bash$ curl "https://api.telegram.org/bot0123456789:BBDKSJhdsjkHDSJKHDkDHSUU/getUpdates"

You'll receive a JSON with a chat id. Note it down somewhere.

The next step is to create an easy telegram script on your server:

bash$ nano /usr/local/bin/telegram

paste the following code:

bash#!/bin/bash
source /etc/telegram/key

URL="https://api.telegram.org/bot$TELEGRAM_KEY/sendMessage"
curl -s -d "chat_id=$CHAT_ID&disable_web_page_preview=1&text=$1" $URL > /dev/null

make it executable by using:

bash$ chmod 644 /usr/local/bin/telegram

Next step adding the telegram configuration file:

bash$ nano /etc/telegram/key

Paste your bot credentials:

bashexport TELEGRAM_KEY="0123456789:BBDKSJhdsjkHDSJKHDkDHSUU"
export CHAT_ID=1234567890

Save the file and then you can try to send a message to your chat from the shell:

bash$ telegram "Ohai it's me - your servers"

Setting up an unit status reporter

Setup a systemd unit status reporter by adding the following file:

bash$ nano /usr/local/bin/unit-status-telegram

with this code:

bash#!/bin/bash

UNIT=$1

UNITSTATUS=$(systemctl status $UNIT)
ALERT=$(echo -e "\u26A0")

telegram "$ALERT Unit failed $UNIT $ALERT
Status:
$UNITSTATUS"

Make it executable and try it out:

bash$ chmod 644 /usr/local/bin/unit-status-telegram
$ unit-status-telegram
$ # or
$ unit-status-telegram geth

it should send you a systemctl status message for the corresponding service.

Wrestling systemd

First, we need to create a service for sending the telegram message. Open the file:

bash$ nano /etc/systemd/system/unit-status-telegram@.service

and "create" the service:

bash[Unit]
Description=Unit Status Telegram Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/unit-status-telegram %i

Please note that this service does not have to be enabled or started since it's triggered OnFailure from other services.

Next we adapt these services to report on failure. We do it for geth:

bash[Unit]
Description=Ethereum go client
After=network.target
Wants=network.target
OnFailure=unit-status-telegram@geth.service
StartLimitBurst=5
StartLimitIntervalSec=33
[Service]
User=goeth
Group=goeth
Type=simple
Restart=always
RestartSec=5
ExecStart=geth --http --cache 4096 --datadir /var/lib/goethereum
[Install]
WantedBy=default.target

For the lighthouse beacon chain:

bash[Unit]
Description=Lighthouse Beacon Node
Wants=network-online.target
After=network-online.target
OnFailure=unit-status-telegram@lighthousebeacon.service
StartLimitBurst=5
StartLimitIntervalSec=33
[Service]
Type=simple
User=lighthousebeacon
Group=lighthousebeacon
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse bn --network mainnet --staking --metrics --datadir /var/lib/lighthouse --eth1-endpoint http://127.0.0.1:8545
[Install]
WantedBy=multi-user.target

and for the validator client:

bash[Unit]
Description=Lighthouse Validator
Wants=network-online.target
After=network-online.target
OnFailure=unit-status-telegram@lighthousevalidator.service
StartLimitBurst=5
StartLimitIntervalSec=33
[Service]
Type=simple
User=lighthousevalidator
Group=lighthousevalidator
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/lighthouse vc --network mainnet --datadir /var/lib/lighthouse --graffiti "https://eth2.9elements.com"
[Install]
WantedBy=multi-user.target

The lines that has been changed from the original tutorial are: StartLimitBurstStartLimitIntervalSec and OnFailure.

Note that we added a StartLimitBurst since OnFailure only works if there is a limit. Last but not least reload the systemd:

bash$ systemctl daemon-reload

You can try if everything works by changing the geth data-dir to something random like /varrrrr/lib/goethereum and restart geth. You should receive a Telegram message with an error after 33 seconds (obviously the data-dir can't be read).

I hope you liked the tutorial! If you need a helping hand with Ethereum Solidity development or web application development, then ping us. For future updates, please follow us on Twitter.

Photo by Nick Chong.

Cofounder of 9elements. Software alchemist since he was a kid. Knee deep in tech with building things in React, Rails or Solidity.