Skip to main content

Actualizar su Nodo

Cosmovisor

El SDK de Cosmos proporciona un gestor de procesos conveniente que envuelve el binario crossfid y puede intercambiar automáticamente nuevos binarios tras una propuesta de actualización de gobernanza exitosa. Cosmovisor es altamente recomendado para operaciones de validador ya que permite:

  • Actualizaciones automáticas: Cambia sin problemas a nuevos binarios durante actualizaciones de gobernanza
  • Actualizaciones sin tiempo de inactividad: Minimiza el tiempo de inactividad del validador durante actualizaciones de red
  • Gestión de respaldos: Respalda automáticamente binarios antiguos (configurable)
  • Capacidad de reversión: Puede revertir a versiones anteriores si es necesario
  • Integración con systemd: Funciona perfectamente con gestores de servicios del sistema para reinicios automáticos
¿Por qué usar Cosmovisor?

Para operaciones de validador, Cosmovisor combinado con systemd asegura MTTR (Tiempo Medio de Recuperación) < 2 minutos, lo cual es crítico para mantener alta disponibilidad del validador y evitar penalidades de slashing.

Más información puede encontrarse en documentos de cosmos.network y cosmos-sdk/cosmovisor/readme.

Configuración

Instalar Cosmovisor

  • Instale la última versión de Cosmovisor:
    # Instalar desde fuente
    go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest

    # Verificar instalación
    cosmovisor version
  • Nota: Asegúrese de tener Go 1.19+ instalado para la última versión.

Establecer Variables de Entorno

  • Configure las variables de entorno de Cosmovisor:
    # Agregar a su perfil de shell (~/.bashrc, ~/.zshrc, o ~/.profile)
    echo "# Setup 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 cambios
    source ~/.profile
  • Variables de Entorno Explicadas:
    • DAEMON_RESTART_AFTER_UPGRADE=true: Reiniciar automáticamente después de actualizaciones
    • DAEMON_ALLOW_DOWNLOAD_BINARIES=false: Deshabilitar descargas automáticas de binarios (recomendado por seguridad)
    • UNSAFE_SKIP_BACKUP=false: Mantener respaldos de binarios antiguos

Crear Estructura de Directorios

  • Configure la estructura de directorios requerida de Cosmovisor:
    # Crear directorios
    mkdir -p $DAEMON_HOME/cosmovisor/genesis/bin
    mkdir -p $DAEMON_HOME/cosmovisor/upgrades

    # Copiar binario actual
    cp $(which crossfid) $DAEMON_HOME/cosmovisor/genesis/bin/

    # Verificar configuración
    cosmovisor version
    ls -la $DAEMON_HOME/cosmovisor/
  • La estructura de directorios debe verse así:
    ~/.crossfi/cosmovisor/
    ├── current -> genesis or upgrades/<name>
    ├── genesis
    │ └── bin
    │ └── crossfid
    └── upgrades
    └── <upgrade_name>
    └── bin
    └── crossfid

Probar Cosmovisor

  • Pruebe que Cosmovisor puede ejecutar su nodo:
    # Probar cosmovisor (debe mostrar la misma versión que crossfid)
    cosmovisor version

    # Iniciar nodo con cosmovisor (para prueba)
    cosmovisor run start --help
  • ⚠️ Importante: No ejecute cosmovisor run start aún si planea usar systemd - lo configuraremos a continuación.

Preparar una Actualización

Cosmovisor monitoreará continuamente el $DAEMON_HOME/data/upgrade-info.json para nuevas instrucciones de actualización. Cuando una actualización esté lista, los operadores de nodos pueden descargar el nuevo binario y colocarlo bajo $DAEMON_HOME/cosmovisor/upgrades//bin donde `` es el nombre codificado en URI de la actualización según se especifica en el plan del módulo de actualización.

Es posible que Cosmovisor descargue automáticamente el nuevo binario. Para hacer esto establezca la siguiente variable de entorno.

export DAEMON_ALLOW_DOWNLOAD_BINARIES=true

Cosmovisor con systemd

Para operaciones de validador en producción, es esencial ejecutar Cosmovisor como un servicio del sistema para asegurar reinicios automáticos y mantener alta disponibilidad.

¿Por qué systemd + Cosmovisor?

🔄 Recuperación Automática

  • Reinicia el nodo inmediatamente después de caídas
  • Mantiene MTTR < 2 minutos
  • Reduce el riesgo de slashing por tiempo de inactividad
  • Funciona durante reinicios del sistema

⚙️ Beneficios de Producción

  • Gestión profesional de servicios
  • Registro integrado con journald
  • Aplicación de límites de recursos
  • Gestión de dependencias

Configuración del Servicio systemd

Crear Archivo de Servicio

  • Cree un archivo de servicio systemd para su validador CrossFi:
    sudo nano /etc/systemd/system/crossfid.service
  • Agregue la siguiente configuración (reemplace <username> con su nombre de usuario 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 Servicio

  • Opciones de Configuración Clave:
    • Restart=always: Siempre reiniciar el servicio si se detiene
    • RestartSec=3: Esperar 3 segundos antes de reiniciar
    • LimitNOFILE=4096: Establecer límite de descriptor de archivo
    • After=network-online.target: Esperar conectividad de red
  • Variables de Entorno:
    • DAEMON_ALLOW_DOWNLOAD_BINARIES=false: Mejor práctica de seguridad
    • DAEMON_RESTART_AFTER_UPGRADE=true: Auto-reiniciar después de actualizaciones
    • DAEMON_LOG_BUFFER_SIZE=512: Optimizar rendimiento de registro

Habilitar e Iniciar Servicio

  • Habilite e inicie el servicio CrossFi:
    # Recargar configuración de systemd
    sudo systemctl daemon-reload

    # Habilitar servicio para iniciar en el arranque
    sudo systemctl enable crossfid.service

    # Iniciar el servicio
    sudo systemctl start crossfid.service

    # Verificar estado del servicio
    sudo systemctl status crossfid.service

Monitorear y Gestionar

  • Comandos esenciales de monitoreo:
    # Ver registros en vivo
    sudo journalctl -u crossfid.service -f

    # Ver registros recientes
    sudo journalctl -u crossfid.service --since "1 hour ago"

    # Verificar estado del servicio
    sudo systemctl status crossfid.service

    # Reiniciar servicio (si es necesario)
    sudo systemctl restart crossfid.service

    # Detener servicio
    sudo systemctl stop crossfid.service

Probar Reinicio Automático

Probar Recuperación de Proceso

  • Termine el proceso crossfid para probar el reinicio automático:
    # Encontrar el ID del proceso crossfid
    ps aux | grep crossfid

    # Terminar el proceso (reemplace PID con el ID de proceso real)
    sudo kill -9 <PID>

    # Verificar que systemd lo reinicie en segundos
    sudo systemctl status crossfid.service
  • Comportamiento esperado: El servicio debe reiniciarse dentro de 3 segundos.

Monitorear Tiempo de Recuperación

  • Monitoree los registros para confirmar recuperación rápida:
    # Observar registros en tiempo real durante la prueba
    sudo journalctl -u crossfid.service -f
  • Debe ver:
    • Terminación de proceso registrada
    • Reinicio automático iniciado
    • Nodo reanudando operaciones
    • Tiempo de inactividad total < 10 segundos

Probar Persistencia de Reinicio

  • Verifique que el servicio inicie automáticamente después del reinicio del sistema:
    # Verificar si el servicio está habilitado
    sudo systemctl is-enabled crossfid.service

    # Debe devolver: enabled
  • Después de un reinicio del sistema, verifique que el servicio inicie automáticamente:
    sudo systemctl status crossfid.service

Configuración Avanzada

Límites de Recursos

Para validadores de alto rendimiento, considere límites de recursos adicionales:

[Service]
# Límites de memoria (ajustar basado en su sistema)
MemoryMax=8G
MemoryHigh=6G

# Límites de CPU (opcional)
CPUQuota=200%

# Límites de I/O (opcional)
IOWeight=500

# Límites de proceso
LimitNPROC=32768
LimitNOFILE=65536

Configuración de Registro

Configure opciones avanzadas de registro:

[Service]
# Registrar a archivo específico (opcional)
StandardOutput=journal+console
StandardError=journal+console

# Variables de entorno adicionales
Environment="DAEMON_LOG_BUFFER_SIZE=1024"
Environment="DAEMON_LOG_LEVEL=info"

Endurecimiento de Seguridad

Para mayor seguridad, agregue estas opciones:

[Service]
# Ejecutar con privilegios restringidos
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/home/<username>/.crossfi

# Restricciones de red
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6

Solución de Problemas

Problemas comunes y soluciones:

  • Problemas de permisos: Asegúrese de que el usuario tenga acceso a todas las rutas
  • Binario no encontrado: Verifique que cosmovisor y crossfid estén en PATH
  • Variables de entorno: Verifique que todas las variables requeridas estén establecidas
# Depurar inicio del servicio sudo systemctl status crossfid.service -l sudo journalctl -u crossfid.service --since "10 minutes ago"
Recomendación de Producción

Para validadores de misión crítica, considere configurar alertas de monitoreo que le notifiquen si el servicio se reinicia frecuentemente, indicando posibles problemas subyacentes.

Actualización Manual de Software

Primero, detenga su instancia de crossfid. A continuación, actualice el software:

cd gaia
git fetch --all && git checkout
make install
NOTA: Si tiene problemas en este paso, por favor verifique que tenga la última versión estable de GO instalada. :::

¡Su nodo completo ha sido actualizado limpiamente! Si no hay cambios que rompan la compatibilidad, entonces puede simplemente reiniciar el nodo ejecutando:

crossfid start

Actualizar Archivo Genesis

Para actualizar el archivo genesis, puede obtenerlo de una fuente confiable o exportarlo localmente.

Obtener de una Fuente Confiable

Si se está uniendo a la mainnet, obtenga el genesis del repositorio mainnet. Si se está uniendo a una testnet pública, obtenga el genesis de la testnet apropiada en el repositorio testnet. De lo contrario, obténgalo de su fuente confiable.

Guarde el nuevo genesis como new_genesis.json. Luego reemplace el genesis.json antiguo con new_genesis.json

cd $HOME/.crossfi/config
cp -f genesis.json new_genesis.json
mv new_genesis.json genesis.json

Exportar Estado a un Nuevo Genesis Localmente

Si estaba ejecutando un nodo en la versión anterior de la red y quiere construir su nuevo genesis localmente desde un estado de esta red anterior, use el siguiente comando:

cd $HOME/.crossfi/config
crossfid export --for-zero-height --height=<export-height> > new_genesis.json

El comando anterior toma un estado a cierta altura <export-height> y lo convierte en un nuevo archivo genesis que puede usarse para iniciar una nueva red.

Luego, reemplace el genesis.json antiguo con new_genesis.json.

cp -f genesis.json new_genesis.json
mv new_genesis.json genesis.json

En este punto, es posible que quiera ejecutar un script para actualizar el genesis exportado a un genesis que sea compatible con su nueva versión. Por ejemplo, los atributos de un tipo Account cambiaron, un script debería consultar la cuenta codificada del almacén de cuentas, desenmascararlas, actualizar su tipo, re-enmascarar y re-almacenarlas. Puede encontrar un ejemplo de tal script aquí.

Restablecer Datos

Si está ejecutando un nodo validador en la mainnet, siempre tenga cuidado al hacer crossfid unsafe-reset-all. Nunca debe usar este comando si no está cambiando chain-id. :::
IMPORTANTE Asegúrese de que cada nodo tenga un priv_validator.json único. No copie el priv_validator.json de un nodo antiguo a múltiples nodos nuevos. Ejecutar dos nodos con el mismo priv_validator.json causará que sea penalizado por doble firma! :::

Primero, remueva los archivos desactualizados y restablezca los datos. Si está ejecutando un nodo validador, asegúrese de entender lo que está haciendo antes de restablecer.

crossfid unsafe-reset-all

Su nodo ahora está en un estado prístino mientras mantiene el priv_validator.json y config.toml originales. Si tenía nodos centinela o nodos completos configurados antes, su nodo seguirá intentando conectarse a ellos, pero puede fallar si no han sido actualizados también.