Ana içeriğe geç
Kategoriye Dön

Node.js Uygulaması Deploy Etme: PM2 ve Nginx

Node.js uygulamasını VPS'e deploy etme rehberi. nvm ile Node.js kurulumu, PM2 process manager, Nginx reverse proxy, SSL sertifikası ve environment variables yönetimi.

Okuma süresi: 15 dk Web Hosting / Uygulama
nodejspm2nginxdeployvpsjavascriptreverse proxyssl

İçindekiler

Node.js Uygulaması Deploy Etme: PM2 ve Nginx Rehberi

Node.js uygulamalarını üretim ortamına deploy etmek, doğru araçlar ve yapılandırma ile oldukça sistematik bir süreçtir. Bu rehberde nvm ile Node.js kurulumundan PM2 process manager kullanımına, Nginx reverse proxy yapılandırmasından SSL sertifikası kurulumuna kadar tüm adımları ele alacağız.

Node.js Kurulumu (nvm ile)

nvm (Node Version Manager), birden fazla Node.js sürümünü yönetmenizi sağlar ve üretim ortamları için önerilir.

hljs bash
# nvm kurulum scriptini indir ve çalıştır
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# Shell'i yeniden yükle
source ~/.bashrc

# nvm sürümünü kontrol et
nvm --version

# En son LTS sürümünü kur
nvm install --lts

# Belirli bir sürüm kur
nvm install 20.11.0

# Varsayılan sürümü ayarla
nvm use --lts
nvm alias default node

# Node.js ve npm sürümlerini kontrol et
node --version
npm --version

Üretim ortamında her zaman LTS (Long Term Support) sürümünü kullanın. LTS sürümleri daha uzun süre güvenlik güncellemesi alır.

Uygulamayı Sunucuya Aktarma

Git ile Klonlama

hljs bash
# Uygulama dizini oluştur
sudo mkdir -p /var/www/myapp
sudo chown $USER:$USER /var/www/myapp

# Repoyu klonla
cd /var/www
git clone https://github.com/kullanici/myapp.git
cd myapp

# Bağımlılıkları kur (üretim için)
npm install --production

# veya tüm bağımlılıkları kur
npm install

Environment Variables (.env)

hljs bash
# .env dosyası oluştur
nano /var/www/myapp/.env
hljs env
NODE_ENV=production
PORT=3000
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
JWT_SECRET=gizli-anahtar-buraya
REDIS_URL=redis://localhost:6379
hljs bash
# .env dosyasını güvenli hale getir
chmod 600 /var/www/myapp/.env

.env dosyasını asla Git reposuna eklemeyin. .gitignore dosyanıza .env satırını ekleyin.

PM2 Process Manager

PM2, Node.js uygulamalarını üretim ortamında yönetmek için en popüler araçtır. Otomatik yeniden başlatma, log yönetimi ve cluster modu gibi özellikler sunar.

PM2 Kurulumu

hljs bash
# PM2'yi global olarak kur
npm install -g pm2

# PM2 sürümünü kontrol et
pm2 --version

Uygulamayı PM2 ile Başlatma

hljs bash
# Basit başlatma
pm2 start app.js --name myapp

# Belirli bir port ile
pm2 start app.js --name myapp -- --port 3000

# npm start komutu ile
pm2 start npm --name myapp -- start

# Cluster modu (CPU çekirdek sayısı kadar instance)
pm2 start app.js --name myapp -i max

# Belirli sayıda instance
pm2 start app.js --name myapp -i 4

PM2 Ecosystem Dosyası

Daha gelişmiş yapılandırma için ecosystem.config.js dosyası kullanın:

hljs bash
nano /var/www/myapp/ecosystem.config.js
hljs javascript
module.exports = {
  apps: [
    {
      name: 'myapp',
      script: './app.js',
      instances: 'max',
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'development',
        PORT: 3000
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 3000
      },
      error_file: '/var/log/pm2/myapp-error.log',
      out_file: '/var/log/pm2/myapp-out.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss',
      max_memory_restart: '500M',
      watch: false,
      autorestart: true
    }
  ]
};
hljs bash
# Ecosystem dosyası ile başlat
pm2 start ecosystem.config.js --env production

# PM2 temel komutlar
pm2 list              # Çalışan uygulamaları listele
pm2 status            # Durum özeti
pm2 logs myapp        # Logları görüntüle
pm2 logs myapp --lines 100  # Son 100 satır log
pm2 restart myapp     # Yeniden başlat
pm2 reload myapp      # Sıfır downtime ile yeniden yükle
pm2 stop myapp        # Durdur
pm2 delete myapp      # Sil
pm2 monit             # Gerçek zamanlı izleme

PM2 Sistem Başlangıcında Otomatik Başlatma

hljs bash
# Startup script oluştur
pm2 startup

# Çıktıdaki komutu çalıştır (örnek):
sudo env PATH=$PATH:/home/user/.nvm/versions/node/v20.11.0/bin pm2 startup systemd -u user --hp /home/user

# Mevcut PM2 listesini kaydet
pm2 save

Nginx Reverse Proxy Yapılandırması

Nginx, Node.js uygulamanızın önünde reverse proxy olarak çalışarak SSL sonlandırma, statik dosya sunumu ve yük dengeleme sağlar.

hljs bash
# Nginx kur
sudo apt update
sudo apt install nginx -y

# Yapılandırma dosyası oluştur
sudo nano /etc/nginx/sites-available/myapp
hljs nginx
server {
    listen 80;
    server_name example.com www.example.com;

    # Statik dosyalar için (opsiyonel)
    location /static/ {
        alias /var/www/myapp/public/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 86400;
    }
}
hljs bash
# Siteyi etkinleştir
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

# Yapılandırmayı test et
sudo nginx -t

# Nginx'i yeniden yükle
sudo systemctl reload nginx

SSL Sertifikası (Let's Encrypt)

hljs bash
# Certbot kur
sudo apt install certbot python3-certbot-nginx -y

# SSL sertifikası al
sudo certbot --nginx -d example.com -d www.example.com

# Otomatik yenilemeyi test et
sudo certbot renew --dry-run

Certbot, Nginx yapılandırmanızı otomatik olarak HTTPS için günceller:

hljs nginx
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

Deployment Workflow

Güncellemeleri deploy etmek için basit bir workflow:

hljs bash
# Yeni kodu çek
cd /var/www/myapp
git pull origin main

# Bağımlılıkları güncelle
npm install --production

# Veritabanı migration (varsa)
npm run migrate

# PM2 ile sıfır downtime yeniden başlatma
pm2 reload myapp

# Logları kontrol et
pm2 logs myapp --lines 50

REXE sunucularında Path Panel üzerinden 3000 portunu kapatabilirsiniz. Nginx 80/443 portlarından trafiği yönlendireceği için Node.js uygulamanızın portuna dışarıdan erişim gerekmez.

Firewall Ayarları

hljs bash
# ufw ile gerekli portları aç
sudo ufw allow 22/tcp    # SSH
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS
sudo ufw enable

# Node.js portunu dışarıya kapatın (Nginx üzerinden erişilecek)
# sudo ufw deny 3000/tcp

Sonuç

Node.js uygulamanız artık PM2 ile yönetilen, Nginx reverse proxy arkasında çalışan ve SSL ile güvenli hale getirilmiş bir üretim ortamında çalışıyor. PM2'nin cluster modu ile CPU çekirdeklerini tam verimlilikle kullanabilir, pm2 reload komutu ile sıfır downtime güncellemeler yapabilirsiniz.