Express.js için çok kiracılı (multi‑tenant) yapılandırma örneği

Korkut

Yeni Üye
Katılım
Eyl 2026
Konular
1
Mesajlar
1
Tepki puanı
0
Görüntülenme
0

1. Hazırlık​

  • Node.js (≥12) ve npm kurulu.
  • express, dotenv, cors paketleri eklenmiş.
Bash:
npm init -y
npm install express dotenv cors

2. Proje Dizinleri​

Kod:
- app.js
- tenants/
    ├─ tenantA.json
    └─ tenantB.json
- routes/
    └─ index.js

tenants/* dosyalarında her kiracının ayarları (veritabanı bağlantısı, API key, vb.) saklanır.

3. Ortam Değişkenleri​

.env içinde:

Kod:
PORT=3000
DEFAULT_TENANT=tenantA

4. Tenant Middleware​

app.js içinde tenant belirleyici middleware oluşturulur:

JavaScript:
const fs = require('fs');
const path = require('path');

app.use((req, res, next) => {
  const subdomain = req.headers.host.split('.')[0]; // example: tenantA.domain.com
  const tenantFile = path.join(__dirname, 'tenants', `${subdomain}.json`);
  if (fs.existsSync(tenantFile)) {
    req.tenantConfig = JSON.parse(fs.readFileSync(tenantFile));
  } else {
    req.tenantConfig = JSON.parse(fs.readFileSync(path.join(__dirname, 'tenants', process.env.DEFAULT_TENANT + '.json')));
  }
  next();
});

Bu, her istek geldiğinde ilgili kiracının konfigürasyonunu alır.

5. Route’lar​

routes/index.js içinde kiraca özgü rotalar tanımlanır ve tenant veri bağlamı kullanılır:

JavaScript:
const express = require('express');
const router = express.Router();

router.get('/data', (req, res) => {
  // tenantConfig içinde veritabanı adı vb. var
  res.json({ tenant: req.tenantConfig.name, message: 'Veri çekildi.' });
});

module.exports = router;

app.js’e ekle:

JavaScript:
const router = require('./routes');
app.use('/', router);

6. Her Kiracının Veritabanı​

  • Ayrı veritabanı isimleri: tenantA_db, tenantB_db.
  • Bağlantı sırasında req.tenantConfig.dbName kullanılabilir.

7. Yayınlama​

node app.js komutu ile başlat.
  • Test için http://tenantA.localhost:3000/data ve http://tenantB.localhost:3000/data.

Sık Karşılaşılan Takılma Noktaları​

SorunÇözüm
CORS hatasıcors() middleware’i ekleyin, origin ayarın.
Ortam değişkeni yok.env dosyası oluşturulmuş mu kontrol edin.
Tenant dosyası bulunamadıDefault tenant ayarı (DEFAULT_TENANT) tanımlanmalı.

Soru: Çok kiracılı yapı içinde oturum yönetimini tenant bazlı hâle getirirken hangi yöntemi tercih edersiniz? (örn. JWT ile tenant id eklemek, session)
 
Geri
En Üst