Takip et

Git Deponuzu DigitalOcean Spaces’e Yedekleme Rehberi

Git Deponuzu DigitalOcean Spaces’e Yedekleme Rehberi Giriş Modern yazılım geliştirme süreçlerinin kalbinde yer alan Git, projelerinizi versiyon

Git Deponuzu DigitalOcean Spaces’e Yedekleme Rehberi

Giriş

Modern yazılım geliştirme süreçlerinin kalbinde yer alan Git, projelerinizi versiyonlamak, değişiklikleri takip etmek ve ekip içinde işbirliği yapmak için vazgeçilmez bir araçtır. Ancak, Git depolarınızı sadece yerel makinenizde veya tek bir uzak sunucuda tutmak, potansiyel veri kaybı risklerini beraberinde getirir. Donanım arızaları, yanlışlıkla silmeler, kötü amaçlı yazılımlar veya doğal afetler gibi öngörülemeyen olaylar, değerli kod tabanınızın tamamen yok olmasına neden olabilir. Bu nedenle, Git depolarınızın düzenli ve güvenli bir şekilde yedeklenmesi, her geliştirici ve ekip için hayati önem taşır.

Bu makale, Git depolarınızı DigitalOcean Spaces’e nasıl yedekleyeceğinizi adım adım açıklayacaktır. DigitalOcean Spaces, Amazon S3 ile uyumlu, ölçeklenebilir ve uygun maliyetli bir nesne depolama hizmetidir. Projelerinizi güvenli bir şekilde bulutta depolayarak, olası veri kayıplarına karşı kendinizi koruyabilir ve felaket kurtarma senaryolarına hazırlıklı olabilirsiniz. Makalenin ilerleyen bölümlerinde, DigitalOcean Spaces’in avantajlarından, farklı yedekleme stratejilerinden, AWS CLI kullanarak yedekleme adımlarından, otomatik yedekleme betiklerinden ve en iyi güvenlik uygulamalarından detaylıca bahsedeceğiz. Amacımız, size kapsamlı bir rehber sunarak Git depolarınızın yedeklenmesi sürecini sorunsuz ve güvenilir hale getirmenize yardımcı olmaktır.

Neden Git Depolarınızı Yedeklemelisiniz?

Git depolarınızı yedeklemek, geliştirme sürecinizin devamlılığı ve veri bütünlüğü için kritik bir adımdır. Birçok geliştirici, uzak bir Git sunucusu (GitHub, GitLab, Bitbucket gibi) kullandığı için yedekleme konusunda kendilerini güvende hissedebilir. Ancak bu platformlar bile tamamen risksiz değildir ve ek bir yedekleme katmanı her zaman tavsiye edilir. İşte Git depolarınızı yedeklemeniz için başlıca nedenler:

Veri Kaybı Riskleri

* Donanım Arızaları: Yerel makinenizin sabit diski bozulabilir veya sunucunuzda bir donanım arızası meydana gelebilir. Bu tür durumlarda, yedeklenmemiş tüm verileriniz kalıcı olarak kaybolabilir.
* Yanlışlıkla Silme: İnsan hatası kaçınılmazdır. Yanlış bir rm -rf komutu veya Git geçmişini silen hatalı bir işlem, projenizin önemli bölümlerini veya tümünü yok edebilir.
* Yazılım Hataları ve Bozulmalar: İşletim sistemi veya Git istemcisindeki bir hata, deponuzun bozulmasına ve erişilemez hale gelmesine neden olabilir.
* Kötü Amaçlı Yazılımlar ve Siber Saldırılar: Fidye yazılımları veya diğer siber saldırılar, verilerinizi şifreleyebilir veya silebilir. Yedekleriniz, bu tür durumlarda hızlı bir şekilde kurtarma yapmanızı sağlar.

Tarihsel Verilerin Korunması

Git, projenizin tüm tarihçesini, her bir değişikliği ve kimin tarafından yapıldığını kaydeder. Bu tarihsel veriler, hata ayıklama, kod incelemesi ve projenin evrimini anlama açısından paha biçilmezdir. Yedekleme, bu değerli tarihçenin kaybolmamasını sağlar.

Felaket Kurtarma

Beklenmedik bir felaket (yangın, sel, deprem vb.) durumunda, fiziksel sunucularınız veya yerel geliştirme ortamlarınız tamamen kullanılamaz hale gelebilir. Bulut tabanlı bir yedekleme çözümü, bu tür senaryolarda iş sürekliliğini garanti altına almanın en etkili yoludur.

Ekip Çalışması ve Senkronizasyonun Ötesinde Güvenlik

Uzak bir Git deposu kullanmak, ekip üyeleri arasında kodun senkronize edilmesini sağlar. Ancak bu, birincil depolama konumunun (örneğin GitHub) kendisinin bir yedek olduğu anlamına gelmez. Kendi yedeklerinizi tutmak, dış hizmet sağlayıcılardan bağımsız bir güvenlik katmanı oluşturur.

Özetle, Git depolarınızı yedeklemek, sadece bir “iyi uygulama” değil, aynı zamanda iş sürekliliği ve veri güvenliği için mutlak bir gerekliliktir.

DigitalOcean Spaces Nedir ve Neden Tercih Edilmeli?

DigitalOcean Spaces, geliştiriciler ve şirketler için tasarlanmış, uygun maliyetli ve ölçeklenebilir bir nesne depolama hizmetidir. Amazon S3 (Simple Storage Service) API’si ile uyumlu olması sayesinde, S3 ile çalışan birçok araç ve kütüphane Spaces ile de sorunsuz bir şekilde kullanılabilir. Bu uyumluluk, DigitalOcean Spaces’i Git depolarınızı yedeklemek için cazip bir seçenek haline getirir.

DigitalOcean Spaces’in Temel Özellikleri ve Avantajları

* S3 Uyumlu API: En önemli avantajlarından biridir. AWS CLI, s3cmd gibi popüler araçlar ve birçok programlama dilindeki S3 kütüphaneleri DigitalOcean Spaces ile doğrudan çalışabilir. Bu, mevcut S3 bilgi ve becerilerinizi Spaces’te de kullanabileceğiniz anlamına gelir.
* Maliyet Etkinliği: Diğer bulut depolama sağlayıcılarına kıyasla genellikle daha rekabetçi fiyatlandırma sunar. Hem depolama alanı hem de veri transferi (bant genişliği) için şeffaf ve öngörülebilir fiyatlandırma modelleri bulunur.
* Ölçeklenebilirlik ve Güvenilirlik: İhtiyaçlarınız doğrultusunda depolama alanınızı kolayca artırabilir veya azaltabilirsiniz. DigitalOcean’ın altyapısı, yüksek erişilebilirlik ve veri dayanıklılığı sağlayacak şekilde tasarlanmıştır. Verileriniz, birden fazla fiziksel cihazda yedekli olarak saklanır.
* Global Erişilebilirlik: Farklı coğrafi bölgelerde (datacenter’lar) Spaces oluşturabilirsiniz. Bu, verilerinizi kullanıcılarınıza veya sunucularınıza daha yakın bir yerde depolayarak gecikmeyi azaltmanıza ve felaket kurtarma stratejilerinizi geliştirmenize olanak tanır.
* Basit Kullanım Arayüzü ve Entegrasyon Kolaylığı: DigitalOcean’ın kontrol paneli kullanıcı dostudur. Spaces oluşturmak, yönetmek ve API anahtarlarını ayarlamak oldukça basittir. Ayrıca, Spaces’i diğer DigitalOcean hizmetleriyle (Droplets, Kubernetes vb.) kolayca entegre edebilirsiniz.
* Güvenlik Özellikleri:
* Erişim Kontrolü: Erişim anahtarları (Access Keys) ve gizli anahtarlar (Secret Keys) aracılığıyla Spaces’inize kimlerin erişebileceğini kontrol edersiniz.
* ACL’ler (Access Control Lists): Nesne düzeyinde veya Space düzeyinde erişim izinlerini belirleyebilirsiniz.
* Statik Web Sitesi Barındırma: Yedekleme için doğrudan ilgili olmasa da, Spaces’in statik web sitelerini barındırma yeteneği, platformun çok yönlülüğünü gösterir.
* CORS Desteği: Çapraz kaynak isteği (CORS) yapılandırmaları ile web uygulamalarınızdan Spaces’teki verilere güvenli erişim sağlayabilirsiniz.

DigitalOcean Spaces, özellikle küçük ve orta ölçekli projelerden kurumsal düzeydeki uygulamalara kadar geniş bir yelpazedeki yedekleme ihtiyaçlarını karşılayabilecek güçlü ve uygun maliyetli bir çözümdür. S3 uyumluluğu sayesinde, mevcut araç setinizi kullanarak kolayca entegre edilebilir ve yönetilebilir.

Yedekleme Stratejileri ve Yöntemleri

Git depolarınızı DigitalOcean Spaces’e yedeklerken uygulayabileceğiniz birkaç farklı strateji ve yöntem bulunmaktadır. Her birinin kendine özgü avantajları ve kullanım senaryoları vardır.

Tam Yedekleme (Bare Repository)

Bu, bir Git deposunun çalışma ağacı (working directory) olmadan, sadece Git nesnelerini ve referanslarını içeren bir kopyasını oluşturma yöntemidir. Bir bare depo, üzerine doğrudan git commit veya git checkout gibi işlemler yapamayacağınız, ancak git push veya git fetch gibi işlemler için uzak bir depo olarak kullanılabilen bir yapıdır.

* Nasıl Oluşturulur: Mevcut bir Git deposunun tam yedeğini almak için git clone --bare komutunu kullanabilirsiniz:

git clone --bare /path/to/your/repo /path/to/backup/repo.git

Bu komut, /path/to/your/repo adresindeki deponun tüm geçmişini ve referanslarını içeren bir bare depo kopyasını /path/to/backup/repo.git adresine oluşturur. .git uzantısı, bir bare depo olduğunu belirtmek için yaygın bir pratiktir.
* Avantajları:
* Deponun tüm geçmişini ve tüm dalları (branches) içerir.
* Basit ve anlaşılır bir yedekleme yöntemidir.
* Geri yüklemesi kolaydır; doğrudan bu bare depodan git clone yapabilirsiniz.
* Dezavantajları:
* Her yedeklemede deponun tamamını kopyaladığı için büyük depolar için zaman ve disk alanı açısından verimsiz olabilir.

Artımlı Yedekleme (Incremental Backup)

Artımlı yedekleme, sadece son yedeklemeden bu yana değişen veya eklenen verileri yedeklemeyi içerir. Bu yöntem, özellikle büyük depolar için bant genişliğinden ve depolama alanından tasarruf sağlar. Git için artımlı yedekleme genellikle git bundle komutu ile yapılır.

* git bundle Nedir? git bundle, bir Git deposunu tek bir dosya halinde paketlemenizi sağlar. Bu dosya, bir Git deposu gibi davranabilir; ondan clone yapabilir veya ona fetch edebilirsiniz. Özellikle ağ bağlantısının olmadığı ortamlarda veya depoları taşımak için kullanışlıdır.
* Nasıl Oluşturulur:
* Tam Bundle (İlk Yedekleme): Deponun tüm geçmişini içeren bir bundle oluşturmak için:

git bundle create myrepo-full-backup.bundle --all

* Artımlı Bundle: Son yedeklemeden bu yana yapılan değişiklikleri içeren bir bundle oluşturmak için:

git bundle create myrepo-incremental-backup-$(date +%Y%m%d).bundle ..HEAD

Bu komut, son_bundle_dosyasi_ismi ile belirtilen bundle’dan bu yana HEAD‘deki tüm değişiklikleri yeni bir bundle dosyasına paketler.
* Avantajları:
* Sadece değişen kısımlar yedeklendiği için daha küçük dosya boyutları ve daha hızlı yedekleme süreleri.
* Bant genişliği ve depolama alanı tasarrufu.
* Dezavantajları:
* Geri yükleme süreci, birden fazla bundle dosyasını yönetmeyi gerektirebilir.
* İlk tam bundle dosyasının varlığı önemlidir.

Otomatik Yedekleme

Manuel yedeklemeler unutulabilir veya düzenli olarak yapılmayabilir. Bu nedenle, yedekleme sürecini otomatikleştirmek en iyi yaklaşımdır.

* Betikler (Scriptler): Yedekleme adımlarını içeren bir Bash veya PowerShell betiği oluşturmak, süreci otomatikleştirmenin temelidir. Bu betikler, git clone --bare, git bundle, aws s3 sync veya aws s3 cp gibi komutları içerecektir.
* Cron İşleri: Linux/Unix sistemlerinde cron veya Windows’ta Görev Zamanlayıcı (Task Scheduler) kullanarak, yedekleme betiklerinizi belirli aralıklarla (günlük, haftalık vb.) otomatik olarak çalıştırmak mümkündür.

En iyi strateji, genellikle tam yedeklemeleri (bare repository veya tam bundle) düzenli aralıklarla (örneğin haftalık) yapmak ve aradaki günlerde artımlı yedeklemeler (incremental bundle) yapmaktır. Bu, hem veri bütünlüğünü sağlar hem de yedekleme süreçlerini verimli tutar.

DigitalOcean Spaces’i Hazırlama

Git depolarınızı DigitalOcean Spaces’e yedeklemeye başlamadan önce, Spaces hesabınızı ve gerekli kimlik doğrulama bilgilerini hazırlamanız gerekir.

1. DigitalOcean Spaces Oluşturma

* DigitalOcean Kontrol Paneli’ne Giriş Yapın: Tarayıcınızdan DigitalOcean hesabınıza giriş yapın.
* “Spaces” Bölümüne Gidin: Sol menüden “Spaces” seçeneğine tıklayın.
* “Create a Space” Butonuna Tıklayın: Yeni bir Space oluşturmak için bu butonu kullanın.
* Bölge Seçimi: Verilerinizin depolanacağı coğrafi bölgeyi seçin. Sunucularınıza veya kendinize en yakın bölgeyi seçmek, gecikmeyi azaltabilir. Örneğin, “Frankfurt”, “London” veya “New York”.
* Space Adı Belirleyin: Space’inize benzersiz bir isim verin. Bu isim, Spaces URL’nizin bir parçası olacaktır (örneğin, https://your-space-name.nyc3.digitaloceanspaces.com).
* Opsiyonel Ayarlar:
* CDN (Content Delivery Network): Eğer Space’i statik içerik dağıtımı için de kullanacaksanız CDN’i etkinleştirebilirsiniz. Yedekleme için zorunlu değildir.
* Dosya Erişimi: Varsayılan olarak dosyalar özeldir. Yedekleme için bu ayarı değiştirmeyin.
* “Create a Space” Butonuna Tıklayarak Tamamlayın: Space’iniz birkaç saniye içinde oluşturulacaktır.

2. API Anahtarları Oluşturma

DigitalOcean Spaces’e programatik olarak (örneğin AWS CLI ile) erişmek için API anahtarlarına ihtiyacınız olacaktır. Bu anahtarlar, kullanıcı adınız ve şifreniz gibidir, bu yüzden onları güvende tutmak çok önemlidir.

* “API” Bölümüne Gidin: DigitalOcean kontrol panelinde sol menüden “API” seçeneğine tıklayın.
* “Spaces Access Keys” Bölümünü Bulun: Bu bölümde, Spaces’e özel erişim anahtarlarını göreceksiniz.
* “Generate New Key” Butonuna Tıklayın: Yeni bir erişim anahtarı çifti oluşturmak için bu butonu kullanın.
* Anahtar Adı Belirleyin: Anahtarınıza açıklayıcı bir isim verin (örneğin, “git-backup-key”).
* Erişim Anahtarlarını Kopyalayın: Yeni bir pencerede size iki anahtar gösterilecektir:
* Access Key ID: Genel anahtar.
* Secret Access Key: Gizli anahtar. Bu anahtar sadece bir kez gösterilir. Bu nedenle, güvenli bir yere (örneğin, bir parola yöneticisi) kopyaladığınızdan emin olun. Bu anahtarı kaybederseniz, yeni bir anahtar oluşturmanız gerekir.

Bu anahtarlar, AWS CLI’yi yapılandırırken veya yedekleme betiklerinizde Spaces’e kimlik doğrulaması yapmak için kullanılacaktır.

Git Depolarını DigitalOcean Spaces’e Yedekleme Adımları

Bu bölümde, Git depolarınızı DigitalOcean Spaces’e yedeklemek için iki temel yöntemi ele alacağız: AWS CLI kullanarak tam yedekleme ve git bundle kullanarak artımlı yedekleme. Her iki yöntem de Spaces’in S3 uyumluluğundan faydalanır.

Yöntem 1: AWS CLI Kullanarak Bare Repository Yedekleme

AWS CLI (Amazon Web Services Command Line Interface), S3 uyumlu depolama hizmetleriyle etkileşim kurmak için güçlü bir araçtır. DigitalOcean Spaces de S3 uyumlu olduğu için AWS CLI’yi kullanabiliriz.

1. AWS CLI Kurulumu

AWS CLI’yi henüz kurmadıysanız, işletim sisteminize göre aşağıdaki adımları izleyin:

* Linux/macOS:

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo ./aws/install
    # Veya macOS için Homebrew ile:
    # brew install awscli

* Windows: AWS CLI MSI yükleyicisini AWS web sitesinden indirin ve kurun.

Kurulumdan sonra, terminalinizde aws --version komutunu çalıştırarak kurulumun başarılı olup olmadığını kontrol edebilirsiniz.

2. AWS CLI Yapılandırması

AWS CLI’yi DigitalOcean Spaces ile çalışacak şekilde yapılandırmanız gerekir. Bu işlem sırasında daha önce oluşturduğunuz API anahtarlarını kullanacaksınız.

aws configure

Komutu çalıştırdığınızda aşağıdaki bilgileri girmeniz istenecektir:
* AWS Access Key ID: DigitalOcean Spaces Access Key ID’nizi buraya yapıştırın.
* AWS Secret Access Key: DigitalOcean Spaces Secret Access Key’inizi buraya yapıştırın.
* Default region name: DigitalOcean Spaces’inizin bulunduğu bölgeyi girin (örneğin, nyc3, fra1, lon1). Bu, S3 endpoint URL’sinde kullanılacaktır.
* Default output format: json olarak bırakabilirsiniz.

Önemli: AWS CLI, varsayılan olarak AWS S3 hizmetine bağlanmaya çalışır. DigitalOcean Spaces’e bağlanmak için, her komutta veya bir yapılandırma dosyasında endpoint URL’sini belirtmeniz gerekir. En temiz yol, komutları çalıştırırken endpoint-url parametresini kullanmaktır.

3. Bare Repository Oluşturma

Yedeklemek istediğiniz yerel Git deponuzun bir bare kopyasını oluşturun:

cd /path/to/your/local/repo
git clone --bare . /tmp/myproject.git

Bu komut, mevcut deponuzun (.) bare bir kopyasını /tmp/myproject.git dizinine oluşturur. /tmp yerine istediğiniz herhangi bir geçici dizini kullanabilirsiniz.

4. Spaces’e Yükleme

Şimdi oluşturduğunuz bare depoyu DigitalOcean Spaces’e yükleyebilirsiniz. aws s3 sync komutu, yerel bir dizini bir S3/Spaces kovasına senkronize etmek için idealdir.

# Bölgeyi ve Space adını kendi bilgilerinizle değiştirin
SPACE_REGION="nyc3" # Örneğin nyc3, fra1, lon1
SPACE_NAME="your-space-name"
REPO_BACKUP_NAME="myproject.git" # Space içinde deponuzun adı

aws s3 sync /tmp/${REPO_BACKUP_NAME} \
    s3://${SPACE_NAME}/${REPO_BACKUP_NAME} \
    --endpoint-url https://${SPACE_REGION}.digitaloceanspaces.com

* --endpoint-url: DigitalOcean Spaces’in endpoint URL’sini belirtir. https://.digitaloceanspaces.com formatındadır.
* s3://${SPACE_NAME}/${REPO_BACKUP_NAME}: Hedef Spaces yoludur. ${SPACE_NAME} yerine kendi Space adınızı, ${REPO_BACKUP_NAME} yerine de yedeklenen deponuzun adını yazın.

Bu komut, /tmp/myproject.git dizininin içeriğini DigitalOcean Spaces’inizdeki your-space-name/myproject.git yoluna senkronize edecektir. Gelecekte aynı komutu tekrar çalıştırdığınızda, aws s3 sync yalnızca değişen veya yeni eklenen dosyaları yükleyerek bant genişliğinden tasarruf edecektir.

Yöntem 2: git bundle ile Yedekleme

git bundle yöntemi, deponuzu tek bir dosya halinde paketleyip bu dosyayı Spaces’e yüklemeyi içerir. Bu, özellikle artımlı yedeklemeler için kullanışlıdır.

1. Bundle Oluşturma

Yedeklemek istediğiniz yerel Git deponuzda aşağıdaki komutları çalıştırın:

* Tam Yedekleme (İlk Bundle):

cd /path/to/your/local/repo
    git bundle create myproject-full-backup-$(date +%Y%m%d).bundle --all

Bu komut, deponuzun tüm geçmişini içeren myproject-full-backup-YYYYMMDD.bundle adında bir dosya oluşturur.

* Artımlı Yedekleme (Sonraki Bundle’lar):
Önceki bir bundle dosyasından bu yana yapılan değişiklikleri yedeklemek için:

cd /path/to/your/local/repo
    # Önceki bundle dosyasının yolunu belirtin
    PREVIOUS_BUNDLE="/path/to/previous/myproject-full-backup-$(date -d '1 week ago' +%Y%m%d).bundle" 
    
    git bundle create myproject-incremental-backup-$(date +%Y%m%d).bundle ${PREVIOUS_BUNDLE}..HEAD

Bu komut, PREVIOUS_BUNDLE‘dan bu yana HEAD‘deki tüm yeni referansları ve nesneleri içeren yeni bir bundle dosyası oluşturur. date -d '1 week ago' kısmı, önceki haftanın tarihini dinamik olarak almak için bir örnektir; bunu kendi yedekleme stratejinize göre ayarlamalısınız.

2. Spaces’e Yükleme

Oluşturduğunuz .bundle dosyasını DigitalOcean Spaces’e yüklemek için aws s3 cp komutunu kullanın:

# Bölgeyi ve Space adını kendi bilgilerinizle değiştirin
SPACE_REGION="nyc3"
SPACE_NAME="your-space-name"
BUNDLE_FILE="myproject-full-backup-$(date +%Y%m%d).bundle" # Veya artımlı bundle dosyanızın adı

aws s3 cp ${BUNDLE_FILE} \
    s3://${SPACE_NAME}/bundles/${BUNDLE_FILE} \
    --endpoint-url https://${SPACE_REGION}.digitaloceanspaces.com

Bu komut, bundle dosyasını your-space-name/bundles/ klasörüne yükler. bundles klasörü, yedeklerinizi düzenli tutmak için isteğe bağlı olarak oluşturduğunuz bir klasördür.

Bu iki yöntem de Git depolarınızı DigitalOcean Spaces’e güvenli bir şekilde yedeklemek için kullanılabilir. Seçiminiz, deponuzun boyutu, yedekleme sıklığı ve geri yükleme stratejiniz gibi faktörlere bağlı olacaktır.

Yedekleme Betikleri (Script) Oluşturma

Manuel yedeklemeler zaman alıcı ve hataya açık olabilir. Bu nedenle, yukarıdaki adımları otomatikleştiren bir betik (script) oluşturmak ve bunu düzenli olarak çalıştırmak en iyi uygulamadır. İşte hem bare repository hem de bundle tabanlı yedekleme için örnek bir Bash betiği.

#!/bin/bash

--- Yapılandırma ---

DigitalOcean Spaces Bilgileri

SPACE_REGION="nyc3" # DigitalOcean Spaces bölgeniz (örn: nyc3, fra1) SPACE_NAME="your-space-name" # Space adınız

Yedeklenecek Git Depoları Listesi (tam yolunu belirtin)

Her repo için ayrı bir satır ekleyin

REPOS_TO_BACKUP=( "/home/user/projects/my-web-app" "/home/user/projects/my-api-service" )

Yedekleme Çıktı Dizini (geçici dosyalar için)

BACKUP_TEMP_DIR="/tmp/git_backups"

Log Dosyası

LOG_FILE="/var/log/git_backup_to_spaces.log"

Saklanacak Son X Günlük Yedekler (sadece bundle yöntemi için geçerlidir)

DAYS_TO_KEEP=7

--- Fonksiyonlar ---

log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE" }

--- Başlangıç ---

log_message "--- Git Yedekleme Süreci Başladı ---"

Yedekleme dizinini oluştur (varsa siler)

if [ -d "$BACKUP_TEMP_DIR" ]; then log_message "Geçici yedekleme dizini temizleniyor: $BACKUP_TEMP_DIR" rm -rf "$BACKUP_TEMP_DIR" fi mkdir -p "$BACKUP_TEMP_DIR" || { log_message "HATA: Geçici dizin oluşturulamadı."; exit 1; }

Her depoyu yedekle

for REPO_PATH in "${REPOS_TO_BACKUP[@]}"; do if [ ! -d "$REPO_PATH" ]; then log_message "UYARI: Depo yolu bulunamadı, atlanıyor: $REPO_PATH" continue fi REPO_NAME=$(basename "$REPO_PATH") log_message "Depo yedekleniyor: $REPO_NAME" # --- Yöntem 1: Bare Repository Yedekleme --- # Bare depo oluştur BARE_REPO_DIR="${BACKUP_TEMP_DIR}/${REPO_NAME}.git" log_message "Bare depo oluşturuluyor: $BARE_REPO_DIR" git clone --bare "$REPO_PATH" "$BARE_REPO_DIR" || { log_message "HATA: Bare depo oluşturulamadı."; continue; } # Spaces'e senkronize et log_message "Bare depoyu DigitalOcean Spaces'e senkronize ediliyor..." aws s3 sync "$BARE_REPO_DIR" \ "s3://${SPACE_NAME}/bare-repos/${REPO_NAME}.git" \ --endpoint-url "https://${SPACE_REGION}.digitaloceanspaces.com" \ --delete # Bu flag, Space'teki mevcut dosyaları yereldekiyle eşleşecek şekilde siler. Dikkatli kullanın! if [ $? -eq 0 ]; then log_message "Bare depo yedeklemesi BAŞARILI: ${REPO_NAME}" else log_message "HATA: Bare depo yedeklemesi BAŞARISIZ: ${REPO_NAME}" fi # --- Yöntem 2: Git Bundle ile Artımlı Yedekleme (İsteğe Bağlı) --- # Eğer bu yöntemi kullanmayacaksanız aşağıdaki bloğu yorum satırı yapın veya silin. # Bu yöntem, daha önce Spaces'e yüklenmiş bir bundle dosyasının varlığını gerektirir. # İlk çalıştırmada tam bundle oluşturulmalı veya bu kısım atlanmalıdır. # CURRENT_DATE=$(date +%Y%m%d) # BUNDLE_FILE="${BACKUP_TEMP_DIR}/${REPO_NAME}-${CURRENT_DATE}.bundle" # PREVIOUS_BUNDLE_PATH="s3://${SPACE_NAME}/bundles/${REPO_NAME}-$(date -d "${DAYS_TO_KEEP} days ago" +%Y%m%d)*.bundle" # Önceki bundle'ı Space'ten arama # # Önceki bundle dosyasını Spaces'ten indir (artımlı yedekleme için gerekli) # log_message "Önceki bundle aranıyor ve indiriliyor (varsa)..." # # Bu kısım daha karmaşık olabilir, doğrudan S3'ten bir önceki bundle'ı bulmak yerine # # yerel olarak son bundle'ın adını saklamak daha pratik olabilir. # # Basitlik adına, şimdilik tam bundle oluşturacağız veya manuel olarak önceki bundle'ı belirtmeliyiz. # # Tam bundle oluşturma (ilk yedekleme veya belirli aralıklarla) # log_message "Tam bundle oluşturuluyor: ${BUNDLE_FILE}" # git bundle create "$BUNDLE_FILE" --all || { log_message "HATA: Bundle oluşturulamadı."; continue; } # # Spaces'e yükle # log_message "Bundle dosyasını DigitalOcean Spaces'e yükleniyor..." # aws s3 cp "$BUNDLE_FILE" \ # "s3://${SPACE_NAME}/bundles/${REPO_NAME}/${BUNDLE_FILE##*/}" \ # --endpoint-url "https://${SPACE_REGION}.digitaloceanspaces.com" # if [ $? -eq 0 ]; then # log_message "Bundle yedeklemesi BAŞARILI: ${REPO_NAME}" # else # log_message "HATA: Bundle yedeklemesi BAŞARISIZ: ${REPO_NAME}" # fi # # Eski bundle'ları temizle (isteğe bağlı, AWS CLI ile yaşam döngüsü politikaları daha iyidir) # # Not: Bu kısım AWS CLI'nin kendi yaşam döngüsü politikaları kadar esnek değildir. # # Sadece örnek amaçlıdır. # # log_message "Eski bundle dosyaları temizleniyor..." # # find "${BACKUP_TEMP_DIR}" -name "${REPO_NAME}-*.bundle" -mtime +${DAYS_TO_KEEP} -delete # # log_message "Eski bundle'lar Space'ten siliniyor (dikkatli olun!):" # # aws s3 rm "s3://${SPACE_NAME}/bundles/${REPO_NAME}/" --recursive --exclude "" --include "${REPO_NAME}-$(date -d "${DAYS_TO_KEEP} days ago" +%Y%m%d).bundle" --endpoint-url "https://${SPACE_REGION}.digitaloceanspaces.com" done

Geçici yedekleme dizinini temizle

log_message "Geçici yedekleme dizini temizleniyor: $BACKUP_TEMP_DIR" rm -rf "$BACKUP_TEMP_DIR" log_message "--- Git Yedekleme Süreci Tamamlandı ---"

Bu betik, bare repository yöntemini kullanır. Bundle yöntemini de dahil ettim ancak karmaşıklığı nedeniyle yorum satırı yaptım. Artımlı bundle yedeklemeleri, önceki bundle’ları yönetmeyi gerektirdiği için daha sofistike bir betik gerektirir.

Cron Job ile Otomatikleştirme

Betik hazır olduktan sonra, onu düzenli aralıklarla çalıştırmak için bir cron işi ayarlayabilirsiniz.

1. Betik İzinlerini Ayarlayın:

chmod +x /path/to/your/backup_script.sh

2. Crontab’ı Düzenleyin:

crontab -e

3. Cron İfadesi Ekleyin:
Aşağıdaki örnek, betiği her gün saat 03:00’te çalıştırır.

0 3   * /path/to/your/backup_script.sh > /dev/null 2>&1

0 3 : Her gün sabah 03:00’te çalıştır.
* > /dev/null 2>&1: Çıktıyı gizler. Hata ayıklama için bu kısmı kaldırabilir veya çıktıyı bir dosyaya yönlendirebilirsiniz (örneğin, >> /var/log/cron_backup.log).

Cron işini ayarladıktan sonra, yedeklemeleriniz otomatik olarak çalışmaya başlayacaktır. Log dosyasını düzenli olarak kontrol ederek yedekleme sürecinin sorunsuz ilerlediğinden emin olun.

Güvenlik ve En İyi Uygulamalar

Git depolarınızı DigitalOcean Spaces’e yedeklerken güvenlik ve en iyi uygulamaları göz önünde bulundurmak, verilerinizin korunmasını sağlamanın anahtarıdır.

API Anahtarlarının Güvenliği

* Ortam Değişkenleri: API anahtarlarınızı doğrudan betik dosyalarına yazmaktan kaçının. Bunun yerine, anahtarları ortam değişkenleri olarak ayarlayın (örneğin, .bashrc veya .profile dosyanızda export DO_SPACES_ACCESS_KEY_ID="YOUR_ACCESS_KEY"). AWS CLI, bu ortam değişkenlerini otomatik olarak algılayacaktır.
* Sınırlı İzinler: Mümkünse, API anahtarlarınıza yalnızca yedekleme için gerekli olan minimum izinleri verin (örneğin, sadece yazma ve okuma izinleri). DigitalOcean’da şu an için S3 benzeri IAM (Identity and Access Management) rolleri bulunmamaktadır, ancak gelecekte bu tür özellikler eklenebilir.
* Düzenli Değişim: Güvenlik ihlallerini önlemek için API anahtarlarınızı düzenli aralıklarla (örneğin, her 6 ayda bir) değiştirin.

Veri Şifrelemesi

* İstemci Tarafı Şifreleme: Hassas veriler içeren depoları yedeklemeden önce yerel olarak şifrelemeyi düşünebilirsiniz (örneğin, gpg veya openssl kullanarak). Bu, verileriniz Spaces’e yüklenmeden önce şifrelenir ve DigitalOcean’ın kendisi bile şifreli içeriği göremez.
* Spaces Tarafı Şifreleme: DigitalOcean Spaces, varsayılan olarak depolanan verileri dinlenirken (at rest) şifreler. Ancak bu, verilerinize erişimi olan herkesin okuyabileceği anlamına gelir. İstemci tarafı şifreleme, ek bir güvenlik katmanı sağlar.

Yedekleme Sıklığı

* Projenin Değişim Sıklığı: Projeniz ne kadar sık değişiyorsa, yedekleme sıklığınız da o kadar artmalıdır. Günlük yedeklemeler, çoğu proje için iyi bir başlangıç noktasıdır. Çok aktif projeler için saatlik yedeklemeler düşünülebilir.
* Veri Kaybı Toleransı: Ne kadar veri kaybını tolere edebileceğinizi belirleyin. Son bir saatlik çalışmanın kaybolması kabul edilemezse, yedeklemeler daha sık olmalıdır.

Yedeklerin Düzenli Test Edilmesi

* Geri Yükleme Pratiği: Yedekleme sisteminizin gerçekten çalıştığından emin olmanın tek yolu, düzenli olarak yedeklerden geri yükleme yapmayı denemektir. Belirli aralıklarla (örneğin, ayda bir) bir yedek kopyasını alıp yeni bir dizine geri yükleyerek deponun bütünlüğünü kontrol edin.
* Dosya Bütünlüğü: Geri yüklenen deponun orijinal depo ile aynı olduğundan emin olmak için git fsck gibi komutları kullanabilirsiniz.

Eski Yedeklerin Yönetimi (Yaşam Döngüsü Politikaları)

* Depolama Maliyetleri: Sürekli yeni yedekler oluşturmak, depolama maliyetlerini artırabilir. DigitalOcean Spaces, S3 uyumlu yaşam döngüsü politikalarını desteklemez, ancak betiklerinizde eski yedekleri belirli bir süre sonra otomatik olarak silme mantığı ekleyebilirsiniz.
* Betik ile Temizleme: Yedekleme betiğinize, belirli bir yaşın üzerindeki (örneğin, 30 günden eski) yedek dosyalarını Spaces’ten silme komutları ekleyin. aws s3 rm komutunu dikkatli kullanın.

# Örnek: 30 günden eski bundle dosyalarını silme
    # Bu komutu kullanmadan önce çok dikkatli olun ve test edin!
    # aws s3 rm s3://${SPACE_NAME}/bundles/${REPO_NAME}/ --recursive --exclude "" --include "${REPO_NAME}-$(date -d '30 days ago' +%Y%m%d).bundle" --endpoint-url "https://${SPACE_REGION}.digitaloceanspaces.com"

Veya daha basit bir yaklaşım olarak, yedekleme dizininize tarih bazlı klasörler oluşturup, en eski klasörleri silmek olabilir.

Farklı Bölgelerde Yedekleme

Ekstra bir güvenlik katmanı için, yedeklerinizin bir kopyasını farklı bir DigitalOcean Spaces bölgesinde veya hatta farklı bir bulut sağlayıcısında tutmayı düşünebilirsiniz. Bu, bir bölge felaketi durumunda verilerinizin güvende kalmasını sağlar.

Bu en iyi uygulamaları takip ederek, Git depolarınızın DigitalOcean Spaces’e yedeklenmesini güvenli, verimli ve güvenilir hale getirebilirsiniz.

Yedekten Geri Yükleme (Kurtarma)

Yedekleme yapmanın nihai amacı, gerektiğinde verileri geri yükleyebilmektir. Git depolarınızı DigitalOcean Spaces’ten geri yüklemek, kullandığınız yedekleme yöntemine bağlı olarak değişir.

1. Bare Repository’den Geri Yükleme

Eğer deponuzu git clone --bare ile yedeklediyseniz ve aws s3 sync ile Spaces’e yüklediyseniz, geri yükleme süreci oldukça basittir.

* Bare Depoyu İndirme: İlk olarak, yedeklenmiş bare depoyu DigitalOcean Spaces’ten yerel makinenize indirin:

# Bölgeyi ve Space adını kendi bilgilerinizle değiştirin
    SPACE_REGION="nyc3"
    SPACE_NAME="your-space-name"
    REPO_BACKUP_NAME="myproject.git" # Space içinde deponuzun adı
    TARGET_DIR="/path/to/restore/myproject.git" # Bare deponun indirileceği yer

    aws s3 sync "s3://${SPACE_NAME}/bare-repos/${REPO_BACKUP_NAME}" \
        "$TARGET_DIR" \
        --endpoint-url "https://${SPACE_REGION}.digitaloceanspaces.com"

Bu komut, myproject.git adlı bare depoyu $TARGET_DIR dizinine indirir.

* Çalışma Ağacı Oluşturma: İndirilen bare depodan normal bir çalışma ağacına sahip bir depo oluşturmak için git clone komutunu kullanın:

# İndirilen bare deponun yolu
    BARE_REPO_PATH="/path/to/restore/myproject.git"
    # Yeni deponun oluşturulacağı yol
    NEW_REPO_PATH="/path/to/new/myproject"

    git clone "$BARE_REPO_PATH" "$NEW_REPO_PATH"
    cd "$NEW_REPO_PATH"
    # Artık normal bir Git deposu olarak çalışabilirsiniz

Bu işlem, deponun tüm dallarını ve geçmişini içeren tam bir çalışma kopyasını oluşturacaktır.

2. git bundle Dosyasından Geri Yükleme

Eğer deponuzu git bundle ile yedeklediyseniz, geri yükleme süreci bundle dosyasını indirip ondan depo oluşturmayı veya mevcut bir depoya değişiklikleri getirmeyi içerir.

* Bundle Dosyasını İndirme: İhtiyaç duyduğunuz .bundle dosyasını DigitalOcean Spaces’ten yerel makinenize indirin:

# Bölgeyi ve Space adını kendi bilgilerinizle değiştirin
    SPACE_REGION="nyc3"
    SPACE_NAME="your-space-name"
    BUNDLE_FILE_NAME="myproject-full-backup-YYYYMMDD.bundle" # İndirmek istediğiniz bundle dosyasının adı
    DOWNLOAD_PATH="/tmp/${BUNDLE_FILE_NAME}" # Bundle dosyasının indirileceği yer

    aws s3 cp "s3://${SPACE_NAME}/bundles/myproject/${BUNDLE_FILE_NAME}" \
        "$DOWNLOAD_PATH" \
        --endpoint-url "https://${SPACE_REGION}.digitaloceanspaces.com"

* Depo Oluşturma veya Güncelleme:
* Yeni Bir Depo Oluşturma: Bundle dosyasından sıfırdan bir depo oluşturmak için:

git clone "$DOWNLOAD_PATH" /path/to/new/myproject

* Mevcut Bir Depoyu Güncelleme: Eğer mevcut bir deponuz varsa ve bundle dosyasındaki değişiklikleri ona getirmek istiyorsanız:

cd /path/to/existing/myproject
        git fetch "$DOWNLOAD_PATH" master:master # Veya diğer dalları

Bu komut, bundle dosyasındaki master dalını mevcut deponuzun master dalına getirir (fetch eder).

Artımlı bundle’lar kullanıyorsanız, geri yükleme işlemi en son tam bundle’ı geri yükleyip ardından sırasıyla tüm artımlı bundle’ları git fetch ile uygulamayı gerektirebilir. Bu, süreci biraz daha karmaşık hale getirebilir, bu yüzden artımlı yedekleme stratejinizin geri yükleme prosedürünü önceden belgelemeniz önemlidir.

Her iki durumda da, geri yükleme işleminden sonra deponuzun doğru şekilde çalıştığından ve tüm verilerinizin eksiksiz olduğundan emin olmak için testler yapmayı unutmayın.

Sonuç

Git depolarınızı düzenli olarak yedeklemek, geliştirme sürecinizin vazgeçilmez bir parçası olmalıdır. Bu makalede, DigitalOcean Spaces’in sunduğu ölçeklenebilir ve uygun maliyetli nesne depolama çözümüyle Git depolarınızı nasıl güvence altına alacağınızı detaylı bir şekilde inceledik. DigitalOcean Spaces’in S3 uyumluluğu sayesinde, AWS CLI gibi güçlü araçları kullanarak yedekleme işlemlerinizi kolayca gerçekleştirebilirsiniz.

Bare repository yedeklemesi ile deponuzun tüm geçmişini ve dallarını Spaces’e senkronize etme veya git bundle ile daha verimli artımlı yedeklemeler yapma yöntemlerini öğrendiniz. Ayrıca, bu süreçleri otomatikleştirmek için Bash betikleri oluşturma ve cron işleri ile düzenli çalıştırma adımlarını ele aldık. Güvenlik, veri şifrelemesi, API anahtarlarının yönetimi ve yedekleme sıklığı gibi en iyi uygulamaların önemi üzerinde durarak, verilerinizin mümkün olan en iyi şekilde korunmasını sağlama yollarını paylaştık. Son olarak, olası bir felaket durumunda verilerinizi Spaces’ten nasıl geri yükleyeceğinizi gösterdik.

Unutmayın ki yedekleme, sadece veriyi bir yere kopyalamakla bitmez; aynı zamanda bu yedeklerin düzenli olarak test edilmesi ve geri yüklenebilirliğinin doğrulanması da aynı derecede önemlidir. Bu rehberdeki adımları takip ederek, değerli Git depolarınızı DigitalOcean Spaces üzerinde güvenli bir şekilde yedekleyebilir, potansiyel veri kayıplarına karşı kendinizi koruyabilir ve projelerinizin sürekliliğini sağlayabilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

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

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.