~/grkn/posts $ cat nodejs-projesini-ubuntuya-deploy-etmek.md
Node.js Projesini Ubuntu'ya Deploy Etmek
- Ön Koşullar
- Nginx Kurulumu
- Node.js Kurulumu
- PM2 Kurulumu
- Projenizi Klonlayın veya Yükleyin
- Özel Vhost Config Oluşturma
- Process Manager Kurulumu
- DNS Ayarları
- Sonuç
Bir Node.js projesini Ubuntu sunucusuna nasıl deploy edersiniz? Hadi adım adım projenizi deploy edelim.
Projenizin tamamını Node.js ile yazdınız, ya da ana projeniz için Node.js tabanlı mikroservisleriniz var. Deploy edemiyorsanız bunlarla harika şeyler ortaya çıkaramazsınız. Ama merak etmeyin. Lütfen tarayıcınızdaki ChatGPT sekmesini kapatın. Ayrıca sistem yöneticisi ya da DevOps mühendisi olmanıza da gerek yok. Hadi adım adım projenizi deploy edelim.

Ön Koşullar
- Ubuntu 24.04
- Root erişimi
Nginx Kurulumu
Önce her şeyin güncel olduğundan emin olun.
apt-get update apt-get upgrade
Ardından Nginx kurulumuna başlayabiliriz.
apt install nginx
Tarayıcınızı açın ve adres çubuğuna sunucunuzun IP adresini girin: http://SUNUCU_IPNIZ.
“Welcome to nginx” sayfasını görüyorsanız her şey yolunda demektir.
Node.js Kurulumu
NVM’i (Node Version Manager) kurmamız gerekiyor. Terminalde şu komutu çalıştırın.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
NVM_DIR’i export edin ve bash profilinizi yeniden yükleyin.
export NVM_DIR="$HOME/.nvm" source .bashrc
Ardından bir Node.js sürümü seçin. Majör bir sürüm belirtebilirsiniz, o sürümün en güncel alt sürümünü kurar.
nvm install 20
Kurulumu doğrulayın.
node -v npm -v
Node.js ve npm sürümlerini yazdırması gerekir.
PM2 Kurulumu
PM2’yi (process manager) kurmak için şu komutu çalıştırın.
npm install pm2 -g
Ardından kurulumu şu komutla doğrulayın.
pm2 --version
Projenizi Klonlayın veya Yükleyin
Deploy sürecini test etmek için Express generator ile yeni bir Express.js projesi oluşturdum. Ama muhtemelen sizin zaten bir projeniz var. /var/www dizinine gidip proje dosyalarınız için bir dizin oluşturmalısınız.
Git reponuzu klonlayın ya da dosyalarınızı oluşturduğunuz dizinin altına yükleyin.
Proje bağımlılıklarını kurmak için şu komutu çalıştırın.
npm i
Projenizi tarayıcı üzerinden test edin. Belirtilen port altında çalışıyorsa, deploy adımlarına devam edebiliriz.
npm run start
Özel Vhost Config Oluşturma
sites-available dizini altında özel bir vhost config dosyası oluşturun. Ben projeme göre express-test olarak isimlendirdim.
touch /etc/nginx/sites-available/express-test
Ardından dosyayı nano veya sevdiğiniz bir editörle açıp aşağıdaki vhost config’i yapıştırın. Kendi projeniz ve domaininiz için server_name, root, access_log ve proxy_pass satırlarını değiştirmelisiniz.
server { listen 80; server_name express-test.hostname.tr; # DOMAININIZ root /var/www/express-test/public; # PROJE YOLUNUZ access_log /var/log/nginx/express-test.log; location / { proxy_pass http://localhost:3000; # KENDİ PORTUNUZLA DEĞİŞTİRİN 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; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location = /favicon.ico { log_not_found off; access_log off; return 204; } }
Ardından config’i Nginx’in okuyabilmesi için etkinleştirin.
cd /etc/nginx/sites-enabled ln -s ../sites-available/express-test
Nginx config’ini kontrol edin.
nginx -t
Hata yoksa Nginx config’ini yeniden yükleyebilirsiniz.
nginx -s reload
Process Manager Kurulumu
Her şey yolunda, ama terminali sonsuza kadar açık tutamayız. Süreci arka planda çalıştırmak için PM2 kullanacağız. Bu işi PM2 halledecek.
Başlatma komutunuzu çift tırnak arasına yazabilir, projeyi PM2’de hatırlamak için bir isim verebilirsiniz.
pm2 start "npm run start" --name ExpressTest
DNS Ayarları
Tek bir siteyi ya da birkaç siteyi çözümlemek için sunucuya Bind veya PowerDNS kurmaya gerek yok. Ben her zaman harici bir DNS sunucusu tercih ederim. Genelde bu amaçla Cloudflare kullanıyorum.
DNS’inizi sunucunuzun IP adresine yönlendirebilirsiniz.
134.122.66.17 A express-test.hostname.tr
Sonuç
Deploy adımlarını tamamladık. DNS değişikliklerinin çözümlenmesini beklemeniz gerekiyor. Ardından hazırsınız! Ayrıca, firewall’unuzda (iptables, csf, vb.) 3000 portunu sunucunuz ve local IP’niz dışında herkese kapatmanızı öneririm.