Betik ve cron ile sunucu yedeklemeyi otomatikleştirme

Bash script ve cron ile sunucu otomatik yedekleme adım adım; dosya ve MySQL yedekleme, sürüm döndürme ve harici alana güvenli aktarım dahil.

6 dk Güncellendi 23 Aug 2026

Sunucu Otomatik Yedekleme Neden Artık Bir Seçenek Değil?

Her sunucu yöneticisi en az bir kez veri kaybı yaşamıştır; yanlışlıkla dosya silme, disk arızası veya fidye yazılımı saldırısı. Böyle bir anda sizi kurtaracak tek şey taze ve geri yüklenebilir bir yedektir. Ancak manuel yedekleme, basit bir insan hatası nedeniyle sonsuza kadar ertelenebilir. Standart çözüm, script yazma ve cron job kombinasyonuyla sunucu otomatik yedekleme sistemini uygulamaktır; bu sistem sizin müdahaleniz olmadan belirli bir programa göre çalışır ve verileriniz konusunda içinizi rahatlatır.

Bu makalede, sunucu otomatik yedekleme için pratik ve eksiksiz bir çözüm sunuyoruz: dosya ve MySQL veritabanı yedekleme scripti yazmaktan, eski sürümleri döndürmeye ve yedeği harici bir alana güvenli bir şekilde aktarmaya kadar. Tüm örnekler Ubuntu/Debian üzerinde test edilmiştir, ancak küçük değişikliklerle diğer Linux dağıtımlarında da çalışır.

Ön Koşullar ve Klasör Yapısı

Scripti yazmadan önce ortamı hazırlamamız gerekiyor. Sunucunuzda statik dosyaları olan bir web uygulaması ve bir MySQL/MariaDB veritabanı çalıştığını varsayıyoruz. Önce gerekli klasörleri oluşturalım:

sudo mkdir -p /opt/backup-scripts
sudo mkdir -p /var/backups/local
sudo mkdir -p /var/backups/logs
  • /opt/backup-scripts yedekleme scriptlerinin saklandığı yerdir.
  • /var/backups/local üretilen yedekler geçici olarak burada saklanır.
  • /var/backups/logs script çalıştırma raporlarını kaydetmek için kullanılır.

Ayrıca aşağıdaki araçların kurulu olduğundan emin olun:

sudo apt update
sudo apt install mysql-client rsync gzip

Sunucu Otomatik Yedekleme Scripti Yazma

Scriptimiz üç ana iş yapar: dosya yedekleme, veritabanı yedekleme ve eski sürümleri silme. Script dosyasını istediğiniz editörle oluşturun:

sudo nano /opt/backup-scripts/backup.sh

İçine aşağıdaki içeriği yerleştirin:

#!/bin/bash
# ============================================
# Sunucu Otomatik Yedekleme - Dosya ve Veritabanı
# ============================================

# Ayarlar
BACKUP_DIR="/var/backups/local"
LOG_DIR="/var/backups/logs"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
RETENTION_DAYS=7

# Site dosyalarının yolu (örnek)
SITE_DIR="/var/www/mysite"
DB_NAME="mydb"
DB_USER="backup_user"
DB_PASS="S3cure_P@ssw0rd"

# Log dosyası
LOG_FILE="$LOG_DIR/backup_$DATE.log"

# Başlangıç
echo "Backup started at $(date)" > "$LOG_FILE"

# 1) tar ile dosya yedekleme
echo "Backing up files..." >> "$LOG_FILE"
tar -czf "$BACKUP_DIR/files_$DATE.tar.gz" -C "$SITE_DIR" . 2>> "$LOG_FILE"

# 2) mysqldump ile veritabanı yedekleme
echo "Backing up database..." >> "$LOG_FILE"
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_DIR/db_$DATE.sql.gz" 2>> "$LOG_FILE"

# 3) Eski yedekleri silme (sürüm döndürme)
echo "Cleaning old backups..." >> "$LOG_FILE"
find "$BACKUP_DIR" -name "files_*.tar.gz" -mtime +$RETENTION_DAYS -delete >> "$LOG_FILE" 2>&1
find "$BACKUP_DIR" -name "db_*.sql.gz" -mtime +$RETENTION_DAYS -delete >> "$LOG_FILE" 2>&1

# Bitiş
echo "Backup completed at $(date)" >> "$LOG_FILE"

Ardından scripti çalıştırılabilir yapın:

sudo chmod +x /opt/backup-scripts/backup.sh

Scriptin Temel Bölümlerinin Açıklaması

  • DATE değişkeni: Yedek dosyalarının adını tam tarih ve saatle oluşturur, böylece sürümler birbiriyle çakışmaz.
  • Dosya yedekleme: tar komutuyla site klasörünün tüm içeriğini sıkıştırır. -C kullanmak, yedekte mutlak yolların saklanmamasını sağlar ve geri yüklemeyi kolaylaştırır.
  • Veritabanı yedekleme: mysqldump ile veritabanının mantıksal bir dökümünü alır ve hemen gzip ile sıkıştırır. Bu, nihai dosya boyutunu büyük ölçüde azaltır.
  • Sürüm döndürme: find komutu 7 günden eski dosyaları bulur ve siler, böylece disk dolmaz.
Yaygın hata: Veritabanı şifresini scriptte düz metin olarak yazmak ciddi bir güvenlik riskidir. Script yetkisiz bir kullanıcı tarafından okunursa, veritabanı bilgileri sızar. Daha iyi bir çözüm, kısıtlı erişime sahip ~/.my.cnf dosyasını kullanmaktır:
chmod 600 ~/.my.cnf
ve ardından scriptte sadece mysqldump "$DB_NAME" kullanın, kullanıcı ve şifre belirtmeden.

Yedeği Harici Alana Aktarma

Yedeği aynı sunucuda saklamak, disk arızası veya fidye yazılımı saldırılarına karşı işe yaramaz. En iyisi, yedekleri otomatik olarak harici bir depolama alanına aktarmaktır. İki yaygın yöntemi inceleyelim.

rsync ile Başka Bir Sunucuya Aktarma

Ayrı bir yedekleme sunucunuz varsa, rsync en iyi seçenektir. Önce SSH anahtarını ayarlayın, böylece script şifre gerektirmeden çalışır:

ssh-keygen -t rsa -b 4096
ssh-copy-id backup_user@backup-server.example.com

Ardından scriptin sonuna şu satırı ekleyin:

rsync -avz --remove-source-files "$BACKUP_DIR/" backup_user@backup-server.example.com:/backups/ >> "$LOG_FILE" 2>&1

--remove-source-files seçeneği, başarılı aktarımdan sonra yerel dosyaları siler ve ana sunucunun disk alanını boş tutar.

rclone ile Bulut Depolamaya Aktarma

Google Drive veya S3 gibi bulut hizmetlerine aktarmak için rclone aracı çok popülerdir. Kurulum ve ayar:

sudo apt install rclone
rclone config

Remote ayarını yaptıktan sonra scripte şu satırı ekleyin:

rclone copy "$BACKUP_DIR" remote:backups/ --log-file="$LOG_FILE"

Otomatik Çalıştırma için cron job Ayarı

Şimdi zamanlama zamanı. crontab -e komutuyla cron dosyasını açın ve scriptin her gece saat 02:00'de çalışması için şu satırı ekleyin:

0 2 * * * /opt/backup-scripts/backup.sh

Belirli bir saatte günlük çalıştırma için bu deseni kullanın. Her 6 saatte bir yedekleme gerekiyorsa:

0 */6 * * * /opt/backup-scripts/backup.sh

cron job Testi

cron'u ayarladıktan sonra, scriptin doğru çalıştığından emin olun. Önce manuel olarak çalıştırın:

sudo /opt/backup-scripts/backup.sh

Ardından log çıktısını kontrol edin:

cat /var/backups/logs/backup_*.log

Bir hata varsa, düzeltin. cron'un çalıştığından emin olmak için crontab'a her dakika çalışacak ve bir test dosyası oluşturacak geçici bir satır ekleyebilirsiniz:

* * * * * touch /tmp/cron-test

Bir dakika sonra /tmp/cron-test dosyası oluştuysa, cron doğru çalışıyor demektir.

Sorun giderme ipucu: cron çalışmıyorsa, muhtemelen scriptin mutlak yolunu yanlış yazdınız veya script çalıştırılabilir değil. Ayrıca cron'un sınırlı bir ortamı olduğunu unutmayın; scriptiniz belirli ortam değişkenlerine ihtiyaç duyuyorsa, bunları scriptin içinde tanımlayın.

Yedek Geri Yükleme; Unutulan Bölüm

Hiç geri yüklenmemiş bir yedek pratikte değersizdir. En az ayda bir, geri yükleme sürecini bir test ortamında gerçekleştirin. Dosyaları geri yüklemek için:

tar -xzf files_2025-01-15_02-00-01.tar.gz -C /tmp/restore-test/

Ve veritabanı için:

gunzip < db_2025-01-15_02-00-01.sql.gz | mysql -u root -p mydb

Bu basit test, gerçek bir kriz ile küçük bir olay arasındaki farkı belirleyebilir.

Yedekleme Scripti Güvenliğini İyileştirme

Birkaç basit önlem, sunucu otomatik yedekleme güvenliğinizi önemli ölçüde artırır:

  • Yedekleri şifreleme: gpg aracıyla yedek dosyalarını aktarmadan önce şifreleyebilirsiniz:
    gpg --symmetric --cipher-algo AES256 backup.tar.gz
  • Yedek klasörüne erişimi kısıtlama: Sadece root kullanıcısı /var/backups klasörüne erişebilmelidir:
    sudo chmod 700 /var/backups
  • Yedekleme çalıştırmasını izleme: Bugünün yedek dosyası oluşturulmadıysa size e-posta gönderecek basit bir script yazın. mailutils kullanabilirsiniz.

Özet

Script ve cron ile sunucu otomatik yedekleme uygulamak, hizmetinizin sürekliliği için yapabileceğiniz en önemli adımlardan biridir. Bu makalede, dosya ve veritabanı yedekleme, eski sürümleri döndürme ve harici alana aktarma için eksiksiz bir script yazdık. Bu çözümü ihtiyaçlarınıza göre kolayca özelleştirebilirsiniz; örneğin belirli klasörlerden yedekleme ekleme, daha güçlü sıkıştırma kullanma veya Telegram'a rapor gönderme.

Bu süreçleri basitleştiren bir altyapı arıyorsanız, ServerNet web hosting ve bulut sunucu hizmetleri iyi bir seçenek olabilir; ancak en önemli ilke başlamaktır. Bugün yedekleme scriptinizi yazın ve cron'u ayarlayın; yarın bir şey olduğunda kendinize teşekkür edeceksiniz.

Bu sayfa yardımcı oldu mu?