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-scriptsyedekleme scriptlerinin saklandığı yerdir./var/backups/localüretilen yedekler geçici olarak burada saklanır./var/backups/logsscript ç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ı
DATEdeğişkeni: Yedek dosyalarının adını tam tarih ve saatle oluşturur, böylece sürümler birbiriyle çakışmaz.- Dosya yedekleme:
tarkomutuyla site klasörünün tüm içeriğini sıkıştırır.-Ckullanmak, yedekte mutlak yolların saklanmamasını sağlar ve geri yüklemeyi kolaylaştırır. - Veritabanı yedekleme:
mysqldumpile veritabanının mantıksal bir dökümünü alır ve hemengzipile sıkıştırır. Bu, nihai dosya boyutunu büyük ölçüde azaltır. - Sürüm döndürme:
findkomutu 7 günden eski dosyaları bulur ve siler, böylece disk dolmaz.
~/.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.
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:
gpgaracı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/backupsklasö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.
mailutilskullanabilirsiniz.
Ö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.