Bacula ile E-posta Bildirimi ve Raporlama Kurulumu

Yedekleme sistemleri kurup çalıştırmak bir şeydir, ama o sistemlerin sağlıklı çalışıp çalışmadığını takip etmek bambaşka bir sorumluluktur. Bacula’yı kurdunuz, job’larınızı tanımladınız, schedule’ları ayarladınız. Peki sabah iş başına geçtiğinizde gece yarısı çalışan yedek işinin başarılı olup olmadığını nasıl anlayacaksınız? Her sabah Bacula konsoluna girip logları incelemek hem zaman kaybıdır hem de insan hatalarına kapı açar. İşte bu yüzden e-posta bildirimleri ve düzenli raporlama mekanizmaları bir sysadmin için lüks değil, zorunluluktur.

Bacula’da E-posta Bildirimi Nasıl Çalışır?

Bacula’nın bildirim sistemi Messages kaynağı üzerine kuruludur. Bacula Director, her job tamamlandığında veya bir hata oluştuğunda bu mesajları farklı hedeflere yönlendirebilir. Bu hedefler; log dosyaları, sistem syslog’u, operatör konsolu veya doğrudan e-posta olabilir.

Temel mantık şöyle işler: Director, job çalışırken oluşan tüm mesajları toplar ve job bittiğinde bunları tanımlanmış mesaj kaynaklarına gönderir. Mesaj kaynakları bacula-dir.conf dosyasında tanımlanır ve her job veya pool kaynağı bu mesaj tanımlarından birine referans verir.

Bacula’nın mesaj sistemi oldukça granüler bir yapıya sahiptir. Hangi mesaj tipinin nereye gideceğini tek tek belirleyebilirsiniz. Bu esneklik başlangıçta kafa karıştırıcı gelebilir ama bir kez kavradığınızda son derece güçlü bir araç haline gelir.

Sistem Gereksinimlerini Hazırlamak

E-posta bildirimlerinin çalışması için Director’ın çalıştığı sunucuda bir MTA (Mail Transfer Agent) kurulu olması gerekir. Bacula varsayılan olarak mail veya bsmtp komutunu kullanır.

# Ubuntu/Debian sistemlerde postfix kurulumu
sudo apt-get install postfix mailutils

# CentOS/RHEL sistemlerde
sudo dnf install postfix mailx

# Postfix'i başlatmak ve otomatik başlatmayı aktif etmek
sudo systemctl enable postfix
sudo systemctl start postfix

Eğer sunucunuz dışarıya doğrudan SMTP gönderemiyorsa (ki birçok kurumsal ortamda böyledir), Bacula’nın kendi bünyesindeki bsmtp aracını kullanabilirsiniz. Bu araç harici SMTP sunucusuna relay yapmanıza olanak tanır ve lokal MTA gerektirmez.

# bsmtp'nin kurulu olup olmadığını kontrol edin
which bsmtp

# Bacula tools paketi içinde gelir, ayrıca kurulum gerekmeyebilir
# Debian/Ubuntu için
sudo apt-get install bacula-common

Messages Kaynağını Yapılandırmak

bacula-dir.conf dosyasındaki Messages bloğu tüm bildirim sisteminin kalbidir. İşte temel bir yapılandırma örneği:

# /etc/bacula/bacula-dir.conf dosyasına ekleyin

Messages {
  Name = Standard
  mailcommand = "/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] -s "Bacula: %j - %e" %r"
  operatorcommand = "/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] -s "Bacula Operator: %j" %r"
  mail = [email protected] = all, !skipped
  operator = [email protected] = mount
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
  catalog = all
}

Buradaki format değişkenlerini açıklayalım:

  • %j: Job adı
  • %e: Job sonucu (OK, Error, Cancelled gibi)
  • %r: Alıcı e-posta adresi
  • %i: Job ID numarası
  • %l: Job seviyesi (Full, Incremental, Differential)
  • %b: Yedeklenen byte miktarı
  • %F: Yedeklenen dosya sayısı
  • %t: Job tipi (Backup, Restore, Verify)

Mesaj tipleri de önemlidir. all tüm mesajları dahil ederken !skipped atlanan dosya mesajlarını hariç tutar. Sık kullanılan mesaj tipleri şunlardır:

  • info: Bilgi mesajları
  • error: Hata mesajları
  • warning: Uyarı mesajları
  • fatal: Ölümcül hatalar
  • all: Tüm mesajlar
  • !skipped: Atlanan dosyaları hariç tut
  • !saved: Kaydedilen dosyaları hariç tut (log dosyalarını küçültür)

Farklı Senaryolar için Ayrı Messages Kaynakları

Gerçek dünyada tek bir mesaj kaynağı yeterli olmaz. Kritik yedekler için anlık bildirim isterken rutin daily backup’lar için yalnızca hata bildirimini tercih edebilirsiniz. Farklı alıcılar için farklı yapılandırmalar oluşturabilirsiniz:

# Sadece hatalar için mesaj kaynağı - Kritik sistemler için
Messages {
  Name = Kritik-Hatalar
  mailcommand = "/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] -s "[KRITIK] Bacula Hata: %j" %r"
  mail on error = [email protected] = all
  mail on error = [email protected] = all
  append = "/var/log/bacula/kritik.log" = all
  catalog = all
}

# Sadece başarılı tamamlanma bildirimi için
Messages {
  Name = Basarili-Bildirim
  mailcommand = "/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] -s "[OK] Yedek Tamamlandi: %j" %r"
  mail = [email protected] = !all, !error, !warning, !fatal
  append = "/var/log/bacula/basarili.log" = all
  catalog = all
}

# Gece vardiyası için operasyon ekibine bildirim
Messages {
  Name = Gece-Operasyon
  mailcommand = "/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] -s "Gece Yedek Raporu: %j (%e)" %r"
  mail = [email protected] = all, !skipped, !saved
  operator = [email protected] = mount, error
  append = "/var/log/bacula/gece.log" = all
  catalog = all
}

Bu kaynakları Job tanımlarınızda kullanmak için:

Job {
  Name = "Kritik-DB-Backup"
  Type = Backup
  Client = db-server-fd
  FileSet = "DB-FileSet"
  Schedule = "Gunluk-Schedule"
  Storage = File1
  Pool = Kritik-Pool
  Messages = Kritik-Hatalar    # Burada belirtiyoruz
  Priority = 10
}

bsmtp ile SMTP Relay Yapılandırması

Birçok kurumsal ortamda, sunucuların doğrudan dışarıya mail gönderme yetkisi yoktur. Merkezi bir SMTP relay sunucusu üzerinden gönderim yapılır. bsmtp bu konuda oldukça esnektir:

# bsmtp test komutu - yapılandırmayı doğrulamak için
/usr/sbin/bsmtp -h smtp.sirketiniz.com -f [email protected] 
  -s "Bacula Test Maili" [email protected] << EOF
Bu bir Bacula test mailidir.
Eğer bu maili aldıysanız e-posta bildirimleri çalışıyor demektir.
EOF

Eğer SMTP kimlik doğrulaması gerekiyorsa bsmtp doğrudan bunu desteklemez. Bu durumda Postfix’i SASL ile yapılandırıp Bacula’nın lokal MTA’yı kullanmasını sağlayabilirsiniz:

# /etc/postfix/main.cf için relay yapılandırması
# relayhost = [smtp.sirketiniz.com]:587
# smtp_sasl_auth_enable = yes
# smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# smtp_sasl_security_options = noanonymous
# smtp_tls_security_level = encrypt

# /etc/postfix/sasl_passwd dosyası
echo "[smtp.sirketiniz.com]:587 [email protected]:sifre" > /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl reload postfix

Postfix’i bu şekilde ayarladıktan sonra Bacula Messages kaynağında mailcommand olarak /usr/bin/mail veya /usr/sbin/sendmail kullanabilirsiniz:

Messages {
  Name = Standard-Mail
  mailcommand = "/usr/bin/mail -s "Bacula %e: %j" %r"
  mail = [email protected] = all, !skipped
  append = "/var/log/bacula/bacula.log" = all
  catalog = all
}

Özel Raporlama Script’i Yazmak

Bacula’nın yerleşik bildirim sistemi güçlü olmakla birlikte, bazen daha zengin içerikli, özelleştirilmiş raporlar göndermek istersiniz. Bunun için RunScript direktifini kullanarak job sonunda kendi script’inizi çalıştırabilirsiniz.

#!/bin/bash
# /usr/local/bin/bacula-rapor.sh
# Bacula job raporu oluşturup e-posta gönderir

JOB_ID=$1
JOB_NAME=$2
JOB_STATUS=$3
RECIPIENT="[email protected]"

# Bacula konsol çıktısından job detaylarını al
JOB_DETAILS=$(echo "list jobid=$JOB_ID" | bconsole -c /etc/bacula/bconsole.conf)

# Job istatistiklerini parse et
FILES=$(echo "$JOB_DETAILS" | grep "Files Written" | awk '{print $NF}')
BYTES=$(echo "$JOB_DETAILS" | grep "Bytes Written" | awk '{print $NF}')
DURATION=$(echo "$JOB_DETAILS" | grep "Elapsed time" | awk '{print $NF}')

# Durum ikonunu belirle
if [ "$JOB_STATUS" = "OK" ]; then
    ICON="✓"
    SUBJECT="[BASARILI] Bacula Yedek: $JOB_NAME"
else
    ICON="✗"
    SUBJECT="[HATA] Bacula Yedek: $JOB_NAME"
fi

# E-posta gönder
/usr/sbin/bsmtp -h mail.sirketiniz.com 
  -f [email protected] 
  -s "$SUBJECT" 
  "$RECIPIENT" << MAIL_EOF
Bacula Job Raporu
==================
Job Adi   : $JOB_NAME
Job ID    : $JOB_ID
Durum     : $ICON $JOB_STATUS
Tarih     : $(date '+%d.%m.%Y %H:%M')
Dosya Sayisi: $FILES
Veri Boyutu : $BYTES
Sure        : $DURATION

Detayli Log:
$JOB_DETAILS
MAIL_EOF

echo "Rapor gönderildi: $JOB_NAME - $JOB_STATUS"

Bu script’i Job tanımınıza bağlayın:

Job {
  Name = "Haftalik-Full-Backup"
  Type = Backup
  Client = web-server-fd
  FileSet = "Web-FileSet"
  Schedule = "Haftalik-Full"
  Storage = Tape1
  Pool = Haftalik-Pool
  Messages = Standard
  RunScript {
    Command = "/usr/local/bin/bacula-rapor.sh %i %j %e"
    RunsWhen = After
    RunsOnFailure = yes
    RunsOnSuccess = yes
    RunsOnClient = no
  }
}

Haftalık Özet Raporu Oluşturmak

Günlük job bildirimleri dışında, haftalık veya aylık özet raporlar yöneticiler için çok değerlidir. Bu tür raporlar için bconsole ve Bacula’nın katalog veritabanını sorgulayan bir script işe yarar:

#!/bin/bash
# /usr/local/bin/bacula-haftalik-rapor.sh
# Her Pazartesi çalışarak geçen haftanın özetini gönderir

BACULA_DB="bacula"
DB_USER="bacula"
DB_PASS="sifreniz"
RECIPIENT="[email protected]"
HAFTA_BASI=$(date -d "7 days ago" '+%Y-%m-%d')
BUGUN=$(date '+%Y-%m-%d')

# Veritabanından haftalık istatistikleri çek
TOPLAM_JOB=$(mysql -u$DB_USER -p$DB_PASS $BACULA_DB -se 
  "SELECT COUNT(*) FROM Job WHERE StartTime >= '$HAFTA_BASI' AND EndTime <= '$BUGUN 23:59:59';")

BASARILI_JOB=$(mysql -u$DB_USER -p$DB_PASS $BACULA_DB -se 
  "SELECT COUNT(*) FROM Job WHERE JobStatus='T' AND StartTime >= '$HAFTA_BASI';")

HATALI_JOB=$(mysql -u$DB_USER -p$DB_PASS $BACULA_DB -se 
  "SELECT COUNT(*) FROM Job WHERE JobStatus='E' AND StartTime >= '$HAFTA_BASI';")

TOPLAM_BYTE=$(mysql -u$DB_USER -p$DB_PASS $BACULA_DB -se 
  "SELECT SUM(JobBytes) FROM Job WHERE StartTime >= '$HAFTA_BASI' AND JobStatus='T';")

# Hatalı job listesi
HATALI_LISTE=$(mysql -u$DB_USER -p$DB_PASS $BACULA_DB -se 
  "SELECT Name, StartTime, JobStatus FROM Job WHERE JobStatus='E' AND StartTime >= '$HAFTA_BASI';")

# GB cinsinden boyut hesapla
TOPLAM_GB=$(echo "scale=2; $TOPLAM_BYTE / 1073741824" | bc)

# Raporu gönder
/usr/sbin/bsmtp -h mail.sirketiniz.com 
  -f [email protected] 
  -s "Haftalik Bacula Yedek Raporu: $HAFTA_BASI / $BUGUN" 
  "$RECIPIENT" << RAPOR_EOF
HAFTALIK YEDEKLEME RAPORU
==========================
Donem   : $HAFTA_BASI - $BUGUN
Hazirlama: $(date '+%d.%m.%Y %H:%M')

OZET ISTATISTIKLER
-------------------
Toplam Job Sayisi    : $TOPLAM_JOB
Basarili Job         : $BASARILI_JOB
Hatali Job           : $HATALI_JOB
Toplam Yedek Boyutu  : $TOPLAM_GB GB

HATALI ISLER
-------------
$HATALI_LISTE

Bu rapor otomatik olarak uretilmistir.
RAPOR_EOF

echo "Haftalik rapor gonderildi."

Bu script’i crontab ile zamanlandırın:

# crontab -e ile açın ve şunu ekleyin
# Her Pazartesi sabah 08:00'da haftalık rapor gönder
0 8 * * 1 /usr/local/bin/bacula-haftalik-rapor.sh >> /var/log/bacula/rapor.log 2>&1

Gerçek Dünya Senaryosu: Çok Lokasyonlu Ortam

Bir örnek senaryo üzerinden düşünelim. Üç farklı lokasyonda (İstanbul merkez, Ankara şube, İzmir şube) sunucularınız var. Her lokasyonun kendi sysadmin’i var ve bir de merkezi izleme ekibiniz bulunuyor. Bu durumda mesaj yapılandırmanız şöyle olabilir:

# Merkezi izleme için - tüm job'lar
Messages {
  Name = Merkezi-Izleme
  mailcommand = "/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] -s "[%e] Bacula %l: %j" %r"
  mail on error = [email protected] = all
  mail on error = [email protected] = all
  append = "/var/log/bacula/tum-joblar.log" = all, !skipped
  catalog = all
}

# Ankara şubesi için - sadece kendi sunucuları
Messages {
  Name = Ankara-Sube
  mailcommand = "/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] -s "Ankara Yedek [%e]: %j" %r"
  mail = [email protected] = all, !skipped, !saved
  append = "/var/log/bacula/ankara.log" = all
  catalog = all
}

Ankara şubesindeki sunuculara ait Job tanımları Messages = Ankara-Sube kullanırken, kritik merkez sunucuları Messages = Merkezi-Izleme kullanır. Böylece her ekip yalnızca kendi sorumluluk alanına ait bildirimleri alır.

Bildirimleri Test Etmek

Yapılandırmayı tamamladıktan sonra mutlaka test edin. Bacula Director’ı yeniden başlatmadan önce sözdizimi kontrolü yapın:

# Yapılandırma dosyasını kontrol et
sudo bacula-dir -t -c /etc/bacula/bacula-dir.conf

# Hata yoksa Director'ı yeniden başlat
sudo systemctl restart bacula-director

# Log dosyasını izle
sudo tail -f /var/log/bacula/bacula.log

Bir test job’ı çalıştırarak bildirimlerin gelip gelmediğini kontrol edin:

# bconsole üzerinden test job çalıştır
echo "run job=Test-Backup yes" | bconsole -c /etc/bacula/bconsole.conf

# Job durumunu kontrol et
echo "status dir" | bconsole -c /etc/bacula/bconsole.conf

Birkaç dakika içinde e-postanın gelmediğini görürseniz şu kontrolleri yapın:

# Mail kuyruğunu kontrol et
sudo mailq

# Postfix loglarını incele
sudo tail -50 /var/log/mail.log

# bsmtp'yi manuel test et
/usr/sbin/bsmtp -h mail.sirketiniz.com -f [email protected] 
  -s "bsmtp Test" [email protected] <<< "Test mesaji"

Log Rotasyonu ve Arşivleme

E-posta bildirimleri dışında, Bacula log dosyalarının düzgün yönetilmesi de raporlama sürecinin bir parçasıdır. Logrotate ile Bacula loglarını yönetin:

# /etc/logrotate.d/bacula dosyası oluşturun
cat > /etc/logrotate.d/bacula << 'EOF'
/var/log/bacula/*.log {
    weekly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    create 640 bacula adm
    postrotate
        /usr/bin/killall -HUP bacula-dir 2>/dev/null || true
    endscript
}
EOF

Sonuç

Bacula’da e-posta bildirimi ve raporlama sistemi, yedekleme altyapınızın görünürlüğünü dramatik biçimde artırır. Sabah iş başında bir bakışta tüm gece boyunca çalışan job’ların durumunu görebilmek, sorunlara proaktif yaklaşabilmek ve yöneticilere düzenli raporlar sunabilmek için bu mekanizmaların doğru kurulması şarttır.

Başlangıç için minimum yapılması gerekenler şunlardır: Önce bsmtp veya lokal MTA’nın çalıştığından emin olun, ardından en azından hatalara özel bir Messages kaynağı tanımlayın ve tüm kritik job’larınızın bunu kullandığından emin olun. Daha sonra kademeli olarak özelleştirilmiş script’ler, haftalık özet raporlar ve farklı ekipler için farklı bildirim profilleri ekleyebilirsiniz.

Yedeklemenin asıl değeri, ihtiyacınız olduğu an çalışmasından gelir. Bu değeri korumak içinse sürekli izleme ve zamanında bildirim sistemleri vazgeçilmezdir. Bir job sessizce hata verip haftalarca kimsenin haberi olmadan, tam felaket anında boş bir yedek deposuyla karşılaşmak, sysadmin kariyerinde yaşanabilecek en kötü senaryolardan biridir. İyi yapılandırılmış bir bildirim sistemi sizi bu durumdan korur.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir