Proxy Sunucu Kurulumu: Squid ve HAProxy Rehberi
Squid forward proxy, HAProxy load balancer, SSL termination, ACL kuralları, caching, health check ve yüksek erişilebilirlik.
Prometheus + Grafana stack kurulumu, Netdata, node_exporter, alert kuralları, dashboard oluşturma ve sunucu metrik izleme.
Sunucu altyapınızı etkin bir şekilde izlemek, performans sorunlarını erken tespit etmek ve kesintileri önlemek için güçlü monitoring araçlarına ihtiyacınız vardır. Bu rehberde Prometheus, Grafana ve Netdata üçlüsünü kurarak kapsamlı bir sunucu izleme sistemi oluşturacağız.
Prometheus, Cloud Native Computing Foundation (CNCF) tarafından desteklenen açık kaynaklı bir metrik toplama ve izleme sistemidir. Pull-based mimarisi sayesinde hedef sistemlerden metrikleri düzenli aralıklarla çeker ve zaman serisi veritabanında saklar.
Prometheus'un temel özellikleri:
Node Exporter, Linux sunuculardan donanım ve işletim sistemi metriklerini toplayan Prometheus exporter'ıdır.
# Node Exporter indir
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
# Binary'yi taşı
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
# Kullanıcı oluştur
sudo useradd --no-create-home --shell /bin/false node_exporter
# Systemd servis dosyası
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \\
--collector.systemd \\
--collector.processes \\
--web.listen-address=:9100
[Install]
WantedBy=multi-user.target
EOF
# Servisi başlat
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter
# docker-compose.yml
version: '3.8'
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
Metrikleri kontrol edin:
curl http://localhost:9100/metrics | head -50
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
volumes:
prometheus_data:
# prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
- "alert_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets:
- 'node-exporter:9100'
- '192.168.1.10:9100'
- '192.168.1.11:9100'
labels:
env: 'production'
- job_name: 'docker'
static_configs:
- targets: ['cadvisor:8080']
Prometheus alert kuralları ile kritik durumları tespit edin:
# prometheus/alert_rules.yml
groups:
- name: sunucu_alerts
rules:
- alert: YuksekCPUKullanimi
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Yüksek CPU kullanımı ({{ $labels.instance }})"
description: "CPU kullanımı %{{ $value | printf \"%.1f\" }} - 5 dakikadır %85 üzerinde."
- alert: YuksekRAMKullanimi
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "Yüksek RAM kullanımı ({{ $labels.instance }})"
description: "RAM kullanımı %{{ $value | printf \"%.1f\" }} - %90 üzerinde."
- alert: DiskDolmakUzere
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "Disk dolmak üzere ({{ $labels.instance }})"
description: "{{ $labels.mountpoint }} disk kullanımı %{{ $value | printf \"%.1f\" }}"
- alert: SunucuErisilemez
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Sunucu erişilemez ({{ $labels.instance }})"
description: "{{ $labels.job }} hedefi 2 dakikadır erişilemez durumda."
- alert: YuksekDiskIO
expr: rate(node_disk_io_time_seconds_total[5m]) > 0.9
for: 10m
labels:
severity: warning
annotations:
summary: "Yüksek Disk I/O ({{ $labels.instance }})"
description: "Disk I/O kullanımı %{{ $value | printf \"%.1f\" }} - 10 dakikadır yüksek."
# alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'telegram'
routes:
- match:
severity: critical
receiver: 'telegram'
repeat_interval: 1h
receivers:
- name: 'telegram'
telegram_configs:
- bot_token: 'BOT_TOKEN_BURAYA'
chat_id: CHAT_ID_BURAYA
parse_mode: 'HTML'
message: |
<b>{{ .Status | toUpper }}</b>
<b>Alert:</b> {{ .CommonLabels.alertname }}
<b>Severity:</b> {{ .CommonLabels.severity }}
<b>Instance:</b> {{ .CommonLabels.instance }}
<b>Description:</b> {{ .CommonAnnotations.description }}
# docker-compose.yml (prometheus stack'e ekleyin)
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=GucluSifre123!
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=https://grafana.example.com
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
volumes:
grafana_data:
# grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
# grafana/provisioning/dashboards/dashboard.yml
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: 'Server Monitoring'
type: file
disableDeletion: false
editable: true
options:
path: /etc/grafana/provisioning/dashboards/json
Grafana.com'dan hazır dashboard'ları import edebilirsiniz:
# Node Exporter Full Dashboard
Dashboard ID: 1860
Data Source: Prometheus
# Docker Container Monitoring
Dashboard ID: 893
# Prometheus Stats
Dashboard ID: 2
# Alertmanager Dashboard
Dashboard ID: 9578
Import etmek için: Grafana → Dashboards → Import → Dashboard ID girin → Load → Prometheus data source seçin → Import.
# CPU kullanım yüzdesi
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# RAM kullanım yüzdesi
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# Disk kullanım yüzdesi
(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100
# Network trafiği (bytes/saniye)
rate(node_network_receive_bytes_total{device="eth0"}[5m])
rate(node_network_transmit_bytes_total{device="eth0"}[5m])
# Disk I/O (read/write bytes/saniye)
rate(node_disk_read_bytes_total[5m])
rate(node_disk_written_bytes_total[5m])
# Sistem uptime
node_time_seconds - node_boot_time_seconds
# Açık dosya tanımlayıcı sayısı
node_filefd_allocated
Netdata, gerçek zamanlı sunucu izleme aracıdır. Kurulumu son derece kolaydır ve anında detaylı metrikler sunar.
# Otomatik kurulum scripti
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
# Kurulum sonrası
sudo systemctl status netdata
Web arayüzü: http://SUNUCU_IP:19999
# docker-compose.yml
version: '3.8'
services:
netdata:
image: netdata/netdata:latest
container_name: netdata
restart: unless-stopped
ports:
- "19999:19999"
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- netdataconfig:/etc/netdata
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /etc/passwd:/host/etc/passwd:ro
- /etc/group:/host/etc/group:ro
- /etc/localtime:/etc/localtime:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
- /var/log:/host/var/log:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
netdataconfig:
netdatalib:
netdatacache:
# Ana yapılandırma dosyasını düzenle
sudo /etc/netdata/edit-config netdata.conf
# /etc/netdata/netdata.conf
[global]
hostname = sunucu-01
history = 3996
update every = 1
memory mode = dbengine
page cache size = 64
dbengine multihost disk space = 2048
[web]
bind to = 0.0.0.0
default port = 19999
allow connections from = localhost 192.168.1.*
sudo /etc/netdata/edit-config health.d/cpu.conf
alarm: cpu_usage_high
on: system.cpu
lookup: average -5m percentage foreach user,system
units: %
every: 1m
warn: $this > 80
crit: $this > 95
info: CPU kullanımı son 5 dakikada ortalama $this%
to: sysadmin
# Netdata Cloud'a bağlan (ücretsiz)
sudo netdata-claim.sh -token=TOKEN -rooms=ROOM_ID -url=https://app.netdata.cloud
Tüm bileşenleri tek bir compose dosyasında birleştirin:
# docker-compose.monitoring.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=GucluSifre123!
depends_on:
- prometheus
networks:
- monitoring
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
networks:
- monitoring
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: unless-stopped
ports:
- "9093:9093"
volumes:
- ./alertmanager:/etc/alertmanager
networks:
- monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
docker compose -f docker-compose.monitoring.yml up -d
# /etc/nginx/sites-available/grafana.example.com
server {
listen 443 ssl http2;
server_name grafana.example.com;
ssl_certificate /etc/letsencrypt/live/grafana.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grafana.example.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
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;
}
location /api/live/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
REXE sunucularınızda Prometheus + Grafana + Netdata stack'ini kurarak tüm altyapınızı tek bir dashboard'dan izleyebilirsiniz. Alert kuralları sayesinde sorunları proaktif olarak tespit edebilirsiniz.
Prometheus metrik toplama ve uzun süreli saklama için idealdir; PromQL ile güçlü sorgulama sunar. Netdata ise gerçek zamanlı izleme için optimize edilmiştir ve kurulumu çok kolaydır. En iyi yaklaşım ikisini birlikte kullanmaktır: Netdata anlık izleme ve hızlı sorun tespiti için, Prometheus + Grafana ise uzun vadeli trend analizi ve özel dashboard'lar için.
Grafana web arayüzünde Dashboards → Import bölümüne gidin. grafana.com/grafana/dashboards adresinden istediğiniz dashboard'un ID'sini kopyalayın (örn: Node Exporter Full için 1860). ID'yi girin, Load'a tıklayın, Prometheus data source'u seçin ve Import edin. Dashboard otomatik olarak yapılandırılacaktır.
Retention süresini kısaltın: '--storage.tsdb.retention.time=15d'. Scrape interval'ı artırın (15s yerine 30s). Gereksiz metrikleri metric_relabel_configs ile filtreleyin. Eski verileri silmek için Admin API kullanın: 'curl -X POST http://localhost:9090/api/v1/admin/tsdb/clean_tombstones'. Disk kullanımını izleyin: 'du -sh /prometheus'.
Önce Prometheus'ta alert'lerin tetiklendiğini kontrol edin: http://localhost:9090/alerts. Alertmanager'ın çalıştığını doğrulayın: http://localhost:9093/#/alerts. Yapılandırma dosyasını kontrol edin: 'amtool check-config alertmanager.yml'. Telegram bot token ve chat ID'nin doğru olduğundan emin olun. Alertmanager loglarını inceleyin: 'docker logs alertmanager'.
Node Exporter CPU kullanımı, RAM, disk alanı ve I/O, network trafiği, sistem yükü (load average), dosya sistemi, boot zamanı, çalışan process sayısı, açık dosya tanımlayıcıları ve daha fazlasını toplar. Ek collector'lar etkinleştirilebilir: --collector.systemd (servis durumları), --collector.processes (detaylı process bilgisi), --collector.tcpstat (TCP bağlantı istatistikleri).
Her sunucuya Node Exporter kurun (port 9100). Prometheus yapılandırmasında tüm sunucuları scrape_configs altına ekleyin. Grafana dashboard'larında instance label'ı ile sunucuları filtreleyebilirsiniz. Çok sayıda sunucu için Prometheus federation veya Thanos kullanarak ölçeklendirebilirsiniz.
Squid forward proxy, HAProxy load balancer, SSL termination, ACL kuralları, caching, health check ve yüksek erişilebilirlik.
Nginx Proxy Manager Docker kurulumu, SSL sertifikası otomatik yenileme, proxy host ekleme, access list, redirect, stream ve custom location.
CrowdSec kurulumu, bouncer yapılandırması, saldırı algılama, IP engelleme, dashboard, koleksiyon ve senaryo yönetimi.