Files
neta/docs/12-storage-ve-dosyalar.md
T
Poyraz 72a0b38f3e Remove obsolete scripts and configuration files for self-hosting and database migrations
- 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.
2026-06-16 09:57:32 +03:00

123 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Storage ve Dosyalar
description: Avatar ve proje görselleri için Supabase Storage kullanımı.
order: 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:
```txt
/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/jpeg`
- `image/png`
- `image/webp`
- `image/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:
```txt
{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ü:
```txt
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.