{"id":36144,"date":"2025-12-08T22:40:49","date_gmt":"2025-12-08T19:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36144"},"modified":"2025-12-08T22:40:49","modified_gmt":"2025-12-08T19:40:49","slug":"ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/","title":{"rendered":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Node.js, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler ve g\u00fc\u00e7l\u00fc bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Y\u00fcksek performansl\u0131, \u00f6l\u00e7eklenebilir ve ger\u00e7ek zamanl\u0131 uygulamalar olu\u015fturma yetene\u011fi sayesinde, bir\u00e7ok geli\u015ftiricinin ve \u015firketin tercih etti\u011fi bir teknolojidir. Ancak bir Node.js uygulamas\u0131n\u0131 geli\u015ftirme ortam\u0131ndan \u00fcretim ortam\u0131na ta\u015f\u0131mak, uygulaman\u0131n s\u00fcrekli, g\u00fcvenli ve verimli bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in belirli ad\u0131mlar\u0131 ve en iyi uygulamalar\u0131 gerektirir. Bu makale, Ubuntu 16.04 i\u015fletim sistemi \u00fczerinde bir Node.js uygulamas\u0131n\u0131 \u00fcretim ortam\u0131 i\u00e7in nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, yap\u0131land\u0131raca\u011f\u0131n\u0131z\u0131 ve g\u00fcvence alt\u0131na alaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klamaktad\u0131r.<\/p>\n<p>Ubuntu 16.04, uzun s\u00fcreli destek (LTS) sunan stabil bir i\u015fletim sistemi s\u00fcr\u00fcm\u00fc olsa da, daha yeni Ubuntu s\u00fcr\u00fcmleri (\u00f6rne\u011fin 20.04, 22.04) mevcut ve genellikle yeni kurulumlar i\u00e7in tercih edilir. Ancak, mevcut altyap\u0131lar veya belirli gereksinimler nedeniyle hala Ubuntu 16.04 kullanan sistemler olabilir. Bu rehber, bu \u00f6zel s\u00fcr\u00fcme odaklanarak, gerekli t\u00fcm ad\u0131mlar\u0131 detayland\u0131racakt\u0131r. Konumuz, Node.js uygulaman\u0131z\u0131 bir web sunucusu (Nginx), bir s\u00fcre\u00e7 y\u00f6neticisi (PM2) ve g\u00fcvenlik duvar\u0131 ayarlar\u0131yla nas\u0131l entegre edece\u011finizi kapsamaktad\u0131r.<\/p>\n<h2>\u00d6n Gereksinimler<\/h2>\n<p>Bu rehbere ba\u015flamadan \u00f6nce, a\u015fa\u011f\u0131daki \u00f6n gereksinimlere sahip oldu\u011funuzdan emin olun:<br \/>\n*   <strong>Ubuntu 16.04 Sunucusu:<\/strong> Temiz bir Ubuntu 16.04 sunucusu (VPS veya fiziksel sunucu).<br \/>\n*   <strong>SSH Eri\u015fimi:<\/strong> Sunucuya SSH \u00fczerinden eri\u015fim yetkisi olan bir kullan\u0131c\u0131 (root olmayan, <code>sudo<\/code> yetkisine sahip bir kullan\u0131c\u0131 \u00f6nerilir).<br \/>\n*   <strong>Temel Linux Bilgisi:<\/strong> Komut sat\u0131r\u0131 (CLI) kullan\u0131m\u0131 hakk\u0131nda temel bilgi.<br \/>\n*   <strong>Node.js Uygulamas\u0131:<\/strong> Sunucuya da\u011f\u0131t\u0131lmaya haz\u0131r, \u00e7al\u0131\u015fan bir Node.js uygulaman\u0131z olmal\u0131. Bu uygulama genellikle <code>app.js<\/code> veya <code>server.js<\/code> gibi bir ana dosya ile ba\u015flar ve belirli bir portta dinler (\u00f6rne\u011fin, 3000).<\/p>\n<h2>Ad\u0131m 1: Sunucuyu G\u00fcncelleme<\/h2>\n<p>Herhangi bir kuruluma ba\u015flamadan \u00f6nce, sunucunuzdaki paket listelerini g\u00fcncellemek ve mevcut paketleri en son s\u00fcr\u00fcmlerine y\u00fckseltmek iyi bir uygulamad\u0131r. Bu, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapatmaya ve uyumluluk sorunlar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur.<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<p><code>sudo apt update<\/code> komutu, yerel paket indeksini g\u00fcncellerken, <code>sudo apt upgrade -y<\/code> komutu ise kurulu t\u00fcm paketleri onay gerektirmeden y\u00fckseltir.<\/p>\n<h2>Ad\u0131m 2: Node.js ve npm Kurulumu<\/h2>\n<p>Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in Node.js \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131n\u0131n ve npm (Node Package Manager) paket y\u00f6neticisinin sunucuya kurulmas\u0131 gereklidir. Node.js&#8217;i kurman\u0131n birka\u00e7 yolu vard\u0131r, ancak \u00fcretim ortamlar\u0131 i\u00e7in Node Version Manager (NVM) kullan\u0131lmas\u0131, farkl\u0131 Node.js s\u00fcr\u00fcmleri aras\u0131nda kolayca ge\u00e7i\u015f yapman\u0131z\u0131 sa\u011flad\u0131\u011f\u0131 i\u00e7in genellikle en iyi y\u00f6ntemdir.<\/p>\n<h3>NVM (Node Version Manager) Kullanarak Kurulum (\u00d6nerilen)<\/h3>\n<p>NVM, ayn\u0131 sunucuda birden fazla Node.js s\u00fcr\u00fcm\u00fcn\u00fc y\u00f6netmenizi sa\u011flar. Bu, farkl\u0131 projeler i\u00e7in farkl\u0131 Node.js s\u00fcr\u00fcmlerine ihtiya\u00e7 duydu\u011funuzda veya Node.js&#8217;in yeni bir s\u00fcr\u00fcm\u00fcn\u00fc test etmek istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>\u00d6ncelikle NVM kurulum beti\u011fini indirin ve \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">curl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash<\/code><\/pre>\n<p><strong>Not:<\/strong> <code>v0.39.1<\/code> yerine NVM&#8217;nin en son kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc kontrol edip kullanman\u0131z \u00f6nerilir. NVM GitHub sayfas\u0131ndan g\u00fcncel s\u00fcr\u00fcm\u00fc bulabilirsiniz.<\/p>\n<p>Kurulum beti\u011fi tamamland\u0131ktan sonra, NVM&#8217;nin kabu\u011funuzda kullan\u0131labilir olmas\u0131 i\u00e7in terminal oturumunuzu yeniden ba\u015flatman\u0131z veya a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">source ~\/.bashrc<\/code><\/pre>\n<p>\u015eimdi NVM&#8217;yi kullanarak Node.js&#8217;in en son LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fcn\u00fc kurabiliriz:<\/p>\n<pre><code class=\"language-bash\">nvm install --lts<\/code><\/pre>\n<p>Belirli bir s\u00fcr\u00fcm\u00fc kurmak isterseniz (\u00f6rne\u011fin Node.js 10, Ubuntu 16.04 i\u00e7in daha uygun olabilir):<\/p>\n<pre><code class=\"language-bash\">nvm install 10<\/code><\/pre>\n<p>Kurduktan sonra, bu s\u00fcr\u00fcm\u00fc varsay\u0131lan olarak ayarlay\u0131n ve kullanmaya ba\u015flay\u0131n:<\/p>\n<pre><code class=\"language-bash\">nvm use 10 # Veya nvm use --lts\nnvm alias default 10 # Veya nvm alias default --lts<\/code><\/pre>\n<p>Kurulumun ba\u015far\u0131l\u0131 oldu\u011funu do\u011frulamak i\u00e7in Node.js ve npm s\u00fcr\u00fcmlerini kontrol edin:<\/p>\n<pre><code class=\"language-bash\">node -v\nnpm -v<\/code><\/pre>\n<h3>Apt Paket Y\u00f6neticisi Kullanarak Kurulum (Alternatif)<\/h3>\n<p>E\u011fer NVM kullanmak istemiyorsan\u0131z, Node.js&#8217;i do\u011frudan Ubuntu&#8217;nun paket y\u00f6neticisi (apt) arac\u0131l\u0131\u011f\u0131yla da kurabilirsiniz. Ancak bu y\u00f6ntemle genellikle daha eski Node.js s\u00fcr\u00fcmleri gelir. Daha g\u00fcncel bir s\u00fcr\u00fcm i\u00e7in NodeSource deposunu eklemeniz gerekir.<\/p>\n<p>NodeSource deposunu ekleyelim (\u00f6rne\u011fin Node.js 10.x i\u00e7in):<\/p>\n<pre><code class=\"language-bash\">curl -sL https:\/\/deb.nodesource.com\/setup_10.x | sudo -E bash -<\/code><\/pre>\n<p><strong>Not:<\/strong> <code>setup_10.x<\/code> yerine <code>setup_12.x<\/code>, <code>setup_14.x<\/code> vb. kullanarak istedi\u011finiz Node.js s\u00fcr\u00fcm\u00fcn\u00fc se\u00e7ebilirsiniz. Ancak Ubuntu 16.04&#8217;\u00fcn daha eski \u00e7ekirdek ve glibc s\u00fcr\u00fcmlerine sahip olmas\u0131 nedeniyle, \u00e7ok yeni Node.js s\u00fcr\u00fcmleriyle uyumluluk sorunlar\u0131 ya\u015fanabilir. Node.js 10 veya 12 genellikle 16.04 ile iyi \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>Depoyu ekledikten sonra Node.js&#8217;i kurun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y nodejs<\/code><\/pre>\n<p>Bu, Node.js ve npm&#8217;i kuracakt\u0131r. npm&#8217;in en son s\u00fcr\u00fcm\u00fcn\u00fc edinmek i\u00e7in ayr\u0131ca \u015fu komutu \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo npm install -g npm@latest<\/code><\/pre>\n<p>Kurulumu do\u011frulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">node -v\nnpm -v<\/code><\/pre>\n<h2>Ad\u0131m 3: Uygulama Dosyalar\u0131n\u0131 Sunucuya Aktarma<\/h2>\n<p>Node.js ve npm kurulduktan sonra, uygulama dosyalar\u0131n\u0131z\u0131 sunucuya aktarman\u0131z gerekir. Bu i\u015flemi yapman\u0131n birka\u00e7 yayg\u0131n yolu vard\u0131r.<\/p>\n<h3>Git Kullanarak Aktar\u0131m (\u00d6nerilen)<\/h3>\n<p>E\u011fer uygulaman\u0131z bir Git deposunda bar\u0131nd\u0131r\u0131l\u0131yorsa, dosyalar\u0131 do\u011frudan sunucuya klonlamak en kolay yoldur.<\/p>\n<p>\u00d6ncelikle Git&#8217;i kurun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install git -y<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131 klonlamak istedi\u011finiz dizine gidin (\u00f6rne\u011fin <code>\/var\/www\/<\/code> alt\u0131na):<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/www\/your_app_name\nsudo chown -R your_username:your_username \/var\/www\/your_app_name # Kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 de\u011fi\u015ftirin\ncd \/var\/www\/your_app_name\ngit clone <repository_url> . # Mevcut dizine klonla<\/code><\/pre>\n<p><strong>Not:<\/strong> Uygulaman\u0131z\u0131 <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine, \u00f6zel bir uygulama kullan\u0131c\u0131s\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131rmak daha g\u00fcvenlidir. Bu rehberde, basitlik ad\u0131na <code>your_username<\/code> kullan\u0131lm\u0131\u015ft\u0131r. \u00dcretim ortam\u0131nda <code>your_app_user<\/code> gibi ayr\u0131 bir kullan\u0131c\u0131 olu\u015fturmak daha iyi bir uygulamad\u0131r.<\/p>\n<h3>SCP Kullanarak Aktar\u0131m<\/h3>\n<p>E\u011fer uygulaman\u0131z bir Git deposunda de\u011filse veya sadece belirli dosyalar\u0131 aktarman\u0131z gerekiyorsa, SCP (Secure Copy Protocol) kullanabilirsiniz. Bu i\u015flemi yerel makinenizden yapars\u0131n\u0131z:<\/p>\n<pre><code class=\"language-bash\">scp -r \/path\/to\/local\/your_app_folder user@your_server_ip:\/var\/www\/your_app_name<\/code><\/pre>\n<p><code>user<\/code>, <code>your_server_ip<\/code>, <code>\/path\/to\/local\/your_app_folder<\/code> ve <code>\/var\/www\/your_app_name<\/code> de\u011ferlerini kendi bilgilerinizle de\u011fi\u015ftirin.<\/p>\n<h3>Uygulama Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 Y\u00fckleme<\/h3>\n<p>Uygulama dosyalar\u0131 sunucuya aktar\u0131ld\u0131ktan sonra, projenizin <code>package.json<\/code> dosyas\u0131nda belirtilen t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/your_app_name # Uygulaman\u0131z\u0131n k\u00f6k dizinine gidin\nnpm install --production<\/code><\/pre>\n<p><code>--production<\/code> bayra\u011f\u0131, yaln\u0131zca \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (devDependencies hari\u00e7) y\u00fckler, bu da disk alan\u0131ndan tasarruf sa\u011flar ve kurulum s\u00fcresini k\u0131salt\u0131r.<\/p>\n<h2>Ad\u0131m 4: S\u00fcre\u00e7 Y\u00f6neticisi Kullanma: PM2<\/h2>\n<p>Node.js uygulamalar\u0131 genellikle tek bir i\u015flem olarak \u00e7al\u0131\u015f\u0131r. E\u011fer bu i\u015flem \u00e7\u00f6kerse, uygulaman\u0131z eri\u015filemez hale gelir. Bir s\u00fcre\u00e7 y\u00f6neticisi, uygulaman\u0131z\u0131n s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak, \u00e7\u00f6kt\u00fc\u011f\u00fcnde otomatik olarak yeniden ba\u015flatmak, performans\u0131n\u0131 izlemek ve loglar\u0131n\u0131 y\u00f6netmek i\u00e7in kritik \u00f6neme sahiptir. PM2 (Process Manager 2) bu ama\u00e7 i\u00e7in pop\u00fcler ve g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<h3>PM2 Kurulumu<\/h3>\n<p>PM2&#8217;yi global olarak kurun:<\/p>\n<pre><code class=\"language-bash\">sudo npm install -g pm2<\/code><\/pre>\n<h3>Uygulamay\u0131 PM2 ile Ba\u015flatma<\/h3>\n<p>PM2&#8217;yi kullanarak Node.js uygulaman\u0131z\u0131 ba\u015flatmak \u00e7ok kolayd\u0131r. Uygulaman\u0131z\u0131n ana dosyas\u0131n\u0131n bulundu\u011fu dizinde oldu\u011funuzdan emin olun:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/your_app_name\npm2 start app.js # Veya server.js, index.js vb.<\/code><\/pre>\n<p>E\u011fer <code>package.json<\/code> dosyan\u0131zda bir <code>start<\/code> beti\u011fi tan\u0131mlad\u0131ysan\u0131z (\u00f6rne\u011fin <code>\"start\": \"node app.js\"<\/code>), onu da kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pm2 start npm --name \"my-app\" -- run start<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">pm2 list<\/code><\/pre>\n<p>Bu komut, \u00e7al\u0131\u015fan PM2 s\u00fcre\u00e7lerinin bir listesini g\u00f6sterir. Uygulaman\u0131z\u0131n <code>online<\/code> durumda olmas\u0131 gerekir.<\/p>\n<p>PM2, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve loglar\u0131n\u0131 izlemek i\u00e7in de ara\u00e7lar sunar:<\/p>\n<pre><code class=\"language-bash\">pm2 monit # Ger\u00e7ek zamanl\u0131 izleme\npm2 logs # Uygulama loglar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleme<\/code><\/pre>\n<h3>PM2&#8217;yi Yeniden Ba\u015flatma ve Durdurma<\/h3>\n<p>Uygulaman\u0131zda de\u011fi\u015fiklikler yapt\u0131ktan sonra, PM2 s\u00fcrecini yeniden ba\u015flatman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">pm2 restart all # T\u00fcm PM2 s\u00fcre\u00e7lerini yeniden ba\u015flat\npm2 restart my-app # Belirli bir uygulamay\u0131 yeniden ba\u015flat (my-app yerine uygulama ad\u0131n\u0131z\u0131 veya ID'sini kullan\u0131n)<\/code><\/pre>\n<p>Uygulamay\u0131 durdurmak veya silmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">pm2 stop my-app\npm2 delete my-app<\/code><\/pre>\n<h3>Ba\u015flang\u0131\u00e7ta PM2&#8217;yi \u00c7al\u0131\u015ft\u0131rma (Startup Script)<\/h3>\n<p>Sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda PM2&#8217;nin uygulamalar\u0131n\u0131z\u0131 otomatik olarak ba\u015flatmas\u0131n\u0131 sa\u011flamak i\u00e7in bir ba\u015flang\u0131\u00e7 beti\u011fi olu\u015fturman\u0131z gerekir.<\/p>\n<pre><code class=\"language-bash\">pm2 startup systemd<\/code><\/pre>\n<p>Bu komut, sunucunuzun init sistemi (systemd) i\u00e7in bir ba\u015flang\u0131\u00e7 beti\u011fi olu\u015fturma talimatlar\u0131n\u0131 verir. Komutun \u00e7\u0131kt\u0131s\u0131n\u0131 dikkatlice okuyun; size \u00e7al\u0131\u015ft\u0131rman\u0131z gereken tam komutu verecektir. Genellikle \u015f\u00f6yle bir \u015fey olacakt\u0131r:<\/p>\n<pre><code class=\"language-bash\">sudo env PATH=$PATH:\/usr\/bin \/usr\/local\/lib\/node_modules\/pm2\/bin\/pm2 startup systemd -u your_username --hp \/home\/your_username<\/code><\/pre>\n<p>Bu komutu kendi kullan\u0131c\u0131 ad\u0131n\u0131zla ve do\u011fru yollarla \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun.<\/p>\n<p>Son olarak, PM2&#8217;nin mevcut uygulama listesini kaydetmesini sa\u011flay\u0131n, b\u00f6ylece ba\u015flang\u0131\u00e7ta bu uygulamalar\u0131 yeniden ba\u015flatabilir:<\/p>\n<pre><code class=\"language-bash\">pm2 save<\/code><\/pre>\n<p>Art\u0131k sunucunuz yeniden ba\u015flat\u0131lsa bile Node.js uygulaman\u0131z otomatik olarak PM2 taraf\u0131ndan ba\u015flat\u0131lacakt\u0131r.<\/p>\n<h2>Ad\u0131m 5: Ters Proxy Kurulumu: Nginx<\/h2>\n<p>Node.js uygulamalar\u0131n\u0131 do\u011frudan internete a\u00e7mak, genellikle g\u00fcvenlik ve performans nedenleriyle \u00f6nerilmez. Bunun yerine, bir ters proxy sunucusu (reverse proxy) kullanmak yayg\u0131n bir yakla\u015f\u0131md\u0131r. Nginx, bu ama\u00e7 i\u00e7in pop\u00fcler, y\u00fcksek performansl\u0131 ve hafif bir web sunucusudur. Nginx, gelen HTTP isteklerini Node.js uygulaman\u0131z\u0131n dinledi\u011fi porta y\u00f6nlendirecek, ayn\u0131 zamanda statik dosyalar\u0131 sunma, SSL\/TLS sonland\u0131rma ve y\u00fck dengeleme gibi ek i\u015flevler sa\u011flayacakt\u0131r.<\/p>\n<h3>Nginx Kurulumu<\/h3>\n<p>Nginx&#8217;i Ubuntu paket y\u00f6neticisi arac\u0131l\u0131\u011f\u0131yla kurun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install nginx -y<\/code><\/pre>\n<p>Kurulumdan sonra Nginx otomatik olarak ba\u015flayacakt\u0131r. Durumunu kontrol edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status nginx<\/code><\/pre>\n<p><code>active (running)<\/code> durumunda olmal\u0131d\u0131r.<\/p>\n<p>E\u011fer UFW (Uncomplicated Firewall) kullan\u0131yorsan\u0131z, Nginx trafi\u011fine izin vermeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow 'Nginx HTTP'\nsudo ufw status<\/code><\/pre>\n<p>Bu, Nginx&#8217;in HTTP (80 numaral\u0131 port) trafi\u011fini kabul etmesini sa\u011flar.<\/p>\n<h3>Nginx Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>\u015eimdi Nginx&#8217;i Node.js uygulaman\u0131za gelen istekleri y\u00f6nlendirecek \u015fekilde yap\u0131land\u0131rmam\u0131z gerekiyor. Nginx yap\u0131land\u0131rma dosyalar\u0131 <code>\/etc\/nginx\/sites-available\/<\/code> dizininde bulunur. Yeni bir yap\u0131land\u0131rma dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/sites-available\/your_app<\/code><\/pre>\n<p>Dosyan\u0131n i\u00e7ine a\u015fa\u011f\u0131daki yap\u0131land\u0131rmay\u0131 yap\u0131\u015ft\u0131r\u0131n. <code>your_domain.com<\/code>, <code>www.your_domain.com<\/code> ve <code>your_server_ip<\/code> de\u011ferlerini kendi alan ad\u0131n\u0131z ve sunucu IP adresinizle de\u011fi\u015ftirin. Ayr\u0131ca, Node.js uygulaman\u0131z\u0131n dinledi\u011fi portu (<code>proxy_pass<\/code> sat\u0131r\u0131ndaki 3000) do\u011fru \u015fekilde ayarlad\u0131\u011f\u0131n\u0131zdan emin olun.<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name your_domain.com www.your_domain.com your_server_ip;\n\n    location \/ {\n        proxy_pass http:\/\/localhost:3000; # Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection 'upgrade';\n        proxy_set_header Host $host;\n        proxy_cache_bypass $http_upgrade;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n}<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma, Nginx&#8217;in 80 numaral\u0131 porttan (HTTP) gelen t\u00fcm istekleri <code>localhost:3000<\/code> adresinde \u00e7al\u0131\u015fan Node.js uygulaman\u0131za y\u00f6nlendirmesini sa\u011flar. <code>proxy_set_header<\/code> sat\u0131rlar\u0131, Node.js uygulaman\u0131z\u0131n istemcinin ger\u00e7ek IP adresini ve di\u011fer \u00f6nemli bilgileri almas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 kaydettikten sonra (CTRL+X, Y, Enter), bu yap\u0131land\u0131rmay\u0131 etkinle\u015ftirmek i\u00e7in bir sembolik ba\u011flant\u0131 olu\u015fturman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/your_app \/etc\/nginx\/sites-enabled\/<\/code><\/pre>\n<p>Varsay\u0131lan Nginx yap\u0131land\u0131rmas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rakman\u0131z gerekebilir:<\/p>\n<pre><code class=\"language-bash\">sudo rm \/etc\/nginx\/sites-enabled\/default<\/code><\/pre>\n<p>Nginx yap\u0131land\u0131rman\u0131z\u0131n s\u00f6zdizimini kontrol edin:<\/p>\n<pre><code class=\"language-bash\">sudo nginx -t<\/code><\/pre>\n<p>E\u011fer herhangi bir hata yoksa, Nginx&#8217;i yeniden ba\u015flatarak yeni yap\u0131land\u0131rmay\u0131 uygulay\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart nginx<\/code><\/pre>\n<p>Art\u0131k taray\u0131c\u0131n\u0131zdan alan ad\u0131n\u0131z\u0131 veya sunucu IP adresinizi ziyaret etti\u011finizde, Nginx iste\u011fi Node.js uygulaman\u0131za y\u00f6nlendirmeli ve uygulaman\u0131z\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h2>Ad\u0131m 6: G\u00fcvenlik Ayarlar\u0131<\/h2>\n<p>Bir \u00fcretim sunucusunda g\u00fcvenlik her zaman \u00f6ncelikli olmal\u0131d\u0131r. A\u015fa\u011f\u0131daki temel g\u00fcvenlik ad\u0131mlar\u0131n\u0131 uygulaman\u0131z \u00f6nemlidir.<\/p>\n<h3>G\u00fcvenlik Duvar\u0131 (UFW) Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>UFW (Uncomplicated Firewall), Ubuntu&#8217;da g\u00fcvenlik duvar\u0131n\u0131 y\u00f6netmek i\u00e7in basit bir aray\u00fcz sa\u011flar. Sadece gerekli portlara izin vererek sunucunuzu koruman\u0131z gerekir.<\/p>\n<pre><code class=\"language-bash\">sudo ufw enable # G\u00fcvenlik duvar\u0131n\u0131 etkinle\u015ftir\nsudo ufw allow OpenSSH # SSH eri\u015fimine izin ver (port 22)\nsudo ufw allow 'Nginx HTTP' # Nginx'in HTTP trafi\u011fine izin ver (port 80)\n<h2>E\u011fer SSL kullanacaksan\u0131z, daha sonra 'Nginx HTTPS' i\u00e7in de izin vereceksiniz<\/h2>\nsudo ufw status verbose # G\u00fcvenlik duvar\u0131 durumunu kontrol et<\/code><\/pre>\n<p>Bu ayarlar, yaln\u0131zca SSH ve HTTP trafi\u011fine izin verirken di\u011fer t\u00fcm portlar\u0131 kapat\u0131r.<\/p>\n<h3>SSH G\u00fcvenli\u011fi<\/h3>\n<p>*   <strong>Parola Yerine Anahtar Tabanl\u0131 Kimlik Do\u011frulama:<\/strong> SSH parolalar\u0131 yerine SSH anahtar \u00e7iftleri kullanarak kimlik do\u011frulama, \u00e7ok daha g\u00fcvenlidir. Bu, sunucunuza eri\u015fim i\u00e7in bir \u00f6zel anahtar gerektirir.<br \/>\n*   <strong>Varsay\u0131lan SSH Portunu De\u011fi\u015ftirme:<\/strong> Varsay\u0131lan 22 numaral\u0131 SSH portunu de\u011fi\u015ftirmek, otomatik sald\u0131r\u0131 giri\u015fimlerini azaltmaya yard\u0131mc\u0131 olabilir. <code>\/etc\/ssh\/sshd_config<\/code> dosyas\u0131n\u0131 d\u00fczenleyerek <code>Port 22<\/code> sat\u0131r\u0131n\u0131 farkl\u0131 bir port numaras\u0131yla de\u011fi\u015ftirin ve UFW&#8217;de yeni porta izin verin.<br \/>\n*   <strong>Root Giri\u015fini Devre D\u0131\u015f\u0131 B\u0131rakma:<\/strong> <code>\/etc\/ssh\/sshd_config<\/code> dosyas\u0131nda <code>PermitRootLogin no<\/code> olarak ayarlayarak root kullan\u0131c\u0131s\u0131n\u0131n do\u011frudan SSH \u00fczerinden giri\u015f yapmas\u0131n\u0131 engelleyin.<br \/>\n*   <strong>Kullan\u0131c\u0131 Ad\u0131 ve Parola Politikalar\u0131:<\/strong> G\u00fc\u00e7l\u00fc parolalar kullan\u0131n ve d\u00fczenli olarak de\u011fi\u015ftirin.<\/p>\n<h3>Uygulama Kullan\u0131c\u0131s\u0131 Olu\u015fturma<\/h3>\n<p>Uygulaman\u0131z\u0131 <code>root<\/code> kullan\u0131c\u0131s\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131rmak b\u00fcy\u00fck bir g\u00fcvenlik riskidir. Bunun yerine, Node.js uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>sudo<\/code> yetkisi olmayan \u00f6zel bir kullan\u0131c\u0131 olu\u015fturman\u0131z \u00f6nerilir.<\/p>\n<pre><code class=\"language-bash\">sudo adduser your_app_user<\/code><\/pre>\n<p>Bu kullan\u0131c\u0131ya uygulaman\u0131z\u0131n dosyalar\u0131n\u0131n bulundu\u011fu dizine okuma ve yazma eri\u015fimi verdi\u011finizden emin olun:<\/p>\n<pre><code class=\"language-bash\">sudo chown -R your_app_user:your_app_user \/var\/www\/your_app_name<\/code><\/pre>\n<p>PM2&#8217;yi de bu kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir. PM2&#8217;nin ba\u015flang\u0131\u00e7 beti\u011fi komutunda <code>--hp \/home\/your_app_user<\/code> parametresini kullanarak bu kullan\u0131c\u0131y\u0131 belirtin.<\/p>\n<h2>Ad\u0131m 7: SSL\/TLS Kurulumu (Certbot ile Let&#8217;s Encrypt)<\/h2>\n<p>HTTP trafi\u011fini \u015fifrelemek ve uygulaman\u0131z\u0131n g\u00fcvenli\u011fini art\u0131rmak i\u00e7in SSL\/TLS sertifikas\u0131 kullanmak zorunludur. Let&#8217;s Encrypt, \u00fccretsiz SSL sertifikalar\u0131 sa\u011flayan pop\u00fcler bir sertifika yetkilisidir ve Certbot arac\u0131 ile kolayca kurulabilir ve y\u00f6netilebilir.<\/p>\n<h3>Certbot Kurulumu<\/h3>\n<p>Certbot&#8217;u kurmak i\u00e7in \u00f6ncelikle gerekli depolar\u0131 eklememiz ve Certbot&#8217;u y\u00fcklememiz gerekiyor:<\/p>\n<pre><code class=\"language-bash\">sudo apt install software-properties-common -y\nsudo add-apt-repository ppa:certbot\/certbot -y\nsudo apt update\nsudo apt install python-certbot-nginx -y<\/code><\/pre>\n<h3>SSL Sertifikas\u0131 Alma<\/h3>\n<p>Certbot&#8217;u Nginx ile entegre ederek otomatik olarak bir SSL sertifikas\u0131 alabilir ve Nginx yap\u0131land\u0131rman\u0131z\u0131 g\u00fcncelleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo certbot --nginx -d your_domain.com -d www.your_domain.com<\/code><\/pre>\n<p>Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra Certbot, e-posta adresinizi isteyecek ve hizmet \u015fartlar\u0131n\u0131 kabul etmenizi isteyecektir. Ayr\u0131ca HTTP trafi\u011fini HTTPS&#8217;ye y\u00f6nlendirip y\u00f6nlendirmeyece\u011finizi de soracakt\u0131r (genellikle &#8220;2: Redirect&#8221; se\u00e7ene\u011fi \u00f6nerilir).<\/p>\n<p>Certbot, Nginx yap\u0131land\u0131rma dosyan\u0131z\u0131 otomatik olarak g\u00fcncelleyerek hem HTTP hem de HTTPS trafi\u011fini dinlemesini sa\u011flayacak ve HTTP isteklerini HTTPS&#8217;ye y\u00f6nlendirecektir.<\/p>\n<p>E\u011fer UFW kullan\u0131yorsan\u0131z, HTTPS trafi\u011fine izin verdi\u011finizden emin olun:<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow 'Nginx HTTPS'\nsudo ufw delete allow 'Nginx HTTP' # Art\u0131k sadece HTTPS kullan\u0131yorsak HTTP'yi kapatabiliriz\nsudo ufw status<\/code><\/pre>\n<h3>Otomatik Yenileme Testi<\/h3>\n<p>Let&#8217;s Encrypt sertifikalar\u0131 90 g\u00fcn ge\u00e7erlidir, ancak Certbot bunlar\u0131 otomatik olarak yenilemek i\u00e7in bir cron i\u015fi kurar. Yenileme s\u00fcrecinin d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 test edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo certbot renew --dry-run<\/code><\/pre>\n<p>Bu komut, sertifikalar\u0131n ba\u015far\u0131yla yenilenebilece\u011fini sim\u00fcle eder.<\/p>\n<h2>Ad\u0131m 8: Ortam De\u011fi\u015fkenleri ve Yap\u0131land\u0131rma<\/h2>\n<p>\u00dcretim ortam\u0131nda hassas bilgiler (veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131 vb.) do\u011frudan kod i\u00e7inde tutulmamal\u0131d\u0131r. Bunun yerine, ortam de\u011fi\u015fkenleri veya ayr\u0131 yap\u0131land\u0131rma dosyalar\u0131 kullan\u0131larak y\u00f6netilmelidir.<\/p>\n<h3>PM2 ile Ortam De\u011fi\u015fkenleri<\/h3>\n<p>PM2, uygulamalar\u0131n\u0131z i\u00e7in ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in bir <code>ecosystem.config.js<\/code> dosyas\u0131 kullanman\u0131za olanak tan\u0131r. Bu, farkl\u0131 ortamlar (geli\u015ftirme, \u00fcretim) i\u00e7in farkl\u0131 de\u011fi\u015fken setleri tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<p>Uygulaman\u0131z\u0131n k\u00f6k dizininde <code>ecosystem.config.js<\/code> ad\u0131nda bir dosya olu\u015fturun:<\/p>\n<pre><code class=\"language-javascript\">\/\/ \/var\/www\/your_app_name\/ecosystem.config.js\nmodule.exports = {\n  apps : [{\n    name: \"my-app\",\n    script: \".\/app.js\", \/\/ Uygulaman\u0131z\u0131n ana dosyas\u0131n\u0131n yolu\n    instances: \"max\", \/\/ CPU \u00e7ekirdek say\u0131s\u0131 kadar \u00f6rnek \u00e7al\u0131\u015ft\u0131r\n    exec_mode: \"cluster\", \/\/ K\u00fcme modunda \u00e7al\u0131\u015ft\u0131r\n    env: {\n      NODE_ENV: \"development\",\n      PORT: 3000\n    },\n    env_production: {\n      NODE_ENV: \"production\",\n      PORT: 3000,\n      DB_HOST: \"localhost\",\n      DB_USER: \"your_db_user\",\n      DB_PASS: \"your_db_password\",\n      API_KEY: \"your_secret_api_key\"\n    }\n  }]\n};<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma ile, uygulamay\u0131 farkl\u0131 ortamlar i\u00e7in farkl\u0131 de\u011fi\u015fkenlerle ba\u015flatabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pm2 start ecosystem.config.js --env production<\/code><\/pre>\n<p>Bu komut, <code>env_production<\/code> b\u00f6l\u00fcm\u00fcndeki de\u011fi\u015fkenleri kullanarak uygulamay\u0131 ba\u015flat\u0131r. <code>NODE_ENV<\/code> de\u011fi\u015fkenini <code>production<\/code> olarak ayarlamak, bir\u00e7ok Node.js k\u00fct\u00fcphanesinin ve \u00e7er\u00e7evesinin (Express gibi) performans optimizasyonlar\u0131n\u0131 etkinle\u015ftirmesine yard\u0131mc\u0131 olur.<\/p>\n<h3>.env Dosyalar\u0131 (dotenv)<\/h3>\n<p>Alternatif olarak, Node.js uygulaman\u0131zda <code>dotenv<\/code> k\u00fct\u00fcphanesini kullanarak <code>.env<\/code> dosyalar\u0131n\u0131 y\u00f6netebilirsiniz.<br \/>\n1.  Uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131na <code>dotenv<\/code>&#8216;i ekleyin:<\/p>\n<pre><code class=\"language-bash\">npm install dotenv<\/code><\/pre>\n<p>2.  Uygulaman\u0131z\u0131n ana dosyas\u0131n\u0131n en ba\u015f\u0131na (\u00f6rne\u011fin <code>app.js<\/code> veya <code>server.js<\/code>) a\u015fa\u011f\u0131daki sat\u0131r\u0131 ekleyin:<\/p>\n<pre><code class=\"language-javascript\">require('dotenv').config();<\/code><\/pre>\n<p>3.  Uygulaman\u0131z\u0131n k\u00f6k dizininde <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturun ve hassas de\u011fi\u015fkenlerinizi buraya yaz\u0131n:<\/p>\n<pre><code class=\"language-\"># \/var\/www\/your_app_name\/.env\n    PORT=3000\n    DB_HOST=localhost\n    DB_USER=your_db_user\n    DB_PASS=your_db_password\n    API_KEY=your_secret_api_key<\/code><\/pre>\n<p>4.  Uygulaman\u0131zda bu de\u011fi\u015fkenlere <code>process.env.PORT<\/code> gibi eri\u015febilirsiniz.<br \/>\n5.  <strong>\u00d6NEML\u0130:<\/strong> <code>.env<\/code> dosyas\u0131n\u0131 Git deposuna y\u00fcklememek i\u00e7in <code>.gitignore<\/code> dosyan\u0131za <code>.env<\/code> ekledi\u011finizden emin olun. Bu dosyay\u0131 sunucuya manuel olarak aktarman\u0131z veya da\u011f\u0131t\u0131m beti\u011finizin bir par\u00e7as\u0131 olarak olu\u015fturman\u0131z gerekecektir.<\/p>\n<h2>Ad\u0131m 9: Log Y\u00f6netimi<\/h2>\n<p>Uygulaman\u0131z\u0131n performans\u0131n\u0131 izlemek, hatalar\u0131 ay\u0131klamak ve sorunlar\u0131 gidermek i\u00e7in loglar hayati \u00f6neme sahiptir.<\/p>\n<h3>PM2 Loglar\u0131<\/h3>\n<p>PM2, uygulama loglar\u0131n\u0131z\u0131 otomatik olarak yakalar ve y\u00f6netir.<br \/>\n*   Uygulaman\u0131z\u0131n loglar\u0131n\u0131 ger\u00e7ek zamanl\u0131 olarak g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">pm2 logs my-app<\/code><\/pre>\n<p>*   Belirli say\u0131da sat\u0131r\u0131 g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">pm2 logs my-app --lines 100<\/code><\/pre>\n<p>*   T\u00fcm loglar\u0131 temizlemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">pm2 flush<\/code><\/pre>\n<p>PM2 loglar\u0131 varsay\u0131lan olarak <code>\/home\/your_username\/.pm2\/logs\/<\/code> dizininde bulunur.<\/p>\n<h3>Nginx Loglar\u0131<\/h3>\n<p>Nginx, eri\u015fim (access) ve hata (error) loglar\u0131n\u0131 tutar. Bunlar, web sunucusu seviyesindeki sorunlar\u0131 veya gelen isteklerle ilgili bilgileri izlemek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   Eri\u015fim loglar\u0131: <code>\/var\/log\/nginx\/access.log<\/code><br \/>\n*   Hata loglar\u0131: <code>\/var\/log\/nginx\/error.log<\/code><\/p>\n<h3>Log Rotasyonu (Logrotate)<\/h3>\n<p>Log dosyalar\u0131 zamanla \u00e7ok b\u00fcy\u00fck hale gelebilir ve disk alan\u0131n\u0131 t\u00fcketebilir. <code>logrotate<\/code> arac\u0131, log dosyalar\u0131n\u0131 otomatik olarak d\u00f6nd\u00fcrmek, s\u0131k\u0131\u015ft\u0131rmak ve silmek i\u00e7in kullan\u0131l\u0131r. Ubuntu&#8217;da Nginx ve sistem loglar\u0131 i\u00e7in <code>logrotate<\/code> varsay\u0131lan olarak yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r. Kendi uygulama loglar\u0131n\u0131z i\u00e7in de \u00f6zel <code>logrotate<\/code> yap\u0131land\u0131rmalar\u0131 olu\u015fturabilirsiniz.<br \/>\n<code>\/etc\/logrotate.d\/<\/code> dizininde kendi uygulaman\u0131z i\u00e7in yeni bir dosya olu\u015fturarak bunu yapabilirsiniz.<\/p>\n<h2>Sonu\u00e7 ve \u00d6zet<\/h2>\n<p>Bu kapsaml\u0131 rehberde, bir Node.js uygulamas\u0131n\u0131 Ubuntu 16.04 \u00fczerinde \u00fcretim ortam\u0131 i\u00e7in kurman\u0131n ve yap\u0131land\u0131rman\u0131n t\u00fcm temel ad\u0131mlar\u0131n\u0131 ele ald\u0131k. Ba\u015flang\u0131\u00e7ta sunucuyu g\u00fcncelleyerek ve Node.js&#8217;i NVM ile kurarak temel altyap\u0131y\u0131 olu\u015fturduk. Ard\u0131ndan, uygulaman\u0131z\u0131 sunucuya aktard\u0131k ve PM2 kullanarak uygulaman\u0131z\u0131n s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131, otomatik olarak yeniden ba\u015flamas\u0131n\u0131 ve loglar\u0131n\u0131 y\u00f6netmesini sa\u011flad\u0131k. Nginx&#8217;i bir ters proxy olarak yap\u0131land\u0131rarak gelen web trafi\u011fini Node.js uygulaman\u0131za y\u00f6nlendirdik ve statik dosya sunumu ile SSL\/TLS sonland\u0131rmas\u0131 i\u00e7in zemin haz\u0131rlad\u0131k. G\u00fcvenlik duvar\u0131 ayarlar\u0131, SSH g\u00fcvenli\u011fi ve uygulama kullan\u0131c\u0131s\u0131 olu\u015fturma gibi kritik g\u00fcvenlik ad\u0131mlar\u0131n\u0131 uygulad\u0131k. Son olarak, Certbot ile \u00fccretsiz SSL sertifikalar\u0131 al\u0131p uygulaman\u0131z\u0131n g\u00fcvenli ileti\u015fimini sa\u011flad\u0131k ve ortam de\u011fi\u015fkenlerinin y\u00f6netimi ile loglama stratejilerini inceledik.<\/p>\n<p>Bu ad\u0131mlar\u0131 takip ederek, Node.js uygulaman\u0131z\u0131n Ubuntu 16.04 \u00fczerinde g\u00fcvenli, kararl\u0131 ve performansl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. Unutmay\u0131n ki, \u00fcretim ortamlar\u0131 s\u00fcrekli izleme, d\u00fczenli g\u00fcncellemeler ve g\u00fcvenlik denetimleri gerektirir. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, bir CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatt\u0131 kurmay\u0131, veritaban\u0131 sunucular\u0131n\u0131 ayr\u0131 tutmay\u0131 ve daha geli\u015fmi\u015f izleme ara\u00e7lar\u0131n\u0131 kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu rehber, sa\u011flam bir temel olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nNode.js, modern web uygulamalar\u0131 geli\u015ft","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-36144","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber Giri\u015f Node.js, modern web uygulamalar\u0131 geli\u015ft\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-08T19:40:49+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-12-08T19:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/\"},\"wordCount\":2966,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/\",\"name\":\"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-08T19:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber","og_description":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber Giri\u015f Node.js, modern web uygulamalar\u0131 geli\u015ft","og_url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-08T19:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber","datePublished":"2025-12-08T19:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/"},"wordCount":2966,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/","name":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-08T19:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-16-04-uzerinde-node-js-uygulamasini-uretim-ortami-icin-kurulumu-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ubuntu 16.04 \u00dczerinde Node.js Uygulamas\u0131n\u0131 \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulumu: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36144"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36144\/revisions"}],"predecessor-version":[{"id":36145,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36144\/revisions\/36145"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}