S3 ve Backblaze B2 Entegrasyonu: Restic ile Bulut Yedekleme Rehberi

Yedeklerinizi güvenli bir şekilde uzak depolama alanına göndermek söz konusu olduğunda, Restic gerçekten öne çıkan araçlardan biri. Hem şifreleme hem de tekilleştirme (deduplication) özelliklerini bir arada sunması, onu klasik rsync tabanlı çözümlerden ayırıyor. Bu yazıda Restic’i hem AWS S3 hem de Backblaze B2 ile nasıl entegre edeceğinizi, gerçek dünya senaryolarıyla birlikte anlatacağım.

Restic Neden Bu Kadar Popüler?

Bir sysadmin olarak onlarca yedekleme aracı denedim. Restic’in beni ikna eden birkaç özelliği var:

  • End-to-end şifreleme: Yedekler depolama tarafında şifreli tutuluyor. Backblaze veya AWS çalışanları bile verilerinizi göremez.
  • Deduplication: Aynı dosyayı tekrar tekrar yedeklemez. Blok bazlı çalıştığı için sadece değişen kısımları gönderir.
  • Cross-platform: Linux, Windows ve macOS’ta aynı şekilde çalışır.
  • Backend esnekliği: S3, B2, SFTP, REST ve daha fazlasını destekler.
  • Snapshot tabanlı yapı: Her yedek bir snapshot. Herhangi bir noktaya geri dönebilirsiniz.

Şimdi kuruluma geçelim.

Kurulum

Linux’ta Restic Kurulumu

Debian/Ubuntu tabanlı sistemler için:

sudo apt update
sudo apt install restic -y

# Ya da en güncel sürümü doğrudan indirin
restic self-update

RHEL/CentOS/Rocky Linux için:

sudo dnf install restic -y
# veya
sudo yum install restic -y

Binary olarak kurmak isterseniz:

wget https://github.com/restic/restic/releases/download/v0.16.4/restic_0.16.4_linux_amd64.bz2
bunzip2 restic_0.16.4_linux_amd64.bz2
chmod +x restic_0.16.4_linux_amd64
sudo mv restic_0.16.4_linux_amd64 /usr/local/bin/restic

Windows’ta Restic Kurulumu

Windows’ta Chocolatey ile kurabilirsiniz:

choco install restic

Ya da GitHub releases sayfasından .zip dosyasını indirip PATH’e ekleyebilirsiniz.

AWS S3 Entegrasyonu

IAM Kullanıcısı ve Bucket Oluşturma

Önce AWS tarafında biraz hazırlık yapmamız gerekiyor. Restic için özel bir IAM kullanıcısı ve kısıtlı izinler oluşturmak en güvenli yaklaşım.

S3 bucket oluşturun:

aws s3 mb s3://sirket-yedekler-2024 --region eu-central-1

IAM policy JSON dosyasını oluşturun (restic-s3-policy.json):

cat > restic-s3-policy.json << 'EOF'
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::sirket-yedekler-2024"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::sirket-yedekler-2024/*"
        }
    ]
}
EOF

aws iam create-policy 
    --policy-name ResticBackupPolicy 
    --policy-document file://restic-s3-policy.json

Bu policy’yi IAM kullanıcınıza bağlayın ve access key oluşturun. Ardından ortam değişkenlerini ayarlayın:

export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export RESTIC_REPOSITORY="s3:s3.amazonaws.com/sirket-yedekler-2024"
export RESTIC_PASSWORD="guclu-sifrenizi-buraya-yazin"

S3 Repository’yi Başlatma

restic init
# Çıktı:
# created restic repository 1a2b3c4d5e at s3:s3.amazonaws.com/sirket-yedekler-2024
# Please note that knowledge of your password is required to access
# the repository. Losing your password means that your backed up data
# is irrecoverably lost.

Bu adım sadece bir kez yapılır. Repository yapısı S3 bucket’ınızda oluşturulur.

İlk Yedekleme

# Dizin yedekleme
restic backup /var/www /etc /home

# Belirli dosyaları hariç tut
restic backup /var/www --exclude="*.log" --exclude="*.tmp" --exclude="/var/www/cache"

# Snapshot listesini görüntüle
restic snapshots

Backblaze B2 Entegrasyonu

Backblaze B2, AWS S3’e göre genellikle çok daha ucuz bir seçenek. Özellikle büyük miktarda veriyi uzun süre saklamak istiyorsanız fark çok belirgin oluyor.

B2 Bucket ve Uygulama Anahtarı Oluşturma

Backblaze kontrol panelinden:

  • Yeni bir private bucket oluşturun (örneğin: prod-sunucu-yedek)
  • “App Keys” bölümünden yeni bir uygulama anahtarı oluşturun
  • Bu anahtara sadece oluşturduğunuz bucket için izin verin

Ortam değişkenlerini ayarlayın:

export B2_ACCOUNT_ID="your-b2-account-id"
export B2_ACCOUNT_KEY="your-b2-application-key"
export RESTIC_REPOSITORY="b2:prod-sunucu-yedek"
export RESTIC_PASSWORD="guclu-sifrenizi-buraya-yazin"

B2 Repository Başlatma ve Yedekleme

# Repository başlat
restic init

# Yedekleme başlat
restic backup /var/www /etc

# Snapshot detaylarını görüntüle
restic snapshots --verbose

B2 entegrasyonu bu kadar basit. Restic, B2 için native desteğe sahip olduğundan rclone gibi bir ara katmana ihtiyaç duymazsınız.

Ortam Değişkenlerini Güvenli Yönetme

Ortam değişkenlerini her seferinde yazmak hem zahmetli hem de güvensiz. Bunun yerine bir konfigürasyon dosyası kullanın.

/root/.restic-env dosyası oluşturun (sadece root okuyabilsin):

cat > /root/.restic-env << 'EOF'
# AWS S3 için
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export RESTIC_REPOSITORY="s3:s3.amazonaws.com/sirket-yedekler-2024"
export RESTIC_PASSWORD_FILE="/root/.restic-password"
EOF

chmod 600 /root/.restic-env

# Şifre dosyasını ayrı oluşturun
echo "guclu-sifrenizi-buraya-yazin" > /root/.restic-password
chmod 600 /root/.restic-password

RESTIC_PASSWORD_FILE kullanmak, şifreyi doğrudan ortam değişkeninde saklamaktan daha güvenli. Komut geçmişinde görünmez.

Otomatik Yedekleme Scripti

Gerçek dünya senaryolarında yedekleme scriptlerini daha kapsamlı yazmak gerekiyor. Aşağıdaki script hem S3 hem de B2 ile kullanılabilir:

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

set -euo pipefail

# Ortam değişkenlerini yükle
source /root/.restic-env

LOG_FILE="/var/log/restic-backup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

log() {
    echo "[$DATE] $1" | tee -a "$LOG_FILE"
}

log "Yedekleme basliyor..."

# Yedeklenecek dizinler
BACKUP_DIRS="/var/www /etc /home /opt/apps"

# Hariç tutulacak pattern'lar
EXCLUDES=(
    "--exclude=*.log"
    "--exclude=*.tmp"
    "--exclude=/var/www/*/cache"
    "--exclude=/var/www/*/node_modules"
    "--exclude=/home/*/.cache"
    "--exclude=/home/*/.local/share/Trash"
)

# Yedekleme yap
if restic backup $BACKUP_DIRS "${EXCLUDES[@]}" 
    --tag "otomatik" 
    --tag "$(hostname)" 
    2>&1 | tee -a "$LOG_FILE"; then
    log "Yedekleme basariyla tamamlandi."
else
    log "HATA: Yedekleme basarisiz oldu!"
    exit 1
fi

# Eski snapshot'ları temizle (retention policy)
log "Eski yedekler temizleniyor..."
restic forget 
    --keep-daily 7 
    --keep-weekly 4 
    --keep-monthly 6 
    --keep-yearly 2 
    --prune 
    2>&1 | tee -a "$LOG_FILE"

# Repository bütünlüğünü kontrol et (her 7 günde bir)
DAY_OF_WEEK=$(date +%u)
if [ "$DAY_OF_WEEK" -eq 7 ]; then
    log "Repository bütünlük kontrolü yapiliyor..."
    restic check 2>&1 | tee -a "$LOG_FILE"
fi

log "Tüm islemler tamamlandi."

Scripti çalıştırılabilir yapın ve cron’a ekleyin:

chmod +x /usr/local/bin/restic-backup.sh

# Crontab'a ekle (her gece 02:00'de)
crontab -e
# Şunu ekleyin:
# 0 2 * * * /usr/local/bin/restic-backup.sh >> /var/log/restic-backup.log 2>&1

Retention Policy ve Prune

Sonsuz yedek biriktirmek hem pahalı hem de yönetimi zor. Restic’in forget komutu bu sorunu çözüyor.

# Kaç yedek tutmak istediğinizi tanımlayın
restic forget 
    --keep-last 5 
    --keep-daily 7 
    --keep-weekly 4 
    --keep-monthly 12 
    --keep-yearly 3

# --prune eklemezseniz sadece hangi snapshot'ların silineceğini gösterir
# Gerçekten silmek için --prune ekleyin
restic forget --keep-daily 7 --keep-weekly 4 --prune

Parametrelerin anlamları:

  • –keep-last N: Son N snapshot’ı sakla
  • –keep-daily N: Her günden en az bir tane olmak üzere son N günü sakla
  • –keep-weekly N: Her haftadan en az bir tane olmak üzere son N haftayı sakla
  • –keep-monthly N: Her aydan en az bir tane olmak üzere son N ayı sakla
  • –keep-yearly N: Her yıldan en az bir tane olmak üzere son N yılı sakla
  • –prune: Referanssız kalan veri bloklarını fiziksel olarak sil

Geri Yükleme Senaryoları

Yedekleme yapmak yetmez, geri yüklemeyi de test etmeniz şart. İşte sık kullandığım senaryolar:

Snapshot Listeleme ve Dosya Arama

# Tüm snapshot'ları listele
restic snapshots

# Belirli bir tag ile snapshot'ları filtrele
restic snapshots --tag otomatik

# Bir snapshot içindeki dosyaları listele
restic ls latest /var/www

# Belirli bir dosyayı bul
restic find "nginx.conf" --snapshot latest

Dosya Geri Yükleme

# En son snapshot'tan tüm /etc dizinini geri yükle
restic restore latest --target /tmp/restore-test --include /etc

# Belirli bir snapshot ID ile geri yükleme
restic restore 1a2b3c4d --target /tmp/restore-test

# Sadece belirli dosyaları geri yükle
restic restore latest 
    --target /tmp/restore-test 
    --include /var/www/html/wp-config.php

# Geri yüklemeyi doğrula
ls -la /tmp/restore-test/etc/

Mount Ederek Geri Yükleme

Restic’in en güzel özelliklerinden biri snapshot’ları FUSE ile mount edebilmek:

# Mount noktası oluştur
mkdir -p /mnt/restic-restore

# Son snapshot'ı mount et
restic mount /mnt/restic-restore &

# Dosyaları incele
ls /mnt/restic-restore/snapshots/

# İşiniz bitince unmount edin
fusermount -u /mnt/restic-restore

Birden Fazla Backend Kullanımı

Kritik sistemler için hem S3 hem de B2’ye yedeklemek iyi bir pratik. 3-2-1 yedekleme kuralını hatırlayın: 3 kopya, 2 farklı ortam, 1 offsite.

Bunun için iki ayrı script veya iki ayrı environment dosyası kullanabilirsiniz:

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

BACKUP_DIRS="/var/www /etc /home"

# Önce S3'e yedekle
export AWS_ACCESS_KEY_ID="s3-access-key"
export AWS_SECRET_ACCESS_KEY="s3-secret-key"
export RESTIC_REPOSITORY="s3:s3.amazonaws.com/sirket-yedekler-2024"
export RESTIC_PASSWORD_FILE="/root/.restic-password"

echo "S3 yedeklemesi basliyor..."
restic backup $BACKUP_DIRS --tag "s3-backup"
restic forget --keep-daily 7 --keep-weekly 4 --prune

# Sonra B2'ye yedekle
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
export B2_ACCOUNT_ID="b2-account-id"
export B2_ACCOUNT_KEY="b2-application-key"
export RESTIC_REPOSITORY="b2:prod-sunucu-yedek"

echo "B2 yedeklemesi basliyor..."
restic backup $BACKUP_DIRS --tag "b2-backup"
restic forget --keep-daily 7 --keep-weekly 4 --prune

echo "Her iki yedekleme tamamlandi."

Monitoring ve Bildirim

Yedeklemenin başarılı olup olmadığını takip etmek için basit bir e-posta bildirimi ekleyebilirsiniz:

#!/bin/bash
# Restic yedekleme sonucuna gore bildirim gonder

source /root/.restic-env

HOSTNAME=$(hostname)
LOG=/tmp/restic-run.log

if restic backup /var/www /etc --tag "gunluk" > "$LOG" 2>&1; then
    STATUS="BASARILI"
    SUBJECT="[$HOSTNAME] Yedekleme $STATUS"
else
    STATUS="BASARISIZ"
    SUBJECT="[KRITIK] [$HOSTNAME] Yedekleme $STATUS"
fi

# mail komutu kurulu olmalı (mailutils paketi)
mail -s "$SUBJECT" [email protected] < "$LOG"

# Ya da Slack webhook kullanabilirsiniz
SLACK_WEBHOOK="https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"
curl -s -X POST -H 'Content-type: application/json' 
    --data "{"text":"$SUBJECT"}" 
    "$SLACK_WEBHOOK"

Performans Optimizasyonu

Büyük sunucularda yedekleme süresini kısaltmak için birkaç ipucu:

  • –limit-upload: Upload bant genişliğini sınırlar, üretim trafiğini etkilememek için kullanışlı
  • –pack-size: Paket boyutunu MB cinsinden ayarlar, büyük dosyalar için artırmak faydalı (varsayılan 128MB)
  • –compression: auto, max, veya off seçenekleri var. Zaten sıkıştırılmış dosyalar için off daha hızlı
# Bant genişliği kısıtlaması ile yedekleme (MB/s cinsinden)
restic backup /var/www --limit-upload 50

# Sıkıştırmayı devre dışı bırak (örneğin video dosyaları için)
restic backup /media/videos --compression off

# Paralel yükleme bağlantı sayısını artır (varsayılan 5)
restic backup /var/www -o s3.connections=10

Yaygın Sorunlar ve Çözümleri

“repository is already locked” hatası: Önceki bir yedekleme yarıda kesilmişse kilidi kaldırmanız gerekir.

restic unlock

Yavaş yedekleme: Repository çok büyümüşse prune işlemi yavaşlayabilir. --max-repack-size ile sınırlayın:

restic forget --keep-daily 7 --prune --max-repack-size 1G

Cache sorunları: Restic local cache kullanır. Sorun yaşarsanız temizleyin:

restic cache --cleanup

Sonuç

Restic, doğru yapılandırıldığında hem S3 hem de Backblaze B2 ile mükemmel çalışan, güvenilir ve uygun maliyetli bir yedekleme çözümü sunuyor. Özellikle şu noktaları aklınızda tutun:

  • Yedeklerinizi düzenli aralıklarla test edin. Geri yükleme yapmadığınız yedekleme geçersizdir.
  • Şifrelerinizi yedeklerin kendisi dışında güvenli bir yerde saklayın. Repository şifrenizi kaybederseniz verilerinize bir daha ulaşamazsınız.
  • Retention policy’nizi iş gereksinimlerinize göre belirleyin. Her sistem için aynı politika uygun olmayabilir.
  • B2’nin S3’e göre genellikle 5-6 kat daha ucuz olduğunu unutmayın, ancak bazı durumlarda S3’ün diğer AWS servisleriyle entegrasyonu daha avantajlı olabilir.
  • Büyük kurumsal ortamlarda hem S3 hem de B2’yi birlikte kullanarak coğrafi redundancy elde edebilirsiniz.

Yedekleme stratejinizi bugün gözden geçirin ve Restic’i test ortamında denemeye başlayın. Bir felaket anında sizi kurtaracak olan şey, bugün kurduğunuz sağlam yedekleme altyapısıdır.

Bir yanıt yazın

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