Alerty SMS z Uptime Kuma i Grafany z własnego numeru

Sprawdzone z dokumentacją:

W Uptime Kuma dodajesz powiadomienie typu Webhook: Post URL https://smsportal.app/api/v1/gateway/send-sms, Request Body ustawione na Custom Body z JSON-em recipients i message, a w Additional Headers x-api-key oraz Content-Type: application/json. Grafana 12 i Healthchecks.io robią to samo swoim webhookiem. Alert wychodzi SMS-em z Twojego telefonu z Androidem.

Czego potrzebujesz

  • Uptime Kuma 1.23 lub nowszy (opcja Custom Body w powiadomieniu Webhook).
  • Dla Grafany: Grafana 12 lub nowsza na własnym serwerze (Extra Headers i Custom Payload w kontakcie Webhook).
  • Konto smsportal z podłączonym telefonem z Androidem i kartą SIM oraz klucz API (Klucze API → Wygeneruj klucz API).
  • Narzędzie monitorujące działa poza serwerem, który pilnuje (inaczej padnie razem z nim).

Jak wysłać alert SMS z Uptime Kuma

  1. Utwórz powiadomienie Webhook

    W Uptime Kuma otwórz Settings → Notifications → Set Up Notification. Notification Type: Webhook, Friendly Name np. SMS smsportal, Post URL: https://smsportal.app/api/v1/gateway/send-sms. Jeśli Twoja wersja ma pole HTTP Method, zostaw POST.

  2. Wklej własne ciało

    W Request Body wybierz Custom Body i wklej szablon. Buduje krótki tekst DOWN: nazwa - powód albo UP: ..., a filtr json zamienia go na poprawny ciąg JSON, więc cudzysłów w nazwie monitora nie zepsuje żądania. Tekst jest przycinany do 160 znaków.

    Custom Body
    {% capture text %}{% if heartbeatJSON %}{% if heartbeatJSON.status == 0 %}DOWN{% else %}UP{% endif %}: {{ monitorJSON.name }} - {{ heartbeatJSON.msg }}{% else %}{{ msg }}{% endif %}{% endcapture %}
    {
      "recipients": ["+48600100200"],
      "message": {{ text | strip | truncate: 160 | json }}
    }
  3. Dodaj nagłówki

    Włącz Additional Headers i wklej JSON poniżej. Content-Type jest potrzebny: Uptime Kuma wysyła Custom Body jako zwykły tekst bez typu JSON i bez tego nagłówka API nie odczyta pól recipients i message.

    Additional Headers
    {
      "x-api-key": "TWOJ_KLUCZ_API",
      "Content-Type": "application/json"
    }
  4. Przetestuj i przypisz do monitorów

    Kliknij Test: przyjdzie SMS SMS smsportal Testing. Zapisz. Default enabled włącza powiadomienie w nowych monitorach, a Apply on all existing monitors w istniejących. W monitorze ustaw Retries na 1 lub 2, żeby chwilowa czkawka nie budziła Cię w nocy.

  5. Grafana: kontakt Webhook

    W Grafanie otwórz Alerting → Contact points → Add contact point, Integration: Webhook, URL jak wyżej. W Optional Webhook settings dodaj w Extra Headers nagłówek x-api-key z kluczem, a w Custom Payload wklej szablon do Payload Template. Kontakt podepnij w Notification policies. W Grafana Cloud Custom Payload nie jest jeszcze ogólnie dostępny: tam wyślij webhook do n8n i stamtąd SMS.

    Grafana: Payload Template
    {{ coll.Dict "recipients" (coll.Slice "+48600100200") "message" (printf "Grafana %s: %s" (toUpper .Status) .CommonLabels.alertname) | data.ToJSON }}
  6. Healthchecks.io: integracja Webhook

    W projekcie otwórz Integrations → Webhook. W sekcji Execute when a check goes down wybierz POST, wpisz URL API i wypełnij Request Body oraz Request Headers (jeden nagłówek w linii). Sekcję dla stanu up możesz zostawić pustą. $NAME to nazwa checka: nie używaj w niej cudzysłowu, bo zepsuje JSON.

    Healthchecks.io: ciało i nagłówki
    Request Body:
    {"recipients": ["+48600100200"], "message": "Healthchecks: $NAME nie zgłosił się na czas"}
    
    Request Headers:
    x-api-key: TWOJ_KLUCZ_API
    Content-Type: application/json

Gotowe scenariusze

  • Sklep albo strona nie odpowiada

    Monitor HTTP w Uptime Kuma sprawdza stronę co minutę. Po nieudanych próbach (Retries) wychodzi SMS DOWN, a po naprawie UP. Uptime Kuma postaw na innym serwerze niż sklep, np. na małym VPS-ie.

  • Grafana: dysk, błędy 5xx, kolejka

    Reguła alertu w Grafanie (np. wolne miejsce poniżej 10%) wysyła SMS z nazwą alertu i stanem FIRING albo RESOLVED. Jeśli nie chcesz SMS-a o rozwiązaniu, włącz Disable resolved message w kontakcie.

  • Nocna kopia zapasowa się nie zgłosiła

    Skrypt kopii po udanym przebiegu wywołuje adres pingu Healthchecks.io. Gdy ping nie przyjdzie na czas, Healthchecks.io wysyła SMS. Dowiesz się rano, a nie w dniu, w którym kopia będzie potrzebna.

Błędy i rozwiązania

Test zwraca 401
Przyczyna: Brak nagłówka x-api-key, błędny klucz albo nagłówek Authorization zamiast x-api-key.
Co zrobić: Sprawdź Additional Headers. Jeśli Uptime Kuma pisze Additional Headers is not a valid JSON, popraw cudzysłowy i przecinki w JSON-ie.
Test zwraca 400
Przyczyna: Brak Content-Type: application/json, więc API nie widzi pól, albo w panelu nie ma włączonego telefonu.
Co zrobić: Dodaj Content-Type do Additional Headers (w Healthchecks.io do Request Headers). W panelu sprawdź, czy telefon jest włączony.
Test działa, ale przy awarii nie ma SMS-a
Przyczyna: Powiadomienie nie jest zaznaczone w monitorze.
Co zrobić: W edycji monitora zaznacz powiadomienie w sekcji Notifications albo użyj Apply on all existing monitors.
W Grafanie nie ma Custom Payload ani Extra Headers
Przyczyna: Grafana starsza niż 12 albo Grafana Cloud, gdzie Custom Payload nie jest jeszcze ogólnie dostępny.
Co zrobić: Zaktualizuj Grafanę albo wyślij domyślny webhook do n8n, wyciągnij title i zbuduj SMS węzłem HTTP Request.
SMS przychodzi z dużym opóźnieniem albo wcale
Przyczyna: Telefon-bramka był offline. Wiadomość czeka w kolejce do 72 godzin, a potem wygasa.
Co zrobić: Trzymaj telefon na ładowarce, z wyłączoną optymalizacją baterii. Zostaw drugi kanał (e-mail, Telegram) w tym samym monitorze.

Najczęstsze pytania

Czy SMS dojdzie, gdy padnie mój serwer albo internet w biurze?

Tak, jeśli narzędzie monitorujące działa gdzie indziej. Telefon-bramka to osobne urządzenie na danych komórkowych, więc awaria serwera czy biurowego łącza go nie dotyczy. Musi mieć zasilanie i zasięg.

Czy to zastąpi pager albo system dyżurów?

Nie. Jeden telefon to jeden punkt awarii i nie ma eskalacji ani potwierdzania alertów. Traktuj SMS jako jeden z kanałów i dodaj drugi, np. e-mail albo Telegram.

Ile SMS-ów zużyją alerty?

Każda zmiana stanu to jeden SMS na odbiorcę (DOWN i UP to dwa). Pakiet Free ma 300 SMS-ów miesięcznie, Pro 3000. Ustaw Retries, żeby krótkie przerwy nie zjadały limitu. Za SMS płacisz operatorowi w ramach abonamentu karty SIM.

Czy mogę wysłać alert do kilku osób?

Tak. Wpisz kilka numerów w `recipients`, np. `["+48600100200", "+48600100201"]`. Każdy dostanie osobny SMS z Twojego numeru.

Dlaczego mój SMS ma tylko 70 znaków na część?

Polskie znaki albo emotka przełączają kodowanie na UCS-2 i limit spada ze 160 do 70 znaków na część. Szablon w przepisie unika emotek, ale nazwy monitorów z polskimi znakami nadal zmienią kodowanie.

Źródła

  1. Uptime Kuma: kod powiadomienia Webhook (GitHub)
  2. Grafana: Configure webhook notifications
  3. Healthchecks.io: Configuring Notifications
  4. Healthchecks.io: kod integracji Webhook (GitHub)
  5. smsportal: dokumentacja API

Więcej w poradnikach

Wyślij pierwszego SMS-a jeszcze dziś

Załóż darmowe konto, podłącz telefon i sprawdź, jak klienci reagują na wiadomości z Twojego numeru.