Как получать ошибки Nginx прямо в Telegram

Вчера, 17:52

Давайте будем честными — сервер без ошибок не бывает. Даже если вы настраиваете всё идеально, рано или поздно что-то да сломается. То файл не найдётся, то скрипт не отработает, то ресурс недоступен. Главное тут — не впадать в панику и как можно быстрее заметить проблему, чтобы сразу её починить. Но ведь никто не хочет постоянно сидеть в терминале, открывать логи и выискивать эти ошибки вручную, правда? Гораздо удобнее, если сервер сам вам напишет в Telegram, как только что-то пошло не так.

Сейчас расскажу, как это настроить всего за 15–20 минут.

Шаг 1. Заводим своего бота в Telegram

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

1. Откройте Telegram и найдите там @BotFather — это такой официальный «папа всех ботов».

2. Напишите ему команду /newbot и следуйте инструкциям. Придумайте имя и логин для вашего бота — это займёт пару минут.

3. В конце вам выдадут токен API — это такая длинная строчка из букв и цифр. Скопируйте её и сохраните куда-нибудь, она нам ещё пригодится.

Важный момент:
После создания обязательно напишите что-нибудь вашему новому боту — например, просто /start.

Это нужно для того, чтобы Telegram понял, что вы с этим ботом знакомы и разрешил ему писать вам сообщения. 

Как узнать свой Chat ID:
1. Найдите ещё одного бота — @myidbot.

2. Напишите ему /getid, и он тут же отправит вам ваш Chat ID. Запомните или сохраните это число — оно нужно, чтобы бот знал, куда именно слать уведомления.

Шаг 2. Настраиваем скрипт для отправки ошибок

Теперь сделаем так, чтобы сервер мог «разговаривать» с вашим ботом. Для этого напишем простой скрипт на Bash. Он будет заглядывать в лог ошибок Nginx и отправлять вам всё новое, что там появилось.

Скопируйте этот код в файл, например, check_nginx_errors.sh:

#!/bin/bash

BOT_TOKEN="yourtoken"
CHAT_ID="your_chat_id"
LOG_FILE="/var/log/nginx/error.log"
LAST_POSITION_FILE="/var/tmp/nginx_log_position"
if [ ! -f "$LAST_POSITION_FILE" ]; then
    echo "Position file not found. Creating a new one: $LAST_POSITION_FILE"
    echo "0" > "$LAST_POSITION_FILE"
fi

LAST_POSITION=$(cat "$LAST_POSITION_FILE" 2>/dev/null || echo "0")

NEW_LINES=$(tail -n +$((LAST_POSITION + 1)) "$LOG_FILE" 2>/dev/null)

if [ -n "$NEW_LINES" ]; then
    echo "$NEW_LINES" | while read -r LINE; do
        curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" -d chat_id=$CHAT_ID -d text="$LINE"
    done
    wc -l < "$LOG_FILE" > "$LAST_POSITION_FILE"
else
    echo "No errors"
fi

Не забудьте сделать его исполняемым:

chmod +x check_nginx_errors.sh

Шаг 3. Автоматизируем запуск через cron

Чтобы скрипт не приходилось запускать вручную, добавим его в cron — это такая встроенная в Linux штука, которая может выполнять команды по расписанию.
1. Откройте cron на редактирование:

crontab -e

2. Добавьте туда строчку, чтобы скрипт запускался каждые 5 минут:

*/5 * * * * /full/path/check_nginx_errors.sh

Обязательно укажите полный путь, иначе cron просто не найдёт ваш скрипт.

Как проверить, что всё настроено правильно?

Чтобы убедиться, что система работает, давайте подбросим в лог что-нибудь похожее на настоящую ошибку:

echo "$(date) [error] 12345#0: *1 open() \"/path/to/nonexistent/file\" failed (2: No such file or directory)" >> /var/log/nginx/error.log

Через пару минут вы должны получить сообщение в Telegram. Если пришло — поздравляю, всё настроено как надо!

Вот и все!

Теперь вы всегда будете в курсе свежих ошибок вашего Nginx, где бы вы ни находились. И не надо каждый раз лезть на сервер и копаться в логах. Всё само приходит в Telegram.

Если хотите, можно доработать скрипт под себя — добавить фильтры, форматирование, или, например, отправлять уведомления в общий чат команды. Всё в ваших руках.