Restic Nedir: Modern Yedekleme Aracına Giriş

Yedekleme dünyasında “bir kez yaparım, çalışır” diye düşünmek, tam anlamıyla felakete davetiye çıkarmak demektir. Onlarca araç denedim, onlarca kez production ortamlarda veri kaybının eşiğinden döndüm. Ve bir noktada Restic ile tanıştım. O günden bu yana yedekleme yaklaşımım köklü biçimde değişti.

Restic Nedir?

Restic, Go diliyle yazılmış, açık kaynaklı, modern bir yedekleme aracıdır. 2014 yılında Alexander Neumann tarafından geliştirilmeye başlanmış ve günümüzde aktif bir topluluk tarafından sürdürülmektedir. GitHub’da on binlerce yıldıza sahip olan bu proje, özellikle sistem yöneticilerinin ve DevOps ekiplerinin gözdesi haline gelmiştir.

Ama “bir yedekleme aracı daha mı?” diye sorabilirsiniz. Haklısınız. Piyasada rsync, Bacula, Amanda, Duplicati gibi onlarca araç var. Restic’i farklı kılan şey ise teknik mimarisinin sağlamlığı ve günlük kullanımda gerçekten işe yaramasıdır.

Restic’in Temel Özellikleri

Veri Bütünlüğü ve Şifreleme

Restic, varsayılan olarak her şeyi şifreler. Yani bir yedek aldığınızda, o veriler AES-256 ile şifrelenerek depolanır. Bu özellik opsiyonel değil, zorunludur. Şifrelenmemiş bir Restic yedeği oluşturamazsınız. Başta “neden bu kadar katı?” diye sorabilirsiniz ama düşünün: Yedeğinizi bulut depolamaya veya uzak bir sunucuya gönderiyorsanız, o verilerin okunabilir olmasını istemezsiniz.

Deduplikasyon (Tekilleştirme)

Restic, içerik adresli depolama kullanır. Bunu şöyle açıklayayım: Her dosyayı küçük parçalara (chunk) böler ve her parçanın SHA-256 hash’ini hesaplar. Eğer aynı veri bloğu daha önce yedeklenmişse, tekrar yazmaz. Bu sayede disk alanı tasarrufu ciddi boyutlara ulaşabilir.

Örneğin 100 GB’lık bir veritabanını her gün yedekliyorsunuz ve her gün sadece 2 GB değişiyor. Klasik yöntemle 30 günde 3 TB yer kaplar. Restic ile bu rakam dramatik biçimde düşer çünkü yalnızca değişen blokları depolar.

Snapshot Tabanlı Yapı

Her yedekleme işlemi bir snapshot oluşturur. Bu snapshot’lar bağımsız ve tutarlıdır. İstediğiniz bir snapshot’a geri dönebilir, iki snapshot arasındaki farkları görebilir veya belirli bir snapshot’tan sadece tek bir dosyayı geri yükleyebilirsiniz.

Platform Bağımsızlık

Restic; Linux, macOS ve Windows üzerinde çalışır. Tek bir binary dosyasıdır, bağımlılık yoktur. İndirip çalıştırırsınız, iş biter.

Geniş Backend Desteği

Restic aşağıdaki konumlara yedek alabilir:

  • Local: Yerel disk veya mount edilmiş dizin
  • SFTP: SSH üzerinden uzak sunucu
  • REST Server: Restic’in kendi REST sunucusu
  • Amazon S3 ve S3 uyumlu servisler (MinIO, Wasabi, Backblaze B2)
  • Google Cloud Storage
  • Azure Blob Storage
  • Rclone entegrasyonu ile 40’tan fazla bulut sağlayıcısı

Kurulum

Restic kurulumu son derece basittir. Dağıtımınıza göre farklı yöntemler kullanabilirsiniz.

Debian/Ubuntu Üzerinde Kurulum

# APT ile kurulum
sudo apt update
sudo apt install restic -y

# Versiyonu kontrol et
restic version

RHEL/CentOS/Rocky Linux Üzerinde Kurulum

# EPEL deposunu ekle
sudo dnf install epel-release -y
sudo dnf install restic -y

# Alternatif olarak binary ile kurulum
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

Restic’i Güncel Tutmak

# Restic kendini güncelleyebilir
sudo restic self-update

Bu komut oldukça kullanışlıdır. Özellikle eski bir binary kullanıyorsanız, tek satırla güncel versiyona geçebilirsiniz.

Repository Kavramı ve İlk Kurulum

Restic’te her şey repository (repo) kavramı etrafında döner. Yedeklerinizin tutulduğu şifreli depolama alanına repository denir. Bir yedekleme yapmadan önce bu repository’yi başlatmanız gerekir.

Yerel Repository Oluşturma

# Yerel bir repository başlat
restic init --repo /mnt/backup/myserver

# Ya da RESTIC_REPOSITORY ortam değişkeni ile
export RESTIC_REPOSITORY=/mnt/backup/myserver
restic init

Komutu çalıştırdığınızda sizden bir parola istenir. Bu parolayı kesinlikle kaybetmeyin. Parolayı kaybederseniz verilerinize bir daha erişemezsiniz. Ben bu parolayı hem bir parola yöneticisinde hem de şifreli bir not dosyasında ayrı bir lokasyonda saklarım.

SFTP ile Uzak Repository

# Uzak sunucuda repository oluştur
restic init --repo sftp:[email protected]:/backups/myserver

# SSH config dosyasındaki host adını kullanabilirsiniz
restic init --repo sftp:backup-server:/backups/myserver

S3 Uyumlu Depolama ile Repository

# MinIO veya AWS S3 için environment variable'ları ayarla
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"

# S3'te repository oluştur
restic init --repo s3:https://s3.amazonaws.com/my-backup-bucket/myserver

# MinIO için
restic init --repo s3:http://minio.internal:9000/backups/myserver

İlk Yedeği Almak

Repository hazırsa, yedek almak için backup komutunu kullanırız.

# Basit bir dizin yedeği
restic backup /etc /home /var/www

# Parolayı ortam değişkeni ile geç (otomasyon için şart)
export RESTIC_PASSWORD="super-secret-password"
restic backup /etc /home /var/www

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

# Hariç tutma listesini dosyadan oku
restic backup /home --exclude-file=/etc/restic/excludes.txt

Çıktı şuna benzer görünür:

repository abc12345 opened (version 2, compression level auto)
no parent snapshot found, will read all files

Files:           1234 new,     0 changed,     0 unmodified
Dirs:             456 new,     0 changed,     0 unmodified
Added to the repository: 2.345 GiB (1.123 GiB stored)

snapshot a1b2c3d4 saved

Son satırdaki a1b2c3d4 sizin snapshot ID’nizdir.

Snapshot’ları Yönetmek

Mevcut Snapshot’ları Listeleme

# Tüm snapshot'ları listele
restic snapshots

# Belirli bir host'a ait snapshot'lar
restic snapshots --host web-server-01

# JSON formatında çıktı (otomasyon için kullanışlı)
restic snapshots --json

Çıktıda her snapshot için tarih, host, tag ve path bilgilerini görürsünüz. Onlarca snapshot biriktiğinde bu listeleme hayat kurtarır.

Snapshot İçeriğini İncelemek

# Snapshot içindeki dosyaları listele
restic ls a1b2c3d4

# Belirli bir dizini listele
restic ls latest /etc/nginx

# Son snapshot'ı kullan
restic ls latest

İki Snapshot Arasındaki Farkları Görmek

# İki snapshot arasında diff al
restic diff a1b2c3d4 e5f6g7h8

Bu komut hangi dosyaların eklendiğini, silindiğini veya değiştiğini gösterir. Özellikle “ne zaman bozuldu?” sorusunu yanıtlarken çok işe yarar.

Veri Geri Yükleme

Yedeklemenin en önemli testi geri yüklemedir. Restic bu konuda da oldukça esnektir.

# Tüm yedeği geri yükle
restic restore latest --target /tmp/restore-test

# Belirli bir snapshot'tan geri yükle
restic restore a1b2c3d4 --target /tmp/restore-test

# Sadece belirli dosyaları geri yükle
restic restore latest 
  --target /tmp/restore-test 
  --include "/etc/nginx"

# Dosyayı mount ederek erişim (FUSE gerektirir)
mkdir /mnt/restic-mount
restic mount /mnt/restic-mount &
ls /mnt/restic-mount/snapshots/

mount komutu özellikle dikkat çekici. Tüm yedek geçmişinizi sanki bir dosya sistemi gibi gezebilirsiniz. “Şu dosya 3 hafta önce nasıldı?” sorusunu saniyeler içinde yanıtlarsınız.

Retention Policy: Eski Yedekleri Otomatik Temizleme

Sonsuza kadar yedek tutmak mümkün değil. Disk alanı bir gün dolar. Restic’in forget komutu, belirli kurallara göre eski snapshot’ları temizler.

# Son 7 günlük snapshot'ları tut, gerisini sil
restic forget --keep-daily 7

# Daha kapsamlı bir policy
restic forget 
  --keep-daily 7 
  --keep-weekly 4 
  --keep-monthly 12 
  --keep-yearly 3

# Gerçekten sil (forget sadece işaretler, prune siler)
restic forget 
  --keep-daily 7 
  --keep-weekly 4 
  --keep-monthly 12 
  --prune

Önemli not: forget komutu snapshot’ları işaretler ancak fiziksel veriyi silmez. Disk alanını geri kazanmak için prune çalıştırmanız gerekir. --prune flag’ini doğrudan forget ile birleştirebilirsiniz.

Veri Bütünlüğünü Doğrulamak

Yedek aldım, tamam. Ama o yedek gerçekten çalışıyor mu? Bu soruyu sormadan geçemeyiz.

# Repository bütünlüğünü kontrol et
restic check

# Daha derin kontrol (veri bloklarını da doğrular, yavaştır)
restic check --read-data

# Rastgele örnek üzerinden kontrol (daha hızlı)
restic check --read-data-subset=10%

Ben production ortamlarında haftada bir restic check --read-data-subset=10% çalıştırırım. Aylık bazda ise --read-data ile tam kontrol yaparım. Bu işlem uzun sürer ama gece saatlerinde cron ile çalıştırmak yeterlidir.

Gerçek Dünya Senaryosu: Web Sunucusu Yedekleme Otomasyonu

Teori yeterli, şimdi gerçek bir senaryo kuralım. Diyelim ki bir web sunucunuz var: Nginx konfigürasyonları, uygulama dosyaları ve bir PostgreSQL veritabanı var.

Adım 1: Environment Dosyası Oluşturun

# /etc/restic/env dosyası oluştur
cat > /etc/restic/env << 'EOF'
export RESTIC_REPOSITORY="sftp:[email protected]:/backups/webserver"
export RESTIC_PASSWORD="cok-gizli-bir-parola-buraya"
export AWS_ACCESS_KEY_ID=""
export AWS_SECRET_ACCESS_KEY=""
EOF

chmod 600 /etc/restic/env

Adım 2: Hariç Tutma Listesi

cat > /etc/restic/excludes.txt << 'EOF'
*.tmp
*.log
*.pid
/var/cache
/tmp
/proc
/sys
/dev
/run
EOF

Adım 3: Yedekleme Script’i

cat > /usr/local/bin/restic-backup.sh << 'EOF'
#!/bin/bash
set -euo pipefail

# Environment'ı yükle
source /etc/restic/env

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

echo "[$DATE] Yedekleme basliyor..." >> "$LOG_FILE"

# PostgreSQL dump al
pg_dump -U postgres myapp_db > /tmp/myapp_db_backup.sql

# Restic ile yedekle
restic backup 
  /etc/nginx 
  /var/www/html 
  /tmp/myapp_db_backup.sql 
  --exclude-file=/etc/restic/excludes.txt 
  --tag "webserver" 
  --tag "$(date +%Y-%m)" 
  >> "$LOG_FILE" 2>&1

# Geçici dosyayı temizle
rm -f /tmp/myapp_db_backup.sql

# Eski snapshot'ları temizle
restic forget 
  --keep-daily 7 
  --keep-weekly 4 
  --keep-monthly 6 
  --prune 
  >> "$LOG_FILE" 2>&1

DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] Yedekleme tamamlandi." >> "$LOG_FILE"
EOF

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

Adım 4: Cron ile Otomatikleştirme

# Crontab'a ekle - her gece 02:00'de çalışsın
crontab -e

Crontab içeriği:

# Her gece 02:00'de yedek al
0 2 * * * /usr/local/bin/restic-backup.sh

# Her Pazar 03:00'te bütünlük kontrolü yap
0 3 * * 0 source /etc/restic/env && restic check >> /var/log/restic-check.log 2>&1

Systemd Timer ile Daha Profesyonel Otomasyon

Cron işe yarar ama systemd timer daha iyi loglama ve hata yönetimi sağlar.

# /etc/systemd/system/restic-backup.service
cat > /etc/systemd/system/restic-backup.service << 'EOF'
[Unit]
Description=Restic Yedekleme Servisi
After=network.target

[Service]
Type=oneshot
EnvironmentFile=/etc/restic/env
ExecStart=/usr/local/bin/restic-backup.sh
User=root
EOF

# /etc/systemd/system/restic-backup.timer
cat > /etc/systemd/system/restic-backup.timer << 'EOF'
[Unit]
Description=Gunluk Restic Yedekleme Timer

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable restic-backup.timer
systemctl start restic-backup.timer

# Durumu kontrol et
systemctl status restic-backup.timer
journalctl -u restic-backup.service -f

Performans İpuçları

Restic genellikle iyi performans gösterir ama büyük veri setlerinde bazı ayarlamalar gerekebilir.

  • –compression: Restic 0.14’ten itibaren sıkıştırma desteği var. --compression auto çoğu durumda iyi bir seçimdir
  • –pack-size: Büyük dosyalar için pack boyutunu artırmak (--pack-size 128) performansı iyileştirebilir
  • Paralel bağlantı: --limit-upload ve --limit-download ile bant genişliği kontrolü yapabilirsiniz
  • Cache kullanımı: Restic metadata cache’i yerel diske yazar, bu sayede sonraki işlemler hızlanır. Cache konumunu --cache-dir ile değiştirebilirsiniz

Restic Kullanırken Sık Yapılan Hatalar

Yıllar içinde gördüğüm ve bizzat yaptığım hatalar:

  • Parolayı güvensiz yerde saklamak: Parolayı sadece sunucunun kendisinde tutmak, sunucuyu kaybettiğinizde yedeğe erişemeyeceğiniz anlamına gelir
  • Check yapmamak: Yedek aldım deyip bütünlük kontrolü atlamamak. Corrupt bir repository var olabilir
  • Prune yapmamak: forget sonrası prune çalıştırmayı unutmak, disk alanının dolu kalmasına yol açar
  • Test geri yüklemesi yapmamak: Felaket anında ilk defa geri yükleme denemek pek de iyi bir strateji değil
  • Network timeout’larını görmezden gelmek: Uzun süren yedeklemeler için SSH KeepAlive ayarlarını yapmamak

Restic ile Rclone Entegrasyonu

Restic’in Rclone backend’i, Google Drive, Dropbox, OneDrive gibi onlarca bulut servisiyle çalışmanızı sağlar.

# Önce rclone'u konfigüre et
rclone config

# Rclone remote'u Restic repository olarak kullan
restic init --repo rclone:gdrive:backups/myserver
restic backup /etc --repo rclone:gdrive:backups/myserver

# Environment variable ile
export RESTIC_REPOSITORY="rclone:gdrive:backups/myserver"
restic backup /etc /home

Bu kombinasyon özellikle ücretli bulut depolama yerine mevcut bulut hesaplarınızı kullanmak istediğinizde işe yarar.

Sonuç

Restic, modern yedekleme ihtiyaçlarını karşılayan olgun ve güvenilir bir araçtır. Şifrelemenin varsayılan olması, deduplikasyon ile alan tasarrufu, snapshot tabanlı yapı ve geniş backend desteği onu rakiplerinden öne taşıyan özelliklerdir. Üstelik kurulumu ve günlük kullanımı gerçekten basittir.

Başlangıç için önerim şudur: Önce yerel bir repository ile başlayın, temel komutlara alışın. Sonra SFTP veya S3 backend’ine geçin. Otomasyon script’inizi yazın, cron veya systemd timer’a bağlayın. Haftada bir restic check çalıştırın. Ve en önemlisi, ayda bir gerçek bir geri yükleme testi yapın.

Yedekleme almak değil, geri yükleyebilmek asıl hedeftir. Restic bu hedefe ulaşmanızı mümkün olduğunca kolaylaştırır. Bir sonraki yazıda Restic ile uzak sunucu konfigürasyonlarını ve çoklu repository stratejilerini detaylıca ele alacağız.

Bir yanıt yazın

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