Cosmovisor
⠀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
. <(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
⠀Наша команда использует для всех сетей подобный конфиг
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 — написание статьи