Site Overlay

Ubuntu Otomatik Bakım ve Raporlama

Ubuntu Otomatik Bakım ve Raporlama

Bu rehberde, birden fazla Ubuntu ve HestiaCP sunucusunda haftalık sistem bakımlarını (update, upgrade, autoremove, clean) otomatikleştiren ve sonuçları Gmail/Google Workspace altyapısıyla şık bir HTML e-posta raporu olarak gönderen tek tıkla kurulum betiğini bulabilirsiniz.

📌 Ön Gereksinimler Google Workspace veya Gmail hesabınızdan alınmış 16 haneli bir Uygulama Parolası (App Password) gereklidir.
1

Kurulum Betiğini Oluşturun

Sunucunuzda geçici bir kurulum dosyası açın:

Bash
sudo nano /tmp/kur.sh

Aşağıdaki betik kodunu kopyalayıp dosyanın içine yapıştırın. Yapıştırmadan önce BURAYA_GMAIL_UYGULAMA_PAROLASI_GELECEK alanına kendi şifrenizi girin:

/tmp/kur.sh
#!/bin/bash

echo "=== Auto Maintenance Setup Başlatılıyor ==="

# 1. MSMTP Yükleme (Exim/HestiaCP yapılandırmasını bozmaz)
echo "[1/5] MSMTP yükleniyor..."
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y msmtp msmtp-mta > /dev/null 2>&1

# Sendmail Sembolik Link
if [ ! -L /usr/sbin/sendmail ] && [ ! -f /usr/sbin/sendmail ]; then
    ln -s /usr/bin/msmtp /usr/sbin/sendmail
fi

# 2. Log Dosyası Oluşturma ve İzin Verilme
touch /var/log/msmtp.log
chmod 666 /var/log/msmtp.log

# 3. MSMTP Yapılandırması
echo "[2/5] SMTP yapılandırması oluşturuluyor..."
cat <<'EOF' > /etc/msmtprc
defaults
auth           on
tls            on
tls_starttls   on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        /var/log/msmtp.log

account        workspace
host           smtp.gmail.com
port           587
from           alert@arifakyuz.com
user           alert@arifakyuz.com
password       BURAYA_GMAIL_UYGULAMA_PAROLASI_GELECEK

account default : workspace
EOF

chmod 600 /etc/msmtprc

# 4. Bakım Script'i Oluşturma
echo "[3/5] Bakım betiği hazırlanıyor..."
cat <<'EOF' > /usr/local/bin/haftalik_bakim.sh
#!/bin/bash

LOG_FILE="/var/log/haftalik_bakim.log"
ALICI="info@arifakyuz.com"
GONDEREN="alert@arifakyuz.com"
SUNUCU_ADI=$(hostname)
TARIH=$(date '+%d.%m.%Y %H:%M')

# Güncellenecek paketleri tespit et
UPDATED_PACKAGES=$(apt list --upgradable 2>/dev/null | grep -v "Listing..." | cut -d/ -f1)
PACKAGE_COUNT=$(echo "$UPDATED_PACKAGES" | grep -c -v '^$' || true)

if [ "$PACKAGE_COUNT" -gt 0 ]; then
    PACKAGES_HTML=$(echo "$UPDATED_PACKAGES" | sed 's/$/<br>/' | tr -d '\n')
else
    PACKAGES_HTML="Güncellenen paket bulunmuyor (Sistem güncel)."
fi

# Log dosyasını başlat
echo "=== Bakım Başladı: $TARIH ===" > $LOG_FILE

# Bakım komutlarını çalıştır
{
    apt update && \
    apt upgrade -y && \
    apt autoremove -y && \
    apt clean
} >> $LOG_FILE 2>&1

STATUS=$?

if [ $STATUS -eq 0 ]; then
    BASLIK="✅ [$SUNUCU_ADI] Haftalık Bakım Başarıyla Tamamlandı"
    STATUS_COLOR="#10b981"
    STATUS_TEXT="BAŞARILI"
    STATUS_BG="#d1fae5"
else
    BASLIK="❌ [$SUNUCU_ADI] Haftalık Bakımda Hata Oluştu"
    STATUS_COLOR="#ef4444"
    STATUS_TEXT="HATA ALINDI"
    STATUS_BG="#fee2e2"
fi

LOG_CONTENT=$(tail -n 25 $LOG_FILE | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')

# Doğrudan MSMTP ile HTML e-posta gönderimi
(
cat <<EOMAIL
To: $ALICI
From: $GONDEREN
Subject: $BASLIK
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"></head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; background-color: #f3f4f6; margin: 0; padding: 20px;">
    <div style="max-width: 600px; margin: 0 auto; background-color: #ffffff; border-radius: 8px; overflow: hidden; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);">
        <div style="background-color: #1e293b; color: #ffffff; padding: 24px; text-align: center;">
            <h2 style="margin: 0; font-size: 20px; font-weight: 600;">Sistem Bakım Raporu</h2>
            <p style="margin: 5px 0 0 0; color: #94a3b8; font-size: 14px;">$SUNUCU_ADI</p>
        </div>
        <div style="padding: 24px;">
            <div style="background-color: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px; padding: 16px; margin-bottom: 20px;">
                <table style="width: 100%; border-collapse: collapse;">
                    <tr>
                        <td style="color: #64748b; font-size: 14px; padding: 4px 0;">İşlem Durumu:</td>
                        <td style="text-align: right; padding: 4px 0;">
                            <span style="background-color: $STATUS_BG; color: $STATUS_COLOR; padding: 4px 12px; border-radius: 12px; font-weight: bold; font-size: 12px;">$STATUS_TEXT</span>
                        </td>
                    </tr>
                    <tr>
                        <td style="color: #64748b; font-size: 14px; padding: 4px 0;">Güncellenen Paket Sayısı:</td>
                        <td style="text-align: right; font-weight: 600; font-size: 14px; color: #0284c7; padding: 4px 0;">$PACKAGE_COUNT Adet</td>
                    </tr>
                    <tr>
                        <td style="color: #64748b; font-size: 14px; padding: 4px 0;">Tarih / Saat:</td>
                        <td style="text-align: right; font-weight: 500; font-size: 14px; color: #1e293b; padding: 4px 0;">$TARIH</td>
                    </tr>
                    <tr>
                        <td style="color: #64748b; font-size: 14px; padding: 4px 0;">Sunucu:</td>
                        <td style="text-align: right; font-weight: 500; font-size: 14px; color: #1e293b; padding: 4px 0;">$SUNUCU_ADI</td>
                    </tr>
                </table>
            </div>
            <h4 style="margin: 0 0 10px 0; color: #334155; font-size: 14px;">Güncellenen / İşlem Gören Paketler:</h4>
            <div style="background-color: #f1f5f9; color: #334155; font-family: monospace; font-size: 12px; padding: 12px; border-radius: 6px; margin-bottom: 20px; max-height: 150px; overflow-y: auto;">
                $PACKAGES_HTML
            </div>
            <h4 style="margin: 0 0 10px 0; color: #334155; font-size: 14px;">Terminal Çıktı Özeti (Son 25 Satır):</h4>
            <div style="background-color: #0f172a; color: #38bdf8; font-family: monospace; font-size: 12px; padding: 14px; border-radius: 6px; overflow-x: auto; white-space: pre-wrap; word-break: break-all;">
$LOG_CONTENT
            </div>
        </div>
        <div style="background-color: #f8fafc; border-top: 1px solid #e2e8f0; padding: 16px; text-align: center; color: #94a3b8; font-size: 12px;">
            HestiaCP Otomatik Bakım Servisi
        </div>
    </div>
</body>
</html>
EOMAIL
) | msmtp -a workspace "$ALICI"
EOF

chmod +x /usr/local/bin/haftalik_bakim.sh
touch /var/log/haftalik_bakim.log

# 5. Crontab Görevi Ekleme (Her Pazar 03:00)
echo "[4/5] Crontab ayarlanıyor..."
(crontab -l 2>/dev/null | grep -v "/usr/local/bin/haftalik_bakim.sh" ; echo "0 3 * * 0 /usr/local/bin/haftalik_bakim.sh") | crontab -

echo "[5/5] Kurulum Tamamlandı! Rapor gönderiliyor..."
/usr/local/bin/haftalik_bakim.sh
2

Kurulumu Başlatın

Dosyaya çalıştırma yetkisi verip tek satırda kurulumu tamamlayın:

Terminal
chmod +x /tmp/kur.sh && sudo /tmp/kur.sh
3

Yönetim ve Kontrol Komutları

Kurulum sonrasında sistemi kontrol etmek veya manuel tetiklemek için kullanabileceğiniz komutlar:

  • Crontab Kontrolü: crontab -l | grep haftalik_bakim
  • Elle Test Çalıştırması: sudo /usr/local/bin/haftalik_bakim.sh
  • SMTP Log İnceleme: cat /var/log/msmtp.log
  • Bakım Log İnceleme: cat /var/log/haftalik_bakim.log

Author: Arif Akyüz

Arif Akyüz - Siber Güvenlik Uzmanı ve Dijital Dönüşüm Lideri 15 yılı aşkın süredir bilişim sektöründe, özellikle siber güvenlik ve dijital dönüşüm alanlarında hizmet veren bir uzmanım. Hem stratejik hem de teknik düzeyde çözümler sunarak organizasyonların güvenlik altyapılarını güçlendiriyor ve dijitalleşme süreçlerini yönetiyorum.