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, veyaoffseçenekleri var. Zaten sıkıştırılmış dosyalar içinoffdaha 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.
