↓ Перейти к основному содержимому

Мониторинг температуры HDD и NVMe в Uptime Kuma

·1291 слово·7 минут·
Оглавление
Мониторинг температуры дисков в Uptime Kuma

В Uptime Kuma я уже давно отслеживаю доступность своих сервисов. Удобная штука: всё собрано на одном дашборде, а если что-то отваливается — прилетает уведомление в Telegram.

Но захотелось немного большего. А именно — следить за температурой HDD и NVMe прямо из Uptime Kuma.

Готового типа монитора для температуры дисков там нет. Зато есть универсальный механизм Push, позволяющий отправлять состояние любого устройства или сервиса через HTTP API.

В итоге получим монитор, который:

  • Показывает температуру HDD и NVMe.
  • Отслеживает превышение заданного температурного порога.
  • Отправляет уведомление в Telegram при перегреве.
  • Обнаруживает отсутствие обновлений, если скрипт перестал работать.
  • Не требует дополнительных сервисов и агентов.

Всё это реализуем обычным Bash-скриптом, smartctl и cron.

Как это работает
#

Схема предельно простая:

HDD / NVMe
    │
    ▼
  smartctl
    │
    ▼
 Bash-скрипт
    │
    ▼
    curl
    │
    ▼
Uptime Kuma Push API
    │
    ├── Дашборд
    │
    └── Telegram

Скрипт периодически получает температуру дисков через SMART, сравнивает её с установленным порогом и отправляет результат в Uptime Kuma.

Для этого используется endpoint:

http://127.0.0.1:3002/api/push/<TOKEN>

Основные параметры запроса:

ПараметрНазначение
status=upТемпература в норме
status=downТемпература превысила порог
msg=Сообщение о состоянии дисков
ping=Числовое значение, отображаемое как ping

Параметр ping в Push API не управляет интервалом следующего heartbeat. Это числовая метрика задержки, которую Uptime Kuma сохраняет вместе с результатом проверки. Интервал ожидания задаётся в настройках самого Push-монитора.

Поэтому для контроля пропущенных обновлений мы настроим интервал монитора и cron согласованно.

Шаг 1. Устанавливаем smartmontools
#

Для получения температуры дисков будем использовать smartctl из пакета smartmontools.

На Debian, Ubuntu или DietPi:

sudo apt update
sudo apt install -y smartmontools

Если отдельный демон smartd не используется для других задач, его можно отключить:

sudo systemctl disable --now smartd

Сам smartctl при этом продолжит работать. Демон для нашего скрипта не нужен.

Проверяем HDD
#

Для обычного SATA-диска:

sudo smartctl -A /dev/sda

Чтобы вывести только температуру:

sudo smartctl -A /dev/sda | grep -i Temperature_Celsius

Обычно интересующий нас атрибут выглядит примерно так:

194 Temperature_Celsius  0x0022  028  045  000  Old_age  Always  -  28

Последнее поле — текущая температура в градусах Цельсия.

В данном случае это 28.

А если HDD подключён через USB?
#

Здесь есть нюанс.

Некоторые USB-SATA-мосты корректно передают SMART через /dev/sda, другим требуется указать тип устройства с помощью -d sat, а иногда удобнее использовать SCSI-generic устройство /dev/sgX.

Посмотреть доступные устройства:

ls -la /dev/sg*

Проверить:

sudo smartctl -A /dev/sg0

Или попробовать явно указать SAT:

sudo smartctl -A -d sat /dev/sda

У меня диск доступен через /dev/sg0, поэтому при необходимости достаточно заменить путь к HDD в скрипте.

Проверяем NVMe
#

С NVMe всё немного интереснее:

sudo smartctl -A /dev/nvme0n1

Пример вывода:

Temperature:                        48 Celsius
Temperature Sensor 1:               46 Celsius
Temperature Sensor 2:               55 Celsius

У NVMe может быть несколько температурных датчиков:

  • Composite Temperature — общая температура устройства.
  • Temperature Sensor 1–8 — дополнительные датчики контроллера, памяти и других компонентов, если они поддерживаются накопителем.

Я решил ориентироваться на максимальную температуру среди доступных датчиков.

Так мы не пропустим ситуацию, когда один из компонентов NVMe заметно горячее остальных.

На моём DietPi обычные температуры примерно такие:

УстройствоТемпература
HDD28–30 °C
NVMe46–56 °C

Шаг 2. Создаём Push-монитор в Uptime Kuma
#

Открываем веб-интерфейс Uptime Kuma.

Выбираем:

Add New Monitor → Push

Указываем:

Friendly Name: HDD Temp
Heartbeat Interval: 120

Сохраняем монитор.

После создания Uptime Kuma покажет Push URL, примерно такого вида:

http://127.0.0.1:3002/api/push/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Эта ссылка содержит уникальный токен, по которому скрипт будет отправлять данные.

Сохраняем её — она понадобится дальше.

Шаг 3. Пишем скрипт мониторинга
#

Создадим файл:

nano /root/scripts/kuma-hdd-temp.sh

Вставляем следующий код: kuma-hdd-temp.sh.

Здесь есть несколько важных моментов.

  • мы проверяем оба диска независимо. Если один накопитель перестанет отдавать температуру, монитор не останется зелёным только потому, что второй диск работает нормально.

  • максимальная температура NVMe вычисляется по всем доступным датчикам, которые удалось распознать.

  • при ошибке отправки curl скрипт возвращает ненулевой код завершения. Это удобно для диагностики и проверки через cron.

  • если smartctl отсутствует, скрипт попытается отправить состояние down, вместо того чтобы просто завершиться без уведомления.

Для USB-диска, который доступен через /dev/sg0, меняем:

HDD_DEVICE="/dev/sg0"

Если USB-мост требует -d sat, эту опцию нужно добавить в вызов smartctl для HDD.

Почему порог 75 °C?
#

Первоначально я пробовал выставить 50 °C.

Но выяснилось, что NVMe вполне спокойно работает при 55–56 °C ну я и рещшил повыше задрать.

Поэтому для своей конфигурации я остановился на значении:

THRESHOLD=75

Это не универсальная рекомендация для всех дисков. Допустимые температуры зависят от конкретной модели HDD или NVMe

Для более точного мониторинга лучше использовать отдельные пороги для HDD и NVMe.

Шаг 4. Настраиваем cron
#

Делаем скрипт исполняемым:

chmod +x /root/scripts/kuma-hdd-temp.sh

Поскольку чтение SMART и запись в системный лог требуют соответствующих прав, запускаем скрипт от root (но надо подумать потом иначе).

Открываем crontab:

sudo crontab -e

Добавляем:

*/2 * * * * /root/scripts/kuma-hdd-temp.sh

Теперь каждые две минуты скрипт будет опрашивать диски и отправлять состояние в Uptime Kuma.

Обратите внимание: в настройках Push-монитора мы тоже указали интервал 120 секунд.

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

Если скрипт перестанет присылать обновления, Uptime Kuma через некоторое время отметит монитор как недоступный.

Шаг 5. Проверяем работу
#

Запускаем скрипт вручную:

sudo /root/scripts/kuma-hdd-temp.sh

Смотрим лог:

sudo tail -n 10 /var/log/kuma-hdd-temp.log

При нормальной работе увидим что-то похожее:

2026-10-22 12:00:00 pushed: up (Температура в норме (порог 75C) | HDD 29C | NVMe 54C)

В Uptime Kuma монитор должен стать зелёным.

Шаг 6. Подключаем уведомления Telegram
#

Осталось самое приятное — автоматические уведомления.

Если Telegram уже подключён к Uptime Kuma, достаточно открыть настройки монитора HDD Temp и назначить ему существующий нотификатор.

Теперь при переходе монитора из up в down Kuma отправит сообщение.

Например:

HDD Temp is DOWN

ПЕРЕГРЕВ! NVMe 78C, порог 75C
HDD 29C | NVMe 78C

Когда температура вернётся в норму, монитор снова станет зелёным, а при соответствующих настройках придёт уведомление о восстановлении.

Никакой отдельной интеграции Telegram в Bash-скрипте не требуется — уведомлениями занимается сама Uptime Kuma.

Подводные камни
#

Пока всё это настраивал, успел столкнуться с несколькими интересными моментами.

1. Не путайте ping и heartbeat interval
#

В Push API параметр ping — это значение метрики задержки, а не интервал следующего запроса.

Для периодичности используйте настройки монитора и cron.

Например:

*/2 * * * * /root/scripts/kuma-hdd-temp.sh

А в Uptime Kuma задайте подходящий Heartbeat Interval.

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

2. NVMe может быть заметно горячее HDD
#

У меня HDD обычно держится около 30 °C, а NVMe может достигать 55–56 °C даже без каких-то экстремальных нагрузок.

Поэтому один общий порог — компромисс.

Для более серьёзного мониторинга лучше сделать два отдельных Push-монитора:

  • HDD Temp со своим порогом.
  • NVMe Temp со своим порогом.

Но для домашнего сервера мне пока достаточно одного общего монитора.

4. У ATA температура находится в последнем поле
#

Для атрибута Temperature_Celsius значение обычно находится в последнем поле вывода smartctl.

Поэтому используем:

awk '/Temperature_Celsius/ {print $NF}'

А не:

awk '/Temperature_Celsius/ {print $(NF-1)}'

В моём случае предпоследнее поле содержало прочерк, из-за чего парсинг возвращал мусор.

При этом формат SMART-атрибутов зависит от накопителя, поэтому на других моделях вывод стоит проверить отдельно.

6. Ошибка чтения температуры тоже должна быть аварией
#

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

В результате монитор мог оставаться зелёным.

В обновлённой версии это исправлено: если хотя бы один ожидаемый диск не удалось опросить, скрипт отправляет status=down.

Так мы отслеживаем не только перегрев, но и работоспособность самого механизма мониторинга.

Что получилось
#

В итоге у меня появился ещё один монитор на дашборде Uptime Kuma — HDD Temp.

Каждые две минуты Bash-скрипт опрашивает SMART, определяет температуру HDD и NVMe и отправляет результат в Kuma.

Если всё хорошо — монитор зелёный.

Если диск перегревается или перестаёт отдавать температуру — монитор становится красным, а Telegram присылает уведомление.

При этом не понадобились ни Prometheus, ни Grafana, ни дополнительные агенты мониторинга. Всё работает на уже установленной Uptime Kuma.

PROFFIT!

Related