Вебхук Discord для уведомлений о статусе сайта

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

Discord – это мессенджер, похожий на Slack. Discord позволяет бесплатно настроить систему обмена сообщениями, благодаря которой вы сможете отправлять сообщения, изображения, аудио и видео. Кроме того, Discord предлагает и платные премиум-функции. Но зарегистрироваться можно бесплатно. У Discord есть клиенты для Windows, macOS, Linux, Android и iOS.

В этом руководстве мы поможем вам настроить ваш собственный сервер Discord, создать вебхук Discord, а затем написать сценарий Bash, который будет проверять статус веб-сайтов по списку. Также мы протестируем отправку уведомлений с вашего сервера на канал Discord.

Требования

  • Сервер Ubuntu 18.04, который будет взаимодействовать с Discord и на котором будет запущен скрипт мониторинга (назовем его monitor-server). Чтобы настроить этот сервер, следуйте этому мануалу.
  • Если на данный момент у вас нет сайта, состояние которого вы хотели бы отслеживать, настройте второй сервер (назовем его apache-server) по этому руководству. Обязательно настройте виртуальный хост по разделу 5.
  • Аккаунт Discord. Бесплатно зарегистрироваться можно на этой странице.

1: Создание вебхука Discord

Давайте попробуем создать свой приватный сервер Discord.

Прежде всего, вам нужно войти на свой аккаунт через браузер или запустить приложение Discord. После этого нажмите кнопку Create a server.

Далее нужно выбрать имя для своего сервера и нажать кнопку Create a server.

Итак, сервер готов, теперь мы создадим вебхук Discord. Вебхуки в контексте Discord – это уникальные URL-адреса, которые можно использовать для связывания сервисов. Вебхуки позволяют автоматизировать отправку сообщений и обновление данных в каналах Discord.

В этом руководстве мы настроим вебхук, который будет отправлять уведомление, если на вашем сервере вышел из строя определенный сервис, а Discord позаботится о том, чтобы вы получили эти уведомления в своем канале.

Чтобы создать вебхук, нужно сначала кликнуть на свой канал, а затем нажать кнопку Edit Channel – она находится рядом с названием канала.

Затем перейдите во вкладку Webhooks и нажмите кнопку Create Webhook.

Далее вам нужно выбрать имя для своего вебхука. В этом руководстве мы назовем его Alerts, поскольку именно это будет делать наш сценарий Bash – оповещать нас в случае сбоя одного из веб-сайтов.

Скопируйте URL-адрес вебхука и сохраните его для дальнейшей работы. Наконец, нажмите кнопку Save, чтобы сохранить вебхук.

Итак, на данный момент у вас есть учетная запись Discord, сервер и вебхук. Пора перейти к созданию тестового файла, который будет отслеживать ваш скрипт.

2: Создание тестового файла (опционально)

Предположим, у вас нет веб-сайта, работу которого вы хотели бы отслеживать. В таком случае вы можете создать тестовый файл, благодаря которому вы проверите работу вашего скрипта.

Примечание: Этот раздел нужно выполнить на apache-server.

Во-первых, вам нужно создать тестовый файл. Для этого запустите:

nano /var/www/your_domain/test

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

test

Сохраните и закройте файл.

А потом перейдите по ссылке http://your_domain/test и убедитесь, что вы видите текст, который поместили в файл test.

На следующем этапе мы напишем сценарий мониторинга.

3: Создание сценария мониторинга

Теперь, когда вы настроили свой вебхук, можно приступить к написанию сценария Bash, который будет проверять код ответа ваших веб-сайтов. В случае если один из сайтов вернет не 200 OK, а что-либо другое, скрипт отправит запрос на вебхук, после чего вы получите уведомление в своем канале Discord.

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

Сначала подключитесь к monitor-server по SSH (напоминаем, что это тот сервер, который вы используете для запуска сценария мониторинга).

Прежде всего нужно создать файл в домашней папке. В этом мануале мы назовем этот файл check_status.sh.

Откройте файл в текстовом редакторе:

nano ~/check_status.sh

Чтобы загрузчик программы распознал этот исполняемый файл как скрипт Bash, поместите в начало файла следующую строку:

#!/bin/bash

Все строки, которые начинаются с символа #, воспринимаются как комментарии. Комментарии в сценариях можно и не использовать, но именно комментарии помогают другим людям понять, что делает ваш скрипт.

#!/bin/bash
##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##
. . .

Затем укажите свой вебхук Discord в качестве переменной. Добавьте URL-адрес вебхука, который вы скопировали ранее:

. . .
##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"
. . .

Возможно, вы захотите использовать этот скрипт для отслеживания статуса нескольких сайтов. Поэтому создайте переменную sites_list и сохраните в ней доменные имена или IP-адреса веб-сайтов, за которыми вам нужно следить. Если вы используете тестовый файл, который мы создали в предыдущем разделе, обязательно добавьте секцию /test после домена или IP-адреса:

. . .
##
# List of websites to check
##
websites_list="your_domain/test"
. . .

Если же вы отслеживаете сразу несколько сайтов, вы можете добавить в переменную sites_list список доменов или IP-адресов (в качестве разделителя нужно использовать пробел):

. . .
websites_list="your_domain1/test your_domain2 your_domain3"
. . .

Теперь нужно сделать так, чтобы скрипт перебирал ваш список веб-сайтов и проверял их статус. Для этого добавьте в файл цикл for:

. . .
for website in ${websites_list} ; do
status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})
echo $status_code
done
. . .

Этот цикл будет перебирать все элементы в переменной sites_list и проверять статус сайта с помощью команды curl.

Оператор echo $status_code выводит статус ответа команды curl. Если веб-сайт работает правильно, команда вернет код 200 OK – значит, этот сайт запущен и все работает хорошо. В противном случае команда получит другой код ответа.

В цикл for добавьте оператор if, чтобы проверить, равен ли код ответа 200. Если код ответа равен 200, значит, сайт работает и Discord не нужно отправлять вам уведомление. Добавьте в файл следующий условный блок:

. . .
if [[ "$status_code" -ne 200 ]] ; then
# POST request to Discord Webhook with the domain name and the HTTP status code
else
echo "${website} is running!"
fi
. . .

Если с веб-сайтом возникнут какие-либо проблемы, вы получите другой код ответа, и в этом случае вы должны получить уведомление через вебхук Discord.

Чтобы отправить такое уведомление, вы можете использовать команду curl, которая отправит POST-запрос на URL-адрес вашего вебхука.

Итак, поместите следующий запрос curl в свой оператор if:

. . .
if [[ "$status_code" -ne 200 ]] ; then
# POST request to Discord Webhook with the domain name and the HTTP status code
curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} returned: ${status_code}"'"}'  $url
else
echo "${website} is running!"
fi
. . .

Теперь давайте рассмотрим аргументы, которые мы использовали в этом запросе:

  • -H: позволяет добавить в запрос curl дополнительный заголовок.
  • “Content-Type: application/json”: определяет тип данных, который должен ожидать вебхук (HTTP JSON).
  • -X POST: указывает POST в качестве метода запроса.
  • -d: отправляет данные JSON в вебхук Discord.

В результате скрипт будет иметь такой вид:

#!/bin/bash
##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##
##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"
##
# List of websites to check
# To add more websites just use space as a separator, for example:
# websites_list="your_domain1 your_domain2 your_domain3"
##
websites_list="your_domain/test your_domain2"
for website in ${websites_list} ; do
status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})
if [[ "$status_code" -ne 200 ]] ; then
# POST request to Discord Webhook with the domain name and the HTTP status code
curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} : ${status_code}"'"}'  $url
else
echo "${website} is running!"
fi
done

Итак, наш сценарий просматривает список веб-сайтов и проверяет статус каждого отдельного сайта. Если ответ сайта не равен 200, вы получите уведомление.

Запустите сценарий с помощью следующей команды, чтобы убедиться, что он работает правильно:

bash ~/check_status.sh

Если после этого вы получите в терминале следующий вывод, значит, ваш веб-сайт работает правильно:

your_domain1 is running!
your_domain2 is running!

Все готово, осталось только протестировать отправку уведомлений Discord.

4: Проверка уведомлений Discord

Наконец, пора проверить, работает ли наш вебхук. Это можно сделать с помощью тестового файла.

Перейдите на apache-server и выполните следующую команду, чтобы закрыть доступ к этому файлу:

sudo chmod 000 /var/www/your_domain/test

Читайте также: Привилегии в Linux: что это и как с этим работать

Затем вернитесь на monitor-server и запустите скрипт:

bash check_status.sh

Перейдите в приложение Discord и проверьте уведомления. Вы получите ошибку 403. Значит, права доступа установлены неправильно, вам запрещено просматривать запрашиваемый файл.

Чтобы получить другую ошибку, вернитесь на сервер apache-server и удалите этот файл:

sudo rm /var/www/your_domain/test

Потом вернитесь на monitor-server и запустите скрипт:

bash check_status.sh

Перейдите в приложение Discord и просмотрите свои уведомления. Вы увидите ошибку 404, которая указывает, что искомый файл недоступен.

Если Discord установлен на вашем смартфоне, вы также будете получать уведомления на это устройство.

Итак, у вас есть скрипт, который предупреждает вас о проблемах в работе перечисленных сайтов. Теперь давайте настроим автоматический запуск этого скрипта.

5: Автоматизация процесса мониторинга

Один из способов автоматизировать проверку состояния сайтов – создать задачу cron, которая будет запускаться с нужным вам интервалом (например, каждые 5 минут).

Во-первых, вернитесь на свой monitor-server. Прежде чем вы сможете настроить автоматический запуск скрипта, вам необходимо разобраться с правами доступа к файлам и убедиться, что скрипт является исполняемым, иначе он не запустится. Чтобы сделать файл скрипта исполняемым, введите команду:

chmod u+x ~/check_status.sh

Далее выполните следующую, чтобы отредактировать crontab:

crontab -e

Вставьте в этот файл такую строку:

*/5 * * * * /home/your_user/check_status.sh

Наконец, сохраните crontab. После этого ваш скрипт будет запускаться каждые 5 минут.

Заключение

Итак, вы настроили вебхук Discord и создали скрипт, который будет уведомлять вас о возникновении ошибок на вашем веб-сайте. Если хотите, вы можете использовать любой другой язык программирования и написать более сложный бот.

Если вы хотите узнать больше о сценариях оболочки, ознакомьтесь с нашим руководством Написание простого скрипта оболочки.

Больше о вебхуках Discord вы можете узнать в официальной документации Discord.

Tags: , ,

Добавить комментарий