Rclone ile S3 Uyumlu Depolama Alanına Yedekleme

Bulut depolama alanlarının bu kadar ucuzladığı ve yaygınlaştığı bir dönemde, verilerini hâlâ sadece yerel disklere yedekleyen sysadmin’ler görünce içim sıkışıyor. Backblaze B2, Wasabi, MinIO, Cloudflare R2… Hepsi S3 uyumlu protokolü destekliyor ve hepsi inanılmaz ucuz. Bu yazıda, bu depolama alanlarını kullanarak sunucularınızı nasıl yedekleyeceğinizi Rclone ile adım adım göstereceğim.

Rclone Nedir, Neden Kullanıyoruz?

Rclone, 40’tan fazla farklı bulut depolama sağlayıcısını destekleyen, Go ile yazılmış bir komut satırı aracı. S3, Google Drive, Dropbox, SFTP, WebDAV ve daha fazlasını tek bir araçla yönetebiliyorsunuz. Benim için en büyük avantajı şu: bir kere öğreniyorsunuz, her yerde kullanıyorsunuz. Bugün Backblaze B2 kullanıyorsunuz, yarın Wasabi’ye geçmek istiyorsunuz; tek yapmanız gereken konfigürasyonu değiştirmek.

Rsync biliyorsanız Rclone’u çok daha hızlı anlayacaksınız. Mantık aynı, sadece hedef yerel bir dizin yerine uzak bir depolama alanı.

Rclone Kurulumu

Linux’a Kurulum

Resmi kurulum scripti en güncel sürümü getiriyor:

curl https://rclone.org/install.sh | sudo bash

Alternatif olarak, paket yöneticisi üzerinden de kurabilirsiniz ama sürüm genellikle geride kalıyor:

# Debian/Ubuntu
sudo apt install rclone

# RHEL/CentOS/Rocky
sudo dnf install rclone

# Arch
sudo pacman -S rclone

Kurulumu doğrulayın:

rclone version

Windows’a Kurulum

Windows sysadmin’leri için PowerShell ile:

winget install Rclone.Rclone

Ya da resmi siteden ZIP’i indirip PATH’e ekleyebilirsiniz. Winget daha temiz bir çözüm.

S3 Uyumlu Depolama Konfigürasyonu

Burada birkaç farklı senaryo üzerinden gideceğim çünkü her sağlayıcının endpoint’i farklı.

İnteraktif Konfigürasyon

Rclone’un en güzel özelliklerinden biri interaktif konfigürasyonu:

rclone config

Bu komut sizi adım adım yönlendiriyor. n ile yeni remote ekleyip isim veriyorsunuz, ardından sağlayıcıyı seçiyorsunuz. Ama sunucularda genellikle headless çalışırız, bu yüzden doğrudan config dosyasını yazmak daha pratik.

Backblaze B2 Konfigürasyonu

B2’de önce Application Key oluşturmanız gerekiyor. B2 konsoluna girip App Keys > Add a New Application Key diyorsunuz. Key ID ve Application Key değerlerini alıyorsunuz.

Config dosyası genellikle ~/.config/rclone/rclone.conf konumunda:

[backblaze-backup]
type = b2
account = YOUR_KEY_ID
key = YOUR_APPLICATION_KEY
hard_delete = false

hard_delete = false önemli. Bu ayar sayesinde dosyaları sildiğinizde B2 onları saklıyor, versiyon geçmişi tutabiliyorsunuz.

Wasabi Konfigürasyonu

Wasabi S3 uyumlu çalışıyor ama endpoint belirtmeniz gerekiyor:

[wasabi-backup]
type = s3
provider = Wasabi
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
region = eu-central-1
endpoint = s3.eu-central-1.wasabisys.com

Wasabi’nin bölge bazlı endpoint’leri var. Bucket’ınızı hangi bölgede oluşturduysanız o endpoint’i kullanın.

Cloudflare R2 Konfigürasyonu

R2, çıkış ücreti olmadığı için son dönemde çok popüler oldu:

[r2-backup]
type = s3
provider = Cloudflare
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
endpoint = https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com
acl = private

Self-Hosted MinIO Konfigürasyonu

Şirket içinde kendi S3’ünüzü çalıştırıyorsanız MinIO mükemmel bir seçenek:

[minio-backup]
type = s3
provider = Minio
access_key_id = minioadmin
secret_access_key = minioadmin_secret
endpoint = http://192.168.1.100:9000
location_constraint =
server_side_encryption =

MinIO’da location_constraint ve server_side_encryption alanlarını boş bırakmanız gerekiyor, aksi halde hata alırsınız.

Temel Rclone Komutları

Konfigürasyonu tamamladıktan sonra remote’u test edin:

# Bucket'ları listele
rclone lsd backblaze-backup:

# Bucket içeriğini listele
rclone ls backblaze-backup:my-backup-bucket

# Bağlantıyı test et
rclone about backblaze-backup:

Kopyalama ve Senkronizasyon

Temel komutlar:

  • rclone copy: Kaynak’tan hedefe kopyalar, hedefte fazladan dosyalar olsa da silmez
  • rclone sync: Rsync gibi çalışır, kaynağı hedefe birebir yansıtır, hedefte olmayan dosyaları siler
  • rclone move: Kopyalar ve kaynaktan siler
  • rclone ls: Dosyaları listeler
  • rclone lsd: Sadece dizinleri listeler
  • rclone check: Kaynak ve hedef arasındaki farkları gösterir
# /var/www dizinini B2'ye kopyala
rclone copy /var/www backblaze-backup:my-backup-bucket/www --progress

# Senkronize et (dikkatli kullanın, hedeften siler!)
rclone sync /var/backups wasabi-backup:my-bucket/backups --progress

# Sadece değişen dosyaları gör (dry run)
rclone sync /var/www backblaze-backup:my-backup-bucket/www --dry-run

--dry-run parametresini her zaman önce çalıştırın. Özellikle sync komutunda ne silineceğini önceden görmeniz kritik.

Gerçek Dünya Senaryosu 1: Web Sunucusu Yedekleme

Diyelim ki bir LAMP/LEMP stack çalıştırıyorsunuz. Web dosyaları ve veritabanını birlikte yedeklemeniz gerekiyor.

#!/bin/bash
# /usr/local/bin/webserver-backup.sh

set -euo pipefail

DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/tmp/backups/$DATE"
REMOTE="backblaze-backup:my-server-backups"
LOG_FILE="/var/log/rclone-backup.log"

mkdir -p "$BACKUP_DIR"

echo "[$DATE] Yedekleme basliyor..." >> "$LOG_FILE"

# MySQL/MariaDB dump
mysqldump --all-databases 
  --single-transaction 
  --routines 
  --triggers 
  -u root 
  > "$BACKUP_DIR/all-databases.sql"

gzip "$BACKUP_DIR/all-databases.sql"

# Web dosyalarını yedekle
rclone sync /var/www "$REMOTE/www" 
  --exclude "*.tmp" 
  --exclude ".git/**" 
  --exclude "node_modules/**" 
  --transfers 8 
  --checkers 16 
  --log-file "$LOG_FILE" 
  --log-level INFO

# Veritabanı yedeğini yükle
rclone copy "$BACKUP_DIR/all-databases.sql.gz" "$REMOTE/databases/$DATE/" 
  --log-file "$LOG_FILE"

# 30 günden eski yedekleri temizle
rclone delete "$REMOTE/databases" 
  --min-age 30d 
  --log-file "$LOG_FILE"

# Geçici dosyaları sil
rm -rf "$BACKUP_DIR"

echo "[$DATE] Yedekleme tamamlandi." >> "$LOG_FILE"

Bu script’i cron’a ekleyelim:

# Her gün gece 02:00'da çalıştır
0 2 * * * root /usr/local/bin/webserver-backup.sh

Önemli parametreler:

  • –transfers: Paralel transfer sayısı, ağ bant genişliğinize göre ayarlayın
  • –checkers: Paralel kontrol sayısı, çok dosyalı dizinlerde hızlandırır
  • –exclude: Belirli dosya/dizinleri atla
  • –min-age: Belirtilen yaştan eski dosyaları hedef alır
  • –log-file: Log dosyası konumu
  • –log-level: DEBUG, INFO, NOTICE, ERROR seviyelerinden birini seçin

Gerçek Dünya Senaryosu 2: PostgreSQL Yedekleme ve Rotasyon

PostgreSQL için biraz daha sofistike bir yaklaşım:

#!/bin/bash
# /usr/local/bin/postgres-backup.sh

set -euo pipefail

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
WEEK=$(date +%V)
MONTH=$(date +%m)
BACKUP_BASE="/tmp/pg_backups"
REMOTE="wasabi-backup:pg-backups"
PG_USER="postgres"

mkdir -p "$BACKUP_BASE"

# Her veritabanını ayrı ayrı yedekle
for DB in $(psql -U "$PG_USER" -t -c "SELECT datname FROM pg_database WHERE datistemplate = false AND datname != 'postgres';"); do
    DB=$(echo $DB | tr -d ' ')
    DUMP_FILE="$BACKUP_BASE/${DB}_${TIMESTAMP}.sql.gz"
    
    echo "Yedekleniyor: $DB"
    pg_dump -U "$PG_USER" "$DB" | gzip > "$DUMP_FILE"
    
    # Günlük yedek
    rclone copy "$DUMP_FILE" "$REMOTE/daily/$DB/"
    
    # Haftalık yedek (Pazar günleri)
    if [ "$(date +%u)" -eq 7 ]; then
        rclone copy "$DUMP_FILE" "$REMOTE/weekly/$DB/week-$WEEK/"
    fi
    
    # Aylık yedek (Ayın 1'i)
    if [ "$(date +%d)" -eq "01" ]; then
        rclone copy "$DUMP_FILE" "$REMOTE/monthly/$DB/month-$MONTH/"
    fi
    
    rm -f "$DUMP_FILE"
done

# Günlük yedekleri 7 günde bir temizle
rclone delete "$REMOTE/daily" --min-age 7d
# Haftalık yedekleri 4 haftada bir temizle  
rclone delete "$REMOTE/weekly" --min-age 28d
# Aylık yedekler 12 ay saklanır
rclone delete "$REMOTE/monthly" --min-age 365d

Bu GFS (Grandfather-Father-Son) rotasyon stratejisi sysadmin’lerin klasiği. Günlük, haftalık, aylık yedekler farklı dizinlerde, farklı retention süresiyle saklanıyor.

Bant Genişliği Yönetimi

Üretim sunucusunda yedekleme yaparken bant genişliğini patlatmamak önemli. Rclone’un bu konuda güzel seçenekleri var:

# Maksimum 50 MB/s ile yükle
rclone sync /var/backups backblaze-backup:my-bucket 
  --bwlimit 50M

# Belirli saatlerde farklı hız sınırları
# 09:00-18:00 arası 10M, diğer saatlerde 100M
rclone sync /var/backups backblaze-backup:my-bucket 
  --bwlimit "09:00,10M 18:00,100M"

Bu özelliği çok kullanıyorum. Mesai saatlerinde yedekleme sınırlı bant genişliğiyle çalışıyor, gece full hızda devam ediyor.

Şifreleme: crypt Remote Kullanımı

Verilerinizi buluta göndermeden önce şifrelemek istiyorsanız Rclone’un yerleşik crypt remote tipi var. Bu kritik bir özellik, özellikle KVKK ve GDPR kapsamındaki verileri yedekliyorsanız.

[backblaze-encrypted]
type = crypt
remote = backblaze-backup:my-encrypted-bucket
filename_encryption = standard
directory_name_encryption = true
password = YOUR_STRONG_PASSWORD
password2 = YOUR_SALT_PASSWORD

Bu konfigürasyonu manuel yazmak yerine rclone config ile oluşturmanızı tavsiye ederim çünkü şifreler obfuscate edilerek saklanıyor. rclone config çalıştırın, n ile yeni remote ekleyin, tip olarak crypt seçin ve yönlendirmeyi takip edin.

Artık encrypted remote’u normal gibi kullanabilirsiniz:

rclone copy /var/secrets backblaze-encrypted:secrets/ --progress

Veriler B2’ye gitmeden önce AES-256-CTR ile şifreleniyor. Dosya isimleri de şifreleniyor, bucket’a bakan biri ne sakladığınızı anlayamıyor.

Çok önemli uyarı: Şifrelerinizi mutlaka güvenli bir yerde saklayın. Şifreyi kaybederseniz verilerinize bir daha erişemezsiniz. Bu parolayı password manager’a veya şifreli bir kasaya ekleyin.

Çoklu Remote ve Failover Konfigürasyonu

Kritik veriler için tek bir sağlayıcıya güvenmemek gerekiyor. Rclone’un union remote tipi ile birden fazla hedefe aynı anda yazabilirsiniz:

[multi-backup]
type = union
upstreams = backblaze-backup:my-bucket wasabi-backup:my-bucket
action_policy = all
create_policy = all
search_policy = ff

Bu konfigürasyonla tek bir komutla hem Backblaze hem Wasabi’ye yazıyorsunuz:

rclone sync /var/www multi-backup: --progress

3-2-1 yedekleme stratejisi (3 kopya, 2 farklı medya, 1 offsite) için ideal.

Monitoring ve Alerting

Yedeklemenin çalıştığını sadece cron çıktısından takip etmek yetmez. Healthchecks.io veya benzeri bir servis kullanın:

#!/bin/bash
# Yedekleme başarılı olursa healthchecks.io'ya ping at

HEALTHCHECK_URL="https://hc-ping.com/YOUR-UUID"

# Başladığını bildir
curl -s "$HEALTHCHECK_URL/start" > /dev/null

# Yedekleme işlemi
if rclone sync /var/www backblaze-backup:my-bucket 
  --log-file /var/log/rclone.log 
  --log-level INFO; then
    # Başarılı
    curl -s "$HEALTHCHECK_URL" > /dev/null
    echo "Yedekleme basarili"
else
    # Basarisiz
    curl -s "$HEALTHCHECK_URL/fail" > /dev/null
    echo "HATA: Yedekleme basarisiz!" >&2
    # Slack veya email notification
    curl -s -X POST -H 'Content-type: application/json' 
      --data '{"text":"KRITIK: Sunucu yedeklemesi basarisiz oldu!"}' 
      https://hooks.slack.com/services/YOUR/WEBHOOK/URL
fi

Healthchecks.io’da belirli aralıklarla ping bekliyorsunuz. Ping gelmezse sizi e-posta veya SMS ile uyarıyor. Ücretsiz planı küçük altyapılar için yeterli.

Yedekten Geri Yükleme

Yedeklemenin en önemli adımı geri yüklemedir. Test etmediğiniz yedek, yedek değildir.

# Tüm bucket içeriğini geri yükle
rclone copy backblaze-backup:my-bucket/www /var/www --progress

# Belirli bir tarihteki yedekten geri yükle
rclone copy backblaze-backup:my-bucket/databases/2024-01-15/ /tmp/restore/

# Sadece belirli dosyaları geri yükle
rclone copy backblaze-backup:my-bucket/www/wp-content /var/www/wp-content 
  --progress 
  --transfers 8

Geri yükleme sırasında --progress parametresi ne kadar kaldığını gösteriyor, büyük veri setlerinde sinir kurtarıcı.

B2 versiyonlama aktifse önceki versiyonlara erişmek için:

# B2'de silinen/eski dosyaları listele
rclone ls backblaze-backup:my-bucket --b2-versions

# Eski versiyon dahil geri yükle
rclone copy backblaze-backup:my-bucket/databases/ /tmp/restore 
  --b2-versions

Performans İpuçları

Yedekleme süresini kısaltmak için birkaç şey yapabilirsiniz:

Chunk size ayarı: Büyük dosyalar için chunk size’ı artırın:

rclone copy /var/backups backblaze-backup:my-bucket 
  --s3-chunk-size 128M 
  --s3-upload-concurrency 8

Checksum yerine modtime kullanımı: Milyonlarca küçük dosya varsa checksum hesaplamak yavaşlatıyor:

rclone sync /var/www backblaze-backup:my-bucket 
  --size-only

--size-only sadece boyutu karşılaştırıyor, hash hesaplamıyor. Daha az güvenli ama çok daha hızlı.

Paralel işlem sayısını optimize edin:

  • –transfers 16: 16 dosyayı paralel transfer et
  • –checkers 32: 32 dosyayı paralel kontrol et
  • –buffer-size 256M: Her transfer için 256MB buffer kullan

Sunucunuzun RAM’ine göre bu değerleri ayarlayın. Buffer size toplam RAM kullanımını etkiliyor.

Yaygın Hatalar ve Çözümleri

“Failed to copy: InvalidBucketName” hatası: Bucket ismi büyük harf veya özel karakter içeriyor. S3 uyumlu sistemlerde bucket isimleri lowercase ve tire dışında özel karakter içeremiyor.

“AccessDenied” hatası: API key’in yeterli izni yok. Backblaze B2’de key oluştururken bucket’a read/write iznini verdiğinizden emin olun.

“connection refused” hatası: MinIO gibi self-hosted çözümlerde endpoint URL’ini kontrol edin. HTTP/HTTPS farkına dikkat edin.

Rclone çok yavaş çalışıyor: --transfers ve --checkers değerlerini artırın. Varsayılan değerler çok düşük.

Büyük dosyaları transfer ederken kesiliyor: --s3-chunk-size değerini artırın ve --retries 5 ekleyin:

rclone copy /backup/large-file.tar.gz backblaze-backup:my-bucket 
  --s3-chunk-size 256M 
  --retries 5 
  --retries-sleep 10s

Systemd Timer ile Profesyonel Yedekleme

Cron iyidir ama systemd timer daha iyi logging ve dependency yönetimi sunuyor:

# /etc/systemd/system/rclone-backup.service
[Unit]
Description=Rclone Backup Service
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/webserver-backup.sh
StandardOutput=journal
StandardError=journal
# /etc/systemd/system/rclone-backup.timer
[Unit]
Description=Daily Rclone Backup Timer

[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=300
Persistent=true

[Install]
WantedBy=timers.target

Aktifleştirmek için:

systemctl daemon-reload
systemctl enable --now rclone-backup.timer
systemctl list-timers rclone-backup.timer

RandomizedDelaySec=300 ile 5 dakikaya kadar rastgele gecikme ekliyorsunuz. Onlarca sunucunuz varsa hepsinin aynı anda başlamasını engelliyor.

Log’lara bakmak için:

journalctl -u rclone-backup.service -f

Sonuç

Rclone ile S3 uyumlu depolama yedeklemesi, bir kez konfigüre ettikten sonra neredeyse sıfır bakım gerektiriyor. Yılda birkaç kez geri yükleme testi yapın, log’ları takip edin, healthcheck monitoring kurun ve uyku düzeninizi bozmayın.

En sık yaptığım hatayı söyleyeyim: insanlar yedeklemeyi kuruyor ama test etmiyor. Disk patladığında ya da fidye yazılımı geldiğinde “acaba çalışıyor muydu?” sorusunu sormak istemezsiniz. Her ay otomatik ya da manuel bir geri yükleme testi yapın. Küçük bir veriyi test sunucusuna geri yükleyip kontrol edin, 10 dakikanızı alır.

Backblaze B2 ile başlamanızı öneririm. Fiyatı çok uygun, S3 uyumluluğu mükemmel ve dökümanları yeterince iyi. İlerleyen süreçte kritik veriler için multi-remote konfigürasyona geçip hem B2 hem Wasabi’ye yazabilirsiniz. Bant genişliği ücretleri konusunda ise Cloudflare R2 ciddi bir alternatif, özellikle sık okuma gerektiren senaryolarda.

Bir yanıt yazın

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