EduPlatform; .NET 8 ve Node.js tabanlı mikroservislerin React frontend ile haberleştiği, NGINX arkasında çalışan kapsamlı bir eğitim yönetim sistemidir. Tüm mimariyi tek bir komutla ayağa kaldırabilirsiniz.
Bilgisayarınızda Docker Desktop'ın kurulu ve çalışır durumda olması gerekmektedir.
Ana dizinde (docker-compose.yml dosyasının bulunduğu klasör) bir terminal açın ve aşağıdaki komutu çalıştırın:
docker compose up --build -d
Tüm konteynerlerin (AuthService, CourseService, PlatformService, Client, Postgres, MongoDB, Nginx) "Started" ve "Healthy" durumuna gelmesini bekleyin.
🌐 Erişim Bilgileri
Sistem ayağa kalktıktan sonra aşağıdaki adreslerden projenin arayüzlerine ulaşabilirsiniz:
Arayüz (Frontend): http://localhost (Doğrudan tarayıcıdan giriş yapabilirsiniz)
Gateway API (PlatformService): http://localhost/api (Tüm trafik NGINX üzerinden buraya akar)
📚 API Dökümantasyonu (Swagger)
Geliştirme ortamında API uç noktalarını incelemek ve test etmek için:
Auth Service (.NET) Swagger: http://localhost:5002/swagger
Course Service (Node.js) Swagger: http://localhost:5001/api-docs
🧪 Testlerin Çalıştırılması
Mikroservislerin birim testlerini (Unit Tests) çalıştırmak için terminalde ilgili klasörlere giderek şu komutları kullanabilirsiniz:
AuthService (.NET) Testleri: ```bash
cd services/AuthService.Tests
dotnet test
CourseService (Node.js) Testleri: ```bash
cd services/CourseService
npm run test
---
### 📄 Dosya 2: Teknik Mimari Raporu
```markdown
# EduPlatform - Eğitim Yönetim Platformu
## Algoritma Açıklamaları ve Teknik Mimari Raporu
**Geliştirici:** Mehmet Yeşil
### 1. Mimari Kararlar ve Altyapı
Proje gereksinimlerini incelerken klasik monolitik bir yapı yerine doğrudan **Mikroservis mimarisi** kurmaya karar verdim. Bütün sistemi tek bir `docker-compose.yml` ile ayağa kalkacak şekilde izole ettim.
* **NGINX ve Gateway:** Dış dünyaya sadece NGINX'i (Port 80) açtım. NGINX gelen `/api` isteklerini YARP tabanlı Gateway'e (.NET PlatformService), geri kalan trafiği ise React arayüzüne paslıyor.
* **Veritabanı İzolasyonu:** PostgreSQL ve MongoDB'yi tamamen Docker iç ağına (bridge network) gömdüm. Dışarıdan erişimleri yok, veri kalıcılığını ise Docker Volumes ile sağladım.
* **Güvenlik:** API dökümantasyonlarını (Swagger), Canlı (Production) ortamda bilgi sızıntısını önlemek amacıyla kilitlenecek şekilde tasarladım. Swagger sadece Development modunda dışarıya yanıt veriyor.
### 2. Servis Dağılımı ve Görevleri
Sistemi tasarlarken iş yüklerine göre teknoloji seçimi yaptım:
* **AuthService (.NET 8 & PostgreSQL):** Kullanıcı rolleri ve kimlik yönetimi gibi ilişkisel bütünlük ve katı kurallar gerektiren veriler için Entity Framework Core ve PostgreSQL ikilisini kullandım.
* **CourseService (Node.js & MongoDB):** Daha esnek bir veri yapısı gerektiren kurs içerikleri ve asenkron I/O (video işlemleri vb.) yükü fazla olan süreçler için Node.js ve MongoDB (Mongoose) mantıklı bir seçimdi.
* **PlatformService (API Gateway):** İstemci ile backend arasındaki CORS problemlerini tek merkezden çözmek ve trafiği mikroservislere şeffaf bir şekilde dağıtmak için konumlandırdım.
### 3. Kritik İş Akışları ve Algoritmalar
* **Durumsuz (Stateless) Kimlik Doğrulama:** Sunucuda session tutmuyorum. Kullanıcı giriş yaptığında AuthService; Rol, Ad Soyad ve ID bilgilerini içeren bir JWT üretiyor. CourseService tarafında ise her istekte C# servisine ağ isteği atmak yerine, paylaşılan `JWT_SECRET` ile token'ı validate ederek aradaki ağ trafiğini ve gecikmeyi (latency) ortadan kaldırdım.
* **Denormalizasyon (N+1 Problemi Çözümü):** Kurs listeleme ekranlarında "Eğitmen kimdi?" diye sürekli C# servisine ek sorgular atmamak için MongoDB tarafında veriyi denormalize ettim. Eğitmen kurs yüklerken, eğitmen adı doğrudan JWT içinden okunup kurs dökümanına kalıcı olarak yazılıyor.
* **Güvenli Video Yükleme ve İzleme (Stream):**
* *Yükleme:* Sunucu RAM'ini şişirmemek adına büyük video dosyalarını Multer ile doğrudan diske yazdırıyorum. İsim çakışmalarını UUID ile maskeliyorum ve yükleme sırasında Frontend'e "yüzde (%)" bilgisi dönüyorum.
* *İzleme:* Videoları public (herkese açık) klasörlerde tutmak yerine özel bir endpoint üzerinden stream ediyorum. Backend ilk olarak "Bu öğrenci kursu satın almış mı?" kontrolünü yapıyor, yetki varsa stream başlıyor.
* *Fiziksel Temizlik:* Bir kurs silindiğinde sadece DB kaydını değil, sunucu diskindeki fiziksel `.mp4` dosyasını da uçurarak diskin şişmesini engelliyorum.
### 4. Frontend (İstemci) ve Ekstra Geliştirmeler
* **React & Modern UI:** Arayüzde hızlı build süreleri için Vite, tasarımlar için Tailwind CSS v4 kullandım.
* **Korumalı Rotalar:** Token kontrolü yapılmadan kullanıcıların öğretmen paneline erişmesini React Router tarafında engelledim.
* **Responsive Tasarım:** Uygulamayı (özellikle kurs kartları ve menü yapısını) mobil ve masaüstü cihazlarda sorunsuz çalışacak şekilde esnek (flex/grid) tasarladım.
* **Birim Testleri:** Sistemin en kırılgan noktaları olan doğrulama katmanlarını test altına aldım. AuthService DTO kuralları için **xUnit**, CourseService yetki middleware'leri için **Jest** ile güvenlik kalkanlarını test ettim.
* **Dosya Sistemine Loglama:** C# tarafında **Serilog**, Node.js tarafında **Winston** kullanarak oluşan hataların ve trafik bilgisinin konsol haricinde fiziksel `.log` dosyalarına da yazılmasını kurguladım.