# Norden Medya Klasör ve R2 Sözleşmesi

Tarih: 1 Eylül 2026  
Bağlantılar: [[08-SINEMATIK-WEB-ADMIN-VE-MEDYA-ANA-PLANI]], [[09-HOSTINGER-DOCKER-POSTGRESQL-R2-YAYIN-VE-MALIYET-PLANI]], [[YAYIN-KABUL-VE-GERI-DONUS-KONTROL-LISTESI]]

## 1. Amaç

Ham kaynak, web-ready dosya, admin yüklemesi ve ilerideki R2 nesnesini birbirinden ayırmak; yeni ürün/seri/video eklenirken kod, DB ve dosya yollarının sessizce kopmasını engellemek.

## 2. Yerel klasör sözleşmesi

```text
source-assets/                 # Git, Docker ve web dışında master arşiv
  product-renders/             # yüksek çözünürlüklü ürün PNG/JPG
  story/                       # 9 kademe, kapak, iç kapak, kitchen vb.
  brand/                       # orijinal marka dosyaları
  catalog/                     # master PDF
  videos/originals/            # orijinal filmler
  ai-generated/                # prompt + onay + conceptual/real kaydı
  notes/                       # kaynak notları
  legacy-site/                 # eski site arşivi
  legacy-web-public/           # artık kullanılmayan eski/template public dosyalar

public/                        # yalnız web-ready ve yayımlanabilir dosyalar
  brand/
  catalog/
  products/{series}/{product}/
  media/gallery/images/
  media/gallery/videos/
  media/story/catalog/
  media/maps/
  uploads/admin/
```

Eski `norden-images/`, `norden-video/` ve `norden_gorseller/` kökleri yeniden oluşturulmaz.

## 3. Bugünkü doğrulanmış envanter

| Alan | Dosya | Boyut |
|---|---:|---:|
| Web-ready public | 292 | 74.060.757 bayt / 70,63 MiB |
| Master ve legacy kaynak | 496 | yaklaşık 4,23 GiB |
| Yayımlanmış ürün görsel kaydı | 272 | 272/272 dosya mevcut |
| Kod medya referansı | 43 | 43/43 dosya mevcut |
| DB medya referansı | 310 | 310/310 dosya mevcut |

`public/uploads/admin/.gitkeep` yalnız klasör koruyucusudur; gerçek admin yüklemeleri Git'e girmez.

## 4. URL ve R2 key standardı

Yerelde `/products/...`, `/media/...`, `/catalog/...` ve `/brand/...` kullanılır. Production R2 geçişinde eşdeğer hashli key tercih edilir:

```text
products/{series-slug}/{product-slug}/{content-hash}.webp
gallery/images/{year}/{slug}/{content-hash}.webp
gallery/videos/{year}/{slug}/{content-hash}.mp4
story/catalog/{slug}/{content-hash}.webp
catalog/{year}/norden-katalog-{version}.pdf
brand/{slug}/{content-hash}.svg
```

Görünen seri adı değişebilir; dosya/DB eşlemesi kararlı `slug` ile yapılır. Örnek: görünen ad `Vitroceramic`, eski teknik etiket `VTC`, kararlı slug `vitroceramic`.

## 5. Yeni medya ekleme akışı

1. Master dosya doğru `source-assets/` sınıfına konur.
2. Boyut, format, renk, şeffaflık, ses ve gerçeklik kontrol edilir.
3. WebP/AVIF/MP4/PDF türevi kararlı küçük harfli ASCII adla üretilir.
4. Admin yüklemesinde `MEDIA_STORAGE_DRIVER=local` ise `public/uploads/admin/{module}/{year}/{sha256}.{ext}`, `r2` ise aynı anahtar public media bucket'ına yazılır.
5. DB kaydı yeni URL ile güncellenir; eski dosya hemen silinmez.
6. `npm run media:audit-layout`, `npm run audit:release-acceptance`, `npm run audit:public-regression` ve `npm run audit:performance` çalıştırılır.
7. Staging kabulünden sonra eski nesne rollback manifestine göre arşivlenir/silinir.

## 6. Silme ve geri dönüş kuralı

- Hash eşitliği doğrulanmadan “mükerrer” dosya silinmez.
- Master dosya public kopya kaldırıldığı için kaybedilmez.
- DB yolu değişmeden önce SQLite/PostgreSQL snapshot ve URL manifesti alınır.
- Migration scriptleri idempotent olmalıdır; ikinci çalıştırma 0 değişiklik üretmelidir.
- `release-snapshots/media-layout-pre-migration-2026-09-01.db` bu yerel geçişin geri dönüş yedeğidir ve bütünlük sonucu `ok` olarak doğrulanmıştır.

## 7. R2 erişim sınırı

- Public medya ve private PostgreSQL yedekleri farklı bucket olmalıdır.
- `source-assets/legacy-*` ve doğrulanmamış AI içerikleri public bucket'a girmez.
- Admin yazma anahtarı yalnız gereken bucket/prefix yetkisine sahip olur; tarayıcıya secret verilmez.
- Production `r2.dev` yerine kullanıcının belirttiği alan adına bağlı `media.norden-haus.com` kullanır (15 Eylül güncellemesi).
- Mevcut anahtarın içeriği değiştirilmez; yeni içerik yeni hashli key alır.

## 8. Açık işler

- [ ] `source-assets/` için OneDrive dışında ikinci kontrollü/off-site master yedeği.
- [x] R2 Standard medya ve private yedek bucket oluşturma — 15 Eylül: `norden-public-media`, `norden-private-backups`; ikisi de boş ve public erişime kapalı.
- [ ] `media.norden-haus.com` custom domain kurulumu — patron/alan adı yöneticisinin DNS erişimi bekleniyor.
- [x] Admin upload için `local`/`r2` depolama adaptörü, SHA-256 anahtarı ve server-only kimlik bilgisi sınırı.
- [ ] Gerçek R2 bucket üzerinde admin upload bağlantı ve yetki provası.
- [ ] R2 upload/migration manifesti ve hash karşılaştırma aracı.
- [ ] Staging üzerinde CORS, cache, yetkisiz yazma ve rollback provası.
