Skip to content
Back to blog
Rehber Linux Yedekleme Bash Cron Sistem Yönetimi Güvenlik

Linux Üzerinde Kapsamlı ve Güvenli Otomatik Yedekleme Mimarisi: Bash ve Cron ile Kurumsal Çözüm

Linux sistemlerde veri kaybını önlemek için Bash, Cron ve şifreleme araçlarını kullanarak sıfırdan otomatik yedekleme mekanizması kurun. Gerçek dünya senaryolarına uygun pratik rehber.

Caner Serbest

Sistem ve Altyapı

4 min read

Linux Üzerinde Kapsamlı ve Güvenli Otomatik Yedekleme Mimarisi: Bash ve Cron ile Kurumsal Çözüm

Veri, dijital dünyanın en kıymetli varlığıdır. Bir sistem yöneticisinin kariyeri boyunca karşılaşabileceği en stresli anlardan biri, donanım arızası, yanlışlıkla çalıştırılan silme komutu (rm -rf) veya siber saldırı sonrasında verinin kaybolduğunu fark ettiği andır. “Yedekleme yapmayan sistem yöneticisi değildir” mottosu, sadece bir sektörel şaka değil, acı tecrübelerle sabitlenmiş altın bir kuraldır.

Birçok kişi yedek almanın önemini bilir; ancak mesele manuel olarak arada bir /var/www dizinini tarball yapıp masaüstüne indirmek değildir. Gerçek anlamda güvenilir bir yedekleme stratejisi; otomatik çalışan, hata durumunda bildirim gönderen, belirli bir saklama politikasına (retention policy) sahip ve şifrelenmiş bir mimari üzerine kurulmalıdır.

Bu yazıda, harici araçlara bağımlı kalmadan, Linux işletim sisteminin yerleşik araçları olan Bash, tar, GPG ve Cron kullanarak robust (sağlam) bir otomatik yedekleme mekanizmasının nasıl kurulacağını adım adım ele alacağız.


1. Yedekleme Stratejisinin Temelleri

Kod yazmaya veya betik oluşturmaya başlamadan önce, neyi, nereye ve ne sıklıkla yedekleyeceğimizi netleştirmemiz gerekir. Bu yapılandırmada hedefimiz şu bileşenler olacak:

  • Uygulama Dosyaları: Örn. /var/www/html altındaki web dosyaları.
  • Veritabanı Dump’ları: MySQL/MariaDB veya PostgreSQL veritabanlarının SQL çıktıları.
  • Yapılandırma Dosyaları: /etc altındaki kritik konfigürasyonlar.

Saklama Politikası (Retention Policy)

Sunucunuzda sonsuza kadar yedek saklayamazsınız; disk alanı bir gün mutlaka dolacaktır. Bu yüzden GFSL (Grandfather-Father-Son) veya basitçe Günlük-Haftalık-Aylık rotasyon mantığını uygulamalıyız:

  • Son 7 günün günlük yedekleri,
  • Son 4 haftanın haftalık yedekleri,
  • Son 12 ayın aylık yedekleri saklanır, eski yedekler otomatik silinir.

2. Yedekleme Betiğinin Hazırlanması

İlk olarak, tüm süreci yönetecek olan Bash betiğimizi yazalım. Bu betik; dosyaları sıkıştıracak, veritabanı yedeği alacak, bunları güvenli bir dizine taşıyacak ve eski yedekleri temizleyecektir.

Betiklerimizi genellikle /usr/local/bin veya /opt altında tutarız. /opt/backup/backup.sh dosyasını oluşturalım:

#!/bin/bash

# Hata durumunda betiği durdur
set -e

# Değişkenler
BACKUP_ROOT="/data/backups"
DATE=$(date +"%Y%m%d_%H%M%S")
DEST_DIR="$BACKUP_ROOT/daily"
RETENTION_DAYS=7

# Hedef dizin yoksa oluştur
mkdir -p "$DEST_DIR"

echo "[$DATE] Yedekleme süreci başlatıldı..."

# 1. Dosya ve Dizin Yedekleme
WEB_DIR="/var/www/html"
ARCHIVE_NAME="web_files_$DATE.tar.gz"

echo "Web dosyaları sıkıştırılıyor..."
tar -czf "$DEST_DIR/$ARCHIVE_NAME" -C "$(dirname $WEB_DIR)" "$(basename $WEB_DIR)"

# 2. MySQL Veritabanı Yedeği (Örnek)
DB_USER="root"
DB_PASS="guvenli_sifreniz"
DB_NAME="kurumsal_db"
DB_BACKUP_NAME="db_$DATE.sql"

echo "Veritabanı yedeği alınıyor..."
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$DEST_DIR/$DB_BACKUP_NAME"

gzip "$DEST_DIR/$DB_BACKUP_NAME"

# 3. Eski Yedeklerin Temizlenmesi (Retention Policy)
echo "$RETENTION_DAYS günden eski yedekler temizleniyor..."
find "$DEST_DIR" -type f -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$DEST_DIR" -type f -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "[$DATE] Yedekleme başarıyla tamamlandı."

Betiği kaydettikten sonra çalıştırma izni vermemiz gerekiyor:

chmod +x /opt/backup/backup.sh

Güvenlik Notu: mysqldump komutunda şifreyi doğrudan betik içine yazmak güvenlik riski oluşturabilir (özellikle süreç listesinde ps aux ile görünme ihtimaline karşı). Alternatif olarak /root/.my.cnf dosyası kullanılabilir.


3. Güvenlik ve Şifreleme Katmanı

Yedekleri aldık ve yerel diske kaydettik. Peki, sunucunuza yetkisiz bir erişim sağlanırsa bu yedekler ne kadar güvende? Hassas müşteri verileri veya kişisel bilgiler içeren yedeklerin mutlaka şifrelenmesi gerekir.

GNU Privacy Guard (GPG) kullanarak yedek arşivlerimizi şifreleyebiliriz. Simetrik şifreleme ile veriyi kilitlemek oldukça basittir:

# Şifreleme komutu örneği
gpg --symmetric --cipher-algo AES256 --batch --passphrase "GuvenliParola123!" "$DEST_DIR/$ARCHIVE_NAME"

# Orijinal sıkıştırılmış dosyayı sil, sadece şifrelenmiş kalsın
rm -f "$DEST_DIR/$ARCHIVE_NAME"

Geri yükleme yaparken ise şu komutla dosyayı çözebilirsiniz:

gpg --decrypt --output "web_files.tar.gz" "web_files_$DATE.tar.gz.gpg"

4. Cron ile Otomasyon Zamanlaması

Betigimiz hazır ve test edildi. Şimdi bunu manuel olarak çalıştırmak yerine, Linux’un zamanlayıcısı olan Cron servisine devretmeliyiz.

Sistem yöneticisi olarak root haklarıyla crontab düzenleyicisini açalım:

crontab -e

Her gece saat 03:00’te yedekleme betiğini çalıştırmak ve çıktıları bir log dosyasına yönlendirmek için şu satırı ekleyelim:

0 3 * * * /bin/bash /opt/backup/backup.sh >> /var/log/system_backup.log 2>&1

Cron Zamanlama İpuçları:

  • 0 3 * * *: Her gün saat 03:00.
  • 0 0 * * 0: Her Pazar gece yarısı (Haftalık yedekler için ideal).
  • 2>&1 ifadesi, olası hata mesajlarının (stderr) da standart çıktı (stdout) ile birlikte log dosyasına yazılmasını sağlar. Bu sayede hata ayıklama sürecimiz kolaylaşır.

5. Loglama, İzleme ve Hata Yönetimi

Yedek almak kadar, yedeğin alınıp alınmadığını kontrol etmek de hayati önem taşır. Sadece log dosyasına yazmak yeterli olmayabilir; çünkü her gün log dosyasına bakmak insan hatasına açıktır.

Betiğinize hata durumunda (örneğin disk dolduğunda veya veritabanı yanıt vermediğinde) size e-posta gönderecek veya bir webhook (Discord/Telegram/Slack) tetikleyecek mekanizmalar ekleyebilirsiniz.

Örnek bir temel hata kontrolü:

# mysqldump başarısız olursa betik 'set -e' sayesinde durur
if [ $? -eq 0 ]; then
    echo "Veritabanı yedeği başarılı."
else
    echo "HATA: Veritabanı yedeği alınamadı!" >&2
    # Buraya curl ile Telegram/Slack bildirimi eklenebilir
    exit 1
fi

6. Altın Kural: Geri Yükleme (Restore) Testi Yapılmayan Yedek, Yedek Değildir!

Sistem yöneticileri arasında popüler bir deyiş vardır: “Yedeklerinize asla güvenmeyin; sadece geri yükleme testlerinize güvenin.”

Ayda en az bir kez, aldığınız yedeklerin gerçekten çalışıp çalışmadığını izole bir test ortamında denemelisiniz:

  1. Şifreli yedeği test sunucusuna kopyalayın.
  2. GPG ile şifreyi çözün.
  3. Arşivi çıkarın ve veritabanını test ortamına import edin.
  4. Uygulamanın ayağa kalkıp kalkmadığını kontrol edin.

Eğer bu adımları düzenli olarak yapmıyorsanız, elinizde sadece “yedek aldığını zanneden” bir psikolojik rahatlama dosyası var demektir; gerçek bir güvence değil.


Sonuç

Linux üzerinde otomatik yedekleme kurmak, birkaç satır Bash kodu ve doğru kurgulanmış bir Cron görevi ile oldukça sürdürülebilir bir süreçtir. Karmaşık ve pahalı yazılımlara her zaman ihtiyaç duymazsınız; Unix felsefesinin temel taşı olan küçük ve işini iyi yapan araçları birleştirerek kurumsal düzeyde bir yedekleme mimarisi oluşturabilirsiniz.

Unutmayın, sistem yöneticiliğinde en iyi savunma hattı her zaman güncel, şifrelenmiş ve test edilmiş bir yedektir.


Bu yazı Gemini ile otomatik oluşturulmuştur.