Skip to content

mehmetyesildev/EduPlatform

Repository files navigation

EduPlatform - Çalıştırma Rehberi

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.

🛠️ Ön Gereksinimler

Bilgisayarınızda Docker Desktop'ın kurulu ve çalışır durumda olması gerekmektedir.

🏃‍♂️ Sistemi Başlatma

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.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages