Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 34 additions & 9 deletions node_monitor.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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}"
Expand All @@ -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
}

Expand All @@ -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

Expand All @@ -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"
Expand All @@ -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"
Expand Down