SaaS Maliyetlerinden Kurtulun: Uptime Kuma ve n8n ile Ücretsiz Monitoring Stack Kurulumu
Datadog, New Relic veya BetterStack faturalarının her ay sonunda FinOps ekiplerinin masasında yarattığı kalp çarpıntısını hepimiz biliyoruz. Özellikle yüzlerce microservice veya edge endpoint barındıran altyapılarda, basit bir synthetic check ve alerting mekanizması için ödenen lisans bedelleri katlanılamaz seviyelere ulaşabiliyor. Bu noktada self-hosted bir monitoring altyapısı kurmak, doğrudan bir maliyet optimizasyonu hamlesine dönüşüyor. Bu rehberde, Uptime Kuma ve n8n ikilisini bir araya getirerek kurumsal ölçekte, yüksek esnekliğe sahip ve tamamen ücretsiz bir observability & auto-remediation stack’ini nasıl ayağa kaldıracağımızı inceliyoruz.
Neden Bu Stack? Mimari Kararlar
Piyasada Prometheus + Alertmanager veya Zabbix gibi devasa çözümler varken neden Uptime Kuma ve n8n? Cevap: Bakım maliyeti (operational overhead) ve olay müdahale hızı (MTTR).
Prometheus Blackbox Exporter güçlüdür ancak konfigürasyonu hantaldır; dashboard ve status page için Grafana şarttır. Uptime Kuma ise tek bir container içerisinde HTTP(s), gRPC, TCP, DNS, Ping ve Docker container healthcheck kabiliyetlerini native bir Status Page ile sunar. n8n ise Alertmanager’ın kısıtlı webhook yapısının ötesine geçerek; alert deduplication, payload zenginleştirme (enrichment) ve hatta SSH/Kubernetes API üzerinden otomatik iyileştirme (self-healing) workflow’ları çalıştırmamıza olanak tanır.
Adım 1: Production-Ready Docker Compose Mimarisi
Stack’imizi tek bir node üzerinde izole bir Docker network’ü, persistent storage ve resource limitleri ile ayağa kaldıralım. Reverse proxy olarak Traefik veya Nginx arkasında SSL terminate ettiğinizi varsayıyoruz; bu yüzden internal network üzerinden güvenli bağlantı kuracağız.
version: '3.8'
networks:
monitoring-net:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
volumes:
uptime-kuma-data:
driver: local
n8n-data:
driver: local
services:
uptime-kuma:
image: louislam/uptime-kuma:1.23.13-debian
container_name: uptime-kuma
restart: unless-stopped
volumes:
- uptime-kuma-data:/app/data
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- monitoring-net
ports:
- "127.0.0.1:3001:3001"
deploy:
resources:
limits:
cpus: '1.0'
memory: 1024M
reservations:
cpus: '0.2'
memory: 256M
healthcheck:
test: ["CMD-SHELL", "node extra/healthcheck.js"]
interval: 30s
timeout: 10s
retries: 3
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n-automation
restart: unless-stopped
environment:
- N8N_HOST=n8n.internal.local
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.yourdomain.com/
- GENERIC_TIMEZONE=Europe/Istanbul
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168
volumes:
- n8n-data:/home/node/.n8n
networks:
- monitoring-net
ports:
- "127.0.0.1:5678:5678"
deploy:
resources:
limits:
cpus: '1.5'
memory: 2048M
reservations:
cpus: '0.2'
memory: 512M
Burada kritik olan iki parametre var: Uptime Kuma’ya Docker socket’i ro (read-only) bağlayarak yerel container state’lerini doğrudan izleyebiliyoruz. n8n tarafında ise EXECUTIONS_DATA_PRUNE=true ile SQLite veritabanının kontrolsüz büyümesini engelleyerek disk I/O darboğazlarının önüne geçiyoruz.
Servisleri ayağa kaldıralım:
docker compose up -d
docker compose ps
Adım 2: Uptime Kuma Konfigürasyonu ve Probing Stratejisi
Uptime Kuma arayüzüne (http://localhost:3001) eriştikten sonra ilk işimiz probe stratejisini kurgulamak. Sadece HTTP 200 OK kontrolü yapmak production seviyesinde yetersizdir.
1. HTTP Keyword Check & Payload Validasyonu
Endpoint sadece 200 dönüyor olabilir ancak arka planda database connection pool tükenmiş ve boş bir JSON array render ediyor olabilir. Monitor tipini HTTP(s) – Keyword seçerek response body içinde beklenen bir string (örneğin "status":"healthy") aratmalısınız.
2. Dynamic Certificate Monitoring
TLS sertifikalarının bitişine 14 gün kala alert tetiklemek için TLS/SSL probe ayarlarını aktifleştirin. Bu, Let’s Encrypt botlarının cert-manager veya ACME renewal hatalarında hayat kurtarır.
3. Webhook Entegrasyonu (n8n Köprüsü)
Settings > Notifications > Setup Notification adımlarını izleyin:
- Notification Type: Webhook
- Post URL:
https://n8n.yourdomain.com/webhook/uptime-kuma-alerts - Request Method: POST
- Content-Type: application/json
Uptime Kuma olay anında n8n’e şu formata benzer zengin bir payload fırlatır:
{
"heartbeat": {
"monitorID": 4,
"status": 0,
"time": "2024-03-24 14:32:10.123",
"msg": "HTTP 502 Bad Gateway",
"ping": 142
},
"monitor": {
"name": "Auth-Service-Prod",
"url": "https://auth.internal.domain/healthz",
"type": "http",
"tags": [{"name": "tier-1"}, {"name": "team-core"}]
},
"msg": "[Auth-Service-Prod] is Down: HTTP 502 Bad Gateway"
}
Adım 3: n8n ile Event-Driven Remediation ve Alert Routing
Basit bir bildirim göndermek yerine n8n üzerinde incident management iş akışı kuralım. Senaryomuz: Servis düştüğünde alerti Slack/Telegram kanalına at, ardından servisin kurtarılması için SSH üzerinden staging/prod ortamına safe-restart komutu gönder.
1. Webhook Trigger ve Status Filtreleme
n8n üzerinde bir Webhook Node oluşturup path’i uptime-kuma-alerts yapın. Ardından gelen veriyi kontrol eden bir Switch Node ekleyin:
{{ $json.heartbeat.status }} === 0-> Incident (DOWN){{ $json.heartbeat.status }} === 1-> Recovery (UP)
2. Payload Enrichment (Code Node)
Alert metnini güzelleştirmek ve etiketlere göre on-call mühendisi etiketlemek için araya bir Code (JavaScript) node koyuyoruz:
const monitor = $input.first().json.monitor;
const heartbeat = $input.first().json.heartbeat;
const isTier1 = monitor.tags && monitor.tags.some(t => t.name === 'tier-1');
const severity = heartbeat.status === 0 ? (isTier1 ? 'CRITICAL' : 'WARNING') : 'INFO';
const mention = isTier1 ? '' : '@oncall-dev';
return {
json: {
serviceName: monitor.name,
targetUrl: monitor.url,
errorMessage: heartbeat.msg,
timestamp: heartbeat.time,
severity: severity,
mentionTarget: mention,
rawPayload: $input.first().json
}
};
3. Auto-Remediation: Safe Container Restart
Eğer düşen servis stateless bir worker veya memory leak yaşayan bir microservice ise, gece 03:00’te nöbetçiyi uyandırmadan önce kontrollü bir restart denemek mantıklıdır.
n8n’deki SSH Node‘u kullanarak ilgili host üzerinde minimum yetkili bir service user ile remote command çalıştırıyoruz:
# n8n SSH Execution Node Komutu
docker restart {{ $json.serviceName.toLowerCase() }} || systemctl restart {{ $json.serviceName.toLowerCase() }}
Bu adımdan sonra n8n’e bir Wait Node (60 saniye) koyup Uptime Kuma API’sine veya doğrudan servise probe atarak sorunun çözülüp çözülmediğini teyit edebilirsiniz. Düzelmediyse escalasyon yaparak PagerDuty/Opsgenie veya Telegram sesli arama botunu tetikleyebilirsiniz.
Production Hardening: Monitoring Altyapısını Kim İzleyecek?
Monitoring sisteminin kendisi çökerse ne olur? Single point of failure (SPOF) riskini bertaraf etmek için iki kritik adımı atlamayın:
1. Dead Man’s Snitch (Heartbeat Monitoring)
Uptime Kuma içerisinde Push tipi bir monitor oluşturun. n8n üzerinden her 5 dakikada bir bu endpoint’e curl atan bir Cron Workflow tanımlayın. Eğer n8n veya network giderse Uptime Kuma alarm üretir. Aynı şekilde harici, tamamen ücretsiz bir dış servise (örn. Cronitor veya Healthchecks.io) Uptime Kuma’nın kendisinden periyodik ping atın.
# n8n cron node içinden dış heartbeat servisine ping
curl -m 10 --retry 3 https://hc-ping.com/your-uuid-token
2. SQLite WAL Modu ve Otomatik Backup
Uptime Kuma varsayılan olarak SQLite kullanır. Yoğun monitor sayısında (500+) database lock yaşamamak için SQLite WAL (Write-Ahead Logging) modunun aktif olduğundan emin olun:
# Uptime Kuma data dizininde
sqlite3 kuma.db "PRAGMA journal_mode=WAL;"
Veritabanı yedeğini her gece S3 uyumlu bir object storage’a rclone veya restic ile şifreli olarak senkronize edin:
docker exec uptime-kuma sqlite3 /app/data/kuma.db ".backup '/app/data/kuma-backup.db'"
rclone copy /var/lib/docker/volumes/uptime-kuma-data/_data/kuma-backup.db remote-s3:monitoring-backups/
Özet ve Maliyet Karşılaştırması
Bu mimariyi Hetzner veya DigitalOcean üzerindeki 4-5 USD’lik bir VPS üzerinde rahatlıkla çalıştırabilirsiniz. Ticari bir SaaS çözümünde 200 endpoint, multi-step healthcheck’ler ve custom webhook otomasyonları için ayda 150 – 400 USD arasında bir fatura ödemeniz gerekirken; bu stack ile hem tüm verinizi kendi altyapınızda tutuyor hem de n8n’in geniş ekosistemi sayesinde sınırsız auto-remediation senaryosu üretebiliyorsunuz.