Администрирование виртуального сервера (VPS) под управлением Linux требует постоянного контроля его состояния. Своевременное получение информации о загрузке процессора, потреблении оперативной памяти, свободном месте на диске и сетевой активности помогает предотвратить сбои в работе сервисов и избежать простоев. Постоянный мониторинг через веб-интерфейс панели управления или подключение по SSH не всегда удобен.
В этой статье мы подробно разберем, как автоматизировать процесс мониторинга вашего Linux VPS. Вы научитесь создавать Bash-скрипты для сбора ключевых метрик, настраивать Telegram-бота для получения уведомлений и организовывать автоматическую отправку отчетов по расписанию с помощью планировщика задач Crontab. Это решение легкое, бесплатное и не требует ресурсоемких систем мониторинга.
Данная информация предназначена для услуг: VPS хостинг или Облачный хостинг
Преимущества мониторинга VPS через Telegram
-
Мгновенные уведомления: Получайте критически важные оповещения прямо на свой телефон, где бы вы ни находились.
-
Централизация информации: Все уведомления от разных серверов и сервисов приходят в один чат Telegram, что удобно для анализа.
-
Простота настройки: Не требуется развертывать сложные системы вроде Zabbix или Prometheus. Решение на основе скриптов понятно даже начинающим администраторам.
-
Низкое потребление ресурсов: Bash-скрипты и Crontab практически не нагружают систему, в отличие от тяжелых агентов мониторинга.
-
Доступность: Получать данные о состоянии сервера можно даже без подключения к интернет-панели хостинга или SSH-клиента.
Что будем мониторить: ключевые метрики сервера
Наш скрипт будет собирать и отправлять следующие ключевые показатели производительности:
-
Загрузка CPU (Центральный процессор): Средняя нагрузка за 1, 5 и 15 минут. Показывает, насколько процессор перегружен задачами.
-
Использование RAM (Оперативная память): Общий объем, используемая память, свободная память, а также память, используемая кэшем и буферами.
-
Использование Disk (Дисковое пространство): Занятое и свободное место на критически важных разделах (например, корневой раздел
/
). -
Swap (Файл подкачки): Информация о том, используется ли swap, что может быть признаком нехватки оперативной памяти.
-
Uptime (Время работы): Как долго сервер работает без перезагрузки.
-
Подключенные пользователи: Количество пользователей, работающих на сервере в данный момент.
Подготовительный этап: создаем Telegram-бота
Перед написанием скрипта нам необходимо создать канал в Telegram и бота, который будет иметь права на отправку сообщений в этот канал.
Шаг 1: Получаем API-токен бота у @BotFather
-
Найдите в Telegram пользователя
@BotFather
. -
Отправьте ему команду
/start
, а затем/newbot
. -
Следуйте инструкциям: укажите понятное имя бота (например,
My VPS Monitor
) и его username, который должен оканчиваться наbot
(например,my_vps_monitor_bot
). -
После успешного создания
BotFather
предоставит вам API-токен. Он выглядит примерно так:1234567890:AAFmCqW3e4fdsgfdshRlmnOpQStuvWXYZ
.-
ВАЖНО! Этот токен является секретным ключом к вашему боту. Никому его не передавайте.
-
Шаг 2: Создаем канал и добавляем в него бота
-
Создайте новый публичный или приватный канал в Telegram. Для примера назовем его
VPS Alerts
. -
Добавьте созданного бота (
@my_vps_monitor_bot
) в канал в качестве администратора. Дайте ему право на отправку сообщений (Post Messages
). Для приватного канала это обязательно. -
Для публичного канала достаточно знать его username (например,
@vps_alerts_channel
). Для приватного канала необходимо получить его Chat ID.
Шаг 3: Получаем Chat ID вашего канала или чата
Самый простой способ получить Chat ID — отправить пробное сообщение в канал через бота.
-
Откройте браузер и воспользуйтесь следующим URL, подставив ваш API-токен:
https://api.telegram.org/bot<ВАШ_API_ТОКЕН>/getUpdates
Например:https://api.telegram.org/bot1234567890:AAFmCqW3e4fdsgfdshRlmnOpQStuvWXYZ/getUpdates
-
Если бот добавлен в канал и имеет права, но сообщений еще не было, ответ будет пустым. Отправьте любое сообщение в канал (например, "Hello").
-
Обновите страницу в браузере. Вы увидите JSON-ответ, в котором нужно найти блок
"chat"
. Внутри него будет параметр"id"
. Это отрицательное длинное число (например,-1001234567890
) — это и есть Chat ID вашего канала.-
Сохраните этот ID. Он нам понадобится для скрипта.
-
Пишем Bash-скрипт для сбора и отправки метрик
Теперь создадим скрипт, который будет собирать системную информацию, форматировать ее в удобочитаемое сообщение и отправлять через API Telegram-бота.
Шаг 1: Создаем и редактируем файл скрипта
Подключитесь к вашему VPS по SSH. Создадим файл скрипта в удобном месте, например, в /opt/scripts/
:
sudo mkdir -p /opt/scripts
sudo nano /opt/scripts/vps-monitor.sh
Шаг 2: Заполняем скрипт содержимым
Вставьте следующий код в открывшийся редактор, предварительно заменив значения BOT_TOKEN
и CHAT_ID
на свои.
#!/bin/bash
# ==============================================================================
# КОНФИГУРАЦИЯ
# Замените значения ниже на свои
# ==============================================================================
BOT_TOKEN="1234567890:AAFmCqW3e4fdsgfdshRlmnOpQStuvWXYZ" # Ваш API-токен от @BotFather
CHAT_ID="-1001234567890" # ID вашего канала/чата
HOSTNAME=$(hostname) # Имя сервера (определяется автоматически)
# ==============================================================================
# Функция для отправки сообщения в Telegram
send_telegram_message() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "text=${message}" \
-d "parse_mode=Markdown" \
-d "disable_web_page_preview=true" > /dev/null
}
# Сбор системных метрик
# 1. Load Average
LOAD=$(cat /proc/loadavg | awk '{print $1", "$2", "$3}')
# 2. Использование памяти (RAM) и swap
MEMORY_INFO=$(free -hm | awk '/^Mem/ {print "Total: " $2 ", Used: " $3 ", Free: " $4 ", Cache: " $6 "+" $7}')
SWAP_INFO=$(free -hm | awk '/^Swap/ {print "Total: " $2 ", Used: " $3 ", Free: " $4}')
# 3. Использование дискового пространства
# Мониторим корневой раздел (/) и /boot (если есть)
DISK_INFO=$(df -h / /boot --output=source,pcent,avail 2>/dev/null | awk 'NR>1 {print $1 ": " $3 " free, " $2 " used"}')
# 4. Время работы системы
UPTIME=$(uptime | awk -F'( |, |:)+' '{if ($7=="min") printf "%s minutes", $6; else printf "%s days, %s hours, %s minutes", $5, $6, $7}')
# 5. Количество пользователей
USERS=$(who | wc -l)
# 6. Проверка использования swap (фактической активности)
SWAP_USED=$(free | awk '/^Swap/ {if ($2 > 0) print $3/$2 * 100; else print 0}')
SWAP_THRESHOLD=10 # Порог в 10%
# 7. Топ-5 процессов по использованию CPU
TOP_CPU=$(ps -eo pid,user,%cpu,comm --sort=-%cpu | head -n 6 | awk 'NR>1 {print $1 " " $2 " " $3 "% " $4}')
# 8. Топ-5 процессов по использованию RAM
TOP_MEM=$(ps -eo pid,user,%mem,comm --sort=-%mem | head -n 6 | awk 'NR>1 {print $1 " " $2 " " $3 "% " $4}')
# Формирование сообщения
——————————————————————
*???? Load Average:* ${LOAD} (1, 5, 15 min)
*???? Memory:* ${MEMORY_INFO}
*???? Disk:*
${DISK_INFO}
*???? Swap:* ${SWAP_INFO}
*⏰ Uptime:* ${UPTIME}
*???? Users:* ${USERS}
*???? Top CPU Processes (PID USER % COMMAND):*
\`${TOP_CPU}\`
*???? Top MEM Processes (PID USER % COMMAND):*
\`${TOP_MEM}\`
——————————————————————
*???? Date:* $(date +'%Y-%m-%d %H:%M:%S %Z')
"
# Отправка сообщения в Telegram
send_telegram_message "${MESSAGE}"
# Дополнительная проверка: отправим alert, если swap используется больше порога
if (( $(echo "${SWAP_USED} > ${SWAP_THRESHOLD}" | bc -l) )); then
SWAP_ALERT_MESSAGE="*⚠️ WARNING on ${HOSTNAME}!* Swap usage is high: $(echo ${SWAP_USED} | awk '{printf "%.1f", $1}')%"
send_telegram_message "${SWAP_ALERT_MESSAGE}"
fi
Шаг 3: Делаем скрипт исполняемым и тестируем
Сохраните файл (Ctrl+O
, затем Enter
в nano) и закройте редактор (Ctrl+X
). Дайте файлу права на выполнение:
sudo chmod +x /opt/scripts/vps-monitor.sh
Протестируйте скрипт, запустив его вручную:
/opt/scripts/vps-monitor.sh
Если все настроено correctly, через несколько секунд вы получите подробное сообщение о состоянии сервера в ваш Telegram-канал.
Настраиваем автоматизацию с помощью Crontab
Чтобы скрипт запускался автоматически по расписанию, мы используем системный планировщик задач cron
.
Вариант 1: Для пользователя root (рекомендуется для системных задач)
Отредактируем crontab для пользователя root:
sudo crontab -e
Добавьте в конец файла строку, определяющую расписание. Примеры:
-
Отправка отчета каждые 30 минут:
*/30 * * * * /opt/scripts/vps-monitor.sh
-
Отправка отчета каждый день в 9:00 утра:
0 9 * * * /opt/scripts/vps-monitor.sh
-
Комбинированный вариант: отчет каждый час в будни и alert-проверка каждые 5 минут:
Создадим два скрипта: один для полного отчета (vps-report.sh
), другой для краткой проверки (vps-check.sh
).
В crontab:# Каждый час с 9 до 19 в будни отправляем полный отчет
0 9-19 * * 1-5 /opt/scripts/vps-report.sh
# Каждые 5 минут проверяем критичные метрики (напр., load average и swap)
*/5 * * * * /opt/scripts/vps-check.sh
Сохраните и закройте файл crontab. Изменения применятся автоматически.
Дополнительные улучшения и идеи
Базовый скрипт можно значительно расширить под свои нужды.
-
Мониторинг отдельных сервисов: Добавьте проверку, запущены ли ключевые сервисы (Nginx, MySQL, PHP-FPM). Если сервис упал, скрипт может отправить критическое оповещение.
if systemctl is-active --quiet nginx; then
echo "Nginx is running."
else
send_telegram_message "❌ Nginx is DOWN on ${HOSTNAME}!"
fi -
Логирование: Перенаправляйте вывод скрипта в файл лога для диагностики ошибок. Добавьте в конец команды в crontab:
... /opt/scripts/vps-monitor.sh >> /var/log/vps-monitor.log 2>&1
-
Безопасность: Для большей безопасности можно вынести
BOT_TOKEN
иCHAT_ID
в отдельный конфигурационный файл с ограниченными правами доступа (например,600
). -
Пороги для оповещений: Реализуйте более сложные проверки. Например, отправлять alert только если нагрузка CPU превышает 90% более 5 минут подряд.
Регулярно проверяйте работу скрипта и адаптируйте его под изменяющиеся требования вашей инфраструктуры.