# Sunucu Sağlık Taraması: CPU, RAM ve Disk Doluluk Oranlarını Otomatik HTML Raporuna Çeviren Script Mimarisi

- Bağlantı: https://musti.org/powershell/sunucu-saglik-taramasi-otomatik-html-rapor/
- Yayımlanma: 2026-09-21T21:38:30+03:00
- Yazar: mmutlu

Geçenlerde bir arkadaşım “her sabah tek tek sunuculara bağlanıp disk doluluğuna 
bakıyorum” dediğinde, ilk sorduğum şey şu oldu: neden bunu script yapmıyorsun? Sunucu
filosunun sağlık durumunu manuel kontrol etmek yerine, otomatik oluşturulan ve gelen
kutunuza düşen bir HTML rapor hem zaman kazandırıyor hem de sorunları proaktif olarak
fark etmenizi sağlıyor.

## Script Mimarisi: Üç Katman

 1. **Veri Toplama:** Her sunucudan CPU, RAM, disk verisini topla
 2. **Değerlendirme:** Eşik değerlerine göre durumu renklendir (yeşil/sarı/kırmızı)
 3. **Raporlama:** HTML formatında derle ve e-posta ile gönder

## Veri Toplama

    ```
    $sunucular = @("SRV-WEB01", "SRV-DB01", "SRV-APP01", "SRV-FILE01")
    $rapor = foreach ($sunucu in $sunucular) {
        $cpu = Get-CimInstance Win32_Processor -ComputerName $sunucu |
            Measure-Object -Property LoadPercentage -Average | Select -ExpandProperty Average
        $ram = Get-CimInstance Win32_OperatingSystem -ComputerName $sunucu
        $ramKullanim = [math]::Round((($ram.TotalVisibleMemorySize - $ram.FreePhysicalMemory) / $ram.TotalVisibleMemorySize) * 100, 1)
        $disk = Get-CimInstance Win32_LogicalDisk -ComputerName $sunucu -Filter "DeviceID='C:'"
        $diskKullanim = [math]::Round((($disk.Size - $disk.FreeSpace) / $disk.Size) * 100, 1)

        [PSCustomObject]@{
            Sunucu = $sunucu
            CPU = "$cpu%"
            RAM = "$ramKullanim%"
            Disk = "$diskKullanim%"
            Durum = if ($cpu -gt 85 -or $ramKullanim -gt 90 -or $diskKullanim -gt 90) {"KRİTİK"} else {"Normal"}
        }
    }
    ```

## Renkli HTML Rapor Oluşturma

    ```
    $htmlHead = @"
    <style>
    table { border-collapse: collapse; width: 100%; font-family: Arial; }
    th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
    th { background-color: #2c3e50; color: white; }
    .kritik { background-color: #ffcccc; }
    .normal { background-color: #ccffcc; }
    </style>
    "@

    $htmlBody = $rapor | ConvertTo-Html -Head $htmlHead -Property Sunucu, CPU, RAM, Disk, Durum |
        ForEach-Object { $_ -replace '(.*?)(.*?)(.*?)(.*?)KRİTİK', '$1$2$3$4KRİTİK' }

    Send-MailMessage -From "sunucu-raporu@sirket.com" -To "mmutlu@sirket.com" `
        -Subject "Günlük Sunucu Sağlık Raporu - $(Get-Date -Format 'dd.MM.yyyy')" `
        -Body ($htmlBody | Out-String) -BodyAsHtml -SmtpServer "smtp.sirket.com"
    ```

## Zamanlanmış Görev Olarak Otomatikleştirme

    ```
    $eylem = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scriptler\SaglikRaporu.ps1"
    $tetikleyici = New-ScheduledTaskTrigger -Daily -At "07:00"
    Register-ScheduledTask -TaskName "GunlukSunucuSagligi" -Action $eylem -Trigger $tetikleyici -RunLevel Highest
    ```

Buradaki eşik değerlerini (%85 CPU, %90 RAM/disk) olduğu gibi kopyalamayın — her
ortam için doğru sayı farklı. Sürekli yüksek CPU ile çalışan bir veritabanı sunucusu
için normal olan bir değer, bir dosya sunucusu için kritik bir uyarı olabilir. Eşikleri
sunucu rolüne göre özelleştirmek “yanlış alarm yorgunluğunu” (alert fatigue) baştan
önlüyor.

## Bir Adım Sonrası

Bu mimari “her şey yolunda mı?” sorusuna her sabah otomatik cevap veren, düşük maliyetli
ama yüksek getirili bir otomasyon örneği. İsterseniz bir sonraki adım olarak e-posta
yerine bir Teams veya Slack kanalına bildirim gönderecek şekilde de genişletebilirsiniz.
