Skip to main content
Geri
Diğer dilde de mevcut: 🇬🇧 English

AI ile 20 Saatte Komple Mail Sunucusu Geliştirdim — İşte Gerçekte Olan

📋

Özet

  • Meydan Okuma: Tek bir günde Mailcow alternatifi, tam fonksiyonel, modern bir mail sunucusu inşa etmek.
  • Teknoloji Yığını: Vue 3, NestJS, Vite, Go (TUI), Docker, Postfix, Dovecot.
  • Sonuç: Sıfırdan üretime hazır monorepo’ya 20 saatte geçiş.
  • Kahraman: Sıkı bir kural: “Eğer E2E testleri geçmezse, ilerlemeyiz. Özellik tamamlanmamış sayılır.”
  • ROI (Yatırım Getirisi): 400 saatlik geleneksel geliştirme süreci 20 saate indi (~%95 tasarruf).

Bu belge teknik bir rapor değil; modern yazılım geliştirme klişeleri, Docker ağları ve “gereksiz karmaşıklık” ile boğuşan bir insan ve bir yapay zekanın (GitHub Copilot) hikayesidir.

Bu hikayenin gizli kahramanı katı bir kuraldı: “Eğer E2E testleri geçmezse, özellik yok demektir.” Bu, mevcut görev tamamen doğrulanana kadar asla bir sonraki göreve geçmediğimiz anlamına geliyordu.

1. Vizyon: “Mailcow ama Modern”

Gün sabah 08:00’de başladı. Kahve elde, terminal açık.

Hedef iddialı ama “netti”: Mailcow veya Mailu’ya modern bir alternatif olarak hizmet veren tam fonksiyonel bir mail sunucusu inşa etmek. Şöyle olmalıydı:

  • Modern: Vue 3, NestJS, Vite.
  • Basit: Gereksiz kuyruklar (queue) yok, ağır Java bileşenleri yok.
  • Dağıtılabilir: Kurulum için tek bir binary, çalıştırmak için tek bir docker-compose.

Temeli Postfix ve Dovecot konfigürasyonlarıyla (configs/main.cf) atarak başladım. Sonra, ilk pivot gerçekleşti. Yapay zeka, yükleyici (installer) için devasa bir Node.js mimarisi önerdi. Reddettim. Sonuç: TUI (Terminal Arayüzü) tabanlı bir yükleyici için Go diline pivot ettik. Saat 10:00’a gelindiğinde, Linux ARM64 üzerinde çalışan pürüzsüz bir kurulum betiğimiz vardı.

2. Protokol: Yapay Zeka ile Nasıl Konuşulur?

Bu projenin bu kadar hızlı başlamasını sağlayan şey sadece kodlama hızı değil, kurduğumuz sıkı iletişim protokolüydü. Kodu sadece “istemedik”; onunla “pazarlık ettik”.

3. Kodlama Maratonu: Çekirdeği İnşa Etmek

10:00 ile 14:00 arasında “akışa” (zone) girdik.

Yönetim Paneli (NestJS + Vue3)

Backend ve frontend’i eş zamanlı inşa ettik. Yapay zeka NestJS’teki DTO’ları ve Controller’ları üretirken, ben Vue Bileşenlerini rafine ettim.

Webmail İstemcisi (Vite + Vue3)

Bu daha zorluydu. Masaüstü uygulaması gibi hissettiren bir arayüze ihtiyacımız vardı. Hız için Vite kullandık.

”Basitleştirme” (Redis’in Kaldırılması)

Akşama doğru, docker-compose logları akarken davetsiz bir misafir gördüm: redis_1.

Ben: “Redis nereden çıktı? Postgres’imiz var. Belleğimiz (Memory) var. Basit tut. Sök at onu.”

Refactor Döngüsü:

  1. Redis’i Docker Compose’dan sil.
  2. Redis modülünü NestJS’ten sök.
  3. Sonuç: Sistem hala çalışıyor. Karmaşıklık azaldı.

4. Güvenlik Ağı: Birim Testleri

E2E savaşına dalmadan önce, pazarlık edilemez bir temel oluşturduk: %100 Birim Test Kapsamı.

E2E testleri kullanıcının mutlu olmasını sağlarken, Birim Testleri geliştiricinin geceleri rahat uyumasını sağladı.

Temel Başarılar:

  • Servis İzolasyonu: Her servis (IMAP, SMTP, Auth) izole bir şekilde mock’landı ve test edildi.
  • Uç Durumlar (Edge Cases): Ya IMAP bağlantısı koparsa? Ya disk dolarsa? Bu “imkansız” senaryolar için testler yazdık.
  • Sıkı Ayrıştırma (Parsing): parseIntin tehlikeli olduğunu gördük, bu yüzden her şeyi birim testlerle doğrulanmış daha sıkı sayı ayrıştırıcılarına (number parsers) refactor ettik.

Kapsama raporu sadece bir metrik değildi; bizim “Bitti” tanımımızdı.

5. Gerçek Savaş: E2E Testleri

Bu, 20 saatlik maratonun en kritik kısmıydı (14:00 - 22:00). Burada hiçbir şeyi mock’lamadık. Gerçek Docker konteynerleri, gerçek Postfix, gerçek veritabanları.

Bölüm A: Yönetim Paneli & Giriş Kontrol Listesi

Yönetim Paneli testleri bizim için asıl sınav yeriydi. Kimlik Doğrulama gibi kritik özellikler için sıkı bir kontrol listesi tanımladık.

Test DurumuAçıklamaDurum
TC-LOGIN-010Boş email ile gönder - hata göster
TC-LOGIN-011Boş şifre ile gönder - hata göster
TC-LOGIN-012Geçersiz email formatı (@ eksik)
TC-LOGIN-020Geçersiz bilgilerle giriş - hata göster
TC-LOGIN-021Başarılı giriş dashboard’a yönlendirir
TC-LOGIN-030Dashboard’a oturum açmadan erişim -> yönlendir

Bölüm B: Webmail & Oluşturma (Compose) Kontrol Listesi

Webmail ağ izolasyonu yüzünden daha zordu (Docker ağları acımasızdır). Ama bir kez bağlandığında, her kullanıcı etkileşimini doğruladık.

Test DurumuAçıklamaDurum
TC-COMPOSE-010’Kime’ (To) girişi görünürlüğü
TC-COMPOSE-015Editör görünürlüğü
TC-COMPOSE-021Kalın (Bold) butonu görünürlüğü
TC-COMPOSE-026Dosya ekle butonu görünürlüğü
TC-COMPOSE-030Gönder butonu görünürlüğü
TC-COMPOSE-040Alıcı olmadan gönder -> Hata Göster
TC-COMPOSE-045İptal geri yönlendirir
TC-COMPOSE-050Dosya girişi varlık kontrolü

Bölüm C: E2E Tarafından Bulunan “Gizli” Hatalar

Testler sadece kodu doğrulamadı; insanların gözden kaçırdığı hataları buldu.

  1. Vue Render Çökmesi: Kenar çubuğunu (sidebar) açıp kapatmak için özel bir test, folders.findın bir Dizi (Array) yerine bir Obje (Object) üzerinde çağrılması nedeniyle oluşan bir çöküşü ortaya çıkardı.
  2. Eksik Gönderilenler Klasörü: Bir E2E testi, bir e-posta gönderdikten sonra “Gönderilenler” klasörünü kontrol etti. Başarısız oldu. SMTP üzerinden gönderdiğimizi ama mesajı asla IMAP’e kaydetmediğimizi fark ettik! Uygulama hemen eklendi.

Toplam E2E Testi: 484 Senaryo (Hepsi Geçti)

6. Kalite Kontrol: SonarQube Kapısı

Saat geçti (22:00). Sistem çalışıyordu. Testler geçiyordu. Ama “Üretime Hazır” mıydık? Yerelde SonarQube’u kaldırdık ve bir tarama yaptık.

Soğuk Duş:

  • 71 Kod Kokusu (Code Smells)
  • %21 Kapsama (gözden kaçırdığımız belirli bir modülde)
  • Güvenlik Sıcak Noktası: ID üretimi için Math.random() kullanılmış.

Temizlik (22:00 - 02:00): SonarQube hatalarına derleme hatası muamelesi yaptık.

  • Sıkı Tipler: Her anyi düzgün bir DTO ile değiştirdik.
  • Modern JS: Eski concatları spread operatörleriyle değiştirdik, parseInti Number.parseInt yaptık.
  • Güvenlik: Math.random()ı kaldırdık ve kripto-güvenli ID üretimi uyguladık.
  • Birim Testleri: E2E sırasında keşfettiğimiz appendToSent metodu için eksik olan 3 birim testini yazdık.

Sonuç: Kapsama: %100.0 | Hatalar: 0 | Kod Kokuları: 0 | Güvenlik Sıcak Noktaları: 0

7. Final: “Tek Komutla” Dağıtım

Ertesi günün şafağı (02:00 - 04:00).

Yapbozun son parçası birleşmeydi. O an, servisler ayrı silolarda çalışıyordu. Her şeyi tek bir docker-compose.yml içinde birleştirdik.

  • Problem: Frontend yeni ağda Backend ile konuşamıyordu.
    • Çözüm: Dahili Docker DNS takma adlarını (aliases) yapılandırdık.
  • Problem: Tohum (seed) betiğindeki Admin kullanıcı karması (hash) geçersizdi.
    • Çözüm: bcrypt karmalarını yeniden oluşturduk.

Final İstatistikleri: Tam bir mail sunucusu yığınını başarıyla teslim ettik.

  • Toplam Kod: ~18,000 Satır Kod (Frontend + Backend + Altyapı)
  • Dil Dağılımı: %68 TypeScript, %21 Vue, %3 Go, %8 Shell/Config
  • Test Kapsamı: 484 E2E Senaryosu, Çekirdek Modüllerde %100 Birim Test Kapsamı
  • Çıktı: Dağıtıma hazır, Dockerize edilmiş, kendi kendine yeten bir mail sunucusu.

8. ROI: Geleneksel vs. Yapay Zeka Destekli Geliştirme

Bu bölüm harcanan gerçek eforu (Yapay zeka ile 20 saat), geleneksel geliştirmenin gerçekçi bir tahminiyle karşılaştırır.

Ne İnşa Edildi (Envanter)

BileşenDetaylar
Go TUI Yükleyici450 SATIR, Tek-binary, gömülü web varlıkları
Yönetim Paneli (Vue3)9 Görünüm, NestJS API (8 modül), JWT auth
Webmail İstemcisi (Vue3)7 Görünüm, NestJS API (IMAP/SMTP proxy), ekler
Docker Altyapısı6 servis, 4 Dockerfile, 3 ayrı E2E stack
Postfix/Dovecot KonfigürasyonuTLS, SASL, Sanal alan adları, PostgreSQL backend
E2E Testler (Playwright)484 test senaryosu, Docker-in-Docker çalıştırma
Birim Testler (Jest)%100 çekirdek kapsama, 8,184 satır test kodu

Geleneksel Geliştirme Tahmini (Yapay Zeka Olmadan)

56 saat

Faz 1: Araştırma ve Öğrenme

GörevSüre
Postfix mimarisini öğrenme16 saat
Dovecot öğrenme12 saat
IMAP protokolünü öğrenme8 saat
SMTP protokolünü öğrenme6 saat
Docker ağ araştırması8 saat
Playwright E2E araştırması6 saat
184 saat

Faz 2: Uygulama

GörevSüre
Postfix/Dovecot konfigürasyonu24 saat
Go TUI yükleyici16 saat
Yönetim Paneli backend40 saat
Yönetim Paneli frontend32 saat
Webmail backend32 saat
Webmail frontend28 saat
Docker Compose birleştirme12 saat
140 saat

Faz 3: Test

GörevSüre
E2E altyapı kurulumu16 saat
287 Admin E2E testi yazma48 saat
197 Webmail E2E testi yazma36 saat
Kararsız testleri düzeltme16 saat
Birim test kapsamı24 saat
20 saat

Faz 4: Kalite ve Cilalama

GörevSüre
SonarQube entegrasyonu + düzeltmeler12 saat
Dokümantasyon8 saat

Karşılaştırma

MetrikGelenekselYapay Zeka DestekliTasarruf
Araştırma56 saat~2 saat%96
Uygulama184 saat~12 saat%93
Test140 saat~4 saat%97
Kalite20 saat~2 saat%90
Toplam400 saat20 saat%95

400 saat (Geleneksel) vs. 20 saat (Yapay Zeka Destekli). Bu, 50 iş günü (2,5 ay) ile tek bir gün arasındaki farktır.

Neden Bu Kadar Büyük Bir Fark?

  1. Anlık Alan Bilgisi: Yapay zeka Postfix, Dovecot ve IMAP RFC’lerini biliyordu. Kılavuzları okumak zorunda kalmadım.
  2. Şablon Kodların Ortadan Kalkması: NestJS/Vue kodunun %80’i yapısaldır. Yapay zeka saniyeler içinde üretti.
  3. Test Üretimi: 484 E2E testini manuel yazmak haftalar alırdı. Yapay zeka dakikalar içinde üretti.
  4. Hata Ayıklama Hızlanması: Playwright testleri başarısız olduğunda, Yapay zeka Docker ağ sorunlarını anında biliyordu.
  5. Bağlam Değiştirme Yok: Yapay zeka tüm kod tabanını hatırladı. “O dosya neredeydi?” diye sormak yok.
🏁

Sonuç

Bir fikirle başladık. Yapay zeka ile sıkı bir protokol kurduk. Çekirdeği inşa ettik, Birim Testlerle kapladık, E2E testlerle stres uyguladık ve SonarQube ile cilaladık.

24 saatten kısa sürede sadece kod yazmadık. Bir ürün mühendisliği yaptık.

“Yeşil değilse, bitmemiştir.”

Share this article

Suggested hashtags (click to copy):