- Deleted `pnpm-workspace.yaml` as it is no longer needed. - Removed `apply-migrations.sh` script that handled database migrations. - Eliminated `generate-full-stack-env.mjs` script for environment variable generation. - Deleted `selfhost-backup.sh` script for creating backups of the self-hosted environment. - Removed `selfhost-doctor.sh` script for health checks of the self-hosted services. - Deleted `selfhost-restore.sh` script for restoring backups in the self-hosted environment.
3.5 KiB
title, description, order
| title | description | order |
|---|---|---|
| Storage ve Dosyalar | Avatar ve proje görselleri için Supabase Storage kullanımı. | 12 |
Storage ve Dosyalar
Neta'da dosya saklama için Supabase Storage kullanılır. Şu an iki temel dosya ihtiyacı var: profil fotoğrafları ve proje kapak görselleri.
Bu dosyaları uygulama reposu içinde tutmuyorum. Çünkü production ortamında dosya upload'larının kalıcı ve güvenli bir storage alanında durması gerekir. Supabase Storage bu iş için yeterli ve pratik bir çözüm sağlıyor.
Gerekli Bucket'lar
Neta iki bucket bekler:
| Bucket | Public | Kullanım |
|---|---|---|
avatars |
Evet | Profil fotoğrafları |
project-assets |
Hayır | Proje kapak görselleri |
avatars Bucket
Profil fotoğrafları için kullanılır.
Önerilen ayar:
- Bucket adı:
avatars - Public: Evet
- MIME kısıtı: Gerekirse image türleriyle sınırlandırılabilir
Avatar görselleri public URL ile gösterilir. Bu yüzden bucket public olabilir.
Profil fotoğrafı upload işlemi Ayarlar ekranından yapılır:
/settings
Server action tarafında service role client kullanılır ve upload sonrası public URL profile kaydına yazılır.
project-assets Bucket
Proje kapak görselleri için kullanılır.
Önerilen ayar:
- Bucket adı:
project-assets - Public: Hayır
- File size limit: 5 MB
- Allowed MIME types:
image/jpegimage/pngimage/webpimage/gif
Bu bucket private kalmalıdır. Proje detay sayfasında görsel gerektiğinde server tarafında signed URL üretilir.
Dosya Yolları
Proje görselleri şu mantıkla saklanır:
{user_id}/projects/{project_id}/{file_name}
Bu yapı storage policy yazmayı kolaylaştırır. Çünkü dosya yolunun ilk segmenti kullanıcının id değeridir.
Signed URL Kullanımı
Private bucket içindeki proje görselleri doğrudan public URL ile gösterilmez. Bunun yerine server tarafında kısa süreli signed URL üretilir.
Bu yaklaşım şu avantajları sağlar:
- Proje dosyaları herkese açık olmaz.
- URL süresi sınırlıdır.
- Yetkisiz kullanıcılar dosya yolunu bilse bile doğrudan erişemez.
Service Role Neden Kullanılıyor?
Upload işlemlerinde service role client kullanılır. Bunun sebebi storage policy karmaşıklığını azaltmak ve server-side işlemleri güvenli tutmaktır.
Yine de service role key sadece server tarafında kalmalıdır.
Storage Policy Mantığı
Policy'ler şu iki durumu desteklemelidir:
- Kullanıcı kendi klasöründeki dosyaları yönetebilmeli.
- Service role server-side işlemler için erişebilmeli.
project-assets için tipik yol kontrolü:
auth.uid()::text = storage.foldername(name)[1]
Service role için ayrıca bypass izni verilmelidir.
Sık Karşılaşılan Hatalar
Upload Başarısız
Kontrol edilecekler:
- Bucket adı doğru mu?
- Bucket var mı?
- MIME type izinli mi?
- Dosya boyutu limiti aşılıyor mu?
- Service role key doğru mu?
Görsel Yükleniyor Ama Görünmüyor
project-assets private olduğu için public URL beklemeyin. Signed URL üretimi çalışıyor mu kontrol edin.
Avatar Görünmüyor
avatars bucket public değilse public URL görüntülenmeyebilir. Ya bucket public yapılmalı ya da avatar için de signed URL yaklaşımı kullanılmalıdır.
Production Notu
Storage ayarları deploy platformundan bağımsızdır. Vercel, Coolify veya Dokploy fark etmez; dosya tarafındaki davranışı Supabase bucket ve policy ayarları belirler.