Mimari
Yüksek seviye
flowchart LR
U[Tarayıcı] --> N[nginx / Vite dev sunucusu]
N -->|/api/*| B[Express API]
B --> M[(MongoDB)]
B --> S[(MinIO)]
B --> P[SMTP]
B -.opsiyonel.-> SE[Sentry]
Backend katmanları
backend/src altında beş katman ve iki altyapı dizini vardır:
| Katman | Sorumluluk |
|---|---|
routers/ |
Yol ve HTTP metodu tanımı, middleware zinciri |
controllers/ |
HTTP giriş/çıkışı, istek gövdesinin normalize edilmesi |
services/ |
İş kuralı, doğrulama, veritabanı ve dış servis çağrıları |
models/ |
Koleksiyon adları, izin verilen değerler, belge tipleri |
middlewares/ |
Kimlik doğrulama, rol denetimi, istek kimliği, hata yönetimi |
utils/ |
Yanıt biçimi, JWT, ortam değişkenleri, denetim kaydı |
db/ |
MongoDB bağlantısının tek sahibi |
Bağımlılık yönü tek yönlüdür: routers → controllers → services → models/db.
models/ katmanı Express'i bilmez (içinde Request/Response tipi geçmez).
Uygulama başlatma sırası
backend/src/server.ts:
import './instrument'— Sentry (varsa) en erken noktada yüklenir.connectToDatabase()— başarısız olursa HTTP sunucusu hiç başlamaz.ensurePlatformLogIndexes()— indeksler istek başına değil, bir kez.startReminderMailScheduler()— arka plan hatırlatıcı zamanlayıcısı.createApp()+app.listen(env.port, '0.0.0.0').
0.0.0.0 zorunludur: container içinde yalnızca 127.0.0.1 dinlenirse
yayınlanan port üzerinden gelen istekler ulaşamaz.
Kapatma (graceful shutdown)
SIGINT / SIGTERM / uncaughtException → zamanlayıcı durdurulur, HTTP
sunucusu kapatılır, MongoDB bağlantısı kapatılır, process.exit(0).
unhandledRejection yalnızca loglanır, süreci kapatmaz.
Router bağlama sırası
backend/src/app.ts içinde router'lar şu sırayla bağlanır ve aynı router'lar
ikinci kez /api/v1 öneki ile de bağlanır:
health → auth → platform → api-doc → nodered → docs
Sonra Sentry.setupExpressErrorHandler(app), ardından notFoundHandler ve
errorHandler gelir. Sentry katmanı yalnızca raporlar; yanıtı üretmez.