Takip et

Django ile Nesne Depolama Kurulumu

Django ile Nesne Depolama Kurulumu Giriş Modern web uygulamaları, kullanıcı tarafından yüklenen medya dosyaları, statik içerikler ve diğer b

Django ile Nesne Depolama Kurulumu

Giriş

Modern web uygulamaları, kullanıcı tarafından yüklenen medya dosyaları, statik içerikler ve diğer büyük veri nesneleri gibi çeşitli dosyaları depolama ihtiyacı duyar. Geleneksel olarak, bu dosyalar uygulamanın çalıştığı sunucunun yerel dosya sisteminde saklanır. Ancak, bu yaklaşım ölçeklenebilirlik, güvenilirlik, maliyet etkinliği ve performans gibi konularda önemli kısıtlamalar getirir. İşte bu noktada nesne depolama (Object Storage) devreye girer. Nesne depolama, verileri “nesneler” olarak depolayan, bu nesnelere benzersiz bir kimlik atayan ve meta verilerle zenginleştiren, ölçeklenebilir ve dayanıklı bir depolama mimarisidir.

Django, güçlü bir web çatısı olmakla birlikte, dosya depolama mekanizması varsayılan olarak yerel dosya sistemine odaklanmıştır. Ancak django-storages gibi üçüncü taraf kütüphaneler sayesinde, Django uygulamalarını popüler nesne depolama hizmetleriyle (AWS S3, Google Cloud Storage, Azure Blob Storage, MinIO vb.) entegre etmek oldukça kolaydır. Bu makale, Django uygulamanızı çeşitli nesne depolama sağlayıcılarıyla nasıl kuracağınızı, yapılandıracağınızı ve yöneteceğinizi adım adım açıklayacaktır. Amacımız, uygulamanızın dosya depolama altyapısını ölçeklenebilir, güvenli ve maliyet etkin bir yapıya kavuşturmaktır.

Nesne depolamanın Django ile kullanılmasının temel faydaları şunlardır:
* Ölçeklenebilirlik: İhtiyaç duyduğunuz kadar veri depolayabilir ve depolama kapasitesini anında artırabilirsiniz. Sunucu kaynaklarından bağımsızdır.
* Dayanıklılık ve Güvenilirlik: Nesne depolama hizmetleri genellikle verileri birden fazla konumda yedekleyerek yüksek dayanıklılık ve kullanılabilirlik sunar. Veri kaybı riski minimaldir.
* Maliyet Etkinliği: Kullanım başına ödeme (pay-as-you-go) modeli sayesinde yalnızca kullandığınız depolama alanı ve transfer miktarı için ödeme yaparsınız. Genellikle yerel depolamadan daha uygun maliyetlidir.
* Performans: Nesneler genellikle küresel olarak dağıtılmış ağlar üzerinden sunulabilir. İçerik Dağıtım Ağları (CDN) ile entegrasyonu kolaydır, bu da son kullanıcılara daha hızlı dosya erişimi sağlar.
* Sorumlulukların Ayrılması: Dosya depolama yükünü uygulama sunucusundan alarak, sunucunuzun diğer görevlere odaklanmasını sağlar. Bu, mimariyi daha temiz ve yönetilebilir hale getirir.

Bu makalede, öncelikle geleneksel dosya depolama ile nesne depolama arasındaki farkları inceleyecek, ardından Django entegrasyonu için temel kavramları açıklayacak ve son olarak en popüler üç nesne depolama sağlayıcısı olan AWS S3, Google Cloud Storage ve Azure Blob Storage ile adım adım kurulum süreçlerini detaylandıracağız.

Geleneksel Dosya Depolama ile Nesne Depolama Arasındaki Farklar

Django’nun varsayılan dosya depolama sistemi, MEDIA_ROOT ve STATIC_ROOT ayarlarıyla tanımlanan dizinlere dosya yazma prensibine dayanır. Bu yöntem, küçük ve başlangıç seviyesindeki projeler için yeterli olsa da, uygulamanız büyüdükçe veya dağıtık bir yapıya büründükçe çeşitli zorluklar ortaya çıkar:

* Ölçeklenebilirlik Sınırlamaları: Uygulamanızın çalıştığı sunucunun depolama kapasitesi sınırlıdır. Daha fazla dosya depolamak için sunucunun diskini genişletmek veya başka bir sunucuya geçmek gerekir ki bu da karmaşık bir süreçtir.
* Tek Hata Noktası: Tüm dosyaların tek bir sunucuda bulunması, o sunucunun çökmesi durumunda tüm dosyaların erişilemez hale gelmesine neden olabilir. Bu durum, uygulamanın dayanıklılığını düşürür.
* Yedekleme ve Kurtarma: Büyük miktarda veriyi yerel olarak yedeklemek ve gerektiğinde kurtarmak zaman alıcı ve zahmetli olabilir.
* Sunucu Geçişleri: Uygulamanızı farklı bir sunucuya taşırken, tüm medya ve statik dosyaları da manuel olarak aktarmanız gerekir. Bu, hata yapmaya açık bir süreçtir.
* CDN Entegrasyonu: Yerel olarak depolanan dosyaları bir İçerik Dağıtım Ağı (CDN) ile entegre etmek, ek yapılandırma ve karmaşıklık gerektirir.

Nesne depolama ise bu kısıtlamaların üstesinden gelir. Nesne depolama sistemleri, dosyaları bir dosya sistemi hiyerarşisi yerine düz bir yapı (flat structure) içinde “nesneler” olarak depolar. Her nesne, verinin kendisi, benzersiz bir anahtar (key) ve isteğe bağlı meta verilerden oluşur. Bu yapı, aşağıdaki avantajları sunar:

* Sınırsız Ölçeklenebilirlik: Depolama kapasitesi neredeyse sınırsızdır ve ihtiyaca göre otomatik olarak genişler.
* Yüksek Dayanıklılık: Veriler genellikle birden fazla coğrafi bölgede veya veri merkezinde çoğaltılır, bu da donanım arızalarına karşı yüksek koruma sağlar.
* API Erişimi: Nesnelere HTTP/S üzerinden standart API’ler aracılığıyla erişilir. Bu, farklı uygulamalar ve hizmetler arasında kolay entegrasyon sağlar.
* Maliyet Etkinliği: Genellikle kullanım başına ödeme modeli sunar ve uzun vadede yerel depolamadan daha uygun maliyetli olabilir.
* Yönetim Kolaylığı: Depolama altyapısının yönetimi sağlayıcı tarafından yapılır, bu da geliştiricilerin altyapı yerine uygulama geliştirmeye odaklanmasını sağlar.

Django uygulamalarında nesne depolama kullanmak, özellikle kullanıcı tarafından yüklenen dosyalar (profil resimleri, belgeler, videolar vb.) ve statik dosyalar (CSS, JavaScript, resimler) için büyük avantajlar sağlar. Bu sayede uygulamanız daha esnek, dayanıklı ve performanslı hale gelir.

Django Entegrasyonu için Temel Kavramlar

Django uygulamanızı nesne depolama ile entegre etmek için django-storages kütüphanesi temel bir rol oynar. Bu kütüphane, farklı bulut depolama sağlayıcıları için bir dizi depolama arka ucu (storage backend) sunarak Django’nun dosya depolama API’sini bu hizmetlerle uyumlu hale getirir.

django-storages Kütüphanesi

django-storages, Django’nun FileField ve ImageField gibi alanlarının yanı sıra collectstatic komutunun da farklı depolama sistemleriyle sorunsuz çalışmasını sağlayan bir köprü görevi görür. Her bir depolama sağlayıcısı (AWS S3, Google Cloud Storage, Azure Blob Storage vb.) için özel bir depolama arka ucu (örneğin, storages.backends.s3boto3.S3Boto3Storage) sağlar.

Depolama Arka Uçları (Storage Backends)

django-storages kütüphanesi içinde bulunan bazı yaygın depolama arka uçları şunlardır:
* storages.backends.s3boto3.S3Boto3Storage: AWS S3 için. boto3 kütüphanesini kullanır.
* storages.backends.gcloud.GoogleCloudStorage: Google Cloud Storage için. google-cloud-storage kütüphanesini kullanır.
* storages.backends.azure_storage.AzureStorage: Azure Blob Storage için. azure-storage-blob kütüphanesini kullanır.
* storages.backends.sftp.SFTPStorage: SFTP sunucuları için.
* storages.backends.dropbox.DropboxStorage: Dropbox için.

Django Ayarları

Django’nun settings.py dosyasında yapılandırılması gereken anahtar ayarlar şunlardır:
* DEFAULT_FILE_STORAGE: Bu ayar, Django’nun FileField veya ImageField gibi alanlar aracılığıyla yüklenen medya dosyalarını depolamak için kullanacağı varsayılan depolama arka ucunu belirtir. Örneğin:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

* STATICFILES_STORAGE: Bu ayar, collectstatic komutunun statik dosyaları (CSS, JavaScript, resimler) toplamak ve depolamak için kullanacağı depolama arka ucunu belirtir. Örneğin:

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage' # Veya aynı S3Boto3Storage

Bazı durumlarda statik dosyalar için özel bir S3 depolama sınıfı (S3StaticStorage) kullanmak, statik dosyaların önbellek kontrol başlıklarını daha iyi yönetmenizi sağlayabilir.
* MEDIA_URL: Kullanıcı tarafından yüklenen medya dosyalarına erişim için kullanılan URL önekidir. Nesne depolama ile genellikle bucket URL’sine veya CDN URL’sine işaret eder.
* STATIC_URL: Statik dosyalara erişim için kullanılan URL önekidir. Benzer şekilde, bucket URL’sine veya CDN URL’sine işaret eder.

Kimlik Bilgileri ve Erişim Yönetimi

Nesne depolama hizmetlerine erişmek için kimlik bilgilerine ihtiyacınız vardır. Bu bilgiler genellikle:
* Erişim Anahtarları (Access Keys): Sağlayıcı tarafından size verilen bir anahtar kimliği (Access Key ID) ve gizli anahtar (Secret Access Key) çifti.
* Kova (Bucket) Adı: Dosyalarınızı depolayacağınız depolama biriminin adı.
* Bölge (Region): Kovanızın fiziksel olarak bulunduğu coğrafi bölge.
* Hizmet Hesabı (Service Account) Anahtarları: Özellikle Google Cloud Storage gibi sağlayıcılarda JSON formatında bir hizmet hesabı anahtarı dosyası kullanılır.

Önemli Not: Kimlik bilgilerini (anahtarlar, parolalar vb.) doğrudan settings.py dosyasına yazmak ciddi bir güvenlik açığıdır. Bunun yerine, bu bilgileri ortam değişkenleri (environment variables) aracılığıyla veya django-environ gibi kütüphanelerle güvenli bir şekilde yönetmelisiniz.

Şimdi, farklı nesne depolama sağlayıcıları ile adım adım kurulum süreçlerini inceleyelim.

Django ile AWS S3 Kurulumu

Amazon Web Services (AWS) S3 (Simple Storage Service), en popüler nesne depolama hizmetlerinden biridir. Django uygulamanızı S3 ile entegre etmek, ölçeklenebilir ve güvenilir bir dosya depolama çözümü sunar.

AWS Tarafında Yapılandırma

1. S3 Kovası Oluşturma (Create an S3 Bucket):
* AWS Yönetim Konsolu’na giriş yapın ve S3 hizmetine gidin.
* “Create bucket” düğmesine tıklayın.
* Kova için benzersiz bir ad (örneğin, my-django-app-media) belirleyin. Bu ad tüm AWS genelinde benzersiz olmalıdır.
* Kova için bir bölge (Region) seçin (örneğin, eu-central-1 – Frankfurt). Uygulamanızın sunucusuna yakın bir bölge seçmek gecikmeyi azaltır.
* Varsayılan ayarları genellikle koruyabilirsiniz. Ancak, eğer dosyalarınızın genel erişime açık olmasını istiyorsanız (“public read”), “Block Public Access settings for this bucket” bölümündeki blokları kaldırmanız ve bir kova politikası (bucket policy) eklemeniz gerekebilir. Çoğu durumda, medya dosyaları için bu ayarları varsayılan olarak bırakıp, erişimi IAM kullanıcıları veya önceden imzalanmış URL’ler (pre-signed URLs) ile yönetmek daha güvenlidir. Statik dosyalar için genellikle genel erişim istenir.
* Kovayı oluşturun.

2. IAM Kullanıcısı Oluşturma ve İzinleri Ayarlama (Create IAM User and Permissions):
* AWS Yönetim Konsolu’nda IAM (Identity and Access Management) hizmetine gidin.
* “Users” (Kullanıcılar) bölümünden “Add user” (Kullanıcı ekle) düğmesine tıklayın.
* Kullanıcı için bir ad belirleyin (örneğin, django-s3-user).
* “Select AWS access type” altında “Programmatic access” seçeneğini işaretleyin. Bu, uygulamanızın API anahtarları aracılığıyla S3’e erişmesini sağlar.
* İzinler sayfasında, “Attach existing policies directly” (Mevcut politikaları doğrudan ekle) seçeneğini seçin.
* Arama çubuğuna S3 yazın ve AmazonS3FullAccess politikasını seçin. Üretim ortamında, en az ayrıcalık ilkesini (principle of least privilege) takip ederek bu politikayı daha kısıtlı bir özel politika ile değiştirmeniz şiddetle tavsiye edilir. Örneğin, sadece belirli bir kovaya okuma/yazma izni veren bir politika oluşturabilirsiniz.
* Kullanıcıyı oluşturun. Oluşturma tamamlandığında, “Access key ID” ve “Secret access key” bilgilerini göreceksiniz. Bu anahtarları güvenli bir yere kaydedin, çünkü gizli anahtarı bir daha göremeyeceksiniz.

Django Tarafında Yapılandırma

1. Gerekli Kütüphaneleri Kurma:

pip install django-storages boto3

2. settings.py Dosyasını Yapılandırma:
settings.py dosyanıza aşağıdaki ayarları ekleyin. Güvenlik nedeniyle, bu değerleri ortam değişkenlerinden okumanız şiddetle tavsiye edilir. django-environ gibi bir kütüphane bu konuda yardımcı olabilir.

# settings.py

    # Ortam değişkenlerini yüklemek için (örn: django-environ kullanarak)
    # import environ
    # env = environ.Env()
    # environ.Env.read_env() # .env dosyasını okur

    INSTALLED_APPS = [
        # ... diğer uygulamalarınız
        'storages', # django-storages'ı ekleyin
    ]

    # AWS S3 Ayarları
    AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') # Ortam değişkeninden oku
    AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') # Ortam değişkeninden oku
    AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME') # Ortam değişkeninden oku
    AWS_S3_REGION_NAME = 'eu-central-1' # Kovanızın bulunduğu bölge
    AWS_S3_SIGNATURE_VERSION = 's3v4' # Güvenlik için v4 kullanın
    AWS_S3_FILE_OVERWRITE = False # Aynı isimde dosya yüklenirse üzerine yazmasın
    AWS_DEFAULT_ACL = None # Varsayılan ACL. Özel izinler için 'public-read' veya None
    # AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'} # Tarayıcı önbellek ayarı

    # Opsiyonel: Özel bir alan adı (custom domain) veya CDN kullanıyorsanız
    # AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
    # AWS_S3_CUSTOM_DOMAIN = 'cdn.example.com' # Eğer CloudFront gibi bir CDN kullanıyorsanız

    # Medya Dosyaları (Kullanıcı tarafından yüklenenler)
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    MEDIA_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/media/'
    # Eğer özel alan adı kullanıyorsanız:
    # MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'

    # Statik Dosyalar (CSS, JS, Resimler)
    STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage' # Statik dosyalar için özel sınıf
    STATIC_URL = f'https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/static/'
    # Eğer özel alan adı kullanıyorsanız:
    # STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'

    # Eğer yerel geliştirme ortamında S3'e yükleme yapmak istemiyorsanız,
    # DEBUG = True olduğunda yerel depolamayı kullanmak için koşullu ayarlar yapabilirsiniz.
    # if DEBUG:
    #     DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
    #     STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
    #     MEDIA_URL = '/media/'
    #     STATIC_URL = '/static/'
    #     MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    #     STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Not: S3StaticStorage sınıfı, statik dosyalar için uygun önbellek kontrol başlıklarını otomatik olarak ayarlar. Eğer medya ve statik dosyalarınızın aynı bucket’ta farklı prefix’ler altında olmasını istiyorsanız, MEDIA_URL ve STATIC_URL‘i yukarıdaki gibi yapılandırın.

3. Kullanım:
* Medya Dosyaları: Modelinizdeki FileField veya ImageField alanları otomatik olarak S3’e yükleme yapacaktır.

# models.py
        from django.db import models

        class MyModel(models.Model):
            name = models.CharField(max_length=100)
            my_file = models.FileField(upload_to='my_files/') # my_files/ prefix'i altında S3'e yüklenecek
            my_image = models.ImageField(upload_to='my_images/') # my_images/ prefix'i altında S3'e yüklenecek

* Statik Dosyalar:

python manage.py collectstatic

Bu komut, uygulamanızdaki tüm statik dosyaları (admin statikleri dahil) S3 kovanızın static/ dizinine (veya STATIC_URL ile belirttiğiniz prefix altına) yükleyecektir.

Bu kurulumla, Django uygulamanız artık tüm medya ve statik dosyalarını AWS S3’te depolayacaktır.

Django ile Google Cloud Storage Kurulumu

Google Cloud Storage (GCS), Google Cloud Platform’un (GCP) sunduğu ölçeklenebilir ve dayanıklı nesne depolama hizmetidir. Django ile entegrasyonu da oldukça basittir.

GCP Tarafında Yapılandırma

1. GCP Projesi Oluşturma:
* Google Cloud Console’a giriş yapın ve yeni bir proje oluşturun veya mevcut bir projeyi seçin.
2. Cloud Storage API’sini Etkinleştirme:
* Projenizin kontrol panelinde “APIs & Services” (API’ler ve Hizmetler) -> “Library” (Kütüphane) bölümüne gidin.
* “Cloud Storage API”yi arayın ve etkinleştirin.
3. Depolama Kovası Oluşturma (Create a Storage Bucket):
* Google Cloud Console’da “Storage” (Depolama) -> “Buckets” (Kovalar) bölümüne gidin.
* “CREATE BUCKET” (Kova Oluştur) düğmesine tıklayın.
* Kova için benzersiz bir ad belirleyin (örneğin, my-django-gcs-bucket).
* Depolama sınıfı (Storage class), konumu (Location) ve erişim kontrolü (Access control) gibi ayarları yapın. Genellikle “Standard” depolama sınıfı ve uygulamanıza yakın bir bölge seçilir.
* Erişim kontrolü için, varsayılan olarak “Uniform” (Tek Tip) ayarını kullanmak daha güvenlidir. Dosyaların genel erişime açık olması gerekiyorsa, kova izinlerini buna göre ayarlamanız gerekecektir.
4. Hizmet Hesabı Oluşturma ve Anahtar Yaratma (Create Service Account and Key):
* Google Cloud Console’da “IAM & Admin” -> “Service Accounts” (Hizmet Hesapları) bölümüne gidin.
* “CREATE SERVICE ACCOUNT” (Hizmet Hesabı Oluştur) düğmesine tıklayın.
* Hizmet hesabı için bir ad (örneğin, django-gcs-service) ve açıklama belirleyin.
* “Grant this service account access to project” (Bu hizmet hesabına projeye erişim izni ver) adımında, hizmet hesabına “Storage Object Admin” (Depolama Nesne Yöneticisi) rolünü atayın. Üretim ortamında, en az ayrıcalık ilkesini takip ederek bu rolü daha kısıtlı bir özel rol ile değiştirmeniz şiddetle tavsiye edilir. Örneğin, sadece belirli bir kovaya okuma/yazma izni veren bir rol oluşturabilirsiniz.
* Hizmet hesabını oluşturduktan sonra, listeden yeni oluşturduğunuz hizmet hesabına tıklayın.
* “Keys” (Anahtarlar) sekmesine gidin ve “ADD KEY” (Anahtar Ekle) -> “Create new key” (Yeni anahtar oluştur) seçeneğini tıklayın.
* Anahtar türü olarak “JSON”ı seçin ve “CREATE” (Oluştur) düğmesine tıklayın. Bir JSON dosyası bilgisayarınıza indirilecektir. Bu dosyayı güvenli bir yerde saklayın, çünkü uygulamanız bu dosya aracılığıyla GCS’e kimlik doğrulaması yapacaktır.

Django Tarafında Yapılandırma

1. Gerekli Kütüphaneleri Kurma:

pip install django-storages google-cloud-storage

2. settings.py Dosyasını Yapılandırma:
İndirdiğiniz JSON anahtar dosyasını projenizin kök dizinine veya güvenli bir yere kopyalayın (örneğin, gcs_credentials.json). settings.py dosyanıza aşağıdaki ayarları ekleyin:

# settings.py

    # Ortam değişkenlerini yüklemek için (örn: django-environ kullanarak)
    # import environ
    # env = environ.Env()
    # environ.Env.read_env() # .env dosyasını okur

    INSTALLED_APPS = [
        # ... diğer uygulamalarınız
        'storages', # django-storages'ı ekleyin
    ]

    # Google Cloud Storage Ayarları
    GS_BUCKET_NAME = os.environ.get('GS_BUCKET_NAME') # Ortam değişkeninden oku
    GS_PROJECT_ID = os.environ.get('GS_PROJECT_ID') # Ortam değişkeninden oku
    
    # JSON anahtar dosyasının yolu
    # Güvenlik için, bu dosyanın içeriğini ortam değişkeni olarak da geçirebilirsiniz.
    # Örneğin: GS_CREDENTIALS = json.loads(os.environ.get('GCS_KEY_JSON'))
    # Veya dosya yolu:
    GS_CREDENTIALS = os.path.join(BASE_DIR, 'gcs_credentials.json') # Proje kökünde olduğunu varsayarız

    # Medya Dosyaları
    DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
    MEDIA_URL = f'https://storage.googleapis.com/{GS_BUCKET_NAME}/media/'

    # Statik Dosyalar
    STATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
    STATIC_URL = f'https://storage.googleapis.com/{GS_BUCKET_NAME}/static/'

    # Eğer yerel geliştirme ortamında GCS'e yükleme yapmak istemiyorsanız,
    # DEBUG = True olduğunda yerel depolamayı kullanmak için koşullu ayarlar yapabilirsiniz.
    # if DEBUG:
    #     DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
    #     STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
    #     MEDIA_URL = '/media/'
    #     STATIC_URL = '/static/'
    #     MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    #     STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Not: GS_CREDENTIALS için JSON anahtar dosyasını doğrudan belirtmek yerine, üretim ortamında dosyanın içeriğini bir ortam değişkeni olarak geçirmek ve Python’da json.loads() ile yüklemek daha güvenli bir yaklaşımdır.

3. Kullanım:
* Medya Dosyaları: Modelinizdeki FileField veya ImageField alanları otomatik olarak GCS’e yükleme yapacaktır.

# models.py
        from django.db import models

        class MyModel(models.Model):
            name = models.CharField(max_length=100)
            my_file = models.FileField(upload_to='my_files/')

* Statik Dosyalar:

python manage.py collectstatic

Bu komut, tüm statik dosyalarınızı GCS kovanızın static/ dizinine yükleyecektir.

Bu yapılandırma ile Django uygulamanız, medya ve statik dosyalarını Google Cloud Storage’da güvenli ve ölçeklenebilir bir şekilde depolayacaktır.

Django ile Azure Blob Depolama Kurulumu

Azure Blob Storage, Microsoft Azure’ın sunduğu nesne depolama hizmetidir. Büyük miktarda yapılandırılmamış veriyi depolamak için optimize edilmiştir. Django ile entegrasyonu da django-storages aracılığıyla gerçekleştirilebilir.

Azure Tarafında Yapılandırma

1. Azure Depolama Hesabı Oluşturma (Create an Azure Storage Account):
* Azure Portal’a giriş yapın.
* “Storage accounts” (Depolama hesapları) hizmetine gidin ve “Create” (Oluştur) düğmesine tıklayın.
* Aboneliğinizi (Subscription), kaynak grubunuzu (Resource group) seçin veya yeni bir tane oluşturun.
* Depolama hesabı için benzersiz bir ad (örneğin, mydjangoblobstorage) belirleyin. Bu ad tüm Azure genelinde benzersiz olmalıdır.
* Bir konum (Location) seçin.
* Performans ve yedeklilik ayarlarını (örneğin, “Standard” performans, “Locally-redundant storage (LRS)”) uygulamanızın gereksinimlerine göre yapılandırın.
* Depolama hesabını oluşturun.

2. Blob Kapsayıcısı Oluşturma (Create a Blob Container):
* Oluşturduğunuz depolama hesabına gidin.
* Sol menüden “Containers” (Kapsayıcılar) seçeneğini tıklayın.
* “+ Container” (Kapsayıcı) düğmesine tıklayın.
* Kapsayıcı için bir ad (örneğin, media veya static) belirleyin.
* “Public access level” (Genel erişim düzeyi) ayarını yapın.
* Medya dosyaları için genellikle “Private (no anonymous access)” (Özel) seçeneği tercih edilir. Erişim, SAS tokenları (Shared Access Signatures) veya Azure AD kimlik doğrulaması ile sağlanır.
* Statik dosyalar için “Blob (anonymous read access for blobs only)” (Blob’lar için anonim okuma erişimi) veya “Container (anonymous read access for containers and blobs)” (Kapsayıcılar ve blob’lar için anonim okuma erişimi) seçilebilir.
* Kapsayıcıyı oluşturun.

3. Depolama Hesabı Erişim Anahtarlarını Alma (Get Storage Account Access Keys):
* Depolama hesabınızın ana sayfasına geri dönün.
* Sol menüden “Access keys” (Erişim anahtarları) seçeneğine tıklayın.
* Burada “Storage account name” (Depolama hesabı adı) ve iki adet “Key” (Anahtar) göreceksiniz. Bu anahtarlardan herhangi birini kullanabilirsiniz (genellikle Key1 kullanılır). Bu anahtarları güvenli bir yere kaydedin.

Django Tarafında Yapılandırma

1. Gerekli Kütüphaneleri Kurma:

pip install django-storages azure-storage-blob

2. settings.py Dosyasını Yapılandırma:
settings.py dosyanıza aşağıdaki ayarları ekleyin. Güvenlik nedeniyle, bu değerleri ortam değişkenlerinden okumanız şiddetle tavsiye edilir.

# settings.py

    # Ortam değişkenlerini yüklemek için (örn: django-environ kullanarak)
    # import environ
    # env = environ.Env()
    # environ.Env.read_env() # .env dosyasını okur

    INSTALLED_APPS = [
        # ... diğer uygulamalarınız
        'storages', # django-storages'ı ekleyin
    ]

    # Azure Blob Storage Ayarları
    AZURE_ACCOUNT_NAME = os.environ.get('AZURE_ACCOUNT_NAME') # Depolama hesabı adınız
    AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY') # Erişim anahtarınız

    # Medya Dosyaları
    AZURE_CONTAINER_MEDIA = 'media' # Medya dosyaları için kapsayıcı adınız
    DEFAULT_FILE_STORAGE = 'storages.backends.azure_storage.AzureStorage'
    MEDIA_URL = f'https://{AZURE_ACCOUNT_NAME}.blob.core.windows.net/{AZURE_CONTAINER_MEDIA}/'

    # Statik Dosyalar
    AZURE_CONTAINER_STATIC = 'static' # Statik dosyalar için kapsayıcı adınız
    STATICFILES_STORAGE = 'storages.backends.azure_storage.AzureStorage'
    STATIC_URL = f'https://{AZURE_ACCOUNT_NAME}.blob.core.windows.net/{AZURE_CONTAINER_STATIC}/'

    # Opsiyonel: Özel bir alan adı (custom domain) veya CDN kullanıyorsanız
    # AZURE_CUSTOM_DOMAIN = 'cdn.example.com' # CDN kullanıyorsanız

    # Eğer yerel geliştirme ortamında Azure'a yükleme yapmak istemiyorsanız,
    # DEBUG = True olduğunda yerel depolamayı kullanmak için koşullu ayarlar yapabilirsiniz.
    # if DEBUG:
    #     DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
    #     STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
    #     MEDIA_URL = '/media/'
    #     STATIC_URL = '/static/'
    #     MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    #     STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

Not: Azure için django-storages medya ve statik dosyaları aynı AzureStorage backend’i ile yönetebilir. Farklı kapsayıcılar kullanmak istiyorsanız, AZURE_CONTAINER ayarını dinamik olarak veya farklı depolama sınıfları tanımlayarak yapmanız gerekebilir. Yukarıdaki örnekte, varsayılan olarak AZURE_CONTAINER_MEDIA ve AZURE_CONTAINER_STATIC adında iki ayrı kapsayıcı kullanıldığı varsayılmıştır. django-storages‘ın Azure backend’i, AZURE_CONTAINER ayarını kullanır. Bu nedenle, eğer iki farklı kapsayıcı kullanmak istiyorsanız, DEFAULT_FILE_STORAGE ve STATICFILES_STORAGE için kendi özel depolama sınıflarınızı tanımlamanız ve her birine farklı AZURE_CONTAINER değerleri atamanız gerekebilir. Basit bir çözüm olarak, tek bir kapsayıcı altında media/ ve static/ dizinleri oluşturmak da mümkündür.

3. Kullanım:
* Medya Dosyaları: Modelinizdeki FileField veya ImageField alanları otomatik olarak Azure Blob Storage’a yükleme yapacaktır.

# models.py
        from django.db import models

        class MyModel(models.Model):
            name = models.CharField(max_length=100)
            my_file = models.FileField(upload_to='my_files/')

* Statik Dosyalar:

python manage.py collectstatic

Bu komut, tüm statik dosyalarınızı Azure Blob Storage’daki static kapsayıcısına (veya belirttiğiniz diğer kapsayıcıya) yükleyecektir.

Bu kurulumla, Django uygulamanızın medya ve statik dosyaları Azure Blob Storage’da depolanacaktır.

Genel En İyi Uygulamalar ve Dikkat Edilmesi Gerekenler

Nesne depolama ile çalışırken uygulamanızın güvenliğini, performansını ve yönetilebilirliğini artırmak için bazı en iyi uygulamaları takip etmek önemlidir.

Güvenlik

* Kimlik Bilgilerini Güvenli Tutma: AWS Access Key ID, Secret Access Key, GCP Service Account JSON dosyaları veya Azure Account Key gibi hassas kimlik bilgilerini asla doğrudan settings.py dosyasına yazmayın veya sürüm kontrol sistemine (Git) dahil etmeyin. Bunun yerine ortam değişkenleri (os.environ) veya django-environ gibi kütüphaneler kullanarak bu bilgileri yönetin.
* En Az Ayrıcalık İlkesi (Principle of Least Privilege): Bulut sağlayıcınızda (AWS IAM, GCP IAM, Azure RBAC) kullanıcılar veya hizmet hesapları oluştururken, onlara yalnızca görevlerini yerine getirmek için kesinlikle ihtiyaç duydukları izinleri verin. FullAccess yerine, belirli bir kovaya okuma/yazma izni veren özel politikalar oluşturun.
* Kova Politikaları ve ACL’ler: Kova (bucket) ve kapsayıcı (container) politikalarını dikkatlice yapılandırın. Genel erişim gerektirmeyen dosyalar için erişimi kısıtlı tutun. Hassas verileri asla genel erişime açık bir kovada saklamayın.
* Önceden İmzalanmış URL’ler (Pre-signed URLs): Özel (private) olarak depolanan dosyalara geçici erişim sağlamak için önceden imzalanmış URL’leri kullanın. Bu URL’ler belirli bir süre için geçerli olup, bu süre sonunda otomatik olarak sona erer.

Performans

* CDN Entegrasyonu: İçerik Dağıtım Ağları (CDN’ler) (örn: AWS CloudFront, Google Cloud CDN, Azure CDN, Cloudflare) kullanarak dosyaların son kullanıcılara daha hızlı ulaşmasını sağlayın. CDN’ler, dosyalarınızın kopyalarını dünya genelindeki kenar konumlarında önbelleğe alarak gecikmeyi azaltır.
* Önbellek Kontrolü (Cache Control): Statik dosyalar ve sık değişmeyen medya dosyaları için uygun önbellek kontrol başlıklarını ayarlayın. Bu, tarayıcıların ve CDN’lerin bu dosyaları daha uzun süre önbellekte tutmasına olanak tanır, böylece sunucuya yapılan istek sayısı azalır. AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400'} gibi ayarlar kullanabilirsiniz.
* Bölge Seçimi: Depolama kovalarınızı uygulamanızın sunucularına ve hedef kitlenize coğrafi olarak yakın bir bölgede oluşturun. Bu, gecikmeyi (latency) azaltır.

Maliyet Yönetimi

* Depolama Sınıfları: Bulut sağlayıcıları genellikle farklı depolama sınıfları sunar (örn: AWS S3 Standard, S3 Infrequent Access, S3 Glacier). Dosyalarınızın erişim sıklığına göre uygun depolama sınıfını seçerek maliyetleri optimize edebilirsiniz. Sık erişilenler için “Standard”, nadiren erişilenler için “Infrequent Access” veya “Archive” sınıflarını tercih edin.
* İzleme ve Analiz: Depolama kullanımınızı ve veri transfer maliyetlerinizi düzenli olarak izleyin. Bulut sağlayıcılarının sunduğu izleme araçları (AWS CloudWatch, GCP Monitoring, Azure Monitor) bu konuda size yardımcı olacaktır.

Yerel Geliştirme Ortamı

* Koşullu Depolama Ayarları: Geliştirme ortamında (DEBUG=True iken) bulut depolama yerine yerel dosya sistemini kullanmak pratik olabilir. Bu, geliştirme sırasında sürekli buluta dosya yükleme ve indirme trafiğini önler. Yukarıdaki örneklerde gösterildiği gibi if DEBUG: bloğu içinde yerel depolamayı ayarlayabilirsiniz.
* MinIO Kullanımı: Eğer yerel ortamda da nesne depolama davranışını simüle etmek istiyorsanız, MinIO gibi açık kaynaklı bir nesne depolama sunucusunu Docker ile yerel olarak çalıştırabilirsiniz. django-storages MinIO ile de uyumludur.

Dosya Silme ve Yönetimi

* Model Silme ve Nesne Depolama: Django’da bir model örneği silindiğinde, ilişkili FileField veya ImageField alanları otomatik olarak nesne depolama hizmetindeki dosyayı silmez. Bu davranışı istiyorsanız, post_delete sinyallerini kullanarak kendi dosya silme mantığınızı uygulamanız gerekir.

# myapp/models.py
    from django.db import models
    from django.db.models.signals import post_delete
    from django.dispatch import receiver

    class MyModel(models.Model):
        name = models.CharField(max_length=100)
        my_file = models.FileField(upload_to='my_files/')

    @receiver(post_delete, sender=MyModel)
    def auto_delete_file_on_delete(sender, instance, kwargs):
        """
        Model silindiğinde ilişkili dosyayı nesne depolamadan siler.
        """
        if instance.my_file:
            instance.my_file.delete(save=False)

* Eski Dosyaları Temizleme: Uygulamanızda artık kullanılmayan veya eski versiyonları olan dosyaları periyodik olarak temizlemek için bir stratejiniz olmalıdır. Bu, depolama maliyetlerini düşürmeye yardımcı olur.

Çapraz Kaynak Paylaşımı (CORS)

* Tarayıcı tabanlı uygulamalarınız (frontend JavaScript) nesne depolama hizmetinden dosya yüklemeye veya indirmeye çalışıyorsa, nesne depolama kovanızda CORS (Cross-Origin Resource Sharing) politikalarını yapılandırmanız gerekebilir. Bu, farklı bir alan adından gelen isteklerin kabul edilmesini sağlar.

Sonuç

Django uygulamalarınızda nesne depolama kullanmak, modern web geliştirmenin vazgeçilmez bir parçasıdır. Bu makalede ele aldığımız AWS S3, Google Cloud Storage ve Azure Blob Storage gibi hizmetlerle entegrasyon, uygulamanızın dosya depolama altyapısını ölçeklenebilir, dayanıklı, maliyet etkin ve yüksek performanslı hale getirir. django-storages kütüphanesi, bu entegrasyonu son derece basit ve yönetilebilir kılar.

Geleneksel yerel dosya depolamanın sınırlamalarından kurtularak, uygulamanızın büyümesiyle birlikte ortaya çıkacak depolama ihtiyaçlarına kolayca yanıt verebilirsiniz. Güvenlik, performans ve maliyet yönetimi için belirtilen en iyi uygulamaları takip etmek, uygulamanızın uzun vadeli başarısı için kritik öneme sahiptir. Nesne depolama, Django projenizin geleceğini güvence altına alarak, geliştiricilerin altyapı sorunları yerine iş mantığına odaklanmasına olanak tanır. Bu sayede daha sağlam, esnek ve kullanıcı dostu uygulamalar geliştirebilirsiniz.

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.