Uptime Kuma ile HTTP ve HTTPS Site İzleme
Bir şeylerin bozulduğunu müşteriden öğrenmek, sysadmin kariyerinin en acı anlarından biridir. Geceleri uyurken sunucunun ne zaman düştüğünü, kaç dakika erişilemez kaldığını bilmemek gerçekten rahatsız edici. Uptime Kuma bu problemi çok minimal bir kurulumla çözüyor ve açık kaynak olması, self-hosted çalışması bu aracı özellikle Türkiye’deki sistemciler için cazip kılıyor.
Bu yazıda HTTP ve HTTPS site izlemeye odaklanacağız. Sadece “şu URL’i izle” seviyesinde değil, SSL sertifika kontrolü, özel HTTP başlıkları, kimlik doğrulama gerektiren endpoint’lerin izlenmesi ve webhook bildirimleri gibi konuları da ele alacağız. Kurulum kısmını hızlı geçip asıl konuya geleceğiz çünkü Docker ile kurulum zaten beş dakika.
Kurulum: Hızlı Geçelim
Docker Compose ile kurmak en temizi. Bir docker-compose.yml dosyası oluşturun:
mkdir -p /opt/uptime-kuma && cd /opt/uptime-kuma
nano docker-compose.yml
version: '3.8'
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: always
ports:
- "3001:3001"
volumes:
- ./data:/app/data
environment:
- TZ=Europe/Istanbul
docker compose up -d
docker compose logs -f uptime-kuma
Logda hata yoksa http://sunucu-ip:3001 adresine gidin, admin hesabı oluşturun, bitti. Bu kadar. Şimdi asıl işe gelelim.
HTTP İzleme: Temel Ayarlar ve Sık Yapılan Hatalar
Uptime Kuma’da “Add New Monitor” butonuna tıkladığınızda sizi bir form karşılıyor. Monitor Type olarak HTTP(s) seçtiğinizde önemli alanlar şunlar:
- URL: İzlenecek adres. Burada dikkat edilmesi gereken nokta;
http://ilehttps://arasındaki fark sadece protokol değil, yönlendirme davranışı açısından da önemli. - Heartbeat Interval: Kaç saniyede bir kontrol yapılacak. Default 60 saniye, production’da 30 saniye makul.
- Retries: Hata sayılmadan önce kaç deneme yapılacak. 3 değeri genellikle yeterli.
- Retry Interval: Denemeler arası bekleme süresi.
- Request Timeout: İstek zaman aşımı. Default 48 saniye aşırı yüksek, ben genellikle 10-15 saniyeye çekiyorum.
Sık yapılan hata şu: URL olarak http://domain.com giriyorsunuz, siteniz https://domain.com‘a yönlendiriyor ve Uptime Kuma bu yönlendirmeyi takip ediyor, her şey yeşil görünüyor. Ama aslında siz HTTP’yi değil, HTTPS’i izliyorsunuz demektir. Eğer HTTP’den HTTPS’e yönlendirmenin kendisini izlemek istiyorsanız, Advanced bölümünde “Max Redirects” değerini 0 yapın. Bu durumda yönlendirme olduğunda 3xx dönecek ve bunu da “Accepted Status Codes” kısmında 301 veya 302 olarak kabul edebilirsiniz.
# Komut satırından test etmek için
curl -I -L http://domain.com
# -L olmadan sadece yönlendirme header'larını görmek için
curl -I http://domain.com
HTTPS İzleme ve SSL Sertifika Takibi
HTTPS monitörü eklerken Uptime Kuma otomatik olarak SSL sertifikasını da kontrol ediyor. Advanced sekmesinde şu ayarlar kritik:
- Certificate Expiry Notification: SSL sertifikasının dolmasına kaç gün kala uyarı gönderilsin. Ben bunu 30 gün yapıyorum, 14 günde bir de tekrar uyarı geliyor zaten.
- Ignore TLS/SSL Error: Bu seçeneği asla açmayın production ortamlarında. Geliştirme ortamları için self-signed sertifika olan bir şeyi izliyorsanız tamam, ama production’da bu seçenek açıksa sertifika sorunlarını göremezsiniz.
Gerçek dünyadan bir örnek: Bir müşterimizin sitesi Let’s Encrypt kullanıyordu. Certbot’un cronjob’u bir güncelleme sonrası çalışmaz hale geldi, sertifika yenilemedi. Site HTTPS üzerinden çalışmaya devam ediyordu (browsers cached connection) ama sertifika 3 gün içinde dolacaktı. Uptime Kuma’nın SSL uyarısı olmasaydı, müşteri “neden siteye giremiyorum” diye arayacaktı.
# Sertifika süresini manuel kontrol
openssl s_client -connect domain.com:443 -servername domain.com 2>/dev/null | openssl x509 -noout -dates
# Daha okunabilir format
echo | openssl s_client -connect domain.com:443 -servername domain.com 2>/dev/null
| openssl x509 -noout -enddate | cut -d= -f2
Keyword Monitoring: Sayfa İçeriği Doğrulama
HTTP 200 döndürmek bir sayfanın çalıştığını garanti etmez. Veritabanı bağlantısı kopmuş bir WordPress sitesi hala 200 döndürebilir, ama içerikte hata mesajı gösterebilir. Bunun için Uptime Kuma’da Keyword özelliğini kullanın.
Monitor Type olarak HTTP(s) – Keyword seçildiğinde, yanıt içinde araması gereken bir kelime veya ifade tanımlarsınız. Sayfa içeriğinde bu kelime yoksa, HTTP 200 gelse bile monitor hata verir.
Pratik kullanım örnekleri:
- E-ticaret sitesi için:
sepete ekleveyaadd to cartkelimesi aranabilir - Blog için: Ana sayfadaki bir kategorinin adı
- API için:
"status":"ok"veya"success":true
Keyword Type ayarına dikkat edin:
- Contains: Yanıt bu kelimeyi içeriyorsa UP
- Not Contains: Yanıt bu kelimeyi içermiyorsa UP (hata sayfalarını yakalamak için kullanışlı, örneğin
Errorveya500 Internal Server Errorkelimelerini arayıp bunları görmüyorsa UP demek)
# Curl ile keyword testini simüle etmek
curl -s https://domain.com | grep -i "sepete ekle"
# HTTP status ve keyword birlikte
curl -s -o /dev/null -w "%{http_code}" https://domain.com &&
curl -s https://domain.com | grep -c "sepete ekle"
Kimlik Doğrulama Gerektiren Endpoint’lerin İzlenmesi
Admin paneli, API endpoint’leri veya Basic Auth korumalı sayfaları izlemek için Advanced bölümündeki seçenekleri kullanmanız gerekiyor.
Basic Authentication
Uptime Kuma’nın arayüzünde doğrudan URL’e credential gömmek yerine ayrı alanlar var:
- HTTP Username: Kullanıcı adı
- HTTP Password: Şifre
Bu credentiallar şifreli saklanmıyor dikkat edin, sadece base64 encode ediliyor. Uptime Kuma’nın çalıştığı sunucuya erişim güvenliğine önem verin.
Bearer Token ile API İzleme
API endpoint’lerini izlerken çoğunlukla Authorization header’ı gerekiyor. Bunun için Custom Headers alanını kullanın:
# Test etmek için
curl -H "Authorization: Bearer TOKEN_BURAYA"
-H "Content-Type: application/json"
https://api.domain.com/health
Uptime Kuma’da Custom Headers alanına şöyle girersiniz:
{
"Authorization": "Bearer TOKEN_BURAYA",
"Content-Type": "application/json",
"X-API-Key": "api-key-degeri"
}
POST Request ile Monitoring
Bazı health check endpoint’leri GET değil POST kabul ediyor. Body seçeneği ile bunu yapabilirsiniz:
- Method: POST olarak ayarlayın
- Body: JSON veya form data
# POST endpoint testi
curl -X POST
-H "Content-Type: application/json"
-d '{"check": "health"}'
https://api.domain.com/status
Uptime Kuma API ile Otomatik Monitor Ekleme
Elinizde onlarca site varsa arayüzden tek tek girmek zaman kaybı. Uptime Kuma’nın REST API’si var, bunu kullanarak toplu işlem yapabilirsiniz.
Önce API ile token alın:
# Login ve token alma
curl -X POST http://localhost:3001/api/v1/login
-H "Content-Type: application/json"
-d '{"username": "admin", "password": "sifreniz"}'
Ardından bu token ile monitor ekleyebilirsiniz. Daha pratik yolu ise Uptime Kuma’nın Socket.io tabanlı API’sini kullanan uptime-kuma-api Python kütüphanesi:
pip install uptime-kuma-api
from uptime_kuma_api import UptimeKumaApi, MonitorType
api = UptimeKumaApi('http://localhost:3001')
api.login('admin', 'sifreniz')
# Site listesinden toplu monitor ekleme
siteler = [
{"name": "Ana Site", "url": "https://domain.com"},
{"name": "Blog", "url": "https://blog.domain.com"},
{"name": "API", "url": "https://api.domain.com/health"},
]
for site in siteler:
api.add_monitor(
type=MonitorType.HTTP,
name=site["name"],
url=site["url"],
interval=60,
retryInterval=60,
maxretries=3,
timeout=15,
expiryNotification=True,
ignoreTls=False,
)
print(f"{site['name']} eklendi")
api.disconnect()
Bildirim Kanalları: Telegram ve Slack
Monitor kurmanın yarısı, bildirim kanalını doğru ayarlamak. Türkiye’de en yaygın kullandığımız iki kanal Telegram ve Slack.
Telegram Bot Kurulumu
# BotFather'dan token aldıktan sonra chat ID öğrenmek için
curl https://api.telegram.org/botTOKEN/getUpdates
# Test mesajı göndermek
curl -X POST
"https://api.telegram.org/botTOKEN/sendMessage"
-d "chat_id=CHAT_ID&text=Uptime Kuma test mesajı"
Uptime Kuma’da Settings > Notifications > Add Notification bölümünden Telegram seçin. Bot token ve chat ID’yi girin. Bildirim tipi olarak şunları seçebilirsiniz:
- Down: Site erişilemez olduğunda
- Up: Site tekrar erişilebilir olduğunda
- Certificate Expiry: SSL sertifikası dolmak üzere
Uptime Kuma’nın mesaj şablonunu özelleştiremiyorsunuz doğrudan, ama gelen mesaj formatı oldukça okunabilir.
Webhook ile Özel Entegrasyonlar
Webhook bildirimi ile kendi sistemlerinize sinyal gönderebilirsiniz. Down olduğunda otomatik restart script’i tetiklemek gibi:
#!/bin/bash
# /opt/scripts/auto-restart.sh
# Uptime Kuma webhook'u bu scripti tetikleyecek
LOG_FILE="/var/log/auto-restart.log"
SERVICE_NAME="nginx"
echo "$(date): Restart tetiklendi" >> $LOG_FILE
systemctl restart $SERVICE_NAME
if systemctl is-active --quiet $SERVICE_NAME; then
echo "$(date): $SERVICE_NAME başarıyla yeniden başlatıldı" >> $LOG_FILE
else
echo "$(date): HATA - $SERVICE_NAME başlatılamadı" >> $LOG_FILE
# Buraya eskalasyon logiği eklenebilir
fi
Bu scripti basit bir Flask uygulaması ile sarabilirsiniz:
from flask import Flask, request
import subprocess
import logging
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
@app.route('/webhook/restart', methods=['POST'])
def handle_restart():
data = request.json
if data.get('heartbeat', {}).get('status') == 0: # 0 = DOWN
monitor_name = data.get('monitor', {}).get('name', 'bilinmiyor')
logging.info(f"Down sinyali alındı: {monitor_name}")
subprocess.run(['/opt/scripts/auto-restart.sh'], capture_output=True)
return {'status': 'restart tetiklendi'}, 200
return {'status': 'işlem yapılmadı'}, 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Status Page: Müşterilere Şeffaflık
Uptime Kuma’nın en değerli özelliklerinden biri public status page. Müşterilerinize veya kullanıcılarınıza sistemlerin durumunu gösterebileceğiniz bir sayfa oluşturabilirsiniz.
Status Page oluştururken dikkat edilecekler:
- Slug: URL’de kullanılacak kısım.
status.domain.comşeklinde özel domain bağlayabilirsiniz. - Monitor grupları: İlişkili monitörleri gruplayın. Örneğin “Altyapı” grubunda sunucu monitörleri, “Uygulamalar” grubunda site monitörleri.
- Maintenance zamanlamaları: Planlı bakım için önceden bildirim ekleyebilirsiniz.
Status page’i kendi domain’inize bağlamak için Nginx reverse proxy kullanabilirsiniz:
# /etc/nginx/sites-available/status.domain.com
server {
listen 80;
server_name status.domain.com;
location / {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
ln -s /etc/nginx/sites-available/status.domain.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
# Ardından Certbot ile SSL ekleyin
certbot --nginx -d status.domain.com
Backup ve Veri Yönetimi
Uptime Kuma tüm verilerini SQLite dosyasında tutuyor. Düzenli yedek almak için basit bir script:
#!/bin/bash
# /opt/scripts/uptime-kuma-backup.sh
BACKUP_DIR="/opt/backups/uptime-kuma"
SOURCE_DIR="/opt/uptime-kuma/data"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
mkdir -p $BACKUP_DIR
# Container'ı durdurmadan yedek almak için WAL modunu kullanıyoruz
# SQLite WAL modu aktifse bu güvenli
docker exec uptime-kuma sqlite3 /app/data/kuma.db ".backup '/app/data/kuma_backup.db'"
cp $SOURCE_DIR/kuma_backup.db $BACKUP_DIR/kuma_$DATE.db
# Eski yedekleri temizle
find $BACKUP_DIR -name "*.db" -mtime +$RETENTION_DAYS -delete
echo "Yedek alındı: kuma_$DATE.db"
chmod +x /opt/scripts/uptime-kuma-backup.sh
# Crontab'a ekle
echo "0 2 * * * /opt/scripts/uptime-kuma-backup.sh >> /var/log/kuma-backup.log 2>&1" | crontab -
Uptime Kuma’nın Kendisini Kim İzliyor?
Bu bir özyinelemeli problem gibi görünse de gerçek bir soru. Uptime Kuma’nın kurulu olduğu sunucu çöktüğünde sizi kim bildirecek? Bunun için harici bir servis veya başka bir sunucuda ikinci bir Uptime Kuma kurmanız gerekiyor.
Pratik çözüm: Ücretsiz tier’ı olan harici bir uptime servisi (UptimeRobot free plan veya Freshping) ile sadece Uptime Kuma’nın status page URL’ini izletin. Böylece Uptime Kuma erişilemez olduğunda dış dünyadan uyarı alırsınız.
Alternatif olarak, basit bir heartbeat script’i yazıp cron’a ekleyebilirsiniz:
#!/bin/bash
# /opt/scripts/kuma-heartbeat.sh
# Bu script Uptime Kuma'nın push monitor URL'ine ping atar
# Cron'dan çalışmaması durumunda Uptime Kuma sizi uyarır
PUSH_URL="https://uptime-kuma.domain.com/api/push/TOKEN?status=up&msg=OK&ping="
curl -s "$PUSH_URL" > /dev/null
# Her 5 dakikada bir çalıştır
*/5 * * * * /opt/scripts/kuma-heartbeat.sh
Bu yaklaşımda Uptime Kuma’da bir Push tipi monitor oluşturuyorsunuz. Script push URL’ine düzenli olarak istek atmıyor ise Uptime Kuma’nın bu monitörü DOWN olarak işaretleyip sizi uyarması gerekiyor.
Sonuç
Uptime Kuma, karmaşık monitoring stack’leri kurmaya gerek kalmadan HTTP/HTTPS izleme için ihtiyaç duyduğunuz neredeyse her şeyi sunuyor. SSL sertifika takibi, keyword monitoring, özel header’larla API izleme ve güzel bir status page; bunların hepsi tek bir Docker container içinde geliyor.
Yıllar içinde birçok monitoring aracı kullandım; Zabbix, Nagios, Prometheus/Grafana kombinasyonları. Bunların hepsinin yeri var, ama basit HTTP izleme için Uptime Kuma’nın kurulum kolaylığı ve arayüz sadeliği gerçekten fark yaratıyor. Özellikle müşterilere gösterecek bir status page ihtiyacı varsa, alternatiflerle kıyaslandığında çok daha az eforla halledilebiliyor.
Dikkat edilmesi gereken nokta: Uptime Kuma production-grade büyük altyapılar için tek başına yeterli değil. Metrik toplama, anomali tespiti, capacity planning gibi ihtiyaçlarınız varsa Prometheus ekosistemi ile tamamlamak gerekiyor. Ama “sitem çalışıyor mu, SSL’i ne zaman doluyor, API’m yanıt veriyor mu” sorularının cevabını hızlıca almak için mükemmel bir araç.
