Простые healthcheck-скрипты с уведомлениями в Telegram
Для пары домашних сервисов полноценный мониторинг — перебор. Мне достаточно знать две вещи: работает ли сервис прямо сейчас и когда он упал или поднялся. Всё это умещается в один bash-скрипт и таймер.
Проверяйте то, что видит пользователь
Самая частая ошибка — проверять, что процесс запущен или порт открыт. Сервис может отвечать на рукопожатие и при этом не отдавать данные. Я проверяю настоящий запрос и небольшое скачивание:
code=$(curl -s -o /dev/null -w '%{http_code}' -m 15 https://example.duckdns.org/health)
size=$(curl -s -o /dev/null -w '%{size_download}' -m 20 https://example.duckdns.org/files/256k.bin)
[ "$code" = 200 ] && [ "${size%.*}" = 262144 ] && healthy=1 || healthy=0
Не спамить: сообщать только о смене состояния
STATE=/var/lib/health/state
prev=$(cat "$STATE" 2>/dev/null || echo 1)
if [ "$healthy" != "$prev" ]; then
text=$([ "$healthy" = 1 ] && echo "✅ Снова работает" || echo "❌ Сервис не отвечает")
curl -s "https://api.telegram.org/bot$TG_TOKEN/sendMessage" \
--data-urlencode "chat_id=$TG_CHAT" --data-urlencode "text=$text" >/dev/null
fi
echo "$healthy" > "$STATE"
Ещё одна мелочь, которая спасает от ложных тревог: считать «упавшим» только после двух неудачных проверок подряд. Одиночный таймаут сети не повод будить себя ночью.
Запуск по таймеру
Скрипт запускается systemd-таймером раз в пять минут. Если в скрипте что-то сломается, это сразу видно в journalctl, а не теряется молча, как в cron.
Бота для уведомлений создаёт @BotFather за минуту. Чтобы он мог вам писать, откройте его и нажмите «Start»: до этого Telegram не даст боту отправить первое сообщение.