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.
