Atualize seu nó
Cosmovisor
O Cosmos SDK fornece um gerenciador de processos conveniente que envolve o binário crossfid e pode substituir automaticamente por novos binários após uma proposta de atualização de governança bem-sucedida. O Cosmovisor é altamente recomendado para operações de validador, pois permite:
- Atualizações automáticas: muda suavemente para novos binários durante atualizações de governança
- Atualizações sem tempo de inatividade: Minimiza o tempo de inatividade do validador durante atualizações de rede
- Gerenciamento de backups: Faz backup automático dos binários antigos (configurável)
- Capacidade de rollback: Pode reverter para versões anteriores, se necessário
- Integração com o systemd: Funciona perfeitamente com gerenciadores de serviços do sistema para reinicializações automáticas
Por que usar o Cosmovisor? Para operações de validador, o Cosmovisor em conjunto com o systemd garante MTTR (Tempo Médio de Recuperação) < 2 minutos, o que é crucial para manter alta disponibilidade do validador e evitar penalidades de slashing.
Mais informações podem ser encontradas na cosmos.network docs e cosmos-sdk/cosmovisor/readme.
Configuração
Instalar Cosmovisor
-
Instale a versão mais recente do Cosmovisor:
# Instalar a partir da fonte
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest
# Verificar instalação
cosmovisor version -
Observação: Certifique-se de ter o Go 1.19+ instalado para a versão mais recente.
Configurar Variáveis de Ambiente
-
Configurar as variáveis de ambiente do Cosmovisor:
# Adicionar ao seu perfil de shell (~/.bashrc, ~/.zshrc, ou ~/.profile)
echo "# Configurar Cosmovisor" >> ~/.profile
echo "export DAEMON_NAME=crossfid" >> ~/.profile
echo "export DAEMON_HOME=$HOME/.crossfi" >> ~/.profile
echo "export DAEMON_RESTART_AFTER_UPGRADE=true" >> ~/.profile
echo "export DAEMON_ALLOW_DOWNLOAD_BINARIES=false" >> ~/.profile
echo "export UNSAFE_SKIP_BACKUP=false" >> ~/.profile
# Aplicar alterações
source ~/.profile -
Explicação das Variáveis de Ambiente:
DAEMON_RESTART_AFTER_UPGRADE=true: Reiniciar automaticamente após atualizaçõesDAEMON_ALLOW_DOWNLOAD_BINARIES=false: Desativar downloads automáticos de binários (recomendado pela segurança)UNSAFE_SKIP_BACKUP=false: Manter backups dos binários antigos
Criar Estrutura de Diretórios
-
Configurar a estrutura de diretórios necessária do Cosmovisor:
# Criar diretórios
mkdir -p $DAEMON_HOME/cosmovisor/genesis/bin
mkdir -p $DAEMON_HOME/cosmovisor/upgrades
# Copiar binário atual
cp $(which crossfid) $DAEMON_HOME/cosmovisor/genesis/bin/
# Verificar configuração
cosmovisor version
ls -la $DAEMON_HOME/cosmovisor/ -
A estrutura de diretórios deve parecer com:
~/.crossfi/cosmovisor/
├── atual -> genesis ou upgrades/<nome>
├── genesis
│ └── bin
│ └── crossfid
└── upgrades
└── <upgrade_name>
└── bin
└── crossfid
Teste o Cosmovisor
-
Teste se o Cosmovisor consegue rodar seu nó:
# Teste o cosmovisor (deve mostrar a mesma versão que o crossfid)
cosmovisor version
# Inicie o nó com o cosmovisor (para teste)
cosmovisor run start --help -
⚠️ Importante: não execute
cosmovisor run startainda se você planeja usar systemd - vamos configurar isso a seguir.
Preparando uma atualização
O Cosmovisor ficará monitorando continuamente o $DAEMON_HOME/data/upgrade-info.json à procura de novas instruções de atualização. Quando uma atualização estiver pronta, os operadores do nó poderão baixar o novo binário e colocá-lo em $DAEMON_HOME/cosmovisor/upgrades/<upgrade_name>/bin, onde <upgrade_name> é o nome codificado em URI da atualização, conforme especificado no plano do módulo de atualização.
É possível fazer o Cosmovisor baixar automaticamente o novo binário. Para isso, defina a seguinte variável de ambiente.
export DAEMON_ALLOW_DOWNLOAD_BINARIES=true
Cosmovisor com systemd
Para operações de validadores em produção, é essencial rodar o Cosmovisor como um serviço do sistema para garantir reinicializações automáticas e manter alta disponibilidade.
Por que systemd + Cosmovisor?
🔄 Recuperação Automática
- Reinicia o nó imediatamente após falhas
- Mantém MTTR < 2 minutos
- Reduz o risco de slashing por tempo de inatividade
- Funciona durante reinicializações do sistema
⚙️ Benefícios de Produção
- Gerenciamento profissional de serviços
- Log registrado com journald
- Aplicação de limites de recursos
- Gerenciamento de dependências
Configuração de Serviço do systemd
Criar Arquivo de Serviço
-
Crie um arquivo de serviço systemd para o seu validador CrossFi:
sudo nano /etc/systemd/system/crossfid.service -
Adicione a seguinte configuração (substitua
<username>pelo seu nome de usuário real):[Unit]
Description=CrossFi Daemon (Cosmovisor)
After=network-online.target
Wants=network-online.target
[Service]
Type=exec
User=<username>
Group=<username>
ExecStart=/home/<username>/go/bin/cosmovisor run start
Restart=always
RestartSec=3
LimitNOFILE=4096
Environment="DAEMON_NAME=crossfid"
Environment="DAEMON_HOME=/home/<username>/.crossfi"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_LOG_BUFFER_SIZE=512"
Environment="UNSAFE_SKIP_BACKUP=false"
[Install]
WantedBy=multi-user.target
Configurar Serviço
- Opções-chave de Configuração
Restart=always: Sempre reinicie o serviço se ele pararRestartSec=3: Aguarde 3 segundos antes de reiniciarLimitNOFILE=4096: Definir o limite de descritores de arquivosAfter=network-online.target: Aguarde conectividade de rede
- Variáveis de Ambiente
DAEMON_ALLOW_DOWNLOAD_BINARIES=false: Segurança como prática recomendadaDAEMON_RESTART_AFTER_UPGRADE=true: Reinicialização automática após atualizaçõesDAEMON_LOG_BUFFER_SIZE=512: Otimizar desempenho de registro
Habilitar e Iniciar o Serviço
-
Habilite e inicie o serviço CrossFi:
# Recarregar a configuração do systemd
sudo systemctl daemon-reload
# Habilitar o serviço para iniciar na inicialização
sudo systemctl enable crossfid.service
# Iniciar o serviço
sudo systemctl start crossfid.service
# Verificar o status do serviço
sudo systemctl status crossfid.service
Monitorar e Gerenciar
-
Comandos essenciais de monitoramento
# Visualizar logs em tempo real
sudo journalctl -u crossfid.service -f
# Visualizar logs recentes
sudo journalctl -u crossfid.service --since "há 1 hora"
# Verificar o status do serviço
sudo systemctl status crossfid.service
# Reiniciar o serviço (se necessário)
sudo systemctl restart crossfid.service
# Parar o serviço
sudo systemctl stop crossfid.service
Teste de Reinicialização Automática
Teste de Recuperação de Processo
-
Mate o processo crossfid para testar a reinicialização automática:
# Encontrar o ID do processo crossfid
ps aux | grep crossfid
# Mata o processo (substitua PID pelo ID real do processo)
sudo kill -9 <PID>
# Verifique se o systemd o reinicia dentro de alguns segundos
sudo systemctl status crossfid.service -
Comportamento esperado: O serviço deve reiniciar dentro de 3 segundos.
Monitorar Tempo de Recuperação
- Monitore os logs para confirmar a recuperação rápida:
# Visualizar logs em tempo real durante o teste
sudo journalctl -u crossfid.service -f - Você deve ver:
- Terminação do processo registrada
- Reinicialização automática iniciada
- Nó retomando operações
- Tempo total de inatividade < 10 segundos
Teste de Persistência da Reinicialização
-
Verifique se o serviço inicia automaticamente após a reinicialização do sistema:
# Verificar se o serviço está habilitado
sudo systemctl is-enabled crossfid.service
# Deve retornar: enabled -
Após a reinicialização do sistema, verifique se o serviço inicia automaticamente:
sudo systemctl status crossfid.service
Configuração Avançada
Limites de Recursos
Para validadores de alto desempenho, considere limites adicionais de recursos:
[Service]
# Limites de memória (ajuste conforme o seu sistema)
MemoryMax=8G
MemoryHigh=6G
# Limites de CPU (opcional)
CPUQuota=200%
# Limites de I/O (opcional)
IOWeight=500
# Limites de processo
LimitNPROC=32768
LimitNOFILE=65536
Configuração de Registro
Configure opções avançadas de registro:
[Service]
# Registrar para arquivo específico (opcional)
StandardOutput=journal+console
StandardError=journal+console
# Variáveis adicionais de ambiente
Environment="DAEMON_LOG_BUFFER_SIZE=1024"
Environment="DAEMON_LOG_LEVEL=info"
Fortalecimento de Segurança
Para maior segurança, adicione estas opções:
[Service]
# Executar com privilégios restritos
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/home/<username>/.crossfi
# Restrições de rede
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
Solução de Problemas
- 🚫 O Serviço Não Iniciará
- ⏱️ Tempos de reinicialização lentos
- 📊 Gerenciamento de Logs
Problemas comuns e soluções:
- Questões de permissão: Certifique-se de que o usuário tem acesso a todos os caminhos
- Binário não encontrado: Verifique se o cosmovisor e o crossfid estão no PATH
- Variáveis de ambiente: Verifique se todas as variáveis obrigatórias estão definidas
# Depuração da inicialização do serviço sudo systemctl status crossfid.service -l sudo journalctl -u crossfid.service --since "há 10 minutos"Se os tempos de reinicialização excederem 10 segundos:
- Reduzir
RestartSecpara 1 segundo (recomendação mínima) - Verificar o desempenho de E/S do sistema
- Garantir RAM suficiente disponível
- Monitorar o uso da CPU durante a reinicialização
# Monitorar recursos do sistema htop iostat -x 1 free -hGerenciar armazenamento e rotação de logs:
# Limitar o tamanho do journal (adicionar ao /etc/systemd/journald.conf) SystemMaxUse=1G SystemMaxFileSize=100M SystemMaxFiles=10 # Aplicar alterações sudo systemctl restart systemd-journald # Limpar logs antigos sudo journalctl --vacuum-time=7dRecomendação de Produção Para validadores críticos, considere configurar alertas de monitoramento que informem se o serviço reiniciar com frequência, indicando possíveis problemas subjacentes.
Atualização manual de software
Primeiro, pare sua instância de `