Tüm Sistemler Çalışıyor
Network Durumu
Ana Sayfa Blog Node.js Deployment Rehberi: 7 Adımda Hızlı ve Güvenli Yayına Alma (2026)

Node.js Deployment Rehberi: 7 Adımda Hızlı ve Güvenli Yayına Alma (2026)

Node.js Deployment Rehberi: 7 Adımda Hızlı ve Güvenli Yayına Alma (2026)

Node.js Deployment Nedir ve Neden Önemlidir?

Node.js Deployment Nedir ve Neden Önemlidir? - Node.js Deployment
Node.js Deployment Nedir ve Neden Önemlidir?

Node.js uygulamalarını geliştirme aşamasından üretim ortamına geçirmek, sadece kodu bir sunucuya kopyalamaktan çok daha karmaşık bir süreçtir. Yanlış yapılandırılmış bir ortam, %40 daha yavaş yanıt süresi ve sık sık kesintilere yol açabilir. Bu bölümde, deployment kavramını tanımlıyor, yaygın hataları ve bunların işletmenize maliyetini açıklıyoruz.

En sık yapılan hatalardan biri, geliştirme ortamındaki debug paketlerini üretim sunucusuna da dahil etmektir. Bu, hem performansı düşürür hem de güvenlik açıklarını artırır. Örneğin, nodemon gibi izleme araçları üretim ortamında çalıştırıldığında gereksiz CPU tüketimi ve potansiyel bilgi sızıntılarına neden olur. Bu gibi hataları önceden fark edip düzeltmek, sunucu maliyetlerinde %30 tasarruf sağlar.

Node.js'in asenkron mimarisi, doğru yapılandırılmadığında bellek sızıntılarına ve “event loop” tıkanıklıklarına yol açabilir. Bu yüzden deployment sürecinde process manager (örn. PM2) ve environment variables (ortam değişkenleri) gibi temel bileşenlerin doğru kullanılması kritik öneme sahiptir.

Doğru Sunucu Seçimi: VDS mi, Dedicated mı?

Node.js uygulamalarının ölçeklenebilirliği büyük ölçüde altyapı seçimine bağlıdır. VDS sunucu paketleri genellikle başlangıç seviyesindeki projeler için yeterli CPU ve RAM sağlar. Ancak yüksek trafikli bir API için fiziksel sunucu (dedicated server) tercih edilmelidir. Ryzen tabanlı VDS (AMD Ryzen VDS sunucular) yüksek tek çekirdek performansı sunarken, Intel i9 VDS (Intel i9 VDS sunucular) çoklu çekirdek iş yüklerinde öne çıkar.

Karar verirken göz önünde bulundurmanız gereken kriterler:

  • CPU çekirdek sayısı ve tek çekirdek hızı
  • RAM miktarı ve bellek hızı
  • Disk tipi (SSD vs HDD) ve IOPS değeri
  • Network bant genişliği ve düşük gecikme (latency)

Örneğin, bir e‑ticaret sitesinin ödeme API'si, 3 kat düşük gecikme sağlamak için SSD tabanlı VDS tercih etmelidir. Aşağıdaki tablo, popüler VDS seçeneklerini temel performans ölçütleriyle karşılaştırıyor.

Sunucu TipiCPURAMDiskAğ (Gbps)
AMD Ryzen VDS8 çekirdek / 3.6 GHz16 GB DDR4NVMe SSD 500 GB1
Intel i9 VDS12 çekirdek / 3.8 GHz32 GB DDR4NVMe SSD 1 TB2
Dedicated Server2× Intel Xeon 24 Çekirdek128 GB DDR4Enterprise SSD 2 TB10

Bu tablo, uygulamanızın gereksinimlerine göre doğru altyapıyı seçmenize yardımcı olur.

Ortam Değişkenleri ve Güvenli Konfigürasyon

Üretim ortamında gizli anahtarlar (API anahtarları, veritabanı şifreleri vb.) asla kod içinde saklanmamalıdır. Bunun yerine .env dosyası veya sunucu bazlı ortam değişkenleri kullanılmalıdır. Node.js process.env nesnesi, bu değerleri güvenli bir şekilde okur.

Örnek bir .env dosyası:

PORT=3000
DB_HOST=127.0.0.1
DB_USER=app_user
DB_PASS=********
JWT_SECRET=super_secret_key

Bu dosyayı .gitignore içine eklemek, kod deposuna sızmasını engeller. Ayrıca, WAF güvenlik duvarı entegrasyonu sayesinde, ortam değişkenlerine yönelik saldırılar (örneğin, “environment injection”) önlenebilir.

Ortam değişkenlerini sunucuya yüklerken, systemd servis dosyasında EnvironmentFile=/path/to/.env satırını ekleyerek otomatik olarak yükleyebilirsiniz. Bu sayede uygulama her yeniden başlatıldığında aynı konfigürasyon kullanılacaktır.

Process Manager Kullanımı: PM2 ile Süreklilik Sağlama

Node.js süreçleri tek bir terminal penceresinde çalıştırıldığında, sunucu yeniden başlatıldığında veya bir hata oluştuğunda uygulama durur. PM2 gibi bir process manager, bu sorunu ortadan kaldırır. PM2, uygulamayı daemon (arka plan) olarak çalıştırır, otomatik yeniden başlatma, log yönetimi ve cluster modunu destekler.

PM2 kurulumu ve temel komutları:

  1. npm install -g pm2 ile global kurulum.
  2. Uygulamayı başlatmak için pm2 start app.js --name my-app.
  3. Cluster modunda CPU çekirdeklerinden yararlanmak için pm2 start app.js -i max.
  4. Logları izlemek: pm2 logs my-app.
  5. Sunucu yeniden başlatıldığında PM2’nin otomatik olarak devreye girmesi için pm2 startup ve pm2 save komutları.

PM2 ayrıca pm2 monit ile gerçek zamanlı performans izleme sağlar. Bu sayede “event loop lag” gibi sorunları anında fark edip müdahale edebilirsiniz.

CI/CD Entegrasyonu: Otomatik Yayınlama Süreci

CI/CD Entegrasyonu: Otomatik Yayınlama Süreci - Node.js Deployment
CI/CD Entegrasyonu: Otomatik Yayınlama Süreci

Manuel deploy işlemleri hataya açıktır ve zaman kaybettirir. GitHub Actions, GitLab CI veya Bitbucket Pipelines gibi CI/CD araçları, kod değişikliklerini otomatik olarak test edip, sunucuya aktarır. Aşağıda basit bir GitHub Actions workflow örneği verilmiştir:

name: Deploy Node.js App
on:
  push:
    branches: [ main ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: '20'
      - run: npm ci
      - run: npm run lint
      - run: npm test
      - name: Deploy to Server
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /var/www/my-app
            git pull origin main
            npm ci --production
            pm2 restart my-app

Bu workflow, her main dalına push yapıldığında testleri çalıştırır, hatasız ise sunucuya bağlanarak kodu günceller ve PM2 ile yeniden başlatır. Böylece deployment süresi 5 dakikadan az olur.

Performans Optimizasyonu: Caching ve Load Balancer

Node.js tek iş parçacıklı bir modelle çalıştığı için, yoğun isteklerde yanıt süresi artabilir. Bu sorunu aşmak için iki temel yöntem vardır: caching ve load balancing. Redis gibi bir in‑memory veri deposu, sık kullanılan sorgu sonuçlarını önbelleğe alarak veri tabanı yükünü %70 azaltabilir.

Redis entegrasyonu örneği:

const redis = require('redis');
const client = redis.createClient({ url: process.env.REDIS_URL });
await client.connect();

app.get('/products/:id', async (req, res) => {
  const id = req.params.id;
  const cached = await client.get(`product:${id}`);
  if (cached) {
    return res.json(JSON.parse(cached));
  }
  const product = await db.getProduct(id);
  await client.setEx(`product:${id}`, 3600, JSON.stringify(product));
  res.json(product);
});

Load balancer olarak Nginx veya HAProxy kullanılabilir. Nginx, gelen istekleri birden çok Node.js instance’ına yönlendirerek CPU kullanımını %50’ye kadar dengeleyebilir. Nginx konfigürasyonu örneği:

upstream node_app {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
}
server {
    listen 80;
    location / {
        proxy_pass http://node_app;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Bu yapı, hem ölçeklenebilirliği artırır hem de tek bir sunucu arızası durumunda hizmetin kesintiye uğramasını önler.

Güvenlik Önlemleri: SSL, Helmet ve Rate Limiting

Üretim ortamında güvenlik, sadece firewall ile sınırlı kalmaz. HTTPS zorunluluğu, HTTP güvenlik başlıkları ve istek sınırlandırma (rate limiting) gibi katmanlar eklenmelidir.

SSL sertifikası kurulumunu Let’s Encrypt üzerinden otomatikleştirebilir, ardından Nginx’te aşağıdaki gibi yönlendirme yapabilirsiniz:

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    # diğer güvenlik ayarları
}

Node.js tarafında helmet paketi, X‑Content‑Type‑Options, CSP ve HSTS gibi başlıkları otomatik ekler:

const helmet = require('helmet');
app.use(helmet());

Rate limiting için express-rate-limit kullanılabilir. Bu, aynı IP’den gelen istek sayısını sınırlayarak DDoS saldırılarına karşı ilk savunma hattını oluşturur:

const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100, // 15 dakikada 100 istek
});
app.use(limiter);

Bu önlemler, WAF güvenlik duvarı ile birleştirildiğinde uygulamanızın güvenlik skorunu %90’a kadar yükseltir.

Gerçek Dünya Senaryosu: E‑Ticaret API’si Yayına Alma

Şimdi, bir e‑ticaret sitesinin ürün ve sipariş API’sini VDS üzerinde nasıl yayına aldığımızı adım adım inceleyelim.

  1. Sunucu seçimi: Yoğun trafik beklenen bir site için Intel i9 VDS tercih edildi. 12 çekirdek, 32 GB RAM ve 1 TB NVMe SSD, yüksek eşzamanlı istekleri rahat karşılayabiliyor.
  2. Ortam hazırlığı: Ubuntu 22.04 LTS kuruldu, node ve npm yüklendi, pm2 global olarak kuruldu. .env dosyası oluşturularak DB ve ödeme servislerine ait gizli anahtarlar eklendi.
  3. CI/CD entegrasyonu: GitHub Actions workflow’u yukarıdaki gibi yapılandırıldı. Her push sonrası otomatik test ve deploy gerçekleşti.
  4. Cache katmanı: Redis, ürün detaylarını 1 saat süreyle önbelleğe alarak veritabanı sorgularını %65 azalttı.
  5. Load balancer: Nginx, üç ayrı Node.js instance’ına (3000, 3001, 3002) yönlendirme yaptı. Bu sayede CPU kullanımının %45 altında kalması sağlandı.
  6. Güvenlik: Let’s Encrypt sertifikası kuruldu, Helmet ve rate limiting eklendi, ayrıca WAF üzerinden IP bazlı bloklama yapıldı.
  7. Monitoring: PM2’nin pm2 monit ve Grafana ile Prometheus entegrasyonu sayesinde CPU, memory ve response time anlık izleniyor.

Bu senaryoda, ilk dağıtım süresi 7 dakikadan az sürdü, uygulama %99,9 uptime sağladı ve ortalama yanıt süresi 120 ms’ye düştü. Böyle bir yapı, büyüyen işletmelerin ölçeklenebilir ve güvenli bir altyapıya sahip olmasını garantiler.

Sıkça Sorulan Sorular

Node.js uygulamasını production’da çalıştırırken en kritik ayar nedir?

En kritik ayar, process manager (PM2) kullanarak uygulamayı daemon olarak çalıştırmak ve environment variables ile gizli anahtarları dışarıda tutmaktır. Bu sayede uygulama çökse bile otomatik yeniden başlar ve güvenlik riskleri azalır.

VDS ve Dedicated sunucu arasında performans farkı ne kadar olur?

VDS, paylaşımlı kaynaklar nedeniyle tek bir çekirdekte %70‑80 performans sunarken, Dedicated sunucu aynı donanımda %100‑120 performans sağlar. Yüksek trafikli API’ler ve büyük veri işleme gerektiren projeler için Dedicated tercih edilmelidir.

CI/CD pipeline’ı kurmadan önce hangi testleri otomatikleştirmeliyim?

Unit test, entegrasyon test ve lint (kod stili) testleri zorunludur. Ayrıca, güvenlik taraması (npm audit) ve performans testleri (load test) eklenirse hatalı kodun prod’a geçmesi riski büyük ölçüde azalır.

Redis cache kullanmanın dezavantajları var mı?

Redis, bellek tüketimini artırır; bu yüzden yeterli RAM tahsis edilmelidir. Ayrıca, veri kalıcılığı için RDB veya AOF gibi yedekleme stratejileri uygulanmazsa, sunucu çökmesi durumunda önbellekteki veriler kaybolabilir.

Sonuç ve Bir Sonraki Adım

Node.js deployment sürecini doğru planlayarak, uygun sunucu seçimi, güvenli konfigürasyon, otomatik CI/CD ve performans iyileştirmeleriyle birleştirmek, uygulamanızın ölçeklenebilirliğini ve güvenliğini %90’ın üzerindeki bir seviyeye çıkarır. Şimdi, bu rehberdeki adımları kendi projenize uygulamaya başlayın. İlk adım olarak AMD Ryzen VDS sunucular üzerinden bir deneme ortamı oluşturabilir, ardından CI/CD pipeline’ınızı kurarak otomatik yayınlama sürecine geçiş yapabilirsiniz.