COSMOS WIKI
August 27, 2022

TenderDuty v2 - monitoring and alerting

🪓 Telegram канал UTSA 🪓 Telegram чат UTSA

Tenderduty - это комплексный инструмент мониторинга сетей Tendermint. Подробнее можно ознакомиться здесь

Данный мониторинг TenderDuty v2 позволяет осуществлять контроль за нодами и, в частности, видеть высоту сети, статус валидатора, аптайм, подписанные и пропущенные блоки. Также возможно подключение оповещений в телеграм и дискорд

Установка возможна различными способами, но я буду использовать установку через Docker, хотя нет принципиальной разницы

Итак, нам понадобится отдельный сервер (что однозначно дает плюс безопасности) или сервер с уже установеленной нодой (нодами). Также нужно будет найти открытые RPC или открыть свою на основной (не желательно) или резервной ноде

Подготовка сервера

# обновляем репозитории
sudo apt update && sudo apt upgrade -y

# устанавливаем необходимые утилиты
sudo apt install curl build-essential git wget jq make gcc tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y

File2Ban - подробнее здесь

# устанавливаем и копируем конфиг, который будет иметь больший приоритет
apt install fail2ban -y && \
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \
nano /etc/fail2ban/jail.local
# раскомментировать и добавить свой IP: ignoreip = 127.0.0.1/8 ::1 <ip>
systemctl restart fail2ban

# проверяем status 
systemctl status fail2ban
# проверяем, какие jails активны (по умолчанию только sshd)
fail2ban-client status
# проверяем статистику по sshd
fail2ban-client status sshd
# смотрим логи
tail /var/log/fail2ban.log
# останавливаем работу и удаляем с автозагрузки
systemctl stop fail2ban && systemctl disable fail2ban

Установка docker

# https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ru
apt update && \
apt install apt-transport-https ca-certificates curl software-properties-common -y && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" && \
apt update && \
apt-cache policy docker-ce && \
sudo apt install docker-ce -y && \
docker --version

Настройка

Устанавливаем tenderduty

tmux new-session -s tenderduty

mkdir tenderduty && cd tenderduty
docker run --rm ghcr.io/blockpane/tenderduty:latest -example-config >config.yml

Теперь можно скачать конфиг с русским языком и отредактировать его

wget -O $HOME/tenderduty/config.yml "https://raw.githubusercontent.com/lesnikutsa/lesnik_utsa/main/monitoring/TenderDuty(ru)/config.yml"
nano $HOME/tenderduty/config.yml

Для простого мониторинга без оповещений достаточно изменить в конфиге:

  • имя сети:
  • chain-id:
  • valoper_address:
  • url:

Пример конфиг файла

---

# определяет, включена ли панель мониторинга
enable_dashboard: yes

# Какой TCP-порт будет прослушивать панель мониторинга
listen_port: 8888

# hide_log полезен, если панель мониторинга будет опубликована публично. Он отключает канал журнала,
# и скрывает большинство деталей, связанных с узлом. Имейте в виду, что это не полностью проверено на предмет предотвращения
# утечки информации об именах узлов и т.д.
hide_logs: no

# Сколько времени нужно подождать, прежде чем оповестить о том, что узел не работает
node_down_alert_minutes: 3

# Должен ли быть включен экспортер prometheus?
prometheus_enabled: yes
# Какой порт он должен прослушивать?
prometheus_listen_port: 28686

# Глобальная настройка
pagerduty:
  # Должны ли мы использовать PD? Имейте в виду, что если для этого параметра установлено значение no, это переопределяет отдельные настройки оповещения цепочки.
  enabled: no
  # Это ключ API, а не токен oauth, более подробная информация приведена ниже, но для получения дополнительной информации ознакомьтесь с документами v1.
  api_key: aaaaaaaaaaaabbbbbbbbbbbbbcccccccccccc
  # В настоящее время не используется, но скоро будет использоваться. Это позволяет устанавливать приоритеты эскалации и т.д.
  default_severity: alert

# Настройки Discord
discord:
  # Оповещения в discord?
  enabled: no
  # Webhook настраивается щелчком правой кнопки мыши на канале, редактированием настроек и настройкой webhook в разделе интеграции.
  webhook: https://discord.com/api/webhooks/999999999999999999/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

# Настройки Telegram
telegram:
  # Оповещение в Telegram? Примечание: также заменяет настройки, относящиеся к конкретной сети
  enabled: no
  # Ключ API ... поговорите с @BotFather
  api_key: '5555555555:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  # ID группы чата, в который будут отправляться сообщения
  channel: "-666666666"

# Различные цепочки, подлежащие мониторингу. Создайте новую запись для каждой сети
chains:

  # Удобное для пользователя имя, которое будет использоваться для меток. Настоятельно рекомендую заключить в кавычки
  "aura":
    # chain_id проверяется на соответствие при подключении к конечной точке RPC, также используется в качестве метки в нескольких местах
    chain_id: euphoria-1
    # Ура, в версии v2 мы выводим valcons из запросов abci, так что вам не придется прыгать через обручи, чтобы выяснить, как преобразовывать ключи ed25519 в соответствующий адрес bech32
    valoper_address: auravaloper10...
    # Должен ли мониторинг вернуться к использованию общедоступных конечных точек API, если все предоставленные узлы RCP выйдут из строя?
    # Это не всегда надежно, не все общедоступные узлы имеют правильную настройку прокси-сервера websocket.
    public_fallback: yes

    # Управляет различными настройками оповещений для каждой сети
    alerts:
      # Если сеть перестает видеть новые блоки, следует ли отправлять предупреждение?
      stalled_enabled: yes
      # Сколько времени требуется остановленной сети в минутах, чтобы сгенерировать сигнал тревоги
      stalled_minutes: 10

      # Самый простой сигнал тревоги, вы только что пропустили x блоков... хотели бы вы знать?
      consecutive_enabled: yes
      # Сколько пропущенных блоков должно вызвать уведомление
      consecutive_missed: 5
      # НЕ ИСПОЛЬЗУЕТСЯ: будущая подсказка для маршрутизации pagerduty
      consecutive_priority: critical

      # Для каждой сети существует определенное окно блоков и процент пропущенных блоков, которые приведут к тюрьме
      # Следует ли отправлять предупреждение, если превышен определенный процент этого окна?
      percentage_enabled: no
      # Какой процент должен вызвать оповещение
      percentage_missed: 10
      # Еще не используется, подсказка о маршрутизации pagerduty
      percentage_priority: warning

      # Должно ли быть отправлено предупреждение, если валидатор не находится в активном наборе, т.е. заключен в тюрьму, tombstoned, не привязан?
      alert_if_inactive: yes
      # Следует ли отправлять предупреждение, если ни один RPC-сервер не отвечает? (Обратите внимание, что этот сигнал тревоги подается мгновенно без задержки)
      alert_if_no_servers: yes

      # для этой *конкретной* сети можно переопределить настройки оповещений. Если адреса api_key или webhook пусты,
      # то будут использоваться глобальные настройки. Обратите внимание, что включено должно быть установлено как глобально, так и для каждой цепочки

      # Настройка для конкретной цепочки для pagerduty
      pagerduty:
        enabled: yes
        api_key: "" # используется по умолчанию, если пусто

      # Настройки Discord
      discord:
        enabled: yes
        webhook: "" # используется по умолчанию, если пусто

      # Настройки Telegram
      telegram:
        enabled: yes
        api_key: "" # используется по умолчанию, если пусто
        channel: "" # используется по умолчанию, если пусто

    # В этом разделе рассматриваются наши поставщики RPC. Конечные точки LCD (они же REST) не используются, только конечные точки RPC
    # Рекомендуется использовать несколько хостов, и они будут опробованы последовательно, пока не будет обнаружена рабочая RPC
    nodes:
      # URL-адрес конечной точки. Должен включать protocol://hostname:port
      - url: https://snapshot-1.euphoria.aura.network:443
        # Должны ли мы отправить предупреждение, если этот хост не отвечает?
        alert_if_down: yes
      # повторные хосты для контроля избыточности
#      - url: 
#        alert_if_down: no
#      - url: 
#        alert_if_down: no

################################################################################
# Далее можно добавить вторую и последующие сети... Раскомментируйте и измените#
################################################################################
#chains:
#  "L1":
#    chain_id: genesis_29-2
#    valoper_address: genesisvaloper1...
#    public_fallback: yes

#    alerts:
#      stalled_enabled: yes
#      stalled_minutes: 10
#      consecutive_enabled: yes
#      consecutive_missed: 5
#      consecutive_priority: critical
#      percentage_enabled: no
#      percentage_missed: 10
#      percentage_priority: warning
#      alert_if_inactive: yes
#      alert_if_no_servers: yes

#      pagerduty:
#        enabled: yes
#        api_key: "" # используется по умолчанию, если пусто

#      discord:
#        enabled: yes
#        webhook: "" # используется по умолчанию, если пусто

#      telegram:
#        enabled: yes
#        api_key: "" # используется по умолчанию, если пусто
#        channel: "" # используется по умолчанию, если пусто

#    nodes:
#      - url: 
#        alert_if_down: yes
#      - url: 
#        alert_if_down: no
#      - url: 
#        alert_if_down: no
#      - url: 
#        alert_if_down: no

После настройки конфига запускаем

docker run -d --name tenderduty -p "8888:8888" -p "28686:28686" --restart unless-stopped -v $(pwd)/config.yml:/var/lib/tenderduty/config.yml ghcr.io/blockpane/tenderduty:latest

# смотрим логи
docker logs -f --tail 20 tenderduty

Теперь самое время проверить информацию в браузере

# узнаем адрес и вставляем в браузер
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me):8888/\033[0m"
# http://108.108.108.108:8888/

Настройка Discord

Довольно просто включить оповещение для дискорда. Для этого необходимо выполнить всего несколько действий

Добавляем сервер
Выбираем свой шаблон
После переходим в интеграцию и создаем Вебхук
Наконец копируем ссылку вебхука, которую вставляем в конфиг мониторинга

После всех этих манипуляций перезагружаем мониторинг и алармы будут приходить в дискорд!

Пока на этом все. Добавление алармов в телеграм возможно допишу позднее. Но дискорд с каждым днем становиться все удобнее и практичнее

Настройка Telegram

Telegram настроить немного дольше, но в целом также не очень сложно. Нам будет необходимо создать своего бота и узнать ID своего telegram или ID необходимой нам группы в telegram

  • Создаем своего бота. Для этого пишем боту @BotFather и вводим команду /newbot - далее вводим имя бота - далее username (должно заканчиваться на bot). Бот выдаст token API, который надежно сохраняем и никому не показываем
  • Узнаем свой ID или ID группы (для этого добавляем бота в группу). Для того, чтобы узнать свой ID пишем боту @JsonViewBot и отправляем ему любое сообщение
  • Теперь самое время добавить ID и token API в наш конфиг, после чего перезагружаем мониторинг и радуемся

Полезные команды

# посмотреть установленные образы
docker images
# посмотрнть запущенные контейнеры
docker ps
# остановить контейнер
docker stop tenderduty
# перезапустить контейнер
docker restart tenderduty
# посмотреть логи
docker logs -f --tail 20 tenderduty
# узнать RPC ноды для конфига
NODE_FOLDER=".genesisd"
echo -e "\033[0;32mhttp://$(wget -qO- eth0.me)$(grep -A 3 "\[rpc\]" ~/$NODE_FOLDER/config/config.toml | egrep -o ":[0-9]+")\033[0m"
Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq