# Norden Hostinger, Docker, PostgreSQL, R2 Yayın ve Maliyet Planı

Tarih: 1 Eylül 2026  
Durum: Admin 2.0 ve yayın öncesi yerel kaynak/veri güvenliği tamamlandı; production altyapısı başlamadı  
Kapsam: Yerel yayın adayından staging ve canlı production kabulüne kadar altyapı, veri, medya, güvenlik, maliyet ve geri dönüş.  
Bağlantılı kayıtlar: [[08-SINEMATIK-WEB-ADMIN-VE-MEDYA-ANA-PLANI]], [[07-OCAK-KATALOGU-DONUSUM-PLANI]], [[YAYIN-KABUL-VE-GERI-DONUS-KONTROL-LISTESI]]

> [!important] Bağlayıcı mimari kararı
> Production hedefi **Hostinger KVM VPS + Ubuntu 24.04 Docker şablonu + Docker Compose + Next.js standalone + PostgreSQL + Cloudflare R2 + private GitHub** yapısıdır. PostgreSQL aynı VPS'de çalışır; R2 internet üzerindeki medya deposudur. Admin 2.0 yerelde uygulanmıştır; canlı erişim PostgreSQL/R2, production secrets, reverse proxy ve staging güvenlik kabulü tamamlanmadan açılmaz.

## 1. Hedef mimari

```text
Codex / yerel proje
        │
        ▼
Private GitHub repository
        │  push / release tag
        ▼
GitHub Actions + Hostinger deployment
        │
        ▼
Hostinger VPS
├── reverse-proxy     → alan adı, HTTPS, güvenlik ve istek limitleri
├── web               → Next.js standalone production container
├── db                → PostgreSQL; internete kapalı
├── postgres_data     → kalıcı Docker volume
├── backup            → zamanlanmış şifreli veritabanı yedeği
└── healthcheck/logs  → yayın kabulü ve arıza teşhisi
        │
        └─────────────→ Cloudflare R2 / media.norden.com.tr
                        ürün görselleri, Gallery, videolar, PDF ve özel yedekler
```

## 2. Kesinleşen ilkeler

1. Sunucuda elle kod düzenlenmez; kaynak gerçekliği private GitHub'dır.
2. Container silinse bile PostgreSQL verisi ve gerekli çalışma verisi kaybolmaz.
3. PostgreSQL portu internete açılmaz; yalnız Docker iç ağı erişir.
4. Parolalar, API anahtarları ve session secret repoya, Docker imajına veya Obsidian'a yazılmaz.
5. Yeni sürüm önce staging'de, sonra production'da çalıştırılır.
6. Veri göçü ve medya geçişinden önce geri dönüş yedeği alınır.
7. R2 `r2.dev` development adresi production'da kullanılmaz; özel medya alan adı kullanılır.
8. Teknik iddia, seri, ürün, ülke veya belge doğrulanmadan yayınlanmaz.
9. Yerel Admin 2.0 public yayından bağımsızdır; production güvenlik kapıları tamamlanmadan internetten erişilebilir yapılmaz.
10. Yayın, yalnız HTTP 200 almak değil; veri, medya, üç dil, güvenlik, performans, yedek ve geri dönüş kanıtlarının tamamlanmasıdır.

## 3. Yayına kadar ana plan tablosu

| ID | Faz | İşler | Durum | Bağımlılık | Kabul kriteri |
|---|---|---|---|---|---|
| Y00 | Karar ve sahiplik | Hostinger planı, domain, GitHub, Cloudflare hesap sahibi ve ödeme sorumlusu | Bekliyor | Kullanıcı kararı | Hesaplar kullanıcı adına; 2FA açık; kurtarma bilgileri kayıtlı |
| Y01 | Geçerli Git temeli | Gerçek repo, `.gitignore`, ana branch, private remote ve ilk tag | **Tamamlandı - 14 Eylül 2026** | Y00 | `Quivermist/norden-katalog` private; GitHub Quality Gate `ece1fd7` üzerinde yeşil; ilk doğrulanmış geri dönüş etiketi `v0.1.0` |
| Y02 | Production yapılandırma sözleşmesi | Dev/staging/prod env listesi, secret envanteri, URL ve origin politikası | Yerelde tamamlandı | Y01 | `.env.example` ve `.env.production.example` yalnız değişken sözleşmelerini içeriyor; gerçek secret yok |
| Y03 | Dinamik içerik modeli | Seri, ürün çevirisi, Gallery, ülke, bölüm görünürlüğü, medya ve revizyon modelleri | Yerelde tamamlandı | İçerik kararı | 7→8 seri, gizleme/sıralama ve Gallery/ülke ekleme kod sabitine bağlı değil; PostgreSQL migration bekliyor |
| Y04 | PostgreSQL şeması | Prisma provider, migration'lar, indeksler, constraint ve bağlantı havuzu | **Yerel PostgreSQL 17 provası tamamlandı** | Y03 | Senkron PostgreSQL istemcisi, 26 indeks ve ilk migration geçerli; temiz ve dolu hedef güvenlik senaryoları Docker içinde test edildi |
| Y05 | SQLite göç provası | SQLite→PostgreSQL tam veri, admin/RBAC ve bütünlük doğrulaması | **Yalıtılmış PostgreSQL provası tamamlandı - 14 Eylül 2026** | Y04 | 131 ürün, 272 görsel, tüm içerik, 1 admin ve 5 audit kaydı taşındı; adet/SHA-256 eşleşti. 2 eski session taşınmadı ve parola değişimi zorlandı. Production çalıştırması staging/yedek sonrasında |
| Y06 | R2 medya tasarımı | Standard bucket, klasör/key standardı, özel medya domaini, CORS ve cache | Yerel sözleşme ve upload adaptörü tamamlandı | Y00/Y02 | `local`/`r2` sürücüsü, SHA-256 nesne anahtarı, HTTPS public URL ve immutable cache hazır; gerçek Cloudflare hesabı, bucket, CORS ve custom domain bekliyor |
| Y07 | Medya göç provası | Ürün, marka, Gallery, video ve PDF dosyaları; hash ve URL eşlemesi | Yerel dosya göçü tamamlandı; R2 provası bekliyor | Y06 | Web-ready yapı ve referanslar temiz; admin R2 yazma kodu hazır. Toplu R2 upload, hash manifesti ve geri dönüş provası gerçek bucket üzerinde bekliyor |
| Y08 | Ön yüzü veri odaklılaştırma | Collections, Gallery, ülke, ana sayfa bölümleri ve ürün çevirilerini veri kaynağına bağlama | Yerelde tamamlandı | Y03; production için Y04–Y07 | Seri sayısı değişince selector ve sitemap otomatik; üç dil ve SEO korunuyor |
| Y09 | Next.js production paketi | `output: standalone`, çok aşamalı Dockerfile, non-root runtime, health endpoint | **Yerel Linux imajı tamamlandı** | Y02/Y04 | Linux build, non-root web imajı, statik dosyalar ve container healthcheck geçti. Bkz. [[13-DOCKER-YEREL-PROVA-VE-KURULUM]] |
| Y10 | Docker Compose | web, db, proxy, volume, network, restart ve resource/health kuralları | **Localhost Compose provası tamamlandı; production uyarlaması bekliyor** | Y09 | DB internete kapalı, web/proxy sağlıklı ve restart sonrası veri kalıcı. TLS, admin erişimi ve production limitleri sunucuda eklenecek |
| Y11 | Yedekleme ve geri yükleme | Günlük `pg_dump`, şifreleme, R2 private hedef, saklama süresi ve restore provası | **Yerel restore geçti; production otomasyonu/off-site bekliyor** | Y04/Y06/Y10 | Custom dump, SHA-256 ve ayrı test DB restore sayımları geçti. Şifreli private R2 kopyası ve Hostinger ortamında tekrar bekliyor. Bkz. [[16-POSTGRESQL-YEDEK-VE-RESTORE-PROVASI]] |
| Y12 | Güvenlik | Firewall, SSH anahtarı, root politikası, TLS, proxy rate limit, upload limiti, MFA/VPN ve admin açılış kararı | Bekliyor | Y10 | Yalnız 80/443 gerekli; DB kapalı; secret sızıntısı yok; RBAC denetimi ve güvenlik başlıkları staging'de ölçülür |
| Y13 | CI kalite kapısı | lint, typecheck, build, release acceptance, performans ve public regresyon | **GitHub üzerinde tamamlandı - 14 Eylül 2026** | Y01/Y09 | Salt-okunur workflow; temiz test DB, repo sınırı, lint, typecheck, build, 432 rota, SEO/performance, medya ve admin RBAC denetimleri `ece1fd7` çalışmasında geçti |
| Y14 | CI/CD ve imaj kimliği | GitHub Actions, immutable tag/SHA, staging deploy ve geri dönüş | Bekliyor | Y10/Y13 | Hangi commit'in yayında olduğu bulunur; önceki imaj tek prosedürle döner |
| Y15 | Hostinger staging | Docker VPS şablonu, staging domaini, test DB/R2 prefix ve loglar | Bekliyor | Y00/Y14 | Canlı veriden ayrılmış staging URL HTTPS çalışır |
| Y16 | Staging veri kabulü | PostgreSQL import, medya URL'leri, TR/EN/RU ve rota matrisi | Bekliyor | Y05/Y07/Y15 | 432 kamu rota hedefi ve temsilî akışlar yeniden doğrulanır |
| Y17 | Staging gerçek cihaz/performance | iOS Safari, Android Chrome, desktop; Lighthouse ve medya yük sırası | Bekliyor | Y16 | Yatay taşma/kırık görsel/konsol hatası yok; bütçe dışı regresyon yok |
| Y18 | Production hazırlığı | Bakım penceresi, son SQLite snapshot, medya manifesti, DNS TTL ve sorumlular | Bekliyor | Y17 | Go/no-go toplantısı; önceki sürüm ve geri dönüş hedefi hazır |
| Y19 | Production deploy | Son DB/media aktarımı, production secrets, web/db/proxy başlangıcı | Bekliyor | Y18 | Healthcheck, migration ve smoke test temiz |
| Y20 | DNS ve HTTPS | Ana domain, `www`, `media`, redirect, sertifika ve HSTS | Bekliyor | Y19 | Tüm alan adları doğru hedefe gider; HTTPS zinciri temiz |
| Y21 | Canlı kabul | [[YAYIN-KABUL-VE-GERI-DONUS-KONTROL-LISTESI]] tamamı | Bekliyor | Y20 | TR/EN/RU, ürün/seri, PDF, Gallery, harita, robots/sitemap ve başlıklar temiz |
| Y22 | 72 saat stabilizasyon | Log, 4xx/5xx, DB, disk/RAM, R2, Lighthouse ve kullanıcı geri bildirimi | Bekliyor | Y21 | Kritik hata yok; rollback gerekmiyor; ilk operasyon raporu yazıldı |
| Y23 | Yayın sonrası içerik yönetimi | Admin 2.0 ürün/seri/Gallery/ülke/bölüm/işlem geçmişi + kullanıcı/RBAC | Yerel uygulama tamamlandı | Y04/Y06/Y12/Y15 | Canlı admin PostgreSQL, R2, MFA/VPN kararı ve staging güvenlik kabulünden sonra açılır |

## 4. PostgreSQL geçiş protokolü

### 4.1 Yerleşim

- PostgreSQL, Hostinger VPS üzerindeki `db` Docker servisidir.
- Uygulama `DATABASE_URL=postgresql://...@db:5432/...` mantığıyla Docker ağı üzerinden bağlanır.
- `5432` host portu public internete yayınlanmaz.
- Veri `/var/lib/postgresql/data` yoluna bağlı named volume içinde tutulur.
- Container güncellemek volume'u silmez; proje silme işleminde volume hedefi ayrıca korunur.

### 4.2 Göç sırası

1. Yazma işlemleri durdurulur ve güncel SQLite snapshot alınır.
2. Hash ve SQLite `integrity_check` yeniden doğrulanır.
3. `prisma/migrations-postgresql/20260907000000_init` migration'ı boş PostgreSQL veritabanında uygulanır.
4. Mevcut kategori, seri, ürün ve görsel kayıtları kontrollü script ile aktarılır.
5. Adetler, slug/SKU benzersizliği, ürün-seri ilişkileri ve görsel yolları karşılaştırılır.
6. Staging uygulaması yalnız PostgreSQL ile çalıştırılır.
7. Temsilî ürün, filtre, seri, SEO ve üç dil testleri tamamlanır.
8. Production göçü aynı script ve kayıtlı sürümle yeniden uygulanır.
9. SQLite kaynağı doğrulama süresi bitene kadar arşivde tutulur; uygulama artık ona yazmaz.

Yerel koruma: `npm run audit:database-schema`, SQLite bootstrap SQL'ini, 26 indeksi ve PostgreSQL şema eşliğini denetler. `npm run db:migrate:sqlite-to-postgres -- --include-admin-users` yalnız boş PostgreSQL hedefinde transaction, adet ve SHA-256 içerik karşılaştırması yapar; session/login-attempt taşımaz. Kanıt ve güvenlik sınırı: [[15-SQLITE-POSTGRESQL-GUVENLI-TASIMA]].

### 4.3 Yedek politikası

| Yedek | Sıklık | Saklama | Hedef |
|---|---|---:|---|
| PostgreSQL günlük | Her gece | 14 günlük | Şifreli R2 private prefix/bucket |
| PostgreSQL haftalık | Haftada bir | 8 haftalık | Şifreli R2 private prefix/bucket |
| Yayın öncesi snapshot | Her production release | En az 3 başarılı release | R2 private + release manifesti |
| Hostinger VPS yedeği | Sağlayıcı planına göre haftalık | Sağlayıcı politikasına göre | Hostinger |

En az bir geri yükleme provası yapılmadan “yedek var” kabul edilmez.

## 5. Cloudflare R2 ve CDN protokolü

### 5.1 Bucket ayrımı

Önerilen en az iki mantıksal alan:

- `norden-public-media`: ürünler, Gallery, videolar, PDF; yalnız okuma için özel domain.
- `norden-private-backups`: PostgreSQL yedekleri; hiçbir public domain veya anonim okuma yok.

Tek bucket kullanılırsa `public/` ve `private/` erişim sınırlarının yanlış yapılandırılma riski yükselir; iki bucket tercih edilir.

### 5.2 Adres standardı

```text
https://media.norden.com.tr/products/{series}/{slug}/{hash}.webp
https://media.norden.com.tr/gallery/{year}/{slug}/{hash}.mp4
https://media.norden.com.tr/catalog/{year}/{slug}.pdf
```

- Production'da `r2.dev` kullanılmaz.
- Dosya adı değişmeyen içerik değiştirilmez; yeni hashli key yüklenir. Böylece CDN cache yanlış eski dosyayı göstermez.
- Görseller WebP/AVIF, videolar web uyumlu MP4 ve gerektiğinde mobil türev, PDF gerçek katalog dosyasıdır.
- Admin/servis yalnız dar kapsamlı R2 API anahtarıyla yazabilir.

### 5.3 Mevcut kapasite fotoğrafı

1 Eylül 2026 yerel ölçümü:

| Alan | Dosya | Boyut |
|---|---:|---:|
| `public/products` | 272 | 25,08 MiB |
| `public/media` | 15 | 28,31 MiB |
| `public/catalog` | 1 | 17,23 MiB |
| `public/uploads` | 1 koruyucu `.gitkeep` | 0 MiB |
| `public/brand` | 3 | 0,01 MiB |
| **Toplam** | **292** | **70,63 MiB** |

Web-ready toplam R2 Standard ücretsiz 10 GB-ay depolama kotasının yaklaşık yüzde 0,7'sidir. `source-assets/` altındaki yaklaşık 4,23 GiB master/legacy arşiv public R2'ye yüklenmez; ayrı ve erişimi kapalı yedek politikasıyla korunur. Asıl izlenecek metrik depolamadan çok Class B okuma sayısıdır; doğru CDN cache R2 okuma sayısını azaltır.

Yerel klasör ve R2 key sözleşmesi: [[11-NORDEN-MEDYA-KLASOR-VE-R2-SOZLESMESI]].

## 6. İçerik ve kod değişikliği sözleşmesi

| Değişiklik | Veri/medya yayını | Docker kod yayını |
|---|---:|---:|
| Yeni ürün veya yeni ürün görseli | Evet | Hayır |
| Yeni seri veya seri sıralaması | Evet | Hayır |
| 7 seriyi 8 yapmak / bir seriyi gizlemek | Evet | Hayır |
| Gallery video/görseli | Evet | Hayır |
| İhracat ülkesi ve doğrulanmış koordinat | Evet | Hayır |
| Ana sayfa bölümünü aç/kapat/sırala | Evet | Hayır |
| Önceden geliştirilmiş layout varyantı | Evet | Hayır |
| Yeni CSS, yeni animasyon veya tamamen yeni layout | Hayır | Evet |
| Veri şeması değişikliği | Migration | Evet |

Admin ekranından ham CSS/JavaScript çalıştırılmaz. Görsel özgürlük, test edilmiş varyantlar ve tasarım tokenleri üzerinden sağlanır.

## 7. Maliyet fotoğrafı

### 7.1 Varsayımlar

- **Assumption:** Fiyat bölgesi Türkiye ve ödeme para birimi TL'dir. Yanlışsa Hostinger checkout fiyatı ve vergi hesabı seçilen ülkeye göre yeniden yapılır.
- **Assumption:** İlk satın alma 24 aylık kampanyalı dönemdir; Hostinger aylık gösterse de toplam bedel peşin alınır.
- **Assumption:** Mevcut kod varsayılanına dayanarak ana alan adı `norden.com.tr`, medya alan adı `media.norden.com.tr` kabul edilmiştir. Gerçek domain farklıysa DNS, CSP, Next Image ve URL planı o alan adına göre değiştirilir.
- **Assumption:** Alan adı mevcut olabilir veya ilk yıl kampanyaya dahil olabilir. Kesin TLD ve yenileme bedeli checkout sırasında kaydedilmeden maliyete `0 TL` yazılmaz.
- **Assumption:** R2 Standard kullanımı 10 GB-ay, 1 milyon Class A ve 10 milyon Class B aylık ücretsiz sınırlarında kalır.
- Tutarlar geliştirme emeğini değil, üçüncü taraf altyapı maliyetini gösterir.
- Kampanya, KDV/vergi ve döviz koşulları değişebilir; satın alma gününde yeniden doğrulanır.

### 7.2 Hostinger VPS fiyat anlık görüntüsü — 1 Eylül 2026

Resmi Türkiye fiyat sayfasına göre:

| Plan | Kaynak | Kampanyalı eşdeğer / ay | İlk 24 ay toplam | 24 aylık yenileme eşdeğeri / ay | Yenileme 24 ay toplam | Norden kararı |
|---|---|---:|---:|---:|---:|---|
| KVM 1 | 1 vCPU, 4 GB RAM, 50 GB NVMe | 276,99 TL | 6.647,76 TL | 552,99 TL | 13.271,76 TL | Ekonomi; düşük trafikte mümkün, build/runtime payı dar |
| **KVM 2** | **2 vCPU, 8 GB RAM, 100 GB NVMe** | **405,99 TL** | **9.743,76 TL** | **718,99 TL** | **17.255,76 TL** | **Önerilen başlangıç** |
| KVM 4 | 4 vCPU, 16 GB RAM, 200 GB NVMe | 552,99 TL | 13.271,76 TL | 1.381,99 TL | 33.167,76 TL | Başlangıçta gereksiz; gerçek ölçümle yükseltilir |

Kaynak: [Hostinger Türkiye VPS fiyatları](https://www.hostinger.com/tr/vps-hosting)

Neden KVM 2: Next.js çalışma zamanı, PostgreSQL, reverse proxy, image optimization, staging/backup işleri ve büyüme payı için KVM 1'e göre daha güvenli; KVM 4 ise gerçek production ölçümü olmadan gereksiz maliyet.

### 7.3 Diğer servisler

| Kalem | Başlangıç maliyeti | Ücretsiz sınır / not | Aşım veya değişken maliyet |
|---|---:|---|---|
| PostgreSQL | 0 TL | Açık kaynak; aynı VPS'de | Ek lisans yok, VPS kaynağı kullanır |
| Docker / Compose | 0 TL | Hostinger Ubuntu 24.04 Docker şablonunda mevcut | Ek lisans yok |
| GitHub Free private repo | 0 USD | Private repo; 2.000 Actions dakika/ay | Kota aşımı veya ücretli plan isteğe bağlı |
| Cloudflare Free DNS/CDN | 0 USD | DNS, temel CDN, Universal SSL | Pro/Business yalnız ihtiyaç doğarsa |
| Cloudflare R2 Standard | 0 USD | 10 GB-ay, 1M Class A, 10M Class B, egress ücretsiz | Depolama 0,015 USD/GB-ay; A 4,50 USD/milyon; B 0,36 USD/milyon |
| Let's Encrypt / proxy TLS | 0 TL | Otomatik yenileme | Sertifika ücreti yok |
| PostgreSQL günlük yedek | 0 USD hedef | R2 ücretsiz kota içinde, şifreli | Kota aşarsa R2 kullanım bedeli |
| Alan adı | Belirsiz | Mevcut veya bazı VPS kampanyalarında ilk yıl dahil olabilir | TLD yenileme fiyatı satın alma gününde yazılacak |
| Kurumsal e-posta | Bu fazda 0 | Mevcut e-posta/WhatsApp akışı | Ayrı posta kutusu alınırsa sağlayıcı fiyatı |

Resmi kaynaklar:

- [PostgreSQL lisansı](https://www.postgresql.org/about/licence/)
- [GitHub planları](https://github.com/pricing)
- [Cloudflare planları](https://www.cloudflare.com/plans/)
- [Cloudflare R2 fiyatları](https://developers.cloudflare.com/r2/pricing/)
- [Cloudflare R2 public bucket ve özel domain](https://developers.cloudflare.com/r2/buckets/public-buckets/)
- [Cloudflare bütçe uyarıları](https://developers.cloudflare.com/billing/manage/budget-alerts/)
- [Hostinger Docker VPS şablonu](https://www.hostinger.com/support/8306612-how-to-use-the-docker-vps-template-at-hostinger/)

### 7.4 Önerilen ilk dönem toplamı

| Senaryo | 24 aylık altyapı toplamı | Açıklama |
|---|---:|---|
| Ekonomi — KVM 1 | 6.647,76 TL + değişkenler | Düşük trafik, staging aynı anda sürekli açık değil, kaynak takibi sıkı |
| **Önerilen — KVM 2** | **9.743,76 TL + değişkenler** | Next.js + PostgreSQL + Docker + operasyon payı |
| Büyüme — KVM 4 | 13.271,76 TL + değişkenler | Yalnız ölçüm KVM 2'nin yetmediğini gösterirse |

`Değişkenler`: KDV/vergi, alan adı yenileme, R2 ücretsiz kota aşımı ve isteğe bağlı ücretli servisler. R2, GitHub, PostgreSQL, Docker, temel Cloudflare CDN ve TLS ücretsiz sınırlar içinde `0` kabul edilmiştir.

### 7.5 Maliyet kontrol kuralları

1. Satın alma ekranında kampanyalı toplam, yenileme toplamı, vergi ve otomatik yenileme tarihi ekran görüntüsü/kayıt olarak saklanır.
2. Cloudflare R2 için düşük eşikli USD budget alert açılır.
3. Budget alert harcamayı durdurmaz; yalnız e-posta bildirimi verir. Bu nedenle günlük usage ekranı da takip edilir.
4. KVM 4'e tahminle geçilmez; CPU, RAM, swap, disk ve response time kanıtıyla yükseltilir.
5. Ücretli Cloudflare Pro, video streaming, izleme veya e-posta servisi ihtiyaç kanıtı olmadan alınmaz.
6. Her maliyet değişikliği bu dosyada tarihli yeni anlık görüntü olarak eklenir; eski rakam sessizce değiştirilmez.

## 8. Hesap ve yetki sorumlulukları

| İş | Kullanıcı | Codex / teknik çalışma |
|---|---|---|
| Hostinger VPS satın alma ve ödeme | Sahibi/onaylayan | Plan karşılaştırma ve satın alma ekranı kontrolü |
| GitHub hesabı ve 2FA | Sahibi | Repo, branch, Actions ve deploy yapılandırması |
| Cloudflare hesap/checkout ve 2FA | Sahibi | Zone, R2, API token, custom domain ve cache yapılandırması |
| Domain sahipliği / nameserver onayı | Sahibi | DNS kayıtlarının hazırlanması ve doğrulanması |
| Secret değerleri | Güvenli arayüze kullanıcı girer | Değerleri konuşmaya/dosyaya yazmadan isim ve kullanım doğrulaması |
| Uygulama/Docker/PostgreSQL/R2 kodu | Onay | Uygulama, test, veri göçü ve teknik belge |
| Canlıya geçiş kararı | Son onay kullanıcıda | Go/no-go kanıt paketi ve geri dönüş hazırlığı |

Şifre, kart bilgisi, 2FA kodu, API secret veya production DB parolası Obsidian'a ve Git'e yazılmaz.

## 9. Risk kaydı

| Risk | Etki | Önlem / kabul kapısı |
|---|---|---|
| Geçersiz mevcut `.git` | Release kimliği ve geri dönüş yok | Y01 tamamlanmadan CI/CD başlamaz |
| SQLite→PostgreSQL veri kaybı | Yanlış/eksik katalog | Snapshot, göç provası, adet/ilişki/hash doğrulaması |
| PostgreSQL volume yanlışlıkla silinir | Canlı veri kaybı | Named volume, destructive komut kontrolü, günlük off-site backup |
| R2 public/private sınırı hatalı | Yedek veya özel dosya sızıntısı | Public medya ve private backup ayrı bucket |
| R2 ücretsiz kota aşılır | Beklenmeyen fatura | CDN cache, hashli asset, günlük kullanım ve budget alert |
| Admin erken internete açılır | Yetkisiz veri değişimi | Güvenlik kabulü olmadan admin proxy route kapalı |
| DNS geçişi hatalı | Site erişilemez | Düşük TTL, staging doğrulaması, önceki DNS kaydı yedeği |
| Migration eski imajla uyumsuz | Rollback başarısız | Geriye uyumlu migration veya ayrı DB restore planı |
| Video trafiği büyür | R2 read/performans artışı | Cache ölçümü; gerekirse daha sonra streaming servisi |
| KVM 1 kaynak yetersizliği | Build/runtime çökmesi | KVM 2 başlangıç önerisi; health/resource ölçümü |

## 10. Canlıya geçiş günü sırası

1. İçerik değişikliği dondurulur; sorumlular çevrimiçi olur.
2. Son SQLite ve mevcut medya snapshot'ı alınır; hash/bütünlük kontrol edilir.
3. Production PostgreSQL migration uygulanır ve veri aktarılır.
4. R2 medya manifesti ve örnek dosya hashleri doğrulanır.
5. Immutable Docker release etiketi staging'de son kez test edilir.
6. Production secrets yüklenir; web, db ve proxy servisleri başlatılır.
7. Geçici VPS/production adresinde smoke test yapılır.
8. DNS ana alan adı ve `media` alan adı yönlendirilir.
9. HTTPS, redirect, HSTS/CSP Report-Only ve cache başlıkları ölçülür.
10. [[YAYIN-KABUL-VE-GERI-DONUS-KONTROL-LISTESI]] uygulanır.
11. Kritik hata varsa geri dönüş prosedürü tetiklenir; yoksa yayın işareti verilir.
12. İlk 72 saat log, hata, kaynak ve R2 kullanımı izlenir.

## 11. Kullanıcıdan uygulama başlamadan önce gerekecekler

- [ ] Hostinger satın alma ülkesi/para birimi ve tercih edilen ödeme dönemi.
- [ ] KVM 2 varsayılan seçiminin onayı veya farklı plan kararı.
- [ ] Kullanılacak ana alan adı ve domain hesabına erişim.
- [ ] GitHub hesabı; private repo sahipliği ve 2FA.
- [ ] Cloudflare hesabı; R2 checkout onayı ve 2FA.
- [ ] Production iletişim e-postası ve teknik bildirim alıcısı.
- [ ] Gerçek ihracat ülkelerinin onaylı listesi.
- [ ] Canlı yayın için uygun gün/saat ve geri dönüş kararını verecek kişi.

## 12. Son karar özeti

- Varsayılan VPS: **Hostinger KVM 2**.
- Veritabanı: **aynı VPS'de PostgreSQL**, public port olmadan, named volume ile.
- Medya: **Cloudflare R2 Standard**, `media.norden.com.tr`, public medya ile private yedek ayrılmış.
- Kaynak ve deploy: **GitHub Free private repo + Actions + immutable Docker release**.
- SSL/CDN: **Cloudflare Free + reverse proxy + otomatik TLS**.
- Tahmini ilk 24 ay altyapı: **9.743,76 TL + vergi/domain/kota aşımı gibi değişkenler**.
- Admin 2.0: yerel içerik modülleri, korunan Ana Yönetici, sınırlı kullanıcı/RBAC, DB oturumu ve kalıcı rate-limit tamamlandı; production açılışı PostgreSQL, R2, reverse proxy, MFA/VPN kararı ve staging kabulüne bağlı.
- Nihai production onayı: yalnız canlı [[YAYIN-KABUL-VE-GERI-DONUS-KONTROL-LISTESI]] tamamlanınca.

## 13. Yayın öncesi yerel kaynak ve veri güvenliği - 1 Eylül 2026

| Alan | Durum | Kanıt / sınır |
|---|---|---|
| Git deposu | Tamamlandı | `main`, private GitHub remote, yeşil Quality Gate ve `v0.1.0` geri dönüş etiketi doğrulandı |
| Repo sınırı | Temiz | `.env`, SQLite DB, `source-assets`, release snapshot, `.next`, `node_modules`, üretilmiş Prisma client ve gerçek admin upload dosyaları Git dışında |
| Dosya güvenlik denetimi | Temiz | 440 izlenen dosya, yaklaşık 75,9 MB; 50 MB üstü dosya ve yüksek güvenli secret imzası yok |
| Ortam sözleşmesi | Tamamlandı | Development ve production örnekleri yalnız değişken adları/placeholder içeriyor; production secret değerleri repoya girmiyor |
| Katalog snapshot'ı | Tamamlandı | Sadece public içerik: 1 kategori, 7 seri, 131 ürün, 272 ürün görseli, 9 Gallery kaydı, 48 pazar, 7 bölüm |
| Güvenlik verisi ayrımı | Tamamlandı | Admin kullanıcı, parola özeti, izin, session, login-attempt ve audit-log snapshot'a alınmıyor |
| Temiz DB provası | Tamamlandı | Güvenli snapshot yeni SQLite DB'ye yüklendi ve bütün sayımlar birebir doğrulandı; admin kullanıcı sayısı 0 |
| Eski seed riski | Kapatıldı | Kataloğu silip üç örnek ürüne düşüren eski seed kaldırıldı; dolu kataloğun üstüne yazmak varsayılan olarak reddediliyor |
| Kod kalite kapısı | Temiz | Repo güvenlik denetimi, ESLint ve TypeScript kontrolü geçti; çalışan `/tr` rotası HTTP 200 |
| PostgreSQL/Docker provası | Tamamlandı - 14 Eylül | Docker Desktop/WSL2, Linux build, PostgreSQL 17, Compose, Nginx, kalıcılık ve tam SQLite→PostgreSQL taşıması geçti |

Bu bölüm 1 Eylül başlangıç fotoğrafıdır. 14 Eylül itibarıyla Y01, Y04, Y05, Y09, yerel Y10 ve Y13 tamamlandı; sıradaki dış bağımlılıklar gerçek R2 hesabı ile Hostinger staging sunucusudur.

## 14. Docker öncesi yerel kapanış kapısı - 3 Eylül 2026

Y04 PostgreSQL ve Y09 Docker çalışması başlamadan önce [[08-SINEMATIK-WEB-ADMIN-VE-MEDYA-ANA-PLANI]] içindeki DÖ-01—06 uygulanır. Güncel bağımlılık sırası:

| Öncelik | Kapı | Durum | Sonraki adıma etkisi |
|---:|---|---|---|
| 1 | Son tasarım/içerik kabulü | Bekliyor | Kullanıcının son ekran revizyonları kapanmadan immutable release tabanı alınmaz |
| 2 | Git kimliği ve private remote | Bekliyor | İlk commit/tag olmadan CI/CD ve güvenli rollback kimliği kurulamaz |
| 3 | Görsel kullanım caydırıcılığı | Yerel katman tamamlandı | Kamu sayfalarında sürükleme, bağlam menüsü ve iOS uzun basma caydırıcılığı uygulanır; admin paneli etkilenmez. Gerçek hotlink politikası Cloudflare/R2 aşamasında |
| 4 | Kod ve medya optimizasyon ölçümü | Production rota bütçesi temiz; ayrıntılı tur planlandı | Altı rota JS ve cache bütçesi mevcut build'de temiz; standalone imajdan önce tekrar sabitlenir, staging'de Lighthouse/CWV ölçülür |
| 5 | Robots/sitemap/SEO kabulü | Yerel otomatik kabul temiz | 12 sayfa, 5 video, PDF, robots ve 432 URL sitemap temiz; production `SITE_URL`, crawl kuralları ve 3 dil kapsamı Docker env ile yeniden eşleştirilir |
| 6 | Güvenlik ve bilinen açık taraması | Yerel kapı temiz; staging bekliyor | Next.js 16.3.4 ve Prisma 7.10.0 dahil güncel ağda tam/production `npm audit` 0 açık; kaynak/auth/upload/RBAC/başlık denetimleri temiz. Proxy/TLS/CSP/rate-limit ve dış tarama Y15 staging'de |

Teknik sınır: Görseli kullanıcı tarayıcısında göstermek, görsel baytlarının o tarayıcıya teslim edilmesini gerektirir. Bu nedenle “indirilemez” vaat edilmeyecek; hotlink engeli, türev/filigran, sürükleme ve bağlam menüsü caydırıcılığı birlikte uygulanıp asıl yüksek çözünürlüklü kaynaklar public katman dışında tutulacaktır. Güvenlikte de mutlak sıfır açık garantisi verilmeyecek; kapsamı kayıtlı kontrollerde sıfır bilinen kritik/yüksek bulgu release şartıdır.
