Uptime Kuma — отличный инструмент для мониторинга доступности сервисов, но в нем нет встроенной поддержки systemd. В этом посте я покажу, как с помощью простого bash-скрипта и Push отслеживать статус systemd сервисов и получать оповещения об измнении их статуса.

Настраиваем Uptime Link to heading

  • Переходим в Uptime Kuma и логинимся
  • Добавляем Группу (чтоб статистика была общая) Нажимаем +Add New monitor
  • Выбираем тип мониторинга Group

Настройки для Group такие: Link to heading

  • Friendly Name: Server (Можете выбрать удобное вам)
  • Heartbeat Interval: 300
  • Retries: 2
  • Heartbeat Retry Interval: 30
  • Resend Notification if Down X times consecutively: 5

  • Нажимаем Save

Добавляем сервис из systemctl Link to heading

  • Добавляем сервис. Нажимаем +Add New monitor
  • Выбираем Monitoring Type: Push
  • Friendly Name: rclone-yandex
  • Push URL: Копируем в буфер и записываем, он нам позже пригодится.
  • Heartbeat Interval: 300
  • Retries: 2
  • Heartbeat Retry Interval: 30
  • Resend Notification if Down X times consecutively: 5
  • Monitoring Group: Выбираем Server, или то что вы указали в Friendly Name на предыдущем шаге.

  • Нажимаем Save

Повторяем Link to heading

Повторяем шаг для всех нужных вам сервисов. Можно через кнопку Clone в уже готовом сервисе. Так будет проще. У меня получились: unbound, rclone-yandex, qbittorrent,vaultwarden.

Создаем скрипт для отправки статуса сервисов Link to heading

  • Создаем файл: /etc/sendstatus.sh
nano /etc/sendstatus.sh
  • Копируем текст в файл:
#!/bin/bash

# Название сервисов и их Push URL до символа ?
# Например ["qbittorrent"]=http://10.1.0.12:3001/api/push/Qwerty
declare -A SERVICES=(
    ["qbittorrent"]="http://10.1.0.12:3001/api/push/zCDfxf232fds"
    ["vaultwarden"]="http://10.1.0.12:3001/api/push/djfhDf23e12"
    ["unbound"]="http://10.1.0.12:3001/api/push/df234SDd98Kdx"
    ["rclone-yandex"]="http://10.1.0.12:3001/api/push/Df23cxsd2"
)
# Перебираем сервисы и отправляем статус в Uptime
for SERVICE in "${!SERVICES[@]}"; do
    URL="${SERVICES[$SERVICE]}"
    if systemctl is-active --quiet "$SERVICE"; then
        # Сервис работает — отправляем UP
        curl -fsS -X GET "$URL?status=up&msg=$SERVICE%20is%20active" > /dev/null
    else
        # Сервис упал — отправляем DOWN
        curl -fsS -X GET "$URL?status=down&msg=$SERVICE%20is%20inactive" > /dev/null
    fi
done
  • В скрипте перечисляем сервисы и их Push URL в секции SERVICES. Т.е у вас должен быть сервис с названием qbittorent, vaultwarden, unbound, rclone-yandex и т.д. Через = указываем Push URL до ?status=up&msg=OK&ping= так как актуальный статус мы будем передавать самим скриптом. Чтобы проверить что у вас сервис присутвует можно выполнить комманду: systemctl list-unit-files | grep rclone. Т.е systemctl list-unit-files | grep <название сервиса>

  • Сохраняем файл /etc/sendstatus.sh

  • Проверяем работу скрипта:

bash /etc/sendstatus.sh
  • Сервисы в Uptime должны сменить статус на UP

  • Делаем файл скрипта исполняемым:
chmod +x /etc/sendstatus.sh
  • Добавляем в crontab
crontab -e
  • Добавляем строку для отправки статуса сервисов каждые 4 минуты
*/4 * * * * /etc/sendstatus.sh
  • Сохраняем и выходим из редактора