Rclone ile Çoklu Bulut Depolama Senkronizasyonu

Birden fazla bulut servisini ayrı ayrı yönetmek, özellikle production ortamlarında ciddi bir baş ağrısına dönüşebilir. AWS S3’te bir şey, Google Drive’da başka bir şey, Backblaze B2’de ayrı bir şey… Her servise ayrı ayrı giriş yapmak, farklı CLI araçları kullanmak, senkronizasyonu manuel takip etmek. İşte tam bu noktada Rclone devreye giriyor ve hayatı bir hayli kolaylaştırıyor.

Rclone, 70’ten fazla bulut depolama servisini tek bir araçla yönetmenizi sağlayan açık kaynaklı bir komut satırı aracıdır. Rsync’in bulut versiyonu olarak düşünebilirsiniz ama çok daha güçlü. Bu yazıda Rclone’u production ortamında nasıl kullanacağınızı, gerçek dünya senaryolarıyla birlikte ele alacağız.

Rclone Kurulumu

Kurulum oldukça basit. Linux için:

# Otomatik kurulum scripti
curl https://rclone.org/install.sh | sudo bash

# Ya da paket yöneticisi ile
sudo apt install rclone  # Debian/Ubuntu
sudo dnf install rclone  # RHEL/Fedora

# Versiyonu kontrol et
rclone version

Windows için de benzer şekilde, chocolatey ile kurabilirsiniz:

choco install rclone

Kurulum sonrası ilk yapmanız gereken şey remote’ları yapılandırmak. rclone config komutu sizi interaktif bir sihirbaza yönlendirecek.

Remote Yapılandırması

AWS S3 Yapılandırması

rclone config

# Sihirbaz soruları:
# n) New remote
# name> aws-production
# Storage> s3 (Amazon S3 için numara girin)
# provider> AWS
# env_auth> false
# access_key_id> AKIAIOSFODNN7EXAMPLE
# secret_access_key> wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# region> eu-central-1
# endpoint> (boş bırakın)
# location_constraint> eu-central-1

Konfigürasyon dosyası ~/.config/rclone/rclone.conf konumunda saklanır. Dosyayı direkt düzenlemek de mümkün:

[aws-production]
type = s3
provider = AWS
access_key_id = AKIAIOSFODNN7EXAMPLE
secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
region = eu-central-1
location_constraint = eu-central-1

[gcs-backup]
type = google cloud storage
project_number = 123456789
service_account_file = /etc/rclone/gcs-service-account.json
object_acl = private
bucket_acl = private
location = europe-west3

[backblaze-archive]
type = b2
account = 123456789abc
key = 0123456789abcdef0123456789abcdef0123456789

Google Drive Yapılandırması

Google Drive için OAuth akışı gerektiğinden biraz farklı çalışır:

rclone config
# n) New remote
# name> gdrive-team
# Storage> drive (Google Drive)
# client_id> (boş bırakabilirsiniz, varsayılan kullanılır)
# client_secret> (boş bırakabilirsiniz)
# scope> 1 (drive - tam erişim)
# root_folder_id> (boş)
# service_account_file> /etc/rclone/gdrive-sa.json

Headless sunucularda OAuth yapılandırması için önce local makinenizde token alıp sonra sunucuya kopyalamanız gerekir:

# Local makinede
rclone authorize "drive"

# Çıkan token'ı kopyalayıp remote konfigürasyona yapıştırın

Temel Rclone Komutları

Yapılandırma tamamlandıktan sonra kullanabileceğiniz temel komutlar:

# Remote içeriğini listele
rclone ls aws-production:mybucket
rclone lsd aws-production:mybucket  # Sadece dizinleri göster
rclone lsl aws-production:mybucket  # Detaylı liste (boyut, tarih)

# Dosya kopyala
rclone copy /local/path aws-production:mybucket/path

# Senkronize et (kaynak hedefi yansıtır, fazlalıkları siler)
rclone sync /local/path aws-production:mybucket/path

# İki remote arasında kopyala
rclone copy aws-production:mybucket gcs-backup:backup-bucket

# Silmeden önce ne yapacağını gör (dry-run)
rclone sync --dry-run aws-production:source gcs-backup:destination

# Uzak dosyaları sil
rclone delete aws-production:mybucket/old-files/

Gerçek Dünya Senaryosu 1: Çoklu Bulut Yedekleme Stratejisi

Diyelim ki production veritabanı yedeklerinizi hem AWS S3’te hem de Backblaze B2’de tutmak istiyorsunuz. 3-2-1 yedekleme kuralını uyguluyorsunuz. İşte bunu otomatize eden bir script:

#!/bin/bash
# /usr/local/bin/multi-cloud-backup.sh

set -euo pipefail

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="db-backup-${DATE}.sql.gz"
LOCAL_BACKUP_DIR="/tmp/backups"
LOG_FILE="/var/log/rclone-backup.log"

# Logging fonksiyonu
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Backup dizini oluştur
mkdir -p "$LOCAL_BACKUP_DIR"

log "Veritabanı yedeği başlatılıyor..."

# PostgreSQL yedeği al
pg_dump -U postgres mydb | gzip > "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}"

if [ $? -ne 0 ]; then
    log "HATA: Veritabanı yedeği başarısız!"
    exit 1
fi

log "Yedek boyutu: $(du -sh ${LOCAL_BACKUP_DIR}/${BACKUP_NAME} | cut -f1)"

# AWS S3'e yükle (primary)
log "AWS S3'e yükleniyor..."
rclone copy 
    "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" 
    "aws-production:mycompany-backups/database/$(date +%Y/%m)/" 
    --transfers 4 
    --progress 
    2>> "$LOG_FILE"

if [ $? -eq 0 ]; then
    log "AWS S3 yüklemesi başarılı."
else
    log "UYARI: AWS S3 yüklemesi başarısız!"
fi

# Backblaze B2'ye yükle (secondary)
log "Backblaze B2'ye yükleniyor..."
rclone copy 
    "${LOCAL_BACKUP_DIR}/${BACKUP_NAME}" 
    "backblaze-archive:mycompany-archive/database/$(date +%Y/%m)/" 
    --transfers 4 
    --b2-hard-delete 
    2>> "$LOG_FILE"

if [ $? -eq 0 ]; then
    log "Backblaze yüklemesi başarılı."
else
    log "UYARI: Backblaze yüklemesi başarısız!"
fi

# 30 günden eski yerel yedekleri temizle
find "$LOCAL_BACKUP_DIR" -name "db-backup-*.sql.gz" -mtime +30 -delete
log "Eski yedekler temizlendi."

# AWS'de 90 günden eski yedekleri sil
rclone delete 
    --min-age 90d 
    "aws-production:mycompany-backups/database/" 
    2>> "$LOG_FILE"

log "Yedekleme tamamlandı: ${BACKUP_NAME}"

Bu scripti crontab’a ekleyin:

# Her gece 02:00'de çalıştır
0 2 * * * /usr/local/bin/multi-cloud-backup.sh

Gerçek Dünya Senaryosu 2: S3’ten GCS’e Büyük Veri Migrasyonu

AWS’den Google Cloud’a geçiş yapıyorsunuz ve terabaytlarca veriyi taşımanız gerekiyor. Rclone’un --transfers ve --checkers parametrelerini doğru ayarlamak kritik:

#!/bin/bash
# Büyük ölçekli bulut migrasyonu

# Önce ne kadar veri olduğunu kontrol et
echo "Kaynak boyutu kontrol ediliyor..."
rclone size aws-production:legacy-data-bucket

# Paralel transfer ile migrasyon başlat
rclone sync 
    aws-production:legacy-data-bucket 
    gcs-backup:new-data-bucket 
    --transfers 32 
    --checkers 16 
    --buffer-size 256M 
    --s3-chunk-size 128M 
    --progress 
    --log-file /var/log/migration.log 
    --log-level INFO 
    --stats 30s 
    --ignore-errors 
    --backup-dir gcs-backup:migration-conflicts/$(date +%Y%m%d)

echo "Migrasyon tamamlandı. Log: /var/log/migration.log"

Büyük dosyalar için önemli parametreler:

  • –transfers 32: Eş zamanlı dosya transferi sayısı (CPU ve bant genişliğine göre ayarlayın)
  • –checkers 16: Eş zamanlı dosya kontrolü sayısı
  • –buffer-size 256M: Her transfer için bellek tamponu
  • –s3-chunk-size 128M: S3 multipart yükleme parça boyutu
  • –stats 30s: Her 30 saniyede bir istatistik göster
  • –ignore-errors: Hatalı dosyaları atlayıp devam et
  • –backup-dir: Üzerine yazılacak dosyaların yedeğini al

Şifreleme ile Güvenli Depolama

Hassas verileri buluta yüklemeden önce şifrelemek istiyorsanız, Rclone’un yerleşik crypt remote’unu kullanabilirsiniz:

rclone config
# n) New remote
# name> aws-encrypted
# Storage> crypt
# remote> aws-production:mybucket/encrypted
# filename_encryption> standard
# directory_name_encryption> true
# password> (güçlü şifre girin)
# password2> (salt için ikinci şifre)

Konfigürasyon dosyasında şu şekilde görünür:

[aws-encrypted]
type = crypt
remote = aws-production:mybucket/encrypted
filename_encryption = standard
directory_name_encryption = true
password = *** ŞIFRELENMIS ***
password2 = *** ŞIFRELENMIS ***

Artık şifreli remote’a normal gibi dosya yükleyebilirsiniz, Rclone her şeyi otomatik şifreler/çözer:

# Şifreli olarak yükle
rclone copy /sensitive/data aws-encrypted:

# Normal gibi oku (Rclone otomatik çözer)
rclone ls aws-encrypted:

# Gerçek S3'e bakarsanız şifreli dosya adları görürsünüz
rclone ls aws-production:mybucket/encrypted

Mount Özelliği ile FUSE

Rclone’un en kullanışlı özelliklerinden biri, bulut depolamayı yerel dosya sistemi gibi mount etmek:

# Temel mount
rclone mount aws-production:mybucket /mnt/s3-bucket 
    --daemon 
    --allow-other 
    --vfs-cache-mode full 
    --vfs-cache-max-size 10G 
    --vfs-cache-max-age 24h 
    --log-file /var/log/rclone-mount.log

# Systemd servis olarak tanımlamak için
sudo nano /etc/systemd/system/rclone-s3.service
[Unit]
Description=RClone S3 Mount
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/rclone mount 
    aws-production:mybucket 
    /mnt/s3-bucket 
    --allow-other 
    --vfs-cache-mode full 
    --vfs-cache-max-size 10G 
    --vfs-cache-max-age 24h 
    --log-file /var/log/rclone-mount.log 
    --log-level INFO
ExecStop=/bin/fusermount -u /mnt/s3-bucket
Restart=on-failure
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable rclone-s3
sudo systemctl start rclone-s3

VFS cache modları hakkında kısa bilgi:

  • off: Cache yok, her okuma direkt buluttan
  • minimal: Sadece dosya metadata cache’lenir
  • writes: Yazma işlemleri önce cache’e gider
  • full: Okuma ve yazma tamamen cache’lenir (önerilir)

Filtreleme ve Seçici Senkronizasyon

Her zaman tüm dosyaları senkronize etmek istemeyebilirsiniz. Rclone’un filtreleme özellikleri oldukça güçlü:

# Belirli uzantıları dahil et
rclone sync /local/path aws-production:mybucket 
    --include "*.jpg" 
    --include "*.png" 
    --include "*.mp4"

# Belirli dizinleri hariç tut
rclone sync /local/path aws-production:mybucket 
    --exclude ".git/**" 
    --exclude "node_modules/**" 
    --exclude "*.tmp" 
    --exclude ".DS_Store"

# Filter dosyası kullan (daha karmaşık kurallar için)
cat > /etc/rclone/filter-rules.txt << 'EOF'
- .git/**
- node_modules/**
- *.log
- *.tmp
- __pycache__/**
- .env
+ *.py
+ *.js
+ *.json
+ *.yaml
+ docs/**
- **
EOF

rclone sync /local/path aws-production:mybucket 
    --filter-from /etc/rclone/filter-rules.txt 
    --progress

Filter dosyasındaki kurallar sırayla işlenir. + dahil et, - hariç tut anlamına gelir. Son kural genellikle - ** ile diğer her şeyi dışarıda bırakmak olur.

İzleme ve Alerting

Production ortamında Rclone transfer hatalarını izlemek için bir monitoring scripti:

#!/bin/bash
# /usr/local/bin/rclone-monitor.sh

SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
LOG_FILE="/var/log/rclone-sync.log"
ERROR_COUNT=0

# Senkronizasyonu çalıştır ve çıktıyı yakala
rclone sync 
    aws-production:source-bucket 
    gcs-backup:destination-bucket 
    --transfers 8 
    --log-file "$LOG_FILE" 
    --log-level INFO 
    --stats-log-level INFO 
    --stats 60s 2>&1

EXIT_CODE=$?

# Hata kontrolü
if [ $EXIT_CODE -ne 0 ]; then
    ERROR_MSG="Rclone senkronizasyonu başarısız! Exit code: $EXIT_CODE"
    
    # Son 50 satırı al
    LAST_ERRORS=$(tail -50 "$LOG_FILE" | grep -i "error|failed" | head -20)
    
    # Slack bildirimi gönder
    curl -s -X POST "$SLACK_WEBHOOK" 
        -H 'Content-type: application/json' 
        --data "{
            "text": "*Rclone Sync Hatası*n```${ERROR_MSG}n${LAST_ERRORS}```"
        }"
    
    exit $EXIT_CODE
fi

# Başarı bildirimi (opsiyonel, gürültülü olabilir)
TRANSFERRED=$(grep "Transferred:" "$LOG_FILE" | tail -1)
echo "Senkronizasyon başarılı: $TRANSFERRED"

Bandwidth Yönetimi

Üretim sunucularında bant genişliğini kontrol altında tutmak kritik:

# Bant genişliğini sınırla (10 MB/s)
rclone sync source: dest: --bwlimit 10M

# Mesai saatlerinde yavaş, gece hızlı
rclone sync source: dest: 
    --bwlimit "08:00,2M 20:00,off 00:00,100M"

# Bu format: "saat,limit saat,limit" şeklinde çalışır
# 08:00-20:00 arası 2MB/s, 20:00-00:00 arası sınırsız, 00:00-08:00 arası 100MB/s

Rclone ile CI/CD Pipeline Entegrasyonu

GitLab CI’da Rclone kullanımı:

# .gitlab-ci.yml
stages:
  - build
  - deploy
  - sync

variables:
  RCLONE_CONFIG_AWS_PRODUCTION_TYPE: s3
  RCLONE_CONFIG_AWS_PRODUCTION_PROVIDER: AWS
  RCLONE_CONFIG_AWS_PRODUCTION_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
  RCLONE_CONFIG_AWS_PRODUCTION_SECRET_ACCESS_KEY: $AWS_SECRET_KEY
  RCLONE_CONFIG_AWS_PRODUCTION_REGION: eu-central-1

deploy-assets:
  stage: sync
  image: rclone/rclone:latest
  script:
    - rclone sync ./dist/ aws-production:myapp-assets/
      --exclude ".git/**"
      --transfers 16
      --checksum
      --progress
  only:
    - main

CI/CD’de dikkat edilmesi gereken nokta: Rclone konfigürasyonunu ortam değişkenleri üzerinden geçirebilirsiniz. RCLONE_CONFIG_REMOTENAME_OPTION=value formatı kullanılır. Bu sayede config dosyası oluşturmaya gerek kalmaz.

Performans Optimizasyonu İpuçları

Büyük transferlerde performansı artırmak için dikkate almanız gereken noktalar:

  • –checksum: MD5/SHA1 kullanarak değişen dosyaları tespit eder, boyut/tarih yerine. Daha doğru ama daha yavaş.
  • –size-only: Sadece boyut değişikliğine bak, daha hızlı ama daha az güvenilir.
  • –fast-list: S3 uyumlu depolarda tek API çağrısıyla tüm listeyi al. Daha az API çağrısı, daha hızlı.
  • –no-traverse: Hedefte az sayıda dosya değiştiğinde kullanılır, hedefi baştan taramaz.
  • –transfers: Eş zamanlı dosya sayısı, küçük dosyalar için artırın (64-128), büyük dosyalar için düşürün (4-8).
  • –multi-thread-streams: Büyük dosyaları parçalara bölerek paralel indirir.
# Küçük dosyalar için optimize edilmiş ayarlar
rclone sync source: dest: 
    --transfers 64 
    --checkers 32 
    --fast-list 
    --size-only

# Büyük dosyalar için optimize edilmiş ayarlar
rclone sync source: dest: 
    --transfers 4 
    --multi-thread-streams 8 
    --buffer-size 512M 
    --s3-chunk-size 256M

Yaygın Sorunlar ve Çözümleri

Rate limiting hatası:

# İstek hızını düşür
rclone sync source: dest: 
    --tpslimit 10 
    --tpslimit-burst 20

Timeout sorunları:

rclone sync source: dest: 
    --timeout 300s 
    --contimeout 60s 
    --low-level-retries 10 
    --retries 5 
    --retries-sleep 10s

Büyük dizinlerde “too many open files” hatası:

# Sistem limitini artır
ulimit -n 65536

# Ya da rclone'un eş zamanlı checker sayısını düşür
rclone sync source: dest: --checkers 8

Sonuç

Rclone, çoklu bulut ortamlarını yönetmek için gerçekten kapsamlı bir araç. Tek bir komut satırı aracıyla 70’ten fazla servisi yönetebilmek, özellikle vendor lock-in’den kaçınmak isteyenler için büyük avantaj. Production ortamında kullanırken şu noktalara dikkat edin:

Öncelikle her zaman --dry-run ile test edin, özellikle sync ve delete komutlarında. Büyük migrasyonlarda --transfers ve --checkers değerlerini sistemin kapasitesine göre belirleyin; aksi takdirde ya yavaş çalışır ya da sistemi boğarsınız. Şifreli veriler için crypt remote’u kullanmayı alışkanlık haline getirin.

Monitoring tarafında, tüm kritik Rclone işlemlerini log dosyasına yönlendirin ve bu logları bir SIEM ya da en azından basit bir alerting scriptiyle izleyin. Exit code kontrolü yapmayan bir cron job, sessiz sedasız başarısız olur ve fark ettiğinizde iş işten geçmiş olur.

Son olarak, Rclone aktif olarak geliştirilen bir proje. rclone selfupdate ile güncel tutun ve changelog’u takip edin; yeni provider desteği ve performans iyileştirmeleri sürekli geliyor. Özellikle S3 uyumlu depolamalar (MinIO, Wasabi, Cloudflare R2) için destek her geçen gün daha da güçleniyor.

Bir yanıt yazın

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