DIY Uptime Robot: SMS‑alarm za cenu dvou piv (a proč to nechceš svěřit jen cloudu)
Cloudové služby typu UptimeRobot, BetterStack nebo HetrixTools jsou fajn, dokud free tier nestačí nebo GDPR nepíchne do žeber. Za dvě piva (≈ 120 Kč) rozjedeš plnohodnotný monitor s SMS alarmy na vlastním železe či VPS a budeš mít data pod kontrolou. Ukážu ti, jak na Raspberry Pi 4 (nebo libovolném Debian serveru) spustit Prometheus + Blackbox Exporter + Alertmanager + Grafana, posílat SMS přes Twilio a logovat výpadky do Google Sheets. Všechno open‑source, všechno tvoje.
1 · Proč self‑hosted uptime monitor
- Kontrola dat – výpis IP adres, latence, hlavičky HTTPS zůstávají u tebe.
- GDPR – data fyzicky v EU (či v tvém sklepě).
- Custom checks – TLS expirace, DNS SEC, vlastní API endpointy.
- Flexibilita alertů – Slack, Teams, e‑mail, SMS, Ansible hook…
- Cena – Twilio 0,8 Kč/SMS, zbytek free/open‑source.
2 · Architektura stacku
[Targets] ←→ Blackbox Exporter ↔ Prometheus ↔ Alertmanager ↔ Twilio SMS
↘
↘ Grafana ↔ Public Status Page
Blackbox Exporter aktivně testuje ping/HTTP/TLS. Prometheus scrapuje metriky každých 30 s a uchovává historii. Alertmanager vyhodnocuje pravidla (up==0) a triggeruje SMS. Grafana zobrazuje grafy i public status page typu statuspage.io – bez měsíčního paušálu.
3 · Instalace na Raspberry Pi / VPS
3.1 Předpoklady
- Debian 12 (bookworm) 64‑bit
- Docker + Docker‑Compose
- 1 GB RAM, 10 GB storage
3.2 docker‑compose.yml
version: "3.9"
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prom_data:/prometheus
command:
- "--config.file=/etc/prometheus/prometheus.yml"
blackbox:
image: prom/blackbox-exporter:latest
ports: ["9115:9115"]
volumes:
- ./blackbox.yml:/etc/blackbox/blackbox.yml
alertmanager:
image: prom/alertmanager:latest
ports: ["9093:9093"]
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
grafana:
image: grafana/grafana-oss
ports: ["3000:3000"]
volumes:
prom_data:
Stačí docker compose up -d a běží základní stack.
4 · Blackbox Exporter: ping, HTTP, TCP, TLS
4.1 Konfigurace blackbox.yml
modules:
http_2xx:
prober: http
timeout: 10s
http:
preferred_ip_protocol: "ip4"
tcp_connect:
prober: tcp
timeout: 5s
icmp:
prober: icmp
timeout: 3s
tls_cert:
prober: http
timeout: 10s
http:
tls_config:
insecure_skip_verify: false
preferred_ip_protocol: "ip4"
4.2 Přidání cílů do prometheus.yml
scrape_configs:
- job_name: "blackbox_icmp"
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets:
- 8.8.8.8
- example.cz
- job_name: "blackbox_http"
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://webseidon.cz
- https://posta.cz
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: blackbox:9115
5 · Prometheus scrape a retence
Default retence 15 dní; zvedni na 90 dní:
--storage.tsdb.retention.time=90d
--storage.tsdb.max-block-duration=24h
Při 100 cílů / 30 s periodě zabere cca 5 GB/90 dní.
6 · Alertmanager + Twilio SMS
6.1 Twilio SID, AuthToken, From/To number
6.2 alertmanager.yml
global:
resolve_timeout: 1m
route:
receiver: sms
receivers:
- name: sms
webhook_configs:
- url: "http://sms-gateway:8080/send"
6.3 SMS gateway (tiny‑go server)
func sendSMS(to,msg string){
sid := os.Getenv("TWILIO_SID")
tok := os.Getenv("TWILIO_TOKEN")
from:= os.Getenv("TWILIO_FROM")
twilio.NewClient(sid,tok,nil).Messages.SendMessage(from,to,msg,nil)
}
Alert rule:
- alert: TargetDown
expr: probe_success == 0
for: 1m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} nedostupný"
7 · Grafana dashboard & public status page
- Plugin prometheus‑blackbox‑exporter‑dashboard
- Variable
$instance→ filtr cílů. - Public status: Enable Anonymous View Only, složka
StatusPage. - Crt‑sh embed pro cert‑info pod graf.
8 · Kontrola expirace certifikátu
Metrika probe_ssl_earliest_cert_expiry v Blackboxu. Alert:
- alert: TLS_Expiring_30d
expr: (probe_ssl_earliest_cert_expiry - time()) < 2.592e+06
for: 4h
labels:
severity: warning
annotations:
summary: "Certifikát domény {{$labels.instance}} expíruje do 30 dnů"
9 · Logování do Google Sheets přes Apps Script
9.1 Alertmanager Webhook → Cloud Function
function doPost(e){
var data = JSON.parse(e.postData.contents);
var sheet = SpreadsheetApp.openById('SHEETID').getSheets()[0];
data.alerts.forEach(a=>{
sheet.appendRow([new Date(),a.labels.instance,a.status,a.annotations.summary]);
});
}
Takhle máš historii výpadků pro klienta „na klik“.
10 · Case study: Vlastní Pingdom pro pět klientů
| Parametr | UptimeRobot Pro | DIY Stack |
|---|---|---|
| Počet cílů | 80 | 80 |
| Frekvence | 1 min | 30 s |
| Ukládání 1 rok dat | Business plán 30 €/m | SSD 10 GB (0,5 €/m) |
| Custom TLS alert | Ne | Ano |
| Roční náklad | ≈ 9 000 Kč | ≈ 1 400 Kč |
Návratnost < 2 měsíce, přidaná hodnota – vlastní brandovaná status stránka.
11 · Bezpečnost a hardening
- Raspberry Pi za Nginx reverse proxy + Let’s Encrypt.
- Prometheus jen localhost / VPN; Grafana anonym‑view read‑only.
- Alertmanager
--web.external-url+ basic auth. - Twilio token v Docker Secret, ne v yaml.
- Automatický update image → Watchtower.
12 · Kolik to stojí (spoiler: málo)
- Raspberry Pi 4 2 GB – 1 700 Kč jednorázově (nebo VPS 2 €/m)
- SMS Twilio – 0,038 € ≈ 0,9 Kč za 1 SMS v CZ.
- Doména + DNS API – 150 Kč/rok (status sub‑doména).
- Elektrika Pi – 4 W → 120 Kč/rok.
Suma: první rok ≈ 2 000 Kč, další roky < 400 Kč. Dvě piva měsíčně.
13 · Troubleshooting 101
- Blackbox vrací
tls: handshake timeout - Zvětši
timeout:na 15 s nebo vypni TLS 1.3 fallback. - SMS nechodí
- Chekni Twilio balance a whitelist CZ geo v Console → Messaging → Geo Permissions.
- Grafana neukazuje data
- Datasource URL správně?
http://prometheus:9090v docker net. - Prometheus disk full
- Promtool
delete seriesstaré metriky, zkrať retenci.
14 · Závěr
Nebýt offline je dnes minimální hygiena každého webu. Místo měsíčního paušálu můžeš mít domácí „pingdom“, který víc umí a míň stojí. Raspberry na poličce štěká na výpadek dřív, než Google Bot sníží rank. A ty mezitím můžeš v klidu vypustit psa na louku – server si zkontroluje sám.
Klíčová slova
uptime monitoring, diy uptime robot, raspberry pi monitor, sms alert, twilio api, grafana uptime, prometheus blackbox, tls expiry check, ping monitor, http latency, self hosted status, downtime alert




