Sunucular Arası Veri Göçü: Rclone ile Hızlı ve Güvenli Aktarım

Yıllar önce bir müşterimin sunucusunu taşımak zorunda kaldığımda, aklıma gelen ilk araç rsync oldu. Küçük dosyalar için mükemmeldi ama iş büyük veri setlerine, bulut depolama alanlarına veya farklı protokollere gelince rsync yetersiz kalmaya başladı. İşte tam o noktada rclone hayatıma girdi ve o günden beri veri taşıma işlerinin vazgeçilmez parçası haline geldi.

Rclone, “rsync for cloud storage” sloganıyla yola çıkmış ama zamanla çok daha fazlası haline gelmiş bir araç. S3, Google Drive, FTP, SFTP, WebDAV ve daha onlarca protokolü destekliyor. Bu yazıda gerçek dünya senaryoları üzerinden rclone ile sunucular arası veri göçünü detaylıca inceleyeceğiz.

Rclone Neden Bu Kadar Popüler?

Basit bir rsync komutuyla halledemeyeceğiniz durumlar düşünün. Diyelim ki eski sunucunuzdaki verileri hem yeni bir VPS’e hem de S3 bucket’ına aynı anda taşımak istiyorsunuz. Ya da kaynak sunucunuz Windows, hedef sunucunuz Linux. Belki de aktarım sırasında bant genişliğini sınırlamak, aktarılan dosyaları şifrelemek veya paralel transfer yapmak istiyorsunuz. Rclone tüm bunları tek bir araçla çözüyor.

En çok öne çıkan özellikleri şunlar:

  • 60+ depolama sağlayıcısı desteği: AWS S3, Backblaze B2, Google Cloud Storage, Azure Blob ve daha fazlası
  • Bant genişliği kontrolü: Transfer hızını saatlere göre bile ayarlayabilirsiniz
  • Sunucu taraflı kopyalama: Veriler sizin makinenizden geçmeden direkt taşınır
  • Checksum doğrulama: MD5/SHA1 ile dosya bütünlüğü kontrolü
  • Şifreleme: Crypt backend ile verilerinizi şifreleyerek saklayabilirsiniz
  • Çoklu iş parçacığı: Büyük dosyaları parçalara bölerek hızlandırır

Kurulum

Rclone’u kurmak son derece basit. Hem Linux hem Windows için tek satırlık kurulum mevcut.

# Linux için resmi kurulum scripti
curl https://rclone.org/install.sh | sudo bash

# Ya da paket yöneticisiyle
sudo apt install rclone        # Debian/Ubuntu
sudo dnf install rclone        # RHEL/CentOS/Fedora
sudo pacman -S rclone          # Arch Linux

# Windows için (PowerShell yönetici olarak)
winget install Rclone.Rclone

# Versiyon kontrolü
rclone version

Kurulumdan sonra yapılacak ilk şey remote (uzak depolama) yapılandırmasını yapmak. Bu işlem için rclone config komutunu kullanıyoruz.

Remote Yapılandırması: SFTP Örneği

En yaygın senaryo ile başlayalım. Eski bir sunucudan yeni bir sunucuya SFTP üzerinden veri taşımak istiyorsunuz. Önce iki remote tanımlayalım.

# Interaktif yapılandırma
rclone config

# Yapılandırma menüsünde sırasıyla:
# n) New remote
# Name: eski-sunucu
# Type: sftp
# Host: 192.168.1.100
# User: root
# Port: 22
# SSH anahtar yolu ya da şifre girin

# Yapılandırma dosyasını doğrudan da yazabilirsiniz
cat ~/.config/rclone/rclone.conf

İnteraktif menü yerine doğrudan yapılandırma dosyasını düzenlemek daha hızlı olabilir. Özellikle birden fazla sunucu kuruyorsanız bu yaklaşım çok zaman kazandırır.

[eski-sunucu]
type = sftp
host = 192.168.1.100
user = deploy
port = 22
key_file = /home/deploy/.ssh/id_rsa
known_hosts_file = /home/deploy/.ssh/known_hosts

[yeni-sunucu]
type = sftp
host = 192.168.1.200
user = deploy
port = 22
key_file = /home/deploy/.ssh/id_rsa

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

Temel Transfer Komutları

Rclone’un üç ana transfer komutu var ve aralarındaki farkı anlamak kritik önemde.

rclone copy: Kaynak dosyaları hedefe kopyalar, hedefte fazladan olan dosyalara dokunmaz.

rclone sync: Kaynağı hedefe birebir yansıtır, hedefte kaynak’ta olmayan dosyaları siler. Dikkatli kullanın!

rclone move: Kopyaladıktan sonra kaynaktan siler.

# Temel kopyalama
rclone copy eski-sunucu:/var/www/html yeni-sunucu:/var/www/html

# İlerlemeyi görmek için -P veya --progress
rclone copy eski-sunucu:/var/www/html yeni-sunucu:/var/www/html --progress

# Senkronizasyon (hedefte fazladan dosyaları da siler)
rclone sync eski-sunucu:/home/backup yeni-sunucu:/home/backup --progress

# Kuru çalıştırma - ne yapacağını gösterir ama yapmaz
rclone sync eski-sunucu:/data yeni-sunucu:/data --dry-run --verbose

Üretim ortamında bir komutu çalıştırmadan önce her zaman --dry-run ile test edin. Bu alışkanlık beni pek çok felaketten kurtardı.

Gerçek Dünya Senaryosu 1: Web Sunucusu Göçü

Diyelim ki bir e-ticaret sitesini eski bir sunucudan yenisine taşıyorsunuz. Apache document root, yüklenen görseller ve log dosyaları var. Toplam veri 80 GB civarında.

#!/bin/bash
# migrate-webserver.sh

SOURCE="eski-sunucu"
DEST="yeni-sunucu"
LOG_FILE="/var/log/migration-$(date +%Y%m%d_%H%M%S).log"

echo "Migration başlıyor: $(date)" | tee -a "$LOG_FILE"

# Önce büyük dosyaları taşı (medya klasörü)
rclone copy 
  "$SOURCE:/var/www/html/uploads" 
  "$DEST:/var/www/html/uploads" 
  --progress 
  --transfers 8 
  --checkers 16 
  --bwlimit 50M 
  --log-file "$LOG_FILE" 
  --log-level INFO

# Sonra geri kalan web dosyaları
rclone copy 
  "$SOURCE:/var/www/html" 
  "$DEST:/var/www/html" 
  --progress 
  --transfers 4 
  --exclude "uploads/**" 
  --log-file "$LOG_FILE"

# Log dosyalarını hariç tut, gereksiz yer kaplar
rclone copy 
  "$SOURCE:/etc/apache2" 
  "$DEST:/etc/apache2" 
  --exclude "*.log" 
  --exclude "logs/**"

echo "Migration tamamlandı: $(date)" | tee -a "$LOG_FILE"

Burada dikkat etmeniz gereken parametreler:

  • –transfers 8: Aynı anda 8 dosya transfer eder (varsayılan 4)
  • –checkers 16: Dosya kontrolü için 16 iş parçacığı kullanır
  • –bwlimit 50M: Bant genişliğini 50 MB/s ile sınırlar, üretim trafiğini etkilememek için
  • –exclude: Belirli dosya veya dizinleri atlar

Checksum ile Veri Bütünlüğü Doğrulama

Veri taşıdıktan sonra her şeyin sağlıklı kopyalandığını nasıl doğrularsınız? Rclone’un check komutu tam olarak bunun için var.

# Kaynak ve hedef arasında checksum karşılaştırması
rclone check eski-sunucu:/var/www/html yeni-sunucu:/var/www/html

# Daha ayrıntılı çıktı için
rclone check 
  eski-sunucu:/var/www/html 
  yeni-sunucu:/var/www/html 
  --verbose 
  --one-way

# Sadece boyut kontrolü (checksum olmayan depolama için)
rclone check 
  eski-sunucu:/data 
  yeni-sunucu:/data 
  --size-only

# Farklı olan dosyaları bir dosyaya yaz
rclone check 
  eski-sunucu:/data 
  yeni-sunucu:/data 
  --differ /tmp/farkli_dosyalar.txt 
  --missing-on-dst /tmp/eksik_dosyalar.txt

Büyük bir göç operasyonunda check komutu uzun sürebilir ama es geçmeyin. 200 GB veri taşıdıktan sonra “herhalde tamam” deyip sistemi devreye almak riskli. Ben genellikle check sonuçlarını log’a yazıp kritik dizinleri elle de spot-check yapıyorum.

Gerçek Dünya Senaryosu 2: Veritabanı Yedeklerini S3’e Gönderme

Sunucular arası göç sadece dosya taşımak değil. Düzenli yedeklerin uzak depolamaya gönderilmesi de bu kategoriye giriyor. Şöyle bir senaryo düşünün: Her gece MySQL dumpları alınıyor ve bunları hem yerel diskte hem de S3’te saklamak istiyorsunuz.

#!/bin/bash
# db-backup-to-s3.sh

DATE=$(date +%Y-%m-%d_%H%M)
BACKUP_DIR="/tmp/db-backups"
S3_REMOTE="s3-yedek"
S3_BUCKET="my-company-backups"
DB_NAME="production_db"
RETENTION_DAYS=30

mkdir -p "$BACKUP_DIR"

# Veritabanı dump al
mysqldump 
  --single-transaction 
  --routines 
  --triggers 
  -u backup_user 
  -p"$DB_PASSWORD" 
  "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"

echo "Dump alındı: ${DB_NAME}_${DATE}.sql.gz"

# S3'e yükle
rclone copy 
  "$BACKUP_DIR" 
  "$S3_REMOTE:$S3_BUCKET/mysql-backups" 
  --s3-storage-class STANDARD_IA 
  --progress

# Yerel eski yedekleri temizle
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete

# S3'teki eski yedekleri temizle (30 günden eski)
rclone delete 
  "$S3_REMOTE:$S3_BUCKET/mysql-backups" 
  --min-age "${RETENTION_DAYS}d"

echo "Yedekleme tamamlandı: $(date)"

S3’e yüklerken --s3-storage-class STANDARD_IA kullanmak maliyeti ciddi ölçüde düşürür. Sık erişilmeyen yedekler için bu sınıf idealdir. Arşiv amaçlı yedekler için GLACIER da tercih edebilirsiniz.

Bant Genişliği Yönetimi ve Zamanlama

Üretim ortamında en büyük problem transfer sırasında mevcut trafiği etkilemek. Rclone’un bwlimit özelliği sadece sabit bir limit değil, zaman tabanlı limit de destekliyor.

# Sabit bant genişliği limiti
rclone copy source:/ dest:/ --bwlimit 10M

# Zaman tabanlı limit: sabah 08-18 arası 5M, gece ise sınırsız
rclone copy source:/ dest:/ --bwlimit "08:00,5M 18:00,off"

# Mesai saatlerinde 2M, gece 02-06 arası 100M, diğer zamanlarda 20M
rclone copy source:/ dest:/ 
  --bwlimit "09:00,2M 18:00,20M 02:00,100M 06:00,20M"

Büyük bir göç operasyonunda bu ayar çok işe yarıyor. Gündüz yavaş çalışıp gece hızlanması, kullanıcıları etkilemeden arka planda işin ilerlemesini sağlıyor.

Filtreler ve Exclude Kuralları

Gerçek dünyada her zaman tüm dizini taşımak istemezsiniz. Geçici dosyalar, cache dizinleri, log dosyaları genellikle taşımanıza gerek yok.

# Birden fazla exclude kuralı
rclone copy 
  eski-sunucu:/var/www 
  yeni-sunucu:/var/www 
  --exclude "*.tmp" 
  --exclude "*.log" 
  --exclude ".git/**" 
  --exclude "node_modules/**" 
  --exclude "__pycache__/**" 
  --exclude "*.pyc"

# Filter dosyası kullanmak daha temiz
cat > /tmp/rclone-filter.txt << 'EOF'
- *.tmp
- *.log
- .git/**
- node_modules/**
- __pycache__/**
- cache/**
+ **
EOF

rclone copy 
  eski-sunucu:/var/www 
  yeni-sunucu:/var/www 
  --filter-from /tmp/rclone-filter.txt

# Belirli büyüklükten büyük dosyaları atla
rclone copy source:/ dest:/ --max-size 1G

# Son 7 günde değişen dosyaları kopyala
rclone copy source:/ dest:/ --max-age 7d

Filter dosyası kullanmayı alışkanlık haline getirin. Komut satırı karmaşıklaştıkça hata yapma ihtimali artar, bir dosyada tutmak hem daha okunaklı hem de versiyon kontrolüne alınabilir.

Şifreli Yedekleme: Crypt Backend

Hassas verileri bulut depolamaya göndermeden önce şifrelemek zorunlu. Rclone’un crypt backend’i bu işi gayet iyi yapıyor.

# Önce normal bir remote tanımlayın (örnek: s3-yedek)
# Sonra crypt remote oluşturun
rclone config
# n) New remote
# Name: s3-encrypted
# Type: crypt
# Remote: s3-yedek:my-bucket/encrypted-backups
# Şifre ve salt belirleyin (mutlaka kaydedin!)

# Artık şifreli remote'u normal gibi kullanırsınız
rclone copy /var/backups s3-encrypted: --progress

# Şifreli dosyaları geri almak için de aynı remote
rclone copy s3-encrypted: /var/restored --progress

Crypt backend’in güzel yanı tamamen şeffaf çalışması. Siz normal copy/sync komutlarını kullanıyorsunuz, şifreleme arka planda hallediliyor. Ama şifreyi kaybederseniz verilerinize bir daha ulaşamazsınız, bu konuda uyarmadan geçemezdim.

Mount ile Uzak Depolamayı Yerel Disk Gibi Kullanma

Rclone sadece kopyalama aracı değil. rclone mount komutuyla uzak depolamayı yerel bir dizin gibi bağlayabilirsiniz. Bu özellikle sürekli erişim gereken senaryolarda işe yarıyor.

# FUSE gerekli
sudo apt install fuse3

# Mount oluştur
mkdir -p /mnt/eski-sunucu-data
rclone mount eski-sunucu:/data /mnt/eski-sunucu-data 
  --daemon 
  --vfs-cache-mode writes 
  --vfs-cache-max-size 10G 
  --buffer-size 32M

# Mount'u test et
ls -la /mnt/eski-sunucu-data

# Unmount
fusermount -u /mnt/eski-sunucu-data

# Systemd service olarak çalıştırmak için
sudo nano /etc/systemd/system/rclone-mount.service
[Unit]
Description=Rclone Mount - Eski Sunucu
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/rclone mount 
  eski-sunucu:/data 
  /mnt/eski-sunucu-data 
  --vfs-cache-mode writes 
  --vfs-cache-max-size 10G
ExecStop=/bin/fusermount -u /mnt/eski-sunucu-data
Restart=on-failure

[Install]
WantedBy=multi-user.target

Paralel Transfer ve Performans Ayarları

Büyük veri setlerinde performansı artırmak için birkaç önemli parametre var.

# Yüksek performanslı transfer ayarları
rclone copy 
  eski-sunucu:/data 
  yeni-sunucu:/data 
  --transfers 16 
  --checkers 32 
  --buffer-size 64M 
  --multi-thread-streams 4 
  --multi-thread-cutoff 100M 
  --progress 
  --stats 10s

# Küçük dosya sayısı fazlaysa
rclone copy source:/ dest:/ 
  --transfers 32 
  --checkers 64 
  --no-traverse

# S3 için çok parçalı yükleme
rclone copy local-dir s3-yedek:bucket 
  --s3-upload-concurrency 8 
  --s3-chunk-size 64M

Parametre açıklamaları:

  • –transfers: Eş zamanlı dosya transfer sayısı
  • –checkers: Dosyaların zaten var olup olmadığını kontrol eden iş parçacığı sayısı
  • –buffer-size: Her transfer için bellek tamponu
  • –multi-thread-streams: Büyük dosyaları kaç parçaya böleceği
  • –multi-thread-cutoff: Bu boyutun üzerindeki dosyalara çok parçalı transfer uygular

Göç Sırasında Dikkat Edilecekler

Yıllar içinde yaptığım göç operasyonlarından öğrendiğim kritik noktalar:

  • Önce dry-run yapın: Hiçbir üretim göçü --dry-run olmadan başlamasın. Ne kadar aceleye gelse de bu adımı atlamamaya dikkat edin.
  • Log tutun: Her transfer için log dosyası oluşturun. Bir şeyler yanlış gittiğinde geriye dönüp bakabilmek paha biçilemez.
  • Artımlı çalışın: 1 TB’lık bir veriyi tek seferde taşımaya çalışmayın. Parça parça yapın, her parçayı doğrulayın.
  • DNS değişikliğini son yapın: Dosyalar yeni sunucuya taşındıktan sonra, sistemler devreye alındıktan sonra DNS’i değiştirin.
  • Rollback planı hazırlayın: Her şey ters giderse eski sunucuya nasıl geri döneceğinizi önceden planlayın.
  • İzin ve sahiplik bilgilerini kontrol edin: Rclone varsayılan olarak SFTP üzerinde dosya izinlerini korur ama bazı senaryolarda manuel düzeltme gerekebilir.

Sorun Giderme

En sık karşılaşılan sorunlar ve çözümleri:

# Bağlantı sorunlarını debug etmek
rclone ls eski-sunucu:/test --log-level DEBUG

# Zaman aşımı sorunları için
rclone copy source: dest: 
  --timeout 30m 
  --contimeout 60s 
  --retries 10 
  --retries-sleep 30s 
  --low-level-retries 20

# Yarım kalan transferi kaldığı yerden devam ettir
# rclone copy zaten bu özelliğe sahip, tekrar çalıştırmanız yeterli
# Sadece yeni/değişen dosyaları aktarır

# Transfer hızını anlık izleme
rclone copy source: dest: --stats 5s --stats-unit bits

Bağlantı koparsa panik yapmayın. Rclone’un en güzel özelliklerinden biri kaldığı yerden devam edebilmesi. Komutu tekrar çalıştırdığınızda zaten var olan dosyaları atlayıp sadece eksik olanları tamamlar.

Sonuç

Rclone, sistem yöneticisinin araç çantasında olması gereken türden bir yazılım. Kurulumu basit, yapılandırması esnek ve belgelendirmesi mükemmel. Rsync’in yetmediği her yerde rclone devreye giriyor.

Bu yazıda anlattığım senaryolar gerçek üretim ortamlarında karşılaştığım durumlar. SFTP tabanlı sunucu göçlerinden S3 yedeklemelerine, şifreli depolamadan mount işlemlerine kadar rclone’un ne kadar geniş bir kullanım alanı olduğunu gördük.

Bir sonraki sunucu göç projenizde rclone’u denemeden karar vermeyin. Dry-run ile başlayın, küçük bir dizini test edin, sonuçları gördükten sonra büyük veriyi taşıyın. Ve ne olursa olsun, kaynak sunucuyu silmeden önce her zaman checksum doğrulamasını yapın.

Sorularınız veya kendi deneyimleriniz varsa yorumlarda paylaşın. Özellikle alışılmadık senaryolarla karşılaştıysanız duymak isterim.

Bir yanıt yazın

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