Ana SayfaBlogBeszel'e Gectim: Prometheus + Grafana Stack'ten Hafif Monitoring'e 60 Gun
Monitoring & Observability

Beszel'e Gectim: Prometheus + Grafana Stack'ten Hafif Monitoring'e 60 Gun

Emre Ferit Aslantas8 Haziran 202611 dkMakale
beszel monitoring prometheus grafana homelab self-hosted docker
Sponsored

Homelab'imda altmis gun once monitoring stack'ini degistirdim. Once Prometheus + node_exporter + cAdvisor + Grafana + Alertmanager kurarak baslamistim — kitabin yazdigi gibi. Calisti. Hatta cok iyi calisti. Ama bir noktada farkettim ki dort container'i 8 host icin sadece "CPU yuzde kac, disk doluyor mu, container restart ediyor mu" sorularina cevap almak icin ayakta tutuyorum. Bir is uretmiyorum, sadece envanteri yonetiyorum.

Beszel'e gectim. Bu yazi o gecisin durust 60 gunluk notu — ne kazandim, neyi ozledim, nerede tokat yedim.

Once Netdata Denedim, Iki Haftada Vazgectim

Hafiflesme niyetim Beszel ile baslamadi. Ilk Netdata Cloud'a baktim. Agent kurulumu tek satir bash, dashboard hazir, anomaly detection bile var. Iki hafta sonra braktim ve sebepleri sirayla:

  1. Cloud baglanti baskisi — Agent'lar tum metrikleri Netdata Cloud'a gonderiyor; ben homelab'imdaki bilgilerin (container isimleri, agent host adlari, ag topolojisi gibi) ucuncu parti bir SaaS'a gitmesini istemedim. Self-host secenegi (Parent/Child mimarisi) var ama Cloud dashboard'un tum guzelliklerini saglamiyor.
  2. Agent RAM tuketimi — Mac Mini M4'umda Netdata agent idle 220-260 MB RAM yiyordu. Tek bir node icin kabul edilebilir ama 8 host * 240MB = ~2GB. Proxmox CT100'umun toplam RAM'i 1GB, oraya sigmadi.
  3. Cok fazla bilgi — 4000+ metric, hazir 80+ chart. Bir homelab kullanicisi olarak bunlarin %95'ine bakmiyorum. "Daha az ama daha net" bir sey istedim.

Netdata bir SRE takimi icin muhtesem bir urun, sahsen oyle dusunuyorum. Ama benim ihtiyacim degil.

Beszel Nedir, Mimarisi Nasil

Beszel, Go ile yazilmis bir hub + agent monitoring aracidir. Yazari Henry Davis. Mimari basit:

  • Hub (web UI + PocketBase backend) — tek container, varsayilan port 8090
  • Agent — her host icin bir Go binary veya container, hub'a WebSocket uzerinden baglaniyor

Metrik olarak: CPU, RAM, disk (per mount), network, sicaklik, GPU (NVIDIA/AMD/Apple), container/sistemd servisleri (CPU + RAM bazinda). Histogram tipinde olculer yok, hep gauge. Bu, "uygulama icerigine bakmiyorum" felsefesinin sonucu — Beszel "host saglikli mi" sorusuna odakli.

Kurulum

Hub Proxmox uzerindeki bir LXC container'da calisiyor (CT103, 256MB RAM ayrilmis). Compose dosyam:

# /opt/beszel/docker-compose.yml
services:
  beszel:
    image: henrygd/beszel:0.9.2
    container_name: beszel
    restart: unless-stopped
    ports:
      - "8090:8090"
    volumes:
      - ./data:/beszel_data
      - ./socket:/beszel_socket
    environment:
      USER_CREATION: "true"
      DISABLE_PASSWORD_AUTH: "false"

Agent kurulumu Mac Mini M4'te brew ile yapilmiyor — Henry'nin sundugu install script'i veya binary direk. Ben LaunchAgent ile koydum:

# /Users/efa/Library/LaunchAgents/sh.henrygd.beszel-agent.plist
cat > beszel-agent.plist <<'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
  <key>Label</key><string>sh.henrygd.beszel-agent</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/beszel-agent</string>
  </array>
  <key>EnvironmentVariables</key>
  <dict>
    <key>PORT</key><string>45876</string>
    <key>KEY</key><string>ssh-ed25519 AAAA...HUB_PUBLIC_KEY</string>
  </dict>
  <key>KeepAlive</key><true/>
  <key>RunAtLoad</key><true/>
</dict>
</plist>
PLIST
launchctl load -w beszel-agent.plist

Proxmox LXC ve VM host'larinda Docker compose ile:

services:
  beszel-agent:
    image: henrygd/beszel-agent:0.9.2
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      LISTEN: "45876"
      KEY: "ssh-ed25519 AAAA...HUB_PUBLIC_KEY"

Toplam 8 host (Mac Mini M4, 2 Proxmox host, 5 LXC) baglanmasi 35 dakika surdu. Hub UI'da "Add system" diyorsunuz, hostname + IP veriyorsunuz, agent zaten oradaysa bir kac saniye icinde online oluyor.

60 Gunde Olcumler — Karsilastirmali Sayilar

Eski stack vs Beszel'in 60 gun sonra ortalama tuketimi:

| Bilesen | Eski (Prom+Grafana+Alert+exp) | Beszel (Hub+8 Agent) | |---|---|---| | Toplam RAM (idle) | ~720 MB | ~120 MB | | Disk (60 gun retention) | ~3.4 GB | ~190 MB | | Container sayisi | 4 (Prom, Grafana, AM, cAd) | 1 (hub) + 8 agent | | Dashboard kurulumu | 6-9 saat | 0 (yerlesik) | | Yeni host ekleme suresi | ~15 dk (scrape config + reload) | ~90 sn (UI'dan ekle) |

p95 dashboard yukleme suresi de degisti: eski Grafana'da bazi dashboard'lar (cAdvisor "container details") 4-6 saniye yukleniyordu, Beszel hub UI'da host detay sayfasi p95 ~280ms. Sebep basit: Beszel her sey PocketBase'in SQLite'inda, JOIN yok, aggregation yok, sadece son N gun gauge degerleri.

Beni Kismen Yardim Etmedi

60 gunde Beszel'in beni desteklemedigi durumlar oldu:

  1. Custom dashboard yok. Grafana'da yazdigim "Mac Mini M4 - Neural Engine inference latency" dashboard'u tasiyamadim. Beszel uygulama metriklerini bilmiyor; bilmek istemiyor da. Cozum: o tek dashboard icin Grafana'yi ayakta tuttum (sadece MLX server prom endpoint'i scrape ediyor), Prometheus'u soktum. Beszel "altyapi", Grafana "uygulama" diye ayirdim.
  2. Alert flexibility sinirli. Beszel SMTP, webhook, Pushover, Telegram, ntfy, Gotify gibi notifier'lar destekliyor ama tek esik tipi var: "X dakika boyunca metrik > Y". Alertmanager'daki gibi "for" + "group_by" + "inhibit rules" yok. Benim icin yetiyor (esiklerim basit) ama bir productionda yetmez.
  3. Log yok. Loki'yi de eksiledim diye dusunmustum ama Beszel sadece systemd journal'in son satirlarini gosteriyor (agent v0.9'dan beri). Tam bir log pipeline icin hala Loki + Promtail ayakta — onlari sokmadim, sadece Beszel "metric+kucuk log peek" katmani oldu.
  4. Smart prediction yok. Netdata'nin anomaly detection'ini ozledim, Beszel'de yok. Ihtiyacim olur mu? 60 gunde bir kez "ah keske" dedim, sonrasinda unuttum.

Sorun: Agent Disconnect ve WebSocket Kopmasi

Otuzuncu gun civari Mac Mini M4 agent'i 12-15 saatlik araliklarla hub'dan dusup tekrar baglandi. Hub UI'da "Offline" oluyordu, sonrasinda LaunchAgent restart ediyor ve geri geliyordu. Log inceleyince sorun: macOS uyku/uyandirma sirasinda TCP keep-alive timeout, WebSocket sessizce dustugu icin agent'in heartbeat'i basarisiz.

Cozum, agent'in KeepAlive: true plist'ini olduğu gibi tuttum ama hub tarafinda WebSocket'in heartbeat'ini siklastirmadim cunku 0.9.x'te bu config dis ariyuz yok. Henry'nin GitHub issue tracker'inda ayni problemi yasayanlar var, 0.10 milestone'una "configurable WS keepalive" eklendi. Su an workaround olarak Mac Mini'de pmset ile network wake'u acik tuttum:

sudo pmset -a tcpkeepalive 1
sudo pmset -a powernap 1

60 gunde toplam 11 disconnect oldu, hepsi <90 sn icinde geri geldi. Hayati metrik yok ama "online %" gibi guvenli SLA hesaplamalarinda dikkatli olmak gerek.

Backup ve Update Stratejim

PocketBase tek bir SQLite dosyasinda her seyi tutuyor: data/pb_data/data.db. Backup planim:

# /etc/cron.daily/beszel-backup
#!/bin/bash
ts=$(date +%Y%m%d-%H%M)
docker exec beszel sqlite3 /beszel_data/pb_data/data.db ".backup /beszel_data/backup-$ts.db"
restic -r b2:efa-restic:beszel backup /opt/beszel/data/backup-*.db --tag beszel
find /opt/beszel/data/ -name 'backup-*.db' -mtime +3 -delete

Restore'u bir kez denedim (manuel): hub container'i stop, data.db'yi yedek ile degistir, start. Tum 60 gunluk veri ve host config'leri geri geldi. ~190MB ile bu maliyet sifir.

Container update'leri icin Renovate kullaniyorum (docker-compose.yml'deki image tag'ini takip ediyor). 60 gunde 3 minor update geldi (0.8.3 → 0.9.0 → 0.9.1 → 0.9.2), hicbiri breaking olmadi.

Sonuc — 60 Gunluk Notlar

Beszel benim icin Prometheus stack'ini tamamen degil, ama %85 oraninda yerine gecti. Spesifik cikti:

  1. Hafiflik gercek — toplam monitoring RAM tuketimim 720MB'tan ~120MB'a dustu, 600MB Proxmox sunucumda baska seyler icin acildi.
  2. Day-2 maliyet sifira yakin — yeni host eklemek 90 saniye, custom dashboard guncellemek yok cunku custom dashboard yok.
  3. Uygulama metrikleri icin yetersiz — kendi servislerini izlemek istiyorsan Grafana'yi paralel tut, Beszel altyapi katmani.
  4. Alerting basit ama yeterli — homelab icin ntfy push yetiyor; kurumsal SRE iciq Alertmanager'i ozlersiniz.
  5. Backup kuvvetli — tek SQLite dosyasi disaster recovery'yi 5 dakikaya indiriyor.

Bir SRE takiminda calissam Prometheus + Grafana + Loki kombosunu birakacak miyim? Hayir. Ama bir homelab veya kucuk bir hobi projesinde 8 host'u izlemek icin Beszel su an benim default'um. "Daha az ama daha net" hedefim icin tam denk geldi.

Eger benzer bir gecisi dusunuyorsaniz once Beszel hub'i Prometheus stack'in YANINDA bir hafta calistirin, gerekliliklerinizi karsilayan ne kadarini fark edin, sonrasinda eskiyi sokmek kolay olur. Ben de oyle yaptim, geri donmedim.

Sponsored

Haftalık DevOps Bülteni

Yeni tool incelemeleri, karşılaştırmalar ve DevOps trendleri haftada bir kutuna gelsin.