# Kerege Mail: işletim, test ve güvenlik planı

Son gözden geçirme: 8 Ekim 2026. Bu belge, `mail.kerege.net` için uygulanan mimariyi, kanıtlanan sonuçları, bekleyen işleri ve baştan sona sınama sırasını tanımlar. [2000 ayrı olası siber güvenlik testi](./SECURITY_TEST_PLAN.md) bu planın ayrıntılı vaka kataloğudur. Katalogdaki her satır **planlandı** durumundadır; çalıştırılmadığı halde başarılı sayılmaz.

## 1. Kapsam ve mimari

- Alınan posta: `kerege.net` MX → Cloudflare Email Routing → `kerege-mail` Email Worker → R2 ham `.eml` → D1 indeks → Kerege Mail arayüzü.
- Gönderilen posta: Kerege Mail → Postmark Email API → alıcı. Postmark kabulü, alıcının gelen kutusuna kesin teslim edildiği anlamına gelmez; bounce ve alıcı testi ayrıca kontrol edilir.
- Web uygulaması: Cloudflare Worker, `https://mail.kerege.net`, HTTPS, HTTP-only oturum çerezi, e-posta ile tek kullanımlık kod.
- Giriş kodu adresi: `oo25101981@gmail.com`. Gmail yalnızca giriş kodu için kullanılır; `info@` ve `hello@` gelen postaları Gmail'e yönlendirilmez.
- Adresler: `info@kerege.net` ve `hello@kerege.net`. `mailtest@` geçici test kuralı kaldırılmıştır.
- Dosyalar: en çok 10 dosya, toplam en çok 25 MiB. Her tür R2'de özel tutulur; alıcıya 90 gün geçerli imzalı indirme bağlantısı gider. Bu, dosyanın e-posta MIME eki olduğu anlamına gelmez. Postmark tek e-postayı 10 MB ile sınırlar ve bazı uzantıları reddeder.
- Günlükler: giriş kodu, oturum, ileti açma/okuma, gönderim, taslak, indirme ve tanılama olayları D1'de tutulur. Geçmiş olaylar geriye dönük oluşturulmaz; kod, oturum belirteci, posta gövdesi ve dosya içeriği loglanmaz.
- Güvenlik vaka sonuçları: `security_test_results` tablosunda test kimliği, geçti/kaldı/engellendi sonucu, ortam, kanıt notu ve zaman tutulur. Sonuç kaydı Günlükler'e de olay olarak eklenir.

## 2. Aşama kapıları

Her aşama için **hazırlık → uygulama → olumlu test → olumsuz test → kanıt → geri dönüş** sırası izlenir. Kanıt olarak tarih, ortam, test kimliği, beklenen/gerçek sonuç, HTTP veya sağlayıcı durum kodu ve ilgili günlük kimliği kaydedilir. Üretim testleri gerçek alıcılara gereksiz ileti göndermeyecek şekilde küçük örneklerle yapılır.

| No | Aşama | Kabul ölçütü | Bilinen durum |
|---:|---|---|---|
| 01 | Alan adı sahipliği | Cloudflare bölgesi etkin ve DNS sorgulanabilir | Cloudflare DNS gözlendi |
| 02 | MX | MX Cloudflare yönlendirme sunucularına işaret eder | Yerel canlı DNS testi geçti |
| 03 | DKIM | Postmark seçicisinin TXT kaydı geçerli | Postmark doğruladı; canlı sorgu geçti |
| 04 | Return-Path | CNAME `pm.mtasv.net` hedefini gösterir | Postmark doğruladı; canlı sorgu geçti |
| 05 | DMARC | `_dmarc` TXT politikası ve rapor adresi seçilir | Kayıt bulunmadı; bekliyor |
| 06 | Email Routing | `info@` ve `hello@` Worker'a gider | Kurallar listesinde doğrulandı |
| 07 | Gmail yönlendirmesini kaldırma | İki adreste forward kuralı kalmaz | Doğrulandı |
| 08 | D1 | Tablolar, indeksler ve migration geçmişi mevcut | Uygulandı; canlı sorgu testi yerelde geçti |
| 09 | R2 | Özel bucket yazma, okuma, silme | Yerelde geçti; üretim tanılama bekliyor |
| 10 | Web alan adı | `mail.kerege.net` HTTPS 200 | Üretimde doğrulandı |
| 11 | Giriş kodu | Kod Gmail hedefine gelir; başka hedefe gitmez | Canlı istek kabul edildi; kullanıcı ekranı açtı |
| 12 | Oturum | Geçerli kod oturum açar; yanlış/eskimiş kod açmaz | Geçerli akış gözlendi; kapsamlı kötü durum testleri bekliyor |
| 13 | Gelen ileti | `info@` ve `hello@` postaları D1/R2'de görünür | İki gerçek iletide doğrulandı |
| 14 | Giden ileti | Postmark kabulü ve alıcı teslimi ayrı izlenir | Önceki doğrudan API testi başarılı; yeni arayüzde canlı tekrar bekliyor |
| 15 | Dosya paylaşımı | 25 MiB kabul, 25 MiB + 1 bayt ret | Yerelde doğrulandı; üretim testi bekliyor |
| 16 | İmzalı bağlantı | Doğru imza indirir, bozuk imza 403 | Yerelde doğrulandı; üretim testi bekliyor |
| 17 | Günlükler | Olay, sonuç, zaman, kaynak/IP görülebilir | Yeni gelen ileti olayı üretim D1'de doğrulandı; diğer olayların üretim kabul testi bekliyor |
| 18 | 2000 test kataloğu | 2000 benzersiz kimlik, filtreleme ve vaka bazlı sonuç | Katalog üretildi; üretimde vaka sonucu kaydedilmedi |
| 19 | Eski posta aktarımı | MBOX sayıları ve ekleri karşılaştırılır | Gmail Takeout dosyası bekleniyor |
| 20 | Anahtar rotasyonu | Görünmüş Postmark anahtarı iptal, yenisi Worker secret | Bekliyor |
| 21 | Yedekleme | D1 ve R2 geri yükleme tatbikatı | Bekliyor |
| 22 | Olay müdahalesi | Geri dönüş süresi ve ileti kaybı ölçülür | Bekliyor |

## 3. Kurulumdan üretime test sırası

1. DNS kayıtlarının mevcut anlık çıktısını sakla: MX, DKIM, Return-Path, DMARC, webmail CNAME/Worker custom domain. TTL ve farklı resolver sonuçlarını karşılaştır.
2. Cloudflare Email Routing kural listesini al. Yalnız `info@` ve `hello@` için Worker eylemi, catch-all için drop beklendiğini doğrula.
3. D1 migration listesini ve tablo şemasını kontrol et. Migration öncesi otomatik Cloudflare yedeğinin oluştuğunu kaydet.
4. R2 bucket erişimini küçük geçici nesneyle yaz/oku/sil. Private bucket için doğrudan anonim URL'nin çalışmadığını doğrula.
5. Worker dağıtım sürümünü ve `mail.kerege.net` HTTPS yanıtını kaydet. CSP, `nosniff`, `no-store`, `X-Frame-Options`, `Referrer-Policy` başlıklarını incele.
6. Giriş kodunu istenen Gmail adresine gönder. Kodu, API tokenını veya oturum çerezini kanıt dosyasına yazma. Yanlış kod, süre aşımı, tekrar kullanım, deneme ve hız sınırlarını ayrı test et.
7. `info@` ve `hello@` için birer gerçek gelen ileti gönder. Gönderici/alıcı/konu/zaman/gövde/ek ve raw `.eml` eşleşmesini kontrol et. Aynı Message-ID tekrarında tek kayıt oluşmasını doğrula.
8. Normal metin e-postası gönder; Postmark MessageID kaydını, gönderilenler görünümünü, alıcı gelen kutusunu ve bounce durumunu karşılaştır.
9. Bütün dosya türleri için PDF, Office, arşiv, görsel, metin, çalıştırılabilir dosya ve uzantısız örnek kullan. 1 bayt, 7 MiB, 10 MiB, 24 MiB, 25 MiB ve 25 MiB + 1 bayt sınırlarını test et.
10. İmzalı bağlantının oturumsuz, başka tarayıcıdan ve geçerli süre içinde indirildiğini; bozuk imza, değişmiş nesne kimliği, süresi dolmuş bağlantı ve yanlış HTTP yöntemiyle reddedildiğini doğrula.
11. Gelen/giden/okundu/taslak/çöp/yıldız/arama/sayfalama akışlarını masaüstü ve mobil görünümde çalıştır. Her eylemin D1 durumu ve Günlükler satırıyla eşleşmesini kontrol et.
12. Sunucu Testleri ekranında tanılamayı çalıştır. Başarısız bir alt test varsa sebebi ve zamanını kaydet; DNS sorunlarında TTL yayılımını dikkate al.
13. [2000 test kataloğunu](./SECURITY_TEST_PLAN.md) kritik → yüksek öncelik sırasıyla izole ortamda çalıştır. Her vakaya test kanıtı ve sonuç ekle. Yeniden testten sonra ancak başarılıya çevir.
14. D1, R2 ve Worker sürümünü yedekle; ayrı test ortamına geri yükleyip ileti sayısı ve SHA-256 örneklerini karşılaştır.
15. Postmark veya Cloudflare kesintisini canlandır; arayüz hata metnini, tekrar denemede çift gönderim riskini, alarm ve geri dönüş süresini ölç.

## 4. Sınır durumları ve olası sonuçlar

| Olay | Beklenen davranış | Kontrol |
|---|---|---|
| Tarayıcı isteği ağda kopar | Belirsiz teslim durumu açıkça gösterilir; kullanıcı Gönderilenler'i kontrol eder | D1 durum ve Postmark MessageID |
| Postmark isteği 10 MB'ı aşar | Dosya Postmark'a ek olarak gitmez; bağlantı metni küçük kalır | `POSTMARK_API_TEST`, 25 MiB yerel test |
| Postmark uzantıyı yasaklar | Dosya indirme bağlantısıyla paylaşılır | `.exe` yerel test |
| Dosya tam 25 MiB | Kabul edilir | 26.214.400 bayt yerel test |
| Dosya 25 MiB + 1 bayt | 400 ile reddedilir | Yerel test |
| İmza bozulur | 403 | Yerel test |
| Alıcı bağlantıyı başkasına iletir | Bağlantıya sahip kişi süresi içinde indirebilir | Paylaşım modeli; günlük ve süre izlenir |
| R2 nesnesi bulunamaz | 404, günlükte araştırılır | Silinmiş nesne testi |
| D1 yazımı başarısız | İşlem başarısız görünür; tutarsız nesne taranır | Hata enjeksiyonu |
| Oturum süresi dolar | 401 ve yeni giriş | Süre aşımı testi |
| Kod gönderimi hız sınırına takılır | 429 | Dakika/saat sınırı testi |
| Postmark kabul eder ama alıcı bounce olur | Arayüzde mevcut `sent` yalnız kabulü gösterir | Bounce webhook entegrasyonu bekliyor |
| 25 MiB gelen raw ileti | Cloudflare sınırında reddedilebilir | 24/25/25+ MiB alım testi |
| MBOX eski posta eksik | İçe aktarma tamamlandı denmez | Mesaj/ek sayısı ve hash karşılaştırması |

## 5. Günlük ve kanıt ilkeleri

- Günlükler olayın zamanını, türünü, sonucunu, aktörü, ileti/dosya kimliğini, özet ayrıntıyı, IP'yi ve User-Agent'ı tutar.
- D1'deki `activity_events` yeni uygulama sürümünden sonraki olayları kaydeder; önceki Postmark/Cloudflare işlemleri tarihsel günlük olarak uydurulmaz.
- Giriş kodu, API tokenı, `AUTH_SECRET`, oturum çerezi, imzalı indirme URL'si, e-posta gövdesi ve dosya içeriği günlükte yer almaz.
- Güvenlik testi sonucu için önerilen kanıt: test kimliği, zaman, ortam, istek özeti (sırları gizlenmiş), beklenen/gerçek HTTP kodu, D1/R2 yan etkisi ve günlük satırı.
- 2000 testin tamamı canlı ortamda aynı anda çalıştırılmaz. Hız sınırlama, depolama ve gerçek alıcılara teslim riskleri nedeniyle izole ortamda parti parti çalıştırılır.

## 6. İzleme, alarm ve olay müdahalesi

1. Her gün giriş hatası, 429, CSRF reddi, başarısız gönderim, R2/D1 hatası ve yeni bounce sayısını gözden geçir.
2. Ani artışta önce Worker ve Postmark durumunu, sonra DNS ve Cloudflare Email Routing olaylarını kontrol et.
3. Anahtar sızıntısında yeni Postmark Server API tokenı oluştur, Worker secret'ını güncelle, eski tokenı iptal et, gönderim ve giriş kodunu tekrar test et.
4. Yanlış yönlendirmede kuralları ve MX'i karşılaştır; kullanıcı onayı olmadan Gmail yönlendirmesini yeniden açma.
5. Veri bütünlüğü sorununda önce D1/R2 yedeği al, etkilenen MessageID ve R2 nesnesini eşleştir, sonra geri yükle.
6. Kesinti sonrası gelen ve giden örnek ileti, indirme bağlantısı, oturum ve Günlükler ekranını yeniden doğrula.

## 7. Geri dönüş ve açık işler

- Worker dağıtımında sorun çıkarsa önce önceki Worker sürümüne dön; D1 migrationları geriye dönük veri kaybı yaratmadan değerlendir. R2 ham iletileri silme.
- DMARC için önce `p=none` ve rapor adresiyle görünürlük kur; raporlara göre `quarantine`/`reject` kararını ayrıca ver.
- Postmark tokenı ekran görüntüsünde görünmüştü. Yeni token oluşturulup Worker secret güncellenince eski token iptal edilmeli.
- Eski Gmail postaları için Takeout `.mbox` dosyası alınmadan tarihsel posta bu panelde görünmez.
- Postmark bounce/delivery webhookları henüz bağlanmadı; `sent` etiketi API kabulünü gösterir. Nihai teslim izleme ayrı aşamadır.
- 90 gün sonra paylaşım bağlantısı çalışmaz; gönderici arayüzünde saklanan dosya oturumla indirilebilir. Saklama süresi ve silme politikası ayrıca kararlaştırılmalıdır.
