Backblaze B2’den FastAPI ile Dosya Servisi
Hızlı, güvenilir ve ölçeklenebilir bir dosya servis sistemine mi ihtiyacınız var? Backblaze B2’nin sunduğu uygun fiyatlı ve güvenli depolama alanı ile FastAPI’nin sağladığı performanslı API geliştirme olanaklarını birleştirerek, kendi özel dosya sunucunuzu kolayca oluşturabilirsiniz. Bu makalede, Backblaze B2’den FastAPI ile özel dosya servisini adım adım nasıl kuracağınızı, performans optimizasyonlarını ve güvenlik hususlarını ele alacağız.
Backblaze B2 ve FastAPI: Temel Kavramlar
Öncelikle, Backblaze B2 ve FastAPI’nin temel özelliklerini anlamak önemlidir. Backblaze B2, bulut tabanlı bir nesne depolama hizmetidir. Uygun fiyatlı ve güvenilir bir çözüm sunarak, büyük miktarda veriyi güvenli bir şekilde saklamanızı sağlar. Öte yandan, FastAPI, Python tabanlı yüksek performanslı bir web çerçevesidir. API geliştirmeyi kolaylaştırır ve otomatik dokümantasyon gibi birçok avantaj sunar. Bu iki teknolojinin birlikte kullanımı, hızlı, güvenilir ve ölçeklenebilir bir dosya sunucusu oluşturmanıza olanak tanır. İşte bu iki teknolojinin önemli özelliklerine kısaca göz atalım:
- Backblaze B2’nin Avantajları: Uygun fiyat, yüksek güvenilirlik, geniş depolama kapasitesi, global erişim.
- FastAPI’nin Avantajları: Yüksek performans, kolay kullanım, otomatik dokümantasyon, asenkron işlemler.
Bu makalede, Backblaze B2’nin API’sini kullanarak FastAPI ile dosya yükleme, indirme ve silme işlemlerini nasıl gerçekleştireceğinizi öğreneceksiniz. Ayrıca, dosya yönetimi, hata yönetimi ve güvenlik konularına da değineceğiz.
Backblaze B2’ye Bağlanma ve Kimlik Doğrulama
Öncelikle, Backblaze B2 hesabınıza giriş yapmanız ve API anahtarlarınızı oluşturmanız gerekir. Bu anahtarlar, Backblaze B2 ile güvenli bir şekilde iletişim kurmanızı sağlayacaktır. Hesabınızda “Application Keys” bölümünden yeni bir uygulama anahtarı oluşturabilirsiniz. Bu anahtarı, uygulamanızda Backblaze B2 ile iletişim kurmak için kullanacaksınız. Aşağıdaki kod bloğu, Backblaze B2’ye bağlanmak ve kimlik doğrulamasını gerçekleştirmek için kullanılabilecek bir örnektir:
import backblaze_b2
# Backblaze B2 API anahtarlarınızı buraya girin
account_id = "YOUR_ACCOUNT_ID"
application_key = "YOUR_APPLICATION_KEY"
b2 = backblaze_b2.B2(account_id, application_key)
b2.authorize()
bucket_id = b2.list_buckets()[0]['bucketId'] # İlk kovayı seçiyoruz. Kendi kovayı belirtin.
Bu kod bloğu, backblaze_b2 kütüphanesini kullanarak Backblaze B2 hesabınıza bağlanır. YOUR_ACCOUNT_ID ve YOUR_APPLICATION_KEY yerine kendi Backblaze B2 hesap bilgilerinizi girmeniz gerekmektedir. Bu bölümde hata ayıklama için try-except blokları eklemek ve doğrulama işlemlerini iyileştirmek çok önemlidir. Örneğin, yanlış kimlik bilgileri girildiğinde uygun bir hata mesajı gösterilmelidir. Ayrıca, birden fazla depolama alanınız varsa, uygun depolama alanını seçmek için ek mantık ekleyebilirsiniz.
FastAPI ile Dosya Yükleme
FastAPI kullanarak dosya yükleme işlemini gerçekleştirmek oldukça basittir. FastAPI'nin UploadFile nesnesi, dosya yükleme işlemini kolaylaştırır. Aşağıdaki kod bloğu, FastAPI ile dosya yükleme işlemini göstermektedir:
from fastapi import FastAPI, UploadFile, File
from fastapi.responses import JSONResponse
app = FastAPI()
@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile = File(...)):
try:
with open(f"./uploads/{file.filename}", "wb") as buffer:
while content := await file.read(1024): # 1KB'lık parçalar halinde oku
buffer.write(content)
# Backblaze B2'ye dosyayı yükleme işlemi
upload_url = b2.get_upload_url(bucket_id)
file_path = f"./uploads/{file.filename}"
with open(file_path, "rb") as f:
file_content = f.read()
file_info = b2.upload_file(upload_url['uploadUrl'], upload_url['authorizationToken'], file.filename, file_content)
# Dosyayı yükledikten sonra yerel dosyayı silme
import os
os.remove(file_path)
return JSONResponse({"filename": file.filename, "b2_file_id": file_info["fileId"]})
except Exception as e:
return JSONResponse({"error": str(e)}, status_code=500)
Bu kod, /uploadfile/ endpoint'ine bir dosya gönderildiğinde, dosyayı önce yerel olarak kaydeder, daha sonra Backblaze B2'ye yükler ve son olarak yerel dosyayı siler. Hata yönetimi için try-except bloğu kullanılmıştır. Bu işlemde, büyük dosyalar için performans optimizasyonu yapmak önemlidir. Örneğin, dosyayı parçalar halinde yüklemek, bellek tüketimini azaltır ve daha hızlı yükleme sağlar. Ayrıca, dosya türünü kontrol ederek güvenliği artırabilirsiniz.
FastAPI ile Dosya İndirme
Dosya indirme işlemi için, öncelikle Backblaze B2'den dosyanın URL'sini almanız gerekir. Daha sonra, FastAPI kullanarak bu URL'yi kullanarak dosyayı kullanıcılara iletebilirsiniz. Aşağıdaki kod bloğu, FastAPI ile dosya indirme işlemini göstermektedir:
from fastapi import FastAPI, HTTPException
from fastapi.responses import StreamingResponse
import backblaze_b2
# ... (Backblaze B2 bağlantı bilgileri ve diğer kodlar) ...
@app.get("/download/{file_id}")
async def download_file(file_id: str):
try:
file_info = b2.get_file_info(bucket_id, file_id)
download_url = b2.get_download_url(file_id, file_info["fileName"])
response = requests.get(download_url["downloadUrl"], stream=True)
response.raise_for_status() # Hata kontrolü
return StreamingResponse(response.iter_content(chunk_size=8192), media_type="application/octet-stream")
except backblaze_b2.exceptions.B2NotFoundError:
raise HTTPException(status_code=404, detail="Dosya bulunamadı")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Bir hata oluştu: {str(e)}")
Bu kod, /download/{file_id} endpoint'ine bir file_id gönderildiğinde, ilgili dosyanın indirme URL'sini Backblaze B2'den alır ve StreamingResponse kullanarak dosyayı kullanıcılara akış olarak gönderir. Bu yaklaşım, büyük dosyaların indirme işlemini daha verimli hale getirir. Hata yönetimi için, try-except bloğu ile B2NotFoundError gibi Backblaze B2 ile ilgili özel hatalar ele alınmıştır. Ayrıca genel istisnalar da yakalanarak 500 hatası döndürülür.
Dosya Silme İşlemi ve Hata Yönetimi
Dosya silme işlemi, Backblaze B2 API'sini kullanarak gerçekleştirilir. FastAPI ile bir endpoint oluşturarak, kullanıcıların belirli bir file_id'ye sahip dosyaları silmelerine olanak tanıyabilirsiniz. Aşağıdaki örnekte, hata yönetimi ve güvenlik önlemleri de gösterilmektedir:
@app.delete("/delete/{file_id}")
async def delete_file(file_id: str):
try:
b2.delete_file_version(bucket_id, file_id)
return {"message": "Dosya başarıyla silindi"}
except backblaze_b2.exceptions.B2NotFoundError:
raise HTTPException(status_code=404, detail="Dosya bulunamadı")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Bir hata oluştu: {str(e)}")
Bu kod bloğu, /delete/{file_id} endpoint'ini tanımlar. file_id parametresi, silinecek dosyanın ID'sini belirtir. try-except bloğu, hata yönetimi için kullanılır. B2NotFoundError özel istisnası, dosya bulunamadığında yakalanır ve 404 hatası döndürülür. Diğer istisnalar ise genel bir 500 hatasıyla yönetilir. Güvenlik açısından, sadece yetkili kullanıcıların dosya silme işlemini gerçekleştirebildiğinden emin olmak için yetkilendirme mekanizmaları eklenmelidir. Örneğin, API anahtarlarını doğrudan kod içinde saklamaktan kaçınılmalı ve daha güvenli yöntemler tercih edilmelidir.
Performans Optimizasyonu ve Ölçeklenebilirlik
Uygulamanın performansını ve ölçeklenebilirliğini artırmak için birkaç teknik kullanabilirsiniz. Bunlardan bazıları şunlardır:
- Asenkron İşlemler: FastAPI'nin asenkron yeteneklerini kullanarak, dosya yükleme ve indirme işlemlerini eş zamanlı olarak gerçekleştirebilirsiniz. Bu, uygulamanızın genel performansını iyileştirir.
- Parçalı Yükleme: Büyük dosyalar için, dosyayı küçük parçalara bölerek yükleyebilirsiniz. Bu, bellek tüketimini azaltır ve yükleme süresini kısaltır.
- Cacheleme: Sık erişilen dosyalar için bir önbellek mekanizması kullanarak, Backblaze B2'den dosya indirme işlemini hızlandırabilirsiniz. Redis gibi bir önbellek sistemi kullanabilirsiniz.
- CDN kullanımı: Backblaze B2 ile entegre çalışan bir CDN (Content Delivery Network) kullanarak, dosya indirme hızını ve erişilebilirliğini önemli ölçüde artırabilirsiniz. Bu, özellikle coğrafi olarak dağılmış kullanıcılarınız varsa çok önemlidir.
Güvenlik Hususları
Uygulamanızın güvenliğini sağlamak için aşağıdaki hususlara dikkat etmelisiniz:
Dikkat!
API anahtarlarınızı asla kodunuzun içinde doğrudan saklamayın. Çevre değişkenleri veya güvenli bir sır yönetimi sistemi kullanın.
- HTTPS kullanımı: Tüm iletişimleri şifrelemek için HTTPS kullanın.
- Yetkilendirme ve Kimlik Doğrulama: Uygulamanızın sadece yetkili kullanıcıların dosyalara erişebilmesini sağlamak için güvenli bir yetkilendirme ve kimlik doğrulama mekanizması kullanın (örneğin, JWT).
- Giriş Denetimleri: Zararlı dosya yüklemelerini önlemek için dosya türlerini kontrol edin ve zararlı içerikleri engellemek için uygun önlemler alın.
- Hata Yönetimi: Uygulama hatalarını doğru şekilde yönetin ve hassas bilgileri ifşa etmeyin.
Öğrenme Yol Haritası
Bu makaledeki konuyu öğrenmek için aşağıdaki yol haritasını izleyebilirsiniz:
[Yeni Başlayan]
- Backblaze B2 hesabı oluşturma ve API anahtarları alma.
- Python ve FastAPI temellerini öğrenme.
- Bu makaledeki temel dosya yükleme ve indirme örneklerini uygulama.
[Orta]
- Hata yönetimi ve güvenlik önlemlerini uygulama.
- Dosya türü kontrolü ve doğrulama ekleme.
- Daha gelişmiş dosya yönetimi fonksiyonları ekleme (örneğin, dosya listesi alma, dosya güncelleme).
[İleri Düzey]
- Asenkron işlemler ve parçalı yükleme tekniklerini uygulama.
- CDN entegrasyonu.
- Güvenli kimlik doğrulama mekanizmaları (örneğin, OAuth 2.0) ekleme.
- Ölçeklenebilirlik ve performans optimizasyonu için daha gelişmiş teknikler araştırma.
Gerçek Dünya Senaryoları
Bu sistem, çeşitli gerçek dünya senaryolarında kullanılabilir. Örneğin, bir fotoğraf paylaşım platformu, büyük dosya transferi gerektiren bir dosya paylaşım hizmeti veya bir makine öğrenmesi modeli eğitim platformunda kullanılabilir. Backblaze B2'nin ölçeklenebilirliği ve FastAPI'nin performansı sayesinde, bu tür uygulamalar için ideal bir çözüm sunar.
Sonuç
Bu makalede, Backblaze B2'den FastAPI ile özel dosya servisinin nasıl oluşturulacağını adım adım anlattık. Başlangıç seviyesinden ileri seviyeye kadar konunun farklı yönlerini ele aldık ve performans optimizasyonu, güvenlik ve hata yönetimi konularına da değindik. Uygulamanızın ihtiyaçlarına göre bu makaledeki bilgileri ve örnekleri uyarlayarak kendi özelleştirilmiş dosya servis sisteminizi geliştirebilirsiniz. Daha fazla bilgi için fatihsoysal.com sitesini inceleyebilirsiniz.
Sıkça Sorulan Sorular
- Backblaze B2'nin maliyeti nedir? Backblaze B2, kullandığınız depolama alanına göre ücretlendirir. Fiyatlandırma detayları için Backblaze B2 resmi web sitesini ziyaret edebilirsiniz.
- FastAPI'yi öğrenmek için hangi kaynakları kullanabilirim? FastAPI'nin resmi dokümantasyonu ve birçok online eğitim kaynağı mevcuttur.
- Büyük dosyalar için performansı nasıl iyileştirebilirim? Parçalı yükleme, asenkron işlemler ve CDN kullanımı performansı artırmaya yardımcı olabilir.
- Güvenlik için hangi önlemleri almalıyım? API anahtarlarını güvenli bir şekilde saklamak, HTTPS kullanmak ve yetkilendirme/kimlik doğrulama mekanizmaları uygulamak önemlidir.
- Hata yönetimi için ne yapabilirim?
try-exceptblokları kullanarak olası hataları yakalayabilir ve uygun şekilde yanıt verebilirsiniz.
Yazar: Fatih Soysal