Bash-скрипт отправки уведомлений в Telegram о статусе бэкапа, диске и нагрузке
Полноценный 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 только при превышении порогов.
Рекомендуемые смежные конфигурации
Дополнительные рецепты и калькуляторы для полной оптимизации данного серверного стека.