Post icon

Уведомление о падении веб-сервера в Telegram: Простой bash скрипт

Упал трекер или важный проект? Скрипт отправит уведомление в телеграм только при его недоступности. Удобное решение для получения сообщений о проблемах с веб-сервером.

Что умеет скрипт

пример уведомлений в телеграм о проблемах на сервере

Баш-скрипт будет запускаться systemd-сервисом каждые 10 секунд или с другим интервалом по вашему выбору. Может чекать кастомные порты. Минималистичный, лаконичный, не нагружает систему.

1. Веб-серверы
  • Nginx процесс
  • Apache процесс
  • Порт 80 и другие по желанию

2. PHP

  • PHP-FPM

3. Базы данных

  • MariaDB
  • MySQL

Создаем телеграм бота

Botfather – официальный бот телеграм. Через него создаются и редактируются не только боты, но и миниапы.

1. Найдите @BotFather в Telegram
2. Отправьте команду ‘/newbot’
3. Следуйте инструкциям
4. Сохраните полученный токен
5. Напишите любое сообщение вашему боту

Получите ваш ID чата:
1. Найдите @userinfobot в Telegram
2. Отправьте любое сообщение
3. Сохраните полученный ID

Создаем bash скрипт

Создаем файл скрипта:

sudo nano /usr/local/bin/service-monitor.sh

Вставляем в него данный код. Заменяем токен бота и токен чата из раздела СОЗДАЕМ БОТА. По желанию добавляем свои кастомные порты, если есть:

#!/bin/bash

# Конфигурация Telegram бота
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN"
TELEGRAM_CHAT_ID="YOUR_CHAT_ID"

# Список портов для проверки (стандартные и кастомные)
PORTS_TO_CHECK="80"  # Добавьте свои порты через запятую, например: "80 веб сервер, 3306 внешняя mysql"

# Отправка сообщения в Telegram
send_telegram_message() {
    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}" \
        -d parse_mode="HTML"
}

# Проверка статуса сервиса
check_service() {
    local service=$1
    local status

    # Проверка через systemd
    if command -v systemctl >/dev/null 2>&1; then
        if systemctl is-active --quiet $service; then
            status="active"
        else
            status=$(systemctl status $service 2>/dev/null | grep 'Active:' | awk '{print $2}')
        fi
    # Проверка через service
    elif command -v service >/dev/null 2>&1; then
        if service $service status >/dev/null 2>&1; then
            status="active"
        else
            status="inactive"
        fi
    # Проверка через process
    else
        if pgrep -f "$service" >/dev/null; then
            status="active"
        else
            status="inactive"
        fi
    fi

    # Отправляем уведомление если сервис не активен
    if [ "$status" != "active" ] && [ "$status" != "running" ]; then
        send_telegram_message "❌ Сервис $service не работает (статус: $status) на сервере $(hostname)"
    fi
}

# Проверка порта
check_port() {
    local port=$1
    
    if ! ss -tuln | grep ":$port " >/dev/null 2>&1; then
        if ! netstat -tuln | grep ":$port " >/dev/null 2>&1; then
            send_telegram_message "❌ Порт $port не прослушивается на сервере $(hostname)"
        fi
    fi
}

# Проверка установленных веб-серверов
[ -f /usr/sbin/nginx ] || command -v nginx >/dev/null 2>&1 && check_service nginx
[ -f /usr/sbin/apache2 ] || command -v apache2 >/dev/null 2>&1 && check_service apache2
[ -f /usr/sbin/httpd ] || command -v httpd >/dev/null 2>&1 && check_service httpd

# Проверка MySQL/MariaDB
[ -f /usr/sbin/mysqld ] || command -v mysql >/dev/null 2>&1 && {
    check_service mysql
    check_service mysqld
}

# Проверка всех версий PHP-FPM
if [ -d /etc/php ]; then
    for phpver in /etc/php/*; do
        if [ -d "$phpver/fpm" ]; then
            check_service "php$(basename $phpver)-fpm"
        fi
    done
fi

# Дополнительная проверка php-fpm
command -v php-fpm >/dev/null 2>&1 && check_service php-fpm

# Проверка всех указанных портов
for port in ${PORTS_TO_CHECK//,/ }; do
    check_port $port
done

Далее даем этому файлу привелегии запуска:

sudo chmod +x /usr/local/bin/service-monitor.sh

Создание systemd сервиса

Создаем новый файл сервиса:

sudo nano /etc/systemd/system/service-monitor.service

Вставляем в него следующий код, RestartSec=10 – это преодичность работы чекера в секундах, можете поставить 60:

[Unit]
Description=Service Monitor Daemon
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/service-monitor.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Далее активируем созданный сервис:

sudo systemctl daemon-reload
sudo systemctl enable service-monitor
sudo systemctl start service-monitor

Для проверки чекера достаточно ввести:

sudo service nginx stop

Подождать заданный тайминг и проверить сообщения телеграм.
Как только получили алерт, запускаем обратно остановленный nginx:

sudo service nginx start

Управление

проверка статуса сервиса мониторинга

Статус:

sudo systemctl status service-monitor

Запуск:

sudo systemctl start service-monitor

Остановка:

sudo systemctl stop service-monitor

Перезапуск:

sudo systemctl restart service-monitor

To top