
В 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 обычные температуры примерно такие:
| Устройство | Температура |
|---|---|
| HDD | 28–30 °C |
| NVMe | 46–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!


