Продвинутым
July 26, 2022

Cosmovisor

1package

⠀Cosmovisor — менеджер, автоматически обновляющий бинарные файлы нод из экосистемы Cosmos. О том, что это и как с ним работать, написано в этой статье.


Содержание


Что это?

К содержанию

⠀Cosmovisor — это менеджер, отслеживающий версии и автоматически обновляющий помещённые в него бинарные файлы нод из экосистемы Cosmos. При получении в сеть сигнала о новой версии, Cosmovisor в зависимости от настроек может:

  • Автоматически загрузить новую версию бинарных файлов;
  • Остановить ноду;
  • Переключиться на использование нового бинарного файла;
  • Перезапустить ноду на новой версии.

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

⠀Процесс обновления выглядит следующим образом:

  • В сети создаётся голосование о проведении обновления на определённом блоке (пример на скриншоте);
  • Валидаторы поддерживают или отклоняют его в течение 5 дней;
  • Если голосование было поддержано, то валидаторы подготавливаются к обновлению;
  • На указанном блоке в сеть отправляется сигнал для валидаторов, использующих Cosmovisor;
  • Сеть останавливается;
  • Валидаторы обновляются либо автоматически при помощи Cosmovisor’а, либо вручную;
  • Ожидается, пока обновятся валидаторы, на которых в сумме заделегировано 67% токенов;
  • Сеть запускается.

⠀Далее описан процесс установки менеджера, его настройки и запуска ноды с его использованием, а также подготовки к обновлению.


Установка

К содержанию

Все действия необходимо выполнять под именем root пользователя.

⠀Каждый подраздел — отдельный вид установки, нужно выбрать один из них.

Linux (ручной)

Для новичков

⠀Обновить пакеты и систему

sudo apt update && sudo apt upgrade -y

⠀Установить необходимые пакеты

sudo apt install wget git build-essential jq -y

⠀Установить GO

. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/installers/golang.sh)

⠀Клонировать GitHub репозиторий

⠀В различных гайдах, в том числе официальном, можно увидеть установку посредством Go, однако в таком случае могут возникать ошибки, поэтому лучше собирать бинарный файл Cosmovisor’а из клонированного GitHub репозитория.

cd; git clone https://github.com/cosmos/cosmos-sdk

⠀Перейти в директорию с проектом

cd $HOME/cosmos-sdk/

⠀Переключиться на ветку cosmovisor

cosmovisor_version=`git tag -l "cosmovisor*" | tail -n1`; \
git checkout $cosmovisor_version

⠀Собрать бинарный файл

make cosmovisor

⠀Переместить его в папку со всеми бинарными файлами

mv cosmovisor/cosmovisor /usr/bin

⠀Выйти из директории и удалить папку с проектом

cd; rm -rf $HOME/cosmos-sdk/

Linux (автоматический)

Для продвинутых

⠀Запустить скрипт и дождаться окончания установки

. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/installers/cosmovisor.sh)


Настройка и запуск

К содержанию

В качестве примера приводится сеть Evmos, при работе с другой сетью необходимо подставлять в команды свои значения.

⠀После установки Cosmovisor’а нужно скачать или собрать бинарный файл ноды и поместить его в директорию со всеми бинарными файлами

mv evmosd /usr/bin  

⠀Далее необходимо создать папки для Cosmocisor’а в директории ноды

mkdir -p $HOME/.evmosd/cosmovisor/genesis/bin \
$HOME/.evmosd/cosmovisor/upgrades

⠀Скопировать бинарный файл в созданную папку

cp `which evmosd` $HOME/.evmosd/cosmovisor/genesis/bin

⠀Настроить ноду (сгенерировать кошелёк, инициализировать, скачать генезис и т. д.).

⠀Осталось создать сервисный файл, содержащий настройки и запустить ноду. Для настройки используются следующие переменные:

  • DAEMON_NAME — название бинарного файла ноды;
  • DAEMON_HOME — путь к директории ноды;
  • DAEMON_ALLOW_DOWNLOAD_BINARIES — скачать ли автоматически бинарные файлы по ссылке из сигнала (по умолчанию false);

⠀В целях безопасности валидаторам не рекомендуется устанавливать значение true. Разъяснения в официальной документации нет, вероятно, это нужно для того, чтобы минимизировать негативные последствия при перехвате сигнала злоумышленником и подмены ссылки или при становлении указанной ссылки нерабочей.

  • DAEMON_RESTART_AFTER_UPGRADE — перезапустить ли ноду после обновления с новым бинарным файлом (по умолчанию true);
  • UNSAFE_SKIP_BACKUP — пропустить ли резервное копирование БД перед обновлением, для которого требуется дополнительное место на диске (по умолчанию false);
  • DAEMON_DATA_BACKUP_DIR — директория, в которую будет сделано резервное копирование (по умолчанию совпадает с DAEMON_HOME);
  • DAEMON_RESTART_DELAY — задержка между остановкой ноды и резервным копированием БД, например 1s, 10s, 30s (по умолчанию не используется);
  • DAEMON_POLL_INTERVAL — длительность интервала для опроса специального файла, в который поступает сигнал об обновлении, например 1s, 10s, 30s (по умолчанию 300ms);
  • DAEMON_PREUPGRADE_MAX_RETRIES — максимальное количество попыток обновления, после которого Cosmovisor завершит обновление неудачно (по умолчанию 0).

⠀Команда запуска самого процесса выглядит как

cosmovisor run start OPTIONS
  • OPTIONS — опции команды запуска бинарного файла ноды, если таковые необходимы.

⠀Наша команда использует для всех сетей подобный конфиг

sudo tee <<EOF >/dev/null /etc/systemd/system/evmosd.service
[Unit]
Description=Evmos node
After=network.target

[Service]
User=$USER
Environment="DAEMON_NAME=evmosd"
Environment="DAEMON_HOME=$HOME/.evmosd"
Environment="UNSAFE_SKIP_BACKUP=true"
ExecStart=`which cosmovisor` run start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

⠀После создания сервисного можно запустить ноду командами

sudo systemctl daemon-reload
sudo systemctl enable evmosd
sudo systemctl restart evmosd

⠀Удостовериться, что нода успешно запустилась и нагоняет блоки, можно посмотрев лог

sudo journalctl -fn 100 -u evmosd

⠀По такому алгоритму можно запустить несколько нод на одном сервере — для каждой ноды будет свой сервисный файл со своими настройками. При этом надо не забыть про изменение стандартных портов у 2-й и более нод. Эта тема подробно разобрана в другой обучающей статье.

Несколько Tendermint нод на одном сервере


Само обновление

К содержанию

⠀После успешного прохождения голосования необходимо подготовиться к обновлению, а именно скачать или собрать новый бинарный файл и подложить его в папку Cosmovisor’а.

⠀Структура папки должна выглядеть следующим образом

cosmovisor
│
├── current -> ссылка на текущий бинарный файл
├── genesis
│   └── bin
│       └── $DAEMON_NAME
└── upgrades
    └── <name>
        ├── bin
        │   └── $DAEMON_NAME
        └── upgrade-info.json

⠀Например

cosmovisor
│
├── current
├── genesis
│   └── bin
│       └── evmosd
└── upgrades
    └── v6.0.1
        ├── bin
        │   └── evmosd
        └── upgrade-info.json

⠀Сначала необходимо создать директорию для нового бинарного файла

mkdir -p $HOME/.evmosd/cosmovisor/upgrades/v6.0.1/bin

⠀Затем скачать новую версию бинарного файла и поместить в созданную папку

cp evmosd $HOME/.evmosd/cosmovisor/upgrades/v6.0.1/bin

⠀Нода готова к обновлению. Теперь необходимо дождаться указанного в голосовании блока, по достижении которого в файл upgrade-info.json поступит сигнал и нода будет обновлена. Несмотря на автоматизацию процесса желательно удостовериться, что обновление прошло успешно, особенно в начале опыта использования Cosmovisor’а. После обновления валидаторов, на которых в сумме заделегировано 67% токенов, сеть будет запущена.

⠀Для получения текущего процента используется команда

wget -qO- http://localhost:26657/consensus_state \
| jq ".result.round_state.height_vote_set[0].prevotes_bit_array"

⠀После запуска сети нужно поместить новую версию бинарного файла в директорию со всеми бинарными файлами

cp $HOME/.evmosd/cosmovisor/upgrades/v6.0.1/bin/evmosd /usr/bin

Если что-то пошло не по плану

К содержанию

Раздел был написан по памяти выкарабкивания из подобной ситуации, поэтому могут быть неточности. Если вы попали в подобную ситуацию, дайте знать в комментариях, сработал ли алгоритм, а если нет, то что необходимо сделать дополнительно.

⠀В случае, если обновление не увенчалось успехом (возникают какие-либо ошибки, нода не обновляется и не запускается), можно обновить бинарные файлы вручную.

⠀Для этого нужно остановить ноду

sudo systemctl stop evmosd

⠀Перенести новый бинарный файл в генезис папку

mv $HOME/.evmosd/cosmovisor/upgrades/v6.0.1/bin/evmosd \
$HOME/.evmosd/cosmovisor/genesis/bin

⠀Удалить указатель на текущую версию и папку, созданную для обновления

rm -rf $HOME/.evmosd/cosmovisor/current \
$HOME/.evmosd/cosmovisor/genesis/bin

⠀Запустить ноду

sudo systemctl restart evmosd

⠀Удостовериться, что нода успешно запустилась и ожидает запуска сети, посмотрев лог

sudo journalctl -fn 100 -u evmosd

⠀И посмотрев текущий процент стейка на новой версии

wget -qO- http://localhost:26657/consensus_state \
| jq ".result.round_state.height_vote_set[0].prevotes_bit_array"

Полезные ссылки

К содержанию

Официальная документация


1package

К содержанию

Telegram | Chat | Discord | Twitter | Learning | Admitix


Благодарности

К содержанию

Команда 1package — написание статьи