Bash-скрипт отправки уведомлений в Telegram о статусе бэкапа, диске и нагрузке

Обновлено: Сентябрь 2026 Стек: Bash, cURL, Telegram Bot API Проверено: Production-Ready

Полноценный Bash-скрипт Telegram-алертов для Linux VDS: мониторинг диска (>90%), проверка свежести бэкапов за 24ч, Load Average CPU и кастомные алерты.

Интерактивный генератор под ваши параметры
Параметры подставляются в код в реальном времени
/root/scripts/tg-alert.sh
#!/usr/bin/env bash
# ==============================================================================
# SysKit.ru - Универсальный скрипт мониторинга и Telegram-алертов для Linux VDS
# Оповещения: статус бэкапов, переполнение диска, перегрузка CPU и кастомные алерты
# ==============================================================================
set -euo pipefail

# 1. Конфигурация Telegram бота
TG_BOT_TOKEN="1234567890:AAExampleTelegramToken_SecretKey"
TG_CHAT_ID="-1001234567890"
SERVER_NAME="my-vds-server"
BACKUP_DIR="/var/backups"

# 2. Пороговые значения для триггеров алертов
DISK_ALERT_PERCENT=90       # Оповещать, если диск заполнен более чем на X%
LOAD_ALERT_THRESHOLD=4.0    # Порог Load Average (1 min)

# Функция отправки сообщения через Telegram Bot API
send_telegram() {
    local text="$1"
    if [ -z "${TG_BOT_TOKEN}" ] || [ "${TG_BOT_TOKEN}" = "ВАШ_ТОКЕН_БОТА" ]; then
        echo "Ошибка: Не задан валидный TG_BOT_TOKEN" >&2
        return 1
    fi
    curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
        -d "chat_id=${TG_CHAT_ID}" \
        -d "parse_mode=HTML" \
        -d "disable_web_page_preview=true" \
        -d "text=${text}" > /dev/null || true
}

# Функция проверки переполнения диска
check_disk_space() {
    local disk_usage
    disk_usage=$(df -P / | awk 'NR==2 {print $5}' | sed 's/%//')
    if [ "${disk_usage}" -ge "${DISK_ALERT_PERCENT}" ]; then
        local free_mb
        free_mb=$(df -h / | awk 'NR==2 {print $4}')
        local total_mb
        total_mb=$(df -h / | awk 'NR==2 {print $2}')
        local msg="⚠️ <b>[ВНИМАНИЕ] Переполнение диска на сервере ${SERVER_NAME}!</b>%0A"
        msg+="📊 Занято: <b>${disk_usage}%</b> (свободно: ${free_mb} из ${total_mb})%0A"
        msg+="🚨 Требуется срочная очистка кэша или логов!"
        send_telegram "${msg}"
        echo "[ALERT] Диск переполнен: ${disk_usage}%"
    else
        echo "[OK] Свободное место в норме: ${disk_usage}% занято"
    fi
}

# Функция проверки свежести последнего бэкапа (за последние 24 часа)
check_recent_backup() {
    local backup_path="$1"
    if [ ! -d "${backup_path}" ]; then
        return 0
    fi
    local count
    count=$(find "${backup_path}" -type f \( -name "*.tar.gz" -o -name "*.sql.gz" \) -mtime -1 | wc -l)
    if [ "${count}" -eq 0 ]; then
        local msg="🚨 <b>[КРИТИЧЕСКИЙ СБОЙ] Нет свежих бэкапов на ${SERVER_NAME}!</b>%0A"
        msg+="📁 Каталог: <code>${backup_path}</code>%0A"
        msg+="⏳ За последние 24 часа не создано ни одной резервной копии!"
        send_telegram "${msg}"
        echo "[ALERT] Нет свежих бэкапов!"
    else
        echo "[OK] Найдено свежих резервных копий за 24ч: ${count}"
    fi
}

# Функция проверки Load Average CPU
check_cpu_load() {
    local load_1m
    load_1m=$(awk '{print $1}' /proc/loadavg)
    local is_high
    is_high=$(awk -v l="${load_1m}" -v t="${LOAD_ALERT_THRESHOLD}" 'BEGIN {print (l > t) ? 1 : 0}')
    if [ "${is_high}" -eq 1 ]; then
        local msg="🔥 <b>[HIGH LOAD] Высокая нагрузка CPU на ${SERVER_NAME}</b>%0A"
        msg+="📈 Текущий Load Average (1m): <b>${load_1m}</b> (порог: ${LOAD_ALERT_THRESHOLD})"
        send_telegram "${msg}"
        echo "[ALERT] Высокая нагрузка: ${load_1m}"
    else
        echo "[OK] Нагрузка CPU в норме: ${load_1m}"
    fi
}

# ==============================================================================
# Режимы запуска скрипта:
# 1) Вызов с аргументом (для интеграции в бэкап-скрипты): ./tg-alert.sh "Бэкап завершен!"
# 2) Запуск без аргументов по cron: полная диагностика диска, бэкапов и CPU
# ==============================================================================
if [ $# -gt 0 ]; then
    CUSTOM_MSG="$*"
    send_telegram "🔔 <b>[${SERVER_NAME}]</b> ${CUSTOM_MSG}"
    echo "Уведомление отправлено: ${CUSTOM_MSG}"
    exit 0
fi

echo "=== Старт регулярной проверки системы [$(date)] ==="
check_disk_space
check_cpu_load
check_recent_backup "${BACKUP_DIR}"
echo "=== Проверка завершена ==="

Разбор ключевых директив конфигурации

Техническое обоснование директив и их прямое влияние на процессор (CPU), оперативную память (RAM) и дисковый ввод-вывод (NVMe I/O).

Директива / Блок Рекомендуемое значение Зачем нужно и системное влияние (CPU / RAM / I-O)
parse_mode=HTML HTML Позволяет форматировать текст алертов жирным шрифтом, тегами code и выводить структурированные эмодзи-статусы.
DISK_ALERT_PERCENT 90% Критический процент заполнения накопителя. Защищает VDS от аварийного падения MySQL и Nginx из-за переполнения 100% диска.
check_recent_backup -mtime -1 (24 часа) Проверяет наличие свежих .sql.gz и .tar.gz архивов за последние 24 часа. Мгновенно сигнализирует в Telegram, если ночной cron упал.
LOAD_ALERT_THRESHOLD 4.0 (LA 1m) Контролирует всплески аномальной нагрузки на CPU при DDoS-атаках, зависших PHP-воркерах или тяжелых поисковых ботах.

Рекомендуемые системные требования VDS под этот стек

Расчет минимальной и оптимальной конфигурации виртуального сервера для стабильной работы без сбоев.

Оптимальный сайзинг: Любой Linux VDS
2 CPU / 4 GB NVMe
⚡

Timeweb Cloud

Рекомендуемые ресурсы
1 vCPU / 1 GB RAM / 10 GB
2 vCPU / 4 GB RAM
🔷

Selectel

Рекомендуемые ресурсы
1 vCPU / 1 GB RAM / 10 GB
Turbo 4 GB
🟠

Beget

Рекомендуемые ресурсы
1 vCPU / 1 GB RAM / 10 GB

Онлайн-утилиты SysKit для проверки этого сервера

Протестируйте корректность применения конфигурации прямо сейчас в один клик.

Частые ошибки при настройке и их решение (FAQ)

Типовые проблемы вебмастеров и сисадминов при внедрении данной конфигурации.

Как узнать Bot Token и Chat ID для скрипта?
Создайте бота через `@BotFather` в Telegram командой `/newbot` и сохраните HTTP API токен. Затем напишите боту `@userinfobot` или добавьте своего бота в группу и используйте команду `curl https://api.telegram.org/bot<TOKEN>/getUpdates` для получения уникального числового `chat_id`.
Как встроить отправку алерта в мой существующий скрипт бэкапа?
Просто вызывайте скрипт с текстом сообщения в конце вашего пайплайна: `/root/scripts/tg-alert.sh "✅ Бэкап базы данных успешно завершен (размер: 450 MB)"`. А при ошибке через trap: `trap '/root/scripts/tg-alert.sh "🚨 Сбой бэкапа!"' ERR`.
Как настроить периодическую проверку диска и бэкапов в Cron?
Откройте расписание `sudo crontab -e` и добавьте запуск каждый час: `0 * * * * /root/scripts/tg-alert.sh > /var/log/tg-alert.log 2>&1`. Скрипт будет работать тихо и пришлет сообщение в Telegram только при превышении порогов.

Рекомендуемые смежные конфигурации

Дополнительные рецепты и калькуляторы для полной оптимизации данного серверного стека.