diff --git a/node_monitor.sh b/node_monitor.sh index afe14cf..ee89f44 100644 --- a/node_monitor.sh +++ b/node_monitor.sh @@ -7,7 +7,22 @@ NODE_HOME="/home/USER/.NODE_DIR" # Нужно изменить имя по NODE_RPC_PORT="26657" # По умолчанию указан стандартный, нужно изменить на свой, если он отличается? USER_TO_PING=" " # Пользователь кому адресовано сообщение в телеграмме. Пример: @Bob_the_bulider TELEGRAM_BOT_TOKEN="TG BOT TOKEN" -TELEGRAM_CHAT_ID="CHAT ID" + +# TELEGRAM_CHAT_ID="CHAT ID" +# Отдельные чаты для тревог, отчётов и информационных сообщений: +TELEGRAM_ALERT_CHAT_IDS=( + "-4785000000" + # Добавьте другие chat_id для тревог +) +TELEGRAM_REPORT_CHAT_IDS=( + "-4785900001" + # Добавьте другие chat_id для ежедневных отчётов +) +TELEGRAM_INFO_CHAT_IDS=( + "-4780000676" + # Добавьте другие chat_id для информационных сообщений +) + MISSED_BLOCKS_THRESHOLD=10 CRON_INTERVAL=10 VALOPER_ADDRESS="***valoper" @@ -17,7 +32,8 @@ VALOPER_ADDRESS="***valoper" # 2) Для вашей локальной ноды: DAEMON tendermint show-validator PUBKEY_JSON='{"@type":"/cosmos.crypto.ed25519.PubKey","key":"REPLACE_WITH_YOUR_BASE64_PUBKEY=="}' -# Нужно создать директорию для файлов монитора mkdir ~/monitor +# ! Нужно создать директорию для файлов монитора: +# mkdir ~/monitor STATE_FILE="/home/USER/monitor/missed_blocks_state_${NODE_NAME}.txt" DAILY_REPORT_FILE="/home/USER/monitor/daily_report_state_${NODE_NAME}.txt" RPC_URL="http://localhost:${NODE_RPC_PORT}" @@ -28,20 +44,29 @@ DEBUG=false # --- ОТПРАВКА TELEGRAM --- send_telegram() { local message="$1" - curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ - -d chat_id="${TELEGRAM_CHAT_ID}" -d text="${message}" > /dev/null + shift + local types=("$@") + for type in "${types[@]}"; do + local chat_array_name="TELEGRAM_${type}_CHAT_IDS[@]" + for CHAT_ID in "${!chat_array_name}"; do + curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ + -d chat_id="$CHAT_ID" -d text="$message" > /dev/null + done + done } + + # --- ПРОВЕРКА RPC И СИНХРОНИЗАЦИИ --- check_node_health() { if ! curl -s --max-time 10 "${RPC_URL}/health" | grep -q 'result'; then - send_telegram "⛔️ НОДА НЕДОСТУПНА: ${NODE_NAME} не отвечает на RPC (порт ${NODE_RPC_PORT}) ${USER_TO_PING}" + send_telegram "⛔️ НОДА НЕДОСТУПНА: ${NODE_NAME} не отвечает на RPC (порт ${NODE_RPC_PORT}) ${USER_TO_PING}" "ALERT" exit 1 fi local sync_status=$(curl -s "${RPC_URL}/status" | jq -r '.result.sync_info.catching_up') if [[ "$sync_status" != "false" ]]; then - send_telegram "⚠️ ВНИМАНИЕ: ${NODE_NAME} в режиме синхронизации. Возможны пропуски. ${USER_TO_PING}" + send_telegram "⚠️ ВНИМАНИЕ: ${NODE_NAME} в режиме синхронизации. Возможны пропуски. ${USER_TO_PING}" "ALERT" "INFO" fi } @@ -53,7 +78,7 @@ VALIDATOR_STATUS_OUTPUT=$($NODE_BINARY query staking validator "$VALOPER_ADDRESS if echo "$VALIDATOR_STATUS_OUTPUT" | grep -q "jailed: true"; then QUERY_OUTPUT=$($NODE_BINARY query slashing signing-info "$PUBKEY_JSON" --node "tcp://localhost:$NODE_RPC_PORT" --home "$NODE_HOME" 2>&1) JAIL_DATE=$(echo "$QUERY_OUTPUT" | grep "jailed_until:" | sed 's/.*jailed_until: \"\(.*\)\"/\1/' | cut -d'.' -f1) - send_telegram "🚨 ВНИМАНИЕ: ${NODE_NAME} сообщает, что валидатор В ТЮРЬМЕ! Возможно до: ${JAIL_DATE} ${USER_TO_PING}" + send_telegram "🚨 ВНИМАНИЕ: ${NODE_NAME} сообщает, что валидатор В ТЮРЬМЕ! Возможно до: ${JAIL_DATE} ${USER_TO_PING}" "ALERT" "INFO" exit 0 fi @@ -76,7 +101,7 @@ NEWLY_MISSED_BLOCKS=$((CURRENT_MISSED_BLOCKS - LAST_MISSED_BLOCKS)) echo "Проверка ${NODE_NAME}: новых пропущенных блоков за ${CRON_INTERVAL} минут: ${NEWLY_MISSED_BLOCKS}." if [ "$NEWLY_MISSED_BLOCKS" -ge "$MISSED_BLOCKS_THRESHOLD" ] && [ "$NEWLY_MISSED_BLOCKS" -gt 0 ]; then - send_telegram "🚨 ТРЕВОГА: ${NODE_NAME} пропустил ${NEWLY_MISSED_BLOCKS} блоков за ${CRON_INTERVAL} минут! Общий счетчик: ${CURRENT_MISSED_BLOCKS}. ${USER_TO_PING} " + send_telegram "🚨 ТРЕВОГА: ${NODE_NAME} пропустил ${NEWLY_MISSED_BLOCKS} блоков за ${CRON_INTERVAL} минут! Общий счетчик: ${CURRENT_MISSED_BLOCKS}. ${USER_TO_PING} " "ALERT" fi echo "$CURRENT_MISSED_BLOCKS" > "$STATE_FILE" @@ -92,7 +117,7 @@ if [ "$CURRENT_DAY" -ne "$LAST_DAY" ]; then if [ "$YESTERDAY_COUNTER" -ne 0 ]; then MISSED_FOR_24H=$((LAST_MISSED_BLOCKS - YESTERDAY_COUNTER)) - send_telegram "📊 Ежедневный отчет для ${NODE_NAME}:%0AЗа сутки пропущено: ${MISSED_FOR_24H} блоков.%0AТекущий счетчик: ${CURRENT_MISSED_BLOCKS}. ${USER_TO_PING}" + send_telegram "📊 Ежедневный отчет для ${NODE_NAME}:%0AЗа сутки пропущено: ${MISSED_FOR_24H} блоков.%0AТекущий счетчик: ${CURRENT_MISSED_BLOCKS}. ${USER_TO_PING}" "REPORT" "INFO" fi echo "$CURRENT_DAY" > "$DAILY_REPORT_FILE"