Uptime Kuma Nedir: Açık Kaynak Uptime İzleme Aracı

Sunucuların düzgün çalışıp çalışmadığını kontrol etmek için bir zamanlar elle yazılmış bash scriptleri, cron job’lar ve “acaba site açık mıdır” diye tarayıcıyı yenileme döngüleri vardı hayatımızda. Sonra Nagios, Zabbix, Prometheus gibi devler çıktı ama bunların kurulumu ve konfigürasyonu için bazen neredeyse bir tam iş günü harcamak gerekiyordu. Uptime Kuma tam bu noktada devreye giriyor: Basit, güzel arayüzlü, kendi sunucunuzda çalışan ve beş dakikada ayağa kaldırabileceğiniz bir uptime izleme aracı.

Uptime Kuma Nedir?

Uptime Kuma, Louis Lam tarafından geliştirilen ve aktif şekilde topluluk katkısıyla büyüyen açık kaynaklı bir servis izleme aracıdır. Node.js ve Vue.js ile yazılmıştır. Self-hosted çalışır, yani verileriniz sizin sunucunuzdadır. Herhangi bir üçüncü tarafa bağımlılığınız yoktur.

Temel olarak şunları yapabilirsiniz:

  • HTTP/HTTPS endpointlerini izlemek
  • TCP portlarını kontrol etmek
  • Ping ile cihaz erişilebilirliğini ölçmek
  • DNS kayıtlarını doğrulamak
  • SSL sertifika süresini takip etmek
  • Docker container durumlarını izlemek
  • Database bağlantılarını kontrol etmek (MySQL, PostgreSQL, Redis, MongoDB)
  • Heartbeat izleme ile cron job’larınızın düzenli çalışıp çalışmadığını görmek

Arayüzü gerçekten temiz. Statuspage oluşturabiliyorsunuz, bildirimler için onlarca entegrasyon var (Slack, Telegram, PagerDuty, webhook, e-posta ve daha fazlası). Üstelik tüm bunlar için bir kuruş ödeme yapmıyorsunuz.

Kurulum Yöntemleri

Docker ile Kurulum (Önerilen Yöntem)

Prodüksiyonda Docker olmadan Uptime Kuma kurmak biraz naif olur. Güncelleme kolaylığı, izolasyon ve taşınabilirlik açısından Docker her zaman birinci tercih.

docker run -d 
  --restart=always 
  -p 3001:3001 
  -v uptime-kuma:/app/data 
  --name uptime-kuma 
  louislam/uptime-kuma:1

Bu kadar. Gerçekten bu kadar. Tarayıcıdan http://sunucu-ip:3001 adresine girip admin hesabınızı oluşturabilirsiniz.

Docker Compose ile Kurulum

Uzun vadeli yönetim için Docker Compose tercih edin. Özellikle başka servislerle birlikte çalışıyorsanız bu yaklaşım çok daha kontrol edilebilir bir ortam sunar.

version: '3.8'

services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: always
    ports:
      - "3001:3001"
    volumes:
      - ./uptime-kuma-data:/app/data
    environment:
      - TZ=Europe/Istanbul
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge
docker compose up -d
docker compose logs -f uptime-kuma

TZ=Europe/Istanbul parametresini koymayı unutmayın. Loglar ve bildirimler üzerindeki zaman damgalarının Türkiye saatiyle eşleşmesi ciddi fark yaratır. Prodüksiyonda bir incident sırasında UTC ile TST arasında kafa karışıklığı yaşamak istemezsiniz.

Nginx Reverse Proxy ile SSL Sonlandırma

Port 3001’i doğrudan internete açmayın. Bir reverse proxy arkasına alın.

server {
    listen 80;
    server_name uptime.sirketiniz.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name uptime.sirketiniz.com;

    ssl_certificate /etc/letsencrypt/live/uptime.sirketiniz.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/uptime.sirketiniz.com/privkey.pem;

    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;
    }
}

WebSocket header’larını (Upgrade ve Connection) eklemeyi es geçmeyin. Uptime Kuma gerçek zamanlı veri güncellemeleri için WebSocket kullanır. Bu header’lar olmadan arayüz donuk görünür, veriler sayfayı yenilemedikçe güncellenmez.

Monitor Türleri ve Gerçek Dünya Kullanımı

HTTP/HTTPS İzleme

En çok kullanılan monitor türü. Bir URL’e GET ya da HEAD isteği gönderir ve dönen HTTP durum kodunu kontrol eder. Ama asıl güç, keyword kontrolünde saklı.

Diyelim ki bir e-ticaret sitesini yönetiyorsunuz. Site 200 dönüyor ama ödeme sayfası bozuk. Standart HTTP monitörü bunu yakalamaz. Keyword monitörü ile /checkout sayfasında “Ödeme Yap” butonunun HTML içinde var olup olmadığını kontrol edebilirsiniz. Bu, “site açık” ile “site gerçekten çalışıyor” arasındaki farkı kapatır.

TCP Port İzleme

Veritabanı portlarını, SMTP sunucularını, özel uygulama portlarını izlemek için kullanılır.

# Uptime Kuma ile izlemek istediğiniz servisleri manuel test etmek isterseniz
nc -zv 10.0.1.50 5432  # PostgreSQL
nc -zv 10.0.1.50 6379  # Redis
nc -zv 10.0.1.50 27017 # MongoDB

Bu portlar Uptime Kuma arayüzünde TCP türü monitor olarak eklendiğinde, her kontrol intervalinde bağlantı denemesi yapılır.

Heartbeat Monitörleri

Bu özellik pek çok kişinin gözden kaçırdığı ama gerçekten değerli bir şey. Senaryo şu: Bir cron job var, her gece veritabanı yedeği alıyor. Cron çalışmayı bıraktığında nasıl haberdar olacaksınız? Cron’un kendisini izlemek karmaşıklaşır. Heartbeat monitörü ile iş tersine çevrilir; cron job, Uptime Kuma’ya “ben buradayım” diye sinyal gönderir. Belirlenen sürede sinyal gelmezse alarm tetiklenir.

# Cron job'ın sonuna eklenecek satır
# Push URL'yi Uptime Kuma'dan "Push" tipinde monitor oluştururken alırsınız
curl -fsS --retry 3 "https://uptime.sirketiniz.com/api/push/AbCdEfGhIj?status=up&msg=OK&ping="

# Bir yedekleme scriptinin sonuna entegre örnek
#!/bin/bash
PUSH_URL="https://uptime.sirketiniz.com/api/push/AbCdEfGhIj"

# Yedekleme işlemi
pg_dump -U postgres mydb > /backup/mydb_$(date +%Y%m%d).sql

if [ $? -eq 0 ]; then
    curl -fsS "${PUSH_URL}?status=up&msg=Yedekleme+basarili&ping="
else
    curl -fsS "${PUSH_URL}?status=down&msg=Yedekleme+basarisiz&ping="
fi

Docker Container İzleme

Uptime Kuma’yı Docker socket’e erişimli çalıştırırsanız, aynı host üzerindeki container’ların durumunu izleyebilirsiniz.

version: '3.8'

services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: always
    ports:
      - "3001:3001"
    volumes:
      - ./uptime-kuma-data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - TZ=Europe/Istanbul

:ro ile Docker socket’i read-only bağlamak güvenlik açısından iyi bir pratik. Container isimlerini Uptime Kuma’da Docker Container türü monitor olarak eklediğinizde, container’ın çalışıp çalışmadığını görebilirsiniz.

Bildirim Entegrasyonları

Telegram Bildirimleri

Telegram, Türkiye’deki ekiplerin tercih ettiği kanalların başında geliyor. Kurulumu da oldukça basit.

  1. BotFather ile yeni bir bot oluşturun, token alın
  2. Bota bir mesaj gönderin, sonra https://api.telegram.org/bot/getUpdates adresinden chat ID’nizi bulun
  3. Uptime Kuma’da Settings > Notifications > Telegram bölümüne token ve chat ID’yi girin

Grup kanallarına bildirim göndermek de mümkün. Birden fazla kişinin takip etmesi gereken kritik altyapı için bir Telegram grubu oluşturun ve bot’u o gruba ekleyin. Tüm ekip anlık haberdar olur.

Webhook ile Özel Entegrasyon

Uptime Kuma’nın webhook desteği, kendi iç sistemlerinize veya Mattermost gibi self-hosted chat araçlarına entegrasyon için güçlü bir seçenek.

# Webhook'un gönderdiği payload örneği - test etmek için
curl -X POST https://your-webhook-endpoint.com/alert 
  -H "Content-Type: application/json" 
  -d '{
    "heartbeat": {
      "status": 0,
      "time": "2024-01-15 14:30:00",
      "msg": "Connection refused"
    },
    "monitor": {
      "name": "Production API",
      "url": "https://api.sirketiniz.com/health"
    }
  }'

Status Page Oluşturmak

Uptime Kuma’nın en sevdiğim özelliklerinden biri status page. Tek tıkla, müşterilerinize veya iç ekibinize gösterebileceğiniz temiz bir durum sayfası oluşturabilirsiniz.

Status page oluşturmak için:

  1. Sol menüden “Status Page” seçin
  2. “New Status Page” butonuna tıklayın
  3. Sayfa adı ve slug belirleyin (örneğin status.sirketiniz.com)
  4. İzlemek istediğiniz monitor’ları ekleyin
  5. Logo, renk ve açıklama özelleştirmesi yapın

Status page için custom domain kullanmak istiyorsanız, nginx konfigürasyonuna yeni bir server block ekleyip proxy_pass’ı http://localhost:3001/status/slug-adiniz olarak ayarlamanız yeterli.

Müşterilerinizden önce siz haberdar olmak istiyorsunuz elbette, ama bir şey patladığında müşterilerin “site mi çöktü yoksa internet bağlantım mı bozuk” sorusunu status page ile yanıtlamış olursunuz. Destek ekiplerinize gelen gereksiz çağrı sayısı ciddi oranda düşer.

Güvenlik ve Erişim Kontrolü

Temel Güvenlik Önlemleri

Uptime Kuma kurulu sunucunuzun dışarıya sadece 80 ve 443 portları açık olmalı. 3001 portunu doğrudan internete açmayın.

# UFW ile port kısıtlaması
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw deny 3001/tcp
ufw enable
ufw status verbose

Uptime Kuma kendi içinde kullanıcı adı/şifre yönetimi sunuyor ama 2FA (Two-Factor Authentication) desteği de var. Özellikle Uptime Kuma arayüzü internete açıksa 2FA’yı aktif edin.

Güvenilir IP Listesi ile Kısıtlama

Eğer Uptime Kuma’ya sadece belirli IP adreslerinden erişilmesini istiyorsanız, nginx level’ında bunu kısıtlayabilirsiniz:

server {
    listen 443 ssl http2;
    server_name uptime.sirketiniz.com;

    # Sadece ofis IP ve VPN IP'ye izin ver
    allow 203.0.113.50;
    allow 10.8.0.0/24;
    deny all;

    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;
    }
}

Yedekleme ve Güncelleme Stratejisi

Veri Yedekleme

Tüm Uptime Kuma verisi SQLite database’inde tutulur, /app/data dizininde. Volume mount ettiğiniz için bu dizin host’unuzda bulunuyor.

#!/bin/bash
# uptime-kuma-backup.sh
BACKUP_DIR="/opt/backups/uptime-kuma"
DATA_DIR="/opt/uptime-kuma-data"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# Container'ı kısa süreliğine durdur, tutarlı yedek al
docker stop uptime-kuma
cp -r "$DATA_DIR" "$BACKUP_DIR/uptime-kuma-data-$DATE"
tar -czf "$BACKUP_DIR/uptime-kuma-$DATE.tar.gz" -C "$BACKUP_DIR" "uptime-kuma-data-$DATE"
rm -rf "$BACKUP_DIR/uptime-kuma-data-$DATE"
docker start uptime-kuma

# 30 günden eski yedekleri sil
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete

echo "Yedekleme tamamlandi: uptime-kuma-$DATE.tar.gz"

Güncelleme Prosedürü

# Mevcut container'ı durdur ve sil
docker stop uptime-kuma
docker rm uptime-kuma

# Son image'ı çek
docker pull louislam/uptime-kuma:1

# Container'ı yeniden başlat (veri volume'u korunur)
docker run -d 
  --restart=always 
  -p 3001:3001 
  -v uptime-kuma:/app/data 
  --name uptime-kuma 
  louislam/uptime-kuma:1

# Logları kontrol et
docker logs -f uptime-kuma

Docker Compose kullanıyorsanız daha da basit:

docker compose pull
docker compose up -d
docker compose logs -f uptime-kuma

Gerçek Dünya Senaryosu: Küçük Ölçekli SaaS Altyapısı

Bir senaryoyu somutlaştıralım. On farklı müşteriye SaaS çözümü sunan, Türkiye merkezli küçük bir yazılım şirketi düşünün. Altyapıda şunlar var:

  • 3 uygulama sunucusu
  • 2 veritabanı sunucusu (master/slave)
  • 1 Redis cache sunucusu
  • 1 Elasticsearch node’u
  • 10 müşteri için ayrı subdomain’ler
  • Gece çalışan 5 kritik cron job

Bu altyapı için Uptime Kuma’da şunları tanımlayabilirsiniz:

HTTP Monitörleri:

  • Her müşteri subdomain’i için health check endpoint’i (10 adet)
  • API gateway health endpoint’i
  • Admin paneli erişilebilirliği

TCP Monitörleri:

  • Master PostgreSQL port 5432
  • Slave PostgreSQL port 5432
  • Redis port 6379
  • Elasticsearch port 9200

Ping Monitörleri:

  • Tüm sunucular için ICMP ping (temel erişilebilirlik)

Heartbeat Monitörleri:

  • Gece yedekleme cron job’u
  • Fatura oluşturma cron job’u
  • E-posta kuyruğu işleme job’u
  • Veri senkronizasyon job’u
  • Log temizleme job’u

Docker Container Monitörleri:

  • Uygulama container’larının durumu

Toplam 25 ile 30 arası monitor oluyor. Uptime Kuma bu kadar monitor’ü rahatlıkla kaldırır, performans sorunu yaşamazsınız. Her müşteri için ayrı bir status page oluşturabilir, müşterilere kendi subdomain’leri üzerinden sunum yapabilirsiniz.

Sık Karşılaşılan Sorunlar

Monitor’ler yanlış DOWN bildirimi gönderiyor: Timeout süresini artırın. Bazı endpointler yavaş yanıt verebilir. Default 30 saniye genellikle yeterli ama yavaş başlayan Java uygulamaları için bu değeri 60 saniyeye çıkarmak gerekebilir.

SSL sertifika uyarıları çok erken geliyor: Uptime Kuma default olarak sertifikanın bitmesine 14 gün kala uyarı verir. Bu değeri monitor ayarlarından değiştirebilirsiniz. Let’s Encrypt kullananlar için 7 gün yeterli ama kurumsal sertifika kullananlar için 30 gün önceden uyarı almak mantıklı.

Docker socket izinleri: Uptime Kuma container’ının Docker socket’e erişimi yoksa “permission denied” hatası alırsınız. Container’ı docker grubuna üye bir kullanıcıyla çalıştırın ya da --group-add parametresini kullanın.

Çok fazla bildirim geliyor (notification spam): Resend interval ve retry count ayarlarını düzenleyin. Bir servis down olduğunda her 30 saniyede tekrar bildirim geliyorsa bu alarm yorgunluğuna yol açar. DOWN bildirimi bir kez gelsin yeterli, UP bildirimi de bir kez. Resend interval’i 0 yaparak tekrar bildirimlerini kapatabilirsiniz.

Sonuç

Uptime Kuma, “bütçem kısıtlı ama profesyonel izleme istiyorum” diyenlerin aracı. Datadog veya New Relic’in aylık faturasına ödeme yapamayan ya da yapmak istemeyenlere gerçek bir alternatif sunuyor. Beş dakikada kurulumu, temiz arayüzü, güçlü bildirim sistemi ve aktif geliştirme süreci ile kendini kanıtlamış bir araç.

Elbette sınırlılıkları var. Metrik toplama yapmıyor, log analizi yok, uygulama performansı için APM özellikleri beklemeyin. Bunlar için Prometheus ve Grafana ikilisi ya da başka özel araçlar gerekir. Ama “servislerim ayakta mı, SSL’im ne zaman sona eriyor, cron job’larım düzenli çalışıyor mu” sorularının yanıtı için Uptime Kuma fazlasıyla yeterli.

Self-hosted izleme altyapısı kurmak isteyenler için önerim şu sırayla gitmek: Önce Uptime Kuma ile başlayın, stabilitesi ve değeri kanıtlanmış bir araç. Sonra ihtiyaçlar büyüdükçe Grafana ve Prometheus ekleyin. En son APM ve log yönetimini kapsama dahil edin. Büyük bir altyapıyı hemen tek seferde izlemeye çalışmak yerine katmanlı bir yaklaşım hem öğrenme eğrisini yönetilebilir tutar hem de her aracın değerini daha net görmenizi sağlar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir