# Norden Admin 2.0 Kullanım ve Yayın Güvenlik Planı

Tarih: 1 Eylül 2026  
Durum: Yerel faz 2 ve çok kullanıcılı RBAC tamamlandı; production erişimi kapalı kabul edilir  
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ç

Kod dosyası açmadan ürün, seri, Gallery, ihracat pazarı ve ana sayfa kompozisyonunu yönetmek; teknik doğruluğu, üç dil eşleşmesini, veri geri dönüşünü ve yayın güvenliğini korumak.

## 2. Yerelde çalışan modüller

| Modül | Yönetilen içerik | Güvenlik / davranış |
|---|---|---|
| Ürünler | SKU, slug, kategori, seri, ölçü, yüzey, göz sayısı, görseller, durum | Silme yerine arşiv; her mutasyonda yetki ve doğrulama |
| Ürün TR/EN/RU | Ad, açıklama, özellik, opsiyon, aksesuar | TR mevcut 131 üründen taşındı; EN/RU boşsa kontrollü otomatik geri dönüş |
| Seriler | Yeni seri, sıra, yayın durumu, üç dil metin, ölçü/yüzey ve görseller | Ürün bağlı seri arşivlenemez; 7→8 seri kod değişmeden mümkün |
| Gallery | Film/görsel, masaüstü/mobil kaynak, poster, üç dil metin, featured, sıra | Doğrulanmış medya yolu; arşiv veri kaybetmez |
| Ülkeler | Kod, üç dil ad/başkent, koordinat, görünürlük ve sıra | Koordinat sınırı doğrulanır; harita çıktısı DB'den gelir |
| Ana sayfa bölümleri | Aç/kapat, sıra, güvenli varyant ve editör notu | Ham CSS/JavaScript kabul edilmez |
| İşlem geçmişi | Oluşturma, düzenleme, arşiv ve görünürlük işlemleri | Son işlemler zaman ve özetle kaydedilir |
| Kullanıcılar ve yetkiler | Yönetici hesabı, durum, geçici parola, oturum ve modül/işlem matrisi | Yalnız korunan Ana Yönetici yönetir; bütün kontroller sunucu tarafında tekrar uygulanır |

## 3. Yerel veri durumu

- 1 kategori, 7 seri, 131 ürün, 272 ürün görseli.
- 9 Gallery kaydı, 14 ihracat pazarı, 7 ana sayfa bölümü.
- Admin şema çalışmasından önce: `release-snapshots/admin2-pre-schema-2026-09-01.db`.
- RBAC şema çalışmasından önce: `release-snapshots/admin-rbac-pre-schema-2026-09-01.db`; kaynak ve yedek SQLite bütünlüğü `ok`.
- Bir adet aktif ve korunan `super_admin` Ana Yönetici hesabı vardır; ilk girişte parola değişimi zorunludur.
- Ürün dil geçiş scripti: `scripts/backfill-product-locales.mjs`.
- İçerik geçiş scripti: `scripts/backfill-admin-content.mjs`.
- Backfill scriptleri normal panel kullanımı değildir; yalnız kontrollü kurulum/göçte ve yedek alındıktan sonra çalıştırılır.

## 4. Günlük kullanım sırası

1. `/admin/login` üzerinden giriş yapılır; geçici parola kullanılıyorsa diğer modüllerden önce kişisel parola değiştirme ekranı tamamlanır.
2. Değiştirilecek kayıt açılır; teknik iddia katalog veya şirket onayıyla karşılaştırılır.
3. Önce Türkçe ana içerik, sonra gerçek EN ve RU karşılıkları girilir.
4. Taslak kayıt önizlenir; ürün/seri/görsel eşleşmesi kontrol edilir.
5. Yayına alınır ve ilgili TR/EN/RU public rota açılır.
6. İşlem geçmişindeki kayıt ve public çıktı doğrulanır.

## 5. Production secret sözleşmesi

Obsidian, Git, Dockerfile veya uygulama loguna hiçbir gizli değer yazılmaz. Production'da zorunlu değerler secret store veya yalnız sunucuda korunan `.env` dosyasındadır:

- `ADMIN_USERNAME` — yalnız ilk Ana Yönetici bootstrap adımı için
- `ADMIN_PASSWORD_HASH` — yalnız ilk bootstrap için güçlü bcrypt hash; hesap oluştuktan sonra doğrulama verisi veritabanındadır. Düz parola kullanılarak yerel bootstrap yapılacaksa 12 karakterden kısa veya 72 UTF-8 baytından uzun olamaz; büyük-küçük harf, sayı ve özel karakter içermelidir
- `ADMIN_SESSION_SECRET` — en az 32 bayt rastgele; IP gibi özel denetim değerlerini HMAC ile anonimleştirmek için
- `DATABASE_URL` — Docker içindeki PostgreSQL servis adresi
- R2 endpoint/bucket/access key/secret key ve public media base URL

## 6. Canlıya açılmadan önce zorunlu dönüşümler

| İş | Yerel bugün | Production hedefi |
|---|---|---|
| Veritabanı | SQLite `dev.db` | Hostinger VPS Docker ağında PostgreSQL |
| Medya yazma | `public/uploads/admin` | Cloudflare R2 hashli ve kalıcı key |
| Login rate limit | SQLite üzerinde IP+kullanıcı ve IP bazlı kalıcı sayaç | PostgreSQL kalıcı sayaç + reverse proxy dış sınırı |
| Parola | bcrypt hash veritabanında; düz geçici parola `.env` dosyasından kaldırıldı; tüm admin akışlarında 72 UTF-8 byte sınırı var | İlk bootstrap hash ile; sonrasında panelden kullanıcıya özel bcrypt hash ve MFA |
| Yedek | Manuel SQLite snapshot | Günlük şifreli `pg_dump`, off-site private R2 ve restore provası |
| Yayın | Yerel production build | Private GitHub, immutable Docker etiketi, staging, sonra production |

## 7. Production açılış kararları

- Admin varsayılan olarak public internete açılmış sayılmaz.
- VPN/IP allowlist uygulanabiliyorsa ilk tercih edilir; uygulanmıyorsa güçlü kimlik, proxy rate limit ve gözlem zorunludur.
- PostgreSQL `5432` host portu açılmaz.
- R2 yazma anahtarı yalnız gerekli bucket/prefix yetkisini taşır.
- Upload boyutu hem reverse proxy hem uygulama katmanında sınırlandırılır.
- Her şema değişikliği geriye dönüş etkisiyle staging'de test edilir.

## 8. Açık Admin 2.0 fazları

| Öncelik | Açık modül | Neden |
|---|---|---|
| P1 | Kategori yönetimi | İleride fırın/davlumbaz kategorisi eklemek için |
| P1 | Kaynaklar ve sertifikalar | Gerçek PDF, kapsam, tarih, görünürlük ve indirme yönetimi |
| P1 | Global çeviri merkezi | Navbar, iletişim ve marka hikâyesi dahil eksik/stale TR/EN/RU matrisi |
| P1 | Seri bölüm editörü | Beş teknik bölümün gerçek iddia, görsel ve hazır animasyon presetleri |
| P2 | Şirket hikâyesi kanıt akışı | Fabrika/lojistik iddialarında kaynak ve onay kaydı |
| P2 | Fark ve geri dönüş | Birden fazla editör hazır; önce/sonra farkı ve kayıt bazlı geri alma henüz yok |
| P2 | Toplu ürün içe aktarma | Klasör/CSV'den taslak üretip insan onayından sonra yayınlama |

## 9. Yerel kabul kanıtı

- `npm run lint`: temiz.
- `npx tsc --noEmit`: temiz.
- `npm run build`: temiz; admin ve public rotalar üretildi.
- Yetkisiz admin sayfaları girişe; yetkisiz modüller `/admin/forbidden` sayfasına yönlendiriliyor.
- Production admin yanıtları `private, no-store, max-age=0, must-revalidate`; CDN/Cloudflare/surrogate katmanları ayrı `no-store`; admin `noindex`.
- Yetkisiz `/api/admin/upload`: HTTP 401; yanlış modül yetkisi ve farklı Origin: HTTP 403.
- `npm run admin:audit-rbac`: 18/18 senaryo temiz; Ana Yönetici, zorunlu parola değişimi, menü gizleme, doğrudan rota/API engeli, hesap kapatma ve oturum iptali dahil.
- Oturum cookie'sinde yalnız rastgele 256 bit token bulunur; veritabanında tokenın yalnız SHA-256 özeti saklanır, süre sekiz saattir ve iptal edilebilir.
- Geçici yerel hesapla ürün, seri, Gallery, ülke, bölüm ve işlem geçmişi ekranları açıldı.
- Rusça ürün sayfası, özel RU alanı henüz girilmemiş üründe kontrollü otomatik geri dönüşle açıldı.
- Test sırasında ürün/seri/medya verisi değiştirilmedi.

## 10. Bir sonraki uygulama sırası

1. Kategori ve gerçek katalog/sertifika kaynak yönetimi.
2. Global TR/EN/RU çeviri merkezi ve eksik çeviri göstergesi.
3. PostgreSQL migration + SQLite aktarım ve RBAC oturum/rate-limit provası.
4. R2 upload adapter, Origin politikası ve medya göç manifesti.
5. Docker/staging; reverse proxy sınırları, MFA/VPN kararı, güvenlik kabulü ve canlı yayın.

## 11. Uygulanan RBAC sözleşmesi

| Katman | Uygulama |
|---|---|
| Ana Yönetici | `isSystem=true`, `role=super_admin`; kapatılamaz, yetkisi düşürülemez, başka hesapça parolası sıfırlanamaz veya oturumları kapatılamaz |
| Atanabilir modüller | Ürünler, Seriler, Galeri, Ülkeler, Ana sayfa, İşlem geçmişi |
| İşlem izinleri | Görüntüle, ekle, düzenle, yayınla, arşivle, dosya yükle; modüle göre anlamlı alt küme |
| Kullanıcı yönetimi | Yalnız Ana Yönetici; yeni kullanıcı geçici güçlü parolayla oluşturulur ve ilk girişte parola değiştirir |
| Sunucu sınırı | Menü gizlemek yeterli kabul edilmez; her sayfa, Server Action ve upload API kendi modül/işlem iznini yeniden doğrular |
| Oturum iptali | Hesap kapatma veya oturumları kapatma bir sonraki istekte etkili olur |
| Giriş denemesi | 15 dakikalık pencerede IP+kullanıcı için 5, IP için 20 hata; 15 dakika blok; sayaç veritabanında kalıcıdır |
| Upload | Modül yetkisi, SameSite cookie, aynı Origin, tip/boyut, gerçek görsel metadata veya video imzası doğrulanır |

## 12. Yerel işletim komutları

- `npm run admin:bootstrap`: Ana Yönetici hesabını ilk kez oluşturur veya koruma niteliklerini doğrular; var olan hesap için parola değişkeni gerektirmez.
- `npm run admin:audit-rbac`: Çalışan uygulamaya karşı geçici bir sınırlı hesap ve test oturumları üretir; 18 güvenlik senaryosunu çalıştırır ve test verisini `finally` bloğunda temizler.
- `npm run lint`, `npx tsc --noEmit`, `npm run build`: her RBAC veya admin değişikliğinin zorunlu kalite kapısıdır.

## 13. Bilinçli açık production işleri

- PostgreSQL ve R2 geçişi tamamlanmadan yerel SQLite/public upload düzeni internete açılmaz.
- Uygulama içi kalıcı rate limit uygulanmıştır; yine de bot ve hacim saldırıları için reverse proxy sınırı gerekir.
- MFA henüz uygulanmadı. İlk canlı sürümde VPN/IP allowlist mümkün değilse TOTP/WebAuthn veya harici kimlik katmanı production kapısı olarak karara bağlanır.
- CSP bugün `Report-Only` durumundadır; canlı ihlal gözlemi yapılmadan engelleme moduna geçirilmez.
- Bu klasörde geçerli Git deposu yoktur; immutable release ve güvenli geri dönüş için private Git temeli yayın öncesi zorunludur.
