{"id":36163,"date":"2025-12-09T12:23:53","date_gmt":"2025-12-09T09:23:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/"},"modified":"2025-12-09T12:23:53","modified_gmt":"2025-12-09T09:23:53","slug":"node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/","title":{"rendered":"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<h1>Node.js Uygulamas\u0131n\u0131 Ubuntu \u00dczerinde \u00dcretim Ortam\u0131na Kurulum Rehberi<\/h1>\n<p>Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak bu, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda da ayn\u0131 performans\u0131 ve g\u00fcvenilirli\u011fi sunaca\u011f\u0131 anlam\u0131na gelmez. Bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131mak, g\u00fcvenlikten performansa, kesintisiz \u00e7al\u0131\u015fmadan kolay y\u00f6netilebilirli\u011fe kadar bir\u00e7ok kritik fakt\u00f6r\u00fc beraberinde getirir. Bu rehber, uygulaman\u0131z\u0131n canl\u0131ya al\u0131nma s\u00fcrecini ad\u0131m ad\u0131m, en iyi uygulamalarla ve pratik \u00f6rneklerle ele alarak, s\u0131f\u0131rdan uzman seviyesine kadar bilgi edinmenizi sa\u011flayacakt\u0131r.<\/p>\n<h2>Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?<\/h2>\n<p>Bir Node.js uygulamas\u0131n\u0131 \u00fcretim ortam\u0131na ta\u015f\u0131mak, sadece kodunuzu bir sunucuya kopyalay\u0131p \u00e7al\u0131\u015ft\u0131rmakla s\u0131n\u0131rl\u0131 de\u011fildir. Geli\u015ftirme a\u015famas\u0131nda g\u00f6z ard\u0131 edilen bir\u00e7ok detay, canl\u0131 ortamda ciddi sorunlara yol a\u00e7abilir. Bu nedenle, uygulaman\u0131z\u0131n g\u00fcvenli\u011fini, performans\u0131n\u0131 ve s\u00fcrekli eri\u015filebilirli\u011fini sa\u011flamak i\u00e7in \u00f6zel bir yakla\u015f\u0131m benimsemek zorunludur. Peki, bu s\u00fcre\u00e7 neden bu kadar \u00f6nemlidir ve hangi temel kavramlar\u0131 anlamam\u0131z gerekir?<\/p>\n<p>\u00d6ncelikle, <strong>g\u00fcvenlik<\/strong> en \u00f6ncelikli konulardan biridir. \u00dcretim ortam\u0131nda \u00e7al\u0131\u015fan bir uygulama, potansiyel siber sald\u0131r\u0131lara kar\u015f\u0131 savunmas\u0131z kalabilir. Geli\u015ftirme ortam\u0131nda genellikle daha esnek olan g\u00fcvenlik ayarlar\u0131, \u00fcretimde \u00e7ok daha s\u0131k\u0131 olmal\u0131d\u0131r. \u00d6rne\u011fin, a\u00e7\u0131k portlar, zay\u0131f parolalar veya g\u00fcncel olmayan yaz\u0131l\u0131mlar, uygulaman\u0131z i\u00e7in ciddi riskler olu\u015fturur. Bu nedenle, sunucu ve uygulama d\u00fczeyinde kapsaml\u0131 g\u00fcvenlik \u00f6nlemleri almak, verilerinizin ve kullan\u0131c\u0131lar\u0131n\u0131z\u0131n korunmas\u0131 a\u00e7\u0131s\u0131ndan kritik bir rol oynar.<\/p>\n<p>\u0130kinci olarak, <strong>performans ve \u00f6l\u00e7eklenebilirlik<\/strong>, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen fakt\u00f6rlerdir. Bir \u00fcretim uygulamas\u0131, ayn\u0131 anda binlerce hatta milyonlarca kullan\u0131c\u0131ya hizmet verebilir. Geli\u015ftirme ortam\u0131nda tek bir kullan\u0131c\u0131yla test edilen bir uygulama, y\u00fcksek y\u00fck alt\u0131nda performans sorunlar\u0131 ya\u015fayabilir. Bu ba\u011flamda, uygulaman\u0131z\u0131n h\u0131zl\u0131 yan\u0131t vermesi, kaynaklar\u0131 etkin kullanmas\u0131 ve gerekti\u011finde kolayca \u00f6l\u00e7eklenebilmesi i\u00e7in do\u011fru yap\u0131land\u0131rmalar ve ara\u00e7lar kullanmak esast\u0131r. Ters proxy&#8217;ler, s\u00fcre\u00e7 y\u00f6neticileri ve y\u00fck dengeleyiciler gibi teknolojiler, bu hedeflere ula\u015fmada kilit rol oynar.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc ve son olarak, <strong>s\u00fcrekli \u00e7al\u0131\u015fma (uptime) ve bak\u0131m kolayl\u0131\u011f\u0131<\/strong>, bir \u00fcretim uygulamas\u0131n\u0131n olmazsa olmaz\u0131d\u0131r. Uygulaman\u0131z\u0131n her zaman eri\u015filebilir olmas\u0131, i\u015f s\u00fcreklili\u011fi i\u00e7in hayati \u00f6neme sahiptir. Bir uygulama \u00e7\u00f6kt\u00fc\u011f\u00fcnde veya beklenmedik bir hata olu\u015ftu\u011funda, sistemin otomatik olarak toparlanabilmesi veya y\u00f6neticinin h\u0131zl\u0131ca m\u00fcdahale edebilmesi gerekir. S\u00fcre\u00e7 y\u00f6neticileri, loglama sistemleri ve izleme ara\u00e7lar\u0131, bu t\u00fcr durumlar\u0131 y\u00f6netmeyi ve sorun gidermeyi kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, uygulaman\u0131n g\u00fcncellenmesi veya bak\u0131m\u0131n\u0131n yap\u0131lmas\u0131 gerekti\u011finde, kesintileri en aza indiren veya tamamen ortadan kald\u0131ran da\u011f\u0131t\u0131m stratejileri benimsemek de b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<p>Bu temel kavramlar\u0131 anlamak, Node.js uygulaman\u0131z\u0131 \u00fcretim ortam\u0131na ba\u015far\u0131yla ta\u015f\u0131mak i\u00e7in sa\u011flam bir zemin olu\u015fturacakt\u0131r. Bu rehberin ilerleyen b\u00f6l\u00fcmlerinde, bu prensipleri somut ad\u0131mlarla nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Unutmay\u0131n, iyi planlanm\u0131\u015f bir \u00fcretim kurulumu, uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131 i\u00e7in at\u0131lan en \u00f6nemli ad\u0131mlardan biridir.<\/p>\n<h2>Ubuntu Sunucunuzu Node.js Uygulamas\u0131 \u0130\u00e7in Nas\u0131l Haz\u0131rlars\u0131n\u0131z?<\/h2>\n<p>Node.js uygulaman\u0131z\u0131 bar\u0131nd\u0131racak bir Ubuntu sunucusunun do\u011fru \u015fekilde haz\u0131rlanmas\u0131, t\u00fcm s\u00fcrecin temelini olu\u015fturur. Bu ad\u0131mlar, uygulaman\u0131z\u0131n g\u00fcvenli, kararl\u0131 ve performansl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131 i\u00e7in vazge\u00e7ilmezdir. \u0130\u015fte ad\u0131m ad\u0131m sunucu haz\u0131rl\u0131\u011f\u0131:<\/p>\n<h3>Sistem G\u00fcncellemeleri ve Temel Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Kurulumu<\/h3>\n<p>Yeni bir sunucuya ba\u015flad\u0131\u011f\u0131n\u0131zda yapman\u0131z gereken ilk \u015fey, sisteminizi g\u00fcncellemektir. Bu, hem g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapat\u0131r hem de en yeni yaz\u0131l\u0131m paketlerine eri\u015fmenizi sa\u011flar. Terminali a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\nsudo apt update\nsudo apt upgrade -y\n<\/code><\/pre>\n<p>Bu komutlar, paket listelerinizi g\u00fcncelleyecek ve mevcut t\u00fcm paketleri y\u00fckseltecektir. Ayr\u0131ca, Node.js uygulamalar\u0131n\u0131n derlenmesi i\u00e7in gerekli olabilecek baz\u0131 temel ara\u00e7lar\u0131 da y\u00fcklememiz gerekebilir:<\/p>\n<pre><code>\nsudo apt install build-essential curl git -y\n<\/code><\/pre>\n<p><code>build-essential<\/code> paketi, C\/C++ derleyicileri ve di\u011fer geli\u015ftirme ara\u00e7lar\u0131n\u0131 i\u00e7erir; Node.js mod\u00fcllerinin baz\u0131lar\u0131 yerel kod derlemesi gerektirebilir. <code>curl<\/code>, web&#8217;den dosya indirmek i\u00e7in, <code>git<\/code> ise uygulama kodunuzu sunucuya \u00e7ekmek i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<h3>Node.js ve npm Kurulumu: NVM Kullan\u0131m\u0131 Neden \u00d6nemlidir?<\/h3>\n<p>Node.js&#8217;i do\u011frudan Ubuntu depolar\u0131ndan kurmak yerine, Node Version Manager (NVM) kullanman\u0131z\u0131 \u015fiddetle tavsiye ederiz. NVM, ayn\u0131 sunucuda birden fazla Node.js s\u00fcr\u00fcm\u00fcn\u00fc kolayca y\u00f6netmenizi sa\u011flar. Bu, farkl\u0131 uygulamalar\u0131n\u0131z\u0131n farkl\u0131 Node.js s\u00fcr\u00fcmlerine ihtiya\u00e7 duymas\u0131 durumunda b\u00fcy\u00fck esneklik sunar. NVM&#8217;yi kurmak i\u00e7in curl kullanabiliriz:<\/p>\n<pre><code>\ncurl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash\n<\/code><\/pre>\n<p>Kurulum tamamland\u0131ktan sonra, NVM&#8217;yi kabu\u011funuza y\u00fcklemek i\u00e7in terminali kapat\u0131p yeniden a\u00e7man\u0131z veya a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rman\u0131z gerekebilir:<\/p>\n<pre><code>\nsource ~\/.bashrc # veya ~\/.zshrc e\u011fer zsh kullan\u0131yorsan\u0131z\n<\/code><\/pre>\n<p>\u015eimdi NVM ile Node.js&#8217;in en son LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fcn\u00fc kurabiliriz:<\/p>\n<pre><code>\nnvm install --lts\nnvm use --lts\nnvm alias default 'lts\/*'\n<\/code><\/pre>\n<p>Bu komutlar, LTS s\u00fcr\u00fcm\u00fcn\u00fc kuracak, onu varsay\u0131lan olarak ayarlayacak ve her yeni terminal oturumunda otomatik olarak kullan\u0131lmas\u0131n\u0131 sa\u011flayacakt\u0131r. Kurulumu do\u011frulamak i\u00e7in:<\/p>\n<pre><code>\nnode -v\nnpm -v\n<\/code><\/pre>\n<p>Bu komutlar, kurulu Node.js ve npm s\u00fcr\u00fcmlerini g\u00f6stermelidir.<\/p>\n<blockquote>\n<p>Uzman \u0130pucu: NVM kullanmak, farkl\u0131 projeler i\u00e7in farkl\u0131 Node.js versiyonlar\u0131 gerektiren durumlarda veya Node.js versiyon y\u00fckseltmelerinde olas\u0131 uyumluluk sorunlar\u0131n\u0131 minimize eder. Bu esneklik, uzun vadede size b\u00fcy\u00fck zaman kazand\u0131racakt\u0131r.<\/p>\n<\/blockquote>\n<h3>Uygulama \u0130\u00e7in \u00d6zel Kullan\u0131c\u0131 Olu\u015fturma ve \u0130zinler<\/h3>\n<p>Uygulaman\u0131z\u0131 do\u011frudan root kullan\u0131c\u0131s\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131rmak b\u00fcy\u00fck bir g\u00fcvenlik riskidir. Bunun yerine, uygulaman\u0131z i\u00e7in \u00f6zel, yetkisiz bir kullan\u0131c\u0131 olu\u015fturmal\u0131s\u0131n\u0131z. Bu kullan\u0131c\u0131, uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli minimum izinlere sahip olmal\u0131d\u0131r.<\/p>\n<pre><code>\nsudo adduser nodeappuser\nsudo usermod -aG sudo nodeappuser # \u0130ste\u011fe ba\u011fl\u0131: e\u011fer bu kullan\u0131c\u0131ya sudo yetkisi vermek isterseniz\n<\/code><\/pre>\n<p><code>nodeappuser<\/code> ad\u0131nda yeni bir kullan\u0131c\u0131 olu\u015fturduk. \u015eimdi bu kullan\u0131c\u0131ya ge\u00e7i\u015f yaparak uygulama kodunu klonlayabilir ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyebiliriz:<\/p>\n<pre><code>\nsudo su - nodeappuser\n<\/code><\/pre>\n<p>Art\u0131k <code>nodeappuser<\/code> olarak oturum a\u00e7t\u0131n\u0131z. Uygulama kodunuzu bu kullan\u0131c\u0131n\u0131n ana dizinine (<code>\/home\/nodeappuser<\/code>) veya uygun g\u00f6rd\u00fc\u011f\u00fcn\u00fcz ba\u015fka bir dizine klonlayabilirsiniz. Bu ad\u0131mlar, sunucunuzu Node.js uygulaman\u0131z i\u00e7in g\u00fcvenli ve verimli bir \u015fekilde haz\u0131rlaman\u0131z\u0131 sa\u011flar. Bir sonraki ad\u0131mda, uygulaman\u0131z\u0131 sunucuya nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131za odaklanaca\u011f\u0131z.<\/p>\n<h2>Node.js Uygulaman\u0131z\u0131 Sunucuya Nas\u0131l Da\u011f\u0131t\u0131rs\u0131n\u0131z ve Ortam De\u011fi\u015fkenlerini Nas\u0131l Y\u00f6netirsiniz?<\/h2>\n<p>Sunucunuz haz\u0131rland\u0131ktan sonra, s\u0131ra Node.js uygulaman\u0131z\u0131n kodunu sunucuya da\u011f\u0131tmaya gelir. Bu s\u00fcre\u00e7, kodun sunucuya aktar\u0131lmas\u0131, gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00fcklenmesi ve uygulaman\u0131n ortam de\u011fi\u015fkenlerinin do\u011fru \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131n\u0131 i\u00e7erir. Bu ad\u0131mlar, uygulaman\u0131z\u0131n canl\u0131 ortamda beklenen \u015fekilde \u00e7al\u0131\u015fmas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Uygulama Kodunu Klonlama ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme<\/h3>\n<p>\u00d6ncelikle, daha \u00f6nce olu\u015fturdu\u011fumuz <code>nodeappuser<\/code> kullan\u0131c\u0131s\u0131na ge\u00e7i\u015f yapt\u0131\u011f\u0131n\u0131zdan emin olun:<\/p>\n<pre><code>\nsudo su - nodeappuser\n<\/code><\/pre>\n<p>Uygulama kodunuzu genellikle bir Git deposundan klonlayacaks\u0131n\u0131z. Klonlama i\u015flemini kullan\u0131c\u0131n\u0131n ana dizininde veya \u00f6zel bir uygulama dizininde yapabilirsiniz. \u00d6rne\u011fin, <code>\/home\/nodeappuser\/my-app<\/code> gibi bir yap\u0131 olu\u015fturabiliriz:<\/p>\n<pre><code>\nmkdir my-app\ncd my-app\ngit clone https:\/\/github.com\/kullaniciadi\/repoadi.git . # . mevcut dizine klonlar\n<\/code><\/pre>\n<p>Kodunuz klonland\u0131ktan sonra, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan npm paketlerini y\u00fcklemeniz gerekir. Bu i\u015flem, uygulaman\u0131z\u0131n <code>package.json<\/code> dosyas\u0131nda tan\u0131mlanan t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 indirir ve kurar:<\/p>\n<pre><code>\nnpm install --production\n<\/code><\/pre>\n<p><code>--production<\/code> bayra\u011f\u0131, yaln\u0131zca \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n (<code>dependencies<\/code>) y\u00fcklenmesini sa\u011flar ve geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (<code>devDependencies<\/code>) atlar. Bu, gereksiz paketlerin sunucuya kurulmas\u0131n\u0131 \u00f6nleyerek disk alan\u0131ndan tasarruf sa\u011flar ve potansiyel g\u00fcvenlik risklerini azalt\u0131r. E\u011fer uygulaman\u0131z\u0131n derleme ad\u0131mlar\u0131 (\u00f6rne\u011fin TypeScript&#8217;ten JavaScript&#8217;e derleme, frontend build&#8217;leri) varsa, bunlar\u0131 da bu a\u015famada \u00e7al\u0131\u015ft\u0131rman\u0131z gerekebilir:<\/p>\n<pre><code>\nnpm run build # E\u011fer package.json'\u0131n\u0131zda bir 'build' script'i varsa\n<\/code><\/pre>\n<h3>Ortam De\u011fi\u015fkenlerinin G\u00fcvenli Y\u00f6netimi (.env ve dotenv)<\/h3>\n<p>\u00dcretim ortam\u0131nda, veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131 ve di\u011fer hassas bilgiler gibi ortam de\u011fi\u015fkenlerini do\u011frudan kodunuzda tutmak yerine ayr\u0131 bir \u015fekilde y\u00f6netmek esast\u0131r. Bu, g\u00fcvenli\u011fi art\u0131r\u0131r ve farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) aras\u0131nda kolayca ge\u00e7i\u015f yapman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Node.js uygulamalar\u0131nda ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in en yayg\u0131n y\u00f6ntemlerden biri <code>dotenv<\/code> k\u00fct\u00fcphanesini kullanmakt\u0131r. Uygulaman\u0131z\u0131n k\u00f6k dizininde <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturun ve hassas bilgilerinizi buraya ekleyin:<\/p>\n<pre><code>\n# .env dosyas\u0131 \u00f6rne\u011fi\nNODE_ENV=production\nPORT=3000\nDB_HOST=localhost\nDB_USER=myuser\nDB_PASS=mypassword\nAPI_KEY=your_secret_api_key\n<\/code><\/pre>\n<p><strong>\u00d6NEML\u0130:<\/strong> <code>.env<\/code> dosyas\u0131n\u0131 kesinlikle Git deposuna eklemeyin! Bu dosyay\u0131 <code>.gitignore<\/code> dosyan\u0131za ekleyerek versiyon kontrol\u00fcnden hari\u00e7 tutmal\u0131s\u0131n\u0131z. Hassas bilgilerinizi herkese a\u00e7\u0131k bir depoda tutmak b\u00fcy\u00fck bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131d\u0131r.<\/p>\n<pre><code>\n# .gitignore dosyas\u0131 \u00f6rne\u011fi\nnode_modules\/\n.env\nnpm-debug.log*\n<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n bu de\u011fi\u015fkenleri okuyabilmesi i\u00e7in, genellikle uygulaman\u0131z\u0131n ana dosyas\u0131n\u0131n (\u00f6rne\u011fin <code>app.js<\/code> veya <code>index.js<\/code>) en ba\u015f\u0131na <code>dotenv<\/code> k\u00fct\u00fcphanesini dahil etmeniz gerekir:<\/p>\n<pre><code>\n<pre><code>\nrequire('dotenv').config();\n\nconst express = require('express');\nconst app = express();\nconst port = process.env.PORT || 3000;\n\napp.get('\/', (req, res) => {\n  res.send(<code class=\"language-\">Uygulama ${process.env.NODE_ENV} ortam\u0131nda \u00e7al\u0131\u015f\u0131yor!<\/code>);\n});\n\napp.listen(port, () => {\n  console.log(<code class=\"language-\">Sunucu ${port} portunda \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n<\/code><\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, uygulaman\u0131z ba\u015flat\u0131ld\u0131\u011f\u0131nda <code>.env<\/code> dosyas\u0131ndaki de\u011fi\u015fkenler <code>process.env<\/code> objesine y\u00fcklenecektir. Bu yakla\u015f\u0131m, ortam de\u011fi\u015fkenlerini merkezi ve g\u00fcvenli bir \u015fekilde y\u00f6netmenizi sa\u011flar.<\/p>\n<blockquote>\n<p>Uzman \u0130pucu: \u00c7ok say\u0131da ortam de\u011fi\u015fkeniniz varsa veya birden fazla ortam i\u00e7in farkl\u0131 yap\u0131land\u0131rmalar\u0131n\u0131z varsa, <code>dotenv-cli<\/code> gibi ara\u00e7lar\u0131 veya daha geli\u015fmi\u015f yap\u0131land\u0131rma y\u00f6netimi \u00e7\u00f6z\u00fcmlerini (\u00f6rne\u011fin HashiCorp Vault) d\u00fc\u015f\u00fcnebilirsiniz. K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli uygulamalar i\u00e7in <code>.env<\/code> dosyas\u0131 genellikle yeterlidir.<\/p>\n<\/blockquote>\n<h3>Uygulama Testi<\/h3>\n<p>Da\u011f\u0131t\u0131m\u0131n son a\u015famas\u0131nda, uygulaman\u0131z\u0131n sunucuda d\u00fczg\u00fcn bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in basit bir test yapman\u0131z \u00f6nemlidir. Uygulaman\u0131z\u0131 do\u011frudan Node.js ile \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>\nnode index.js # veya uygulaman\u0131z\u0131n ana dosyas\u0131n\u0131n ad\u0131\n<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n konsolda hata vermeden ba\u015flad\u0131\u011f\u0131n\u0131 ve belirtilen portta \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rmelisiniz. E\u011fer bir web uygulamas\u0131 ise, sunucunun IP adresi ve portu \u00fczerinden (\u00f6rne\u011fin <code>http:\/\/sunucu_ip_adresi:3000<\/code>) taray\u0131c\u0131n\u0131zdan eri\u015fmeyi deneyebilirsiniz. Bu, uygulaman\u0131z\u0131n temel i\u015flevselli\u011finin \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frular. Bir sonraki b\u00f6l\u00fcmde, uygulaman\u0131z\u0131n s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacak bir s\u00fcre\u00e7 y\u00f6neticisi olan PM2&#8217;yi nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 \u00f6\u011frenece\u011fiz.<\/p>\n<h2>S\u00fcre\u00e7 Y\u00f6neticisi PM2 ile Node.js Uygulaman\u0131z\u0131 Nas\u0131l Y\u00f6netirsiniz?<\/h2>\n<p>Node.js uygulamalar\u0131 varsay\u0131lan olarak tek i\u015f par\u00e7ac\u0131kl\u0131 (single-threaded) bir yap\u0131ya sahiptir. Bu durum, uygulaman\u0131z\u0131n \u00e7\u00f6kmesi halinde tamamen durmas\u0131na ve eri\u015filemez hale gelmesine neden olabilir. Ayr\u0131ca, \u00e7ok \u00e7ekirdekli i\u015flemcilerin g\u00fcc\u00fcnden tam olarak yararlanamaz. \u0130\u015fte bu noktada PM2 gibi bir s\u00fcre\u00e7 y\u00f6neticisi devreye girer. PM2 (Process Manager 2), Node.js uygulamalar\u0131n\u0131z\u0131 \u00fcretim ortam\u0131nda s\u00fcrekli, g\u00fcvenli ve performansl\u0131 bir \u015fekilde \u00e7al\u0131\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015f kapsaml\u0131 bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h3>PM2 Nedir ve Neden Kullan\u0131lmal\u0131d\u0131r?<\/h3>\n<p>PM2, Node.js uygulamalar\u0131 i\u00e7in geli\u015fmi\u015f bir \u00fcretim s\u00fcre\u00e7 y\u00f6neticisidir. Temel i\u015flevleri \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>S\u00fcrekli \u00c7al\u0131\u015fma (Uptime)<\/strong>: Uygulaman\u0131z beklenmedik bir \u015fekilde \u00e7\u00f6kt\u00fc\u011f\u00fcnde veya bir hata olu\u015ftu\u011funda, PM2 uygulamay\u0131 otomatik olarak yeniden ba\u015flat\u0131r ve kesintisiz hizmet sa\u011flar.<\/li>\n<li><strong>Y\u00fck Dengeleme (Clustering)<\/strong>: PM2, uygulaman\u0131z\u0131n birden fazla kopyas\u0131n\u0131 (i\u015flem k\u00fcmesi) \u00e7al\u0131\u015ft\u0131rarak, \u00e7ok \u00e7ekirdekli i\u015flemcilerden tam verim alman\u0131z\u0131 sa\u011flar. Gelen istekler bu kopyalar aras\u0131nda da\u011f\u0131t\u0131l\u0131r, bu da performans\u0131 art\u0131r\u0131r ve tek bir i\u015flemin \u00e7\u00f6kmesi durumunda di\u011ferlerinin \u00e7al\u0131\u015fmaya devam etmesini sa\u011flar.<\/li>\n<li><strong>Log Y\u00f6netimi<\/strong>: Uygulama loglar\u0131n\u0131 (stdout ve stderr) toplar, saklar ve y\u00f6netir. Bu, sorun giderme ve izleme i\u00e7in hayati \u00f6nem ta\u015f\u0131r.<\/li>\n<li><strong>Sistem Ba\u015flang\u0131c\u0131nda Otomatik Ba\u015flatma<\/strong>: Sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda uygulamalar\u0131n\u0131z\u0131n otomatik olarak ba\u015flamas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Kolay Y\u00f6netim<\/strong>: Uygulamalar\u0131 ba\u015flatma, durdurma, yeniden ba\u015flatma, izleme gibi i\u015flemleri basit komutlarla yapmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ol>\n<p>Bu \u00f6zellikler sayesinde PM2, Node.js uygulamalar\u0131n\u0131z\u0131 \u00fcretimde \u00e7al\u0131\u015ft\u0131r\u0131rken kar\u015f\u0131la\u015f\u0131lan bir\u00e7ok zorlu\u011fu ortadan kald\u0131r\u0131r ve operasyonel y\u00fck\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h3>PM2 Kurulumu ve Temel Komutlar<\/h3>\n<p>PM2&#8217;yi global olarak npm ile kurabilirsiniz:<\/p>\n<pre><code>\nnpm install pm2@latest -g\n<\/code><\/pre>\n<p>Kurulum tamamland\u0131ktan sonra, uygulaman\u0131z\u0131 PM2 ile ba\u015flatmaya haz\u0131rs\u0131n\u0131z. Uygulaman\u0131z\u0131n k\u00f6k dizinine gidin (<code>cd \/home\/nodeappuser\/my-app<\/code>) ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\npm2 start index.js --name \"my-node-app\" --watch -i max\n<\/code><\/pre>\n<ul>\n<li><code>index.js<\/code>: Uygulaman\u0131z\u0131n ana giri\u015f dosyas\u0131.<\/li>\n<li><code>--name \"my-node-app\"<\/code>: Uygulaman\u0131za kolayca tan\u0131nabilecek bir isim atar.<\/li>\n<li><code>--watch<\/code>: Dosya de\u011fi\u015fikliklerini izler ve de\u011fi\u015fiklik oldu\u011funda uygulamay\u0131 otomatik olarak yeniden ba\u015flat\u0131r (geli\u015ftirme ortam\u0131 i\u00e7in kullan\u0131\u015fl\u0131d\u0131r, \u00fcretimde dikkatli kullan\u0131lmal\u0131d\u0131r).<\/li>\n<li><code>-i max<\/code>: Uygulaman\u0131z\u0131n CPU \u00e7ekirde\u011fi say\u0131s\u0131 kadar i\u015flem k\u00fcmesi olu\u015fturmas\u0131n\u0131 sa\u011flar. Bu, y\u00fck dengeleme i\u00e7in idealdir. (<code>-i 0<\/code> da ayn\u0131 i\u015flevi g\u00f6r\u00fcr).<\/li>\n<\/ul>\n<p>Uygulaman\u0131z ba\u015flat\u0131ld\u0131ktan sonra, PM2&#8217;nin durumunu kontrol edebilirsiniz:<\/p>\n<pre><code>\npm2 list\n<\/code><\/pre>\n<p>Bu komut, \u00e7al\u0131\u015fan t\u00fcm PM2 s\u00fcre\u00e7lerini, durumlar\u0131n\u0131, CPU ve bellek kullan\u0131mlar\u0131n\u0131 g\u00f6steren bir tablo sunar.<\/p>\n<h3>PM2 ile Uygulama Y\u00f6netimi ve Ayarlar\u0131<\/h3>\n<p>PM2, uygulamalar\u0131n\u0131z\u0131 y\u00f6netmek i\u00e7in \u00e7e\u015fitli komutlar sunar:<\/p>\n<ul>\n<li>Uygulamay\u0131 yeniden ba\u015flatma: <code>pm2 restart my-node-app<\/code><\/li>\n<li>Uygulamay\u0131 durdurma: <code>pm2 stop my-node-app<\/code><\/li>\n<li>Uygulamay\u0131 silme (PM2&#8217;nin izlemesinden kald\u0131rma): <code>pm2 delete my-node-app<\/code><\/li>\n<li>Loglar\u0131 g\u00f6r\u00fcnt\u00fcleme: <code>pm2 logs my-node-app<\/code> (Ger\u00e7ek zamanl\u0131 log takibi i\u00e7in <code>pm2 logs --follow<\/code>)<\/li>\n<li>\u0130zleme paneli: <code>pm2 monit<\/code> (CPU, bellek ve HTTP isteklerini g\u00f6rsel olarak izler)<\/li>\n<\/ul>\n<h4>Sistem Ba\u015flang\u0131c\u0131nda Otomatik Ba\u015flatma<\/h4>\n<p>Sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda uygulamalar\u0131n\u0131z\u0131n otomatik olarak ba\u015flamas\u0131n\u0131 sa\u011flamak i\u00e7in PM2&#8217;nin ba\u015flang\u0131\u00e7 beti\u011fini olu\u015fturman\u0131z gerekir:<\/p>\n<pre><code>\npm2 startup systemd\n<\/code><\/pre>\n<p>Bu komut, sisteminiz i\u00e7in uygun bir ba\u015flang\u0131\u00e7 beti\u011fi olu\u015fturacak ve size \u00e7al\u0131\u015ft\u0131rman\u0131z gereken bir komut sat\u0131r\u0131 \u00e7\u0131kt\u0131s\u0131 verecektir (genellikle <code>sudo env PATH=$PATH:\/usr\/bin \/usr\/local\/bin\/pm2 startup systemd -u nodeappuser --hp \/home\/nodeappuser<\/code> gibi bir \u015fey). Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, mevcut PM2 s\u00fcre\u00e7lerinizi kaydetmeniz gerekir:<\/p>\n<pre><code>\npm2 save\n<\/code><\/pre>\n<p>Bu, PM2&#8217;nin mevcut uygulama listesini kaydetmesini ve sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda bu listeyi kullanarak uygulamalar\u0131 ba\u015flatmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Ortam De\u011fi\u015fkenlerini PM2 ile Y\u00f6netme<\/h4>\n<p>Daha \u00f6nce <code>.env<\/code> dosyas\u0131 ile y\u00f6netti\u011fimiz ortam de\u011fi\u015fkenlerini PM2&#8217;ye de tan\u0131mlayabiliriz. Bu, genellikle <code>ecosystem.config.js<\/code> ad\u0131nda bir yap\u0131land\u0131rma dosyas\u0131 ile yap\u0131l\u0131r:<\/p>\n<pre><code>\n\/\/ ecosystem.config.js\nmodule.exports = {\n  apps : [{\n    name      : 'my-node-app',\n    script    : 'index.js',\n    instances : 'max',\n    exec_mode : 'cluster',\n    env: {\n      NODE_ENV: 'development',\n      PORT: 3000\n    },\n    env_production : {\n      NODE_ENV: 'production',\n      PORT: 80, \/\/ Nginx ile 80 veya 443'e y\u00f6nlendirece\u011fiz\n      DB_HOST: 'localhost',\n      API_KEY: 'your_production_api_key'\n    }\n  }]\n};\n<\/code><\/pre>\n<p>Bu dosyay\u0131 uygulaman\u0131z\u0131n k\u00f6k dizinine yerle\u015ftirdikten sonra, PM2&#8217;yi bu yap\u0131land\u0131rma dosyas\u0131yla ba\u015flatabilirsiniz:<\/p>\n<pre><code>\npm2 start ecosystem.config.js --env production\n<\/code><\/pre>\n<p>Bu, <code>env_production<\/code> blo\u011fundaki de\u011fi\u015fkenleri kullanarak uygulamay\u0131 ba\u015flat\u0131r. Bu yakla\u015f\u0131m, farkl\u0131 ortamlar i\u00e7in farkl\u0131 yap\u0131land\u0131rmalar\u0131 tek bir dosyada tutman\u0131z\u0131 sa\u011flar.<\/p>\n<blockquote>\n<p>Uzman \u0130pucu: Hassas ortam de\u011fi\u015fkenlerini (\u00f6rne\u011fin veritaban\u0131 \u015fifreleri) <code>ecosystem.config.js<\/code> dosyas\u0131na do\u011frudan yazmak yerine, sunucunun ortam de\u011fi\u015fkenleri olarak ayarlamak (\u00f6rne\u011fin <code>\/etc\/environment<\/code> veya <code>~\/.bashrc<\/code> dosyas\u0131na ekleyip <code>source<\/code> etmek) daha g\u00fcvenli bir y\u00f6ntem olabilir. PM2, bu sistem de\u011fi\u015fkenlerini otomatik olarak uygulaman\u0131za iletecektir.<\/p>\n<\/blockquote>\n<h3>Vaka Analizi: PM2 ile Kesintisiz Da\u011f\u0131t\u0131m<\/h3>\n<p>Bir e-ticaret uygulamas\u0131n\u0131 d\u00fc\u015f\u00fcnelim. M\u00fc\u015fterilerin s\u00fcrekli al\u0131\u015fveri\u015f yapabildi\u011fi bir ortamda, uygulama g\u00fcncellemeleri s\u0131ras\u0131nda dahi kesinti ya\u015fanmamas\u0131 kritik \u00f6neme sahiptir. PM2, bu senaryoda &#8220;s\u0131f\u0131r kesinti&#8221; da\u011f\u0131t\u0131m\u0131 (zero-downtime deployment) sa\u011flamak i\u00e7in kullan\u0131labilir. Uygulaman\u0131z\u0131n yeni s\u00fcr\u00fcm\u00fcn\u00fc da\u011f\u0131t\u0131rken:<\/p>\n<ol>\n<li>Yeni kodu sunucuya \u00e7ekin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin.<\/li>\n<li><code>pm2 reload my-node-app<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. PM2, yeni kodu y\u00fcklerken eski i\u015flemleri \u00e7al\u0131\u015f\u0131r durumda tutar. Yeni kod ba\u015far\u0131yla ba\u015flat\u0131ld\u0131\u011f\u0131nda, eski i\u015flemler sorunsuz bir \u015fekilde sonland\u0131r\u0131l\u0131r. Bu sayede kullan\u0131c\u0131lar, uygulama g\u00fcncellenirken dahi herhangi bir kesinti hissetmezler.<\/li>\n<\/ol>\n<p>PM2, Node.js \u00fcretim ortamlar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Do\u011fru yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131nda, uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131n\u0131, performans\u0131n\u0131 ve y\u00f6netilebilirli\u011fini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bir sonraki b\u00f6l\u00fcmde, Nginx&#8217;i ters proxy olarak nas\u0131l yap\u0131land\u0131raca\u011f\u0131m\u0131z\u0131 ve SSL\/TLS g\u00fcvenli\u011fini nas\u0131l sa\u011flayaca\u011f\u0131m\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<h2>Nginx Ters Proxy Olarak Nas\u0131l Yap\u0131land\u0131r\u0131l\u0131r ve SSL\/TLS Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>Node.js uygulamalar\u0131n\u0131z\u0131 do\u011frudan internete a\u00e7mak, genellikle \u00f6nerilmeyen bir g\u00fcvenlik uygulamas\u0131d\u0131r. Bunun yerine, bir ters proxy sunucusu kullanmak \u00e7ok daha g\u00fcvenli ve performansl\u0131 bir yakla\u015f\u0131md\u0131r. Nginx, bu ama\u00e7la en pop\u00fcler ve g\u00fc\u00e7l\u00fc web sunucular\u0131ndan biridir. Nginx&#8217;i uygulaman\u0131z\u0131n \u00f6n\u00fcne yerle\u015ftirerek, hem g\u00fcvenli\u011fi art\u0131rabilir hem de performans\u0131 optimize edebilirsiniz.<\/p>\n<h3>Nginx Neden Kullan\u0131lmal\u0131d\u0131r?<\/h3>\n<p>Nginx&#8217;i Node.js uygulaman\u0131z\u0131n \u00f6n\u00fcnde bir ters proxy olarak kullanman\u0131n bir\u00e7ok avantaj\u0131 vard\u0131r:<\/p>\n<ol>\n<li><strong>Y\u00fck Dengeleme<\/strong>: Nginx, gelen istekleri birden fazla Node.js i\u015flem k\u00fcmesi aras\u0131nda da\u011f\u0131tabilir (PM2 ile olu\u015fturdu\u011fumuz gibi), bu da uygulaman\u0131z\u0131n daha fazla trafi\u011fi i\u015flemesine olanak tan\u0131r.<\/li>\n<li><strong>SSL\/TLS Sonland\u0131rma<\/strong>: SSL\/TLS \u015fifrelemesini Nginx&#8217;te sonland\u0131rmak, Node.js uygulaman\u0131z\u0131n bu y\u00fckten kurtulmas\u0131n\u0131 sa\u011flar. Nginx, bu i\u015flemi \u00e7ok daha verimli bir \u015fekilde yapabilir.<\/li>\n<li><strong>Statik Dosya Sunumu<\/strong>: Resimler, CSS, JavaScript dosyalar\u0131 gibi statik i\u00e7erikleri Nginx do\u011frudan sunabilir. Bu, Node.js uygulaman\u0131z\u0131n sadece dinamik i\u00e7erik olu\u015fturmaya odaklanmas\u0131n\u0131 sa\u011flayarak performans\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>G\u00fcvenlik<\/strong>: Nginx, do\u011frudan eri\u015fimi engeller ve uygulaman\u0131z\u0131 \u00e7e\u015fitli sald\u0131r\u0131lara kar\u015f\u0131 korur. Ayr\u0131ca, istekleri filtreleme ve k\u00f6t\u00fc niyetli trafi\u011fi engelleme yetene\u011fine sahiptir.<\/li>\n<li><strong>S\u0131k\u0131\u015ft\u0131rma (Gzip) ve \u00d6nbellekleme<\/strong>: Nginx, i\u00e7eri\u011fi s\u0131k\u0131\u015ft\u0131rarak bant geni\u015fli\u011fini azaltabilir ve s\u0131k eri\u015filen i\u00e7erikleri \u00f6nbelle\u011fe alarak yan\u0131t s\u00fcrelerini k\u0131saltabilir.<\/li>\n<\/ol>\n<h3>Nginx Kurulumu<\/h3>\n<p>Nginx&#8217;i Ubuntu&#8217;ya kurmak olduk\u00e7a basittir:<\/p>\n<pre><code>\nsudo apt install nginx -y\nsudo systemctl start nginx\nsudo systemctl enable nginx\n<\/code><\/pre>\n<p>Kurulumdan sonra, taray\u0131c\u0131n\u0131zdan sunucunuzun IP adresine giderek Nginx&#8217;in varsay\u0131lan kar\u015f\u0131lama sayfas\u0131n\u0131 g\u00f6rmelisiniz. Bu, Nginx&#8217;in ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/p>\n<h3>Nginx Yap\u0131land\u0131rmas\u0131: Ters Proxy ve Statik Dosya Sunumu<\/h3>\n<p>\u015eimdi Nginx&#8217;i Node.js uygulaman\u0131z i\u00e7in ters proxy olarak yap\u0131land\u0131ral\u0131m. Yeni bir yap\u0131land\u0131rma dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code>\nsudo nano \/etc\/nginx\/sites-available\/my-node-app\n<\/code><\/pre>\n<p>A\u015fa\u011f\u0131daki i\u00e7eri\u011fi dosyaya yap\u0131\u015ft\u0131r\u0131n ve uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 portu (\u00f6rne\u011fin 3000) ve sunucu ad\u0131n\u0131z\u0131 (alan ad\u0131n\u0131z veya IP adresiniz) g\u00fcncelleyin:<\/p>\n<pre><code>\n<pre><code>\nserver {\n    listen 80;\n    server_name your_domain.com www.your_domain.com; # Alan ad\u0131n\u0131z\u0131 buraya yaz\u0131n\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-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n\n    # Statik dosyalar i\u00e7in \u00f6rnek yap\u0131land\u0131rma (iste\u011fe ba\u011fl\u0131)\n    # location \/static\/ {\n    #     alias \/home\/nodeappuser\/my-app\/public\/; # Statik dosyalar\u0131n\u0131z\u0131n yolu\n    #     expires 30d; # \u00d6nbellekleme s\u00fcresi\n    #     add_header Cache-Control \"public, no-transform\";\n    # }\n}\n<\/code><\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma, Nginx&#8217;in 80 portuna gelen t\u00fcm istekleri Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 <code>http:\/\/localhost:3000<\/code> adresine y\u00f6nlendirmesini sa\u011flar. <code>proxy_set_header<\/code> direktifleri, Node.js uygulaman\u0131z\u0131n orijinal istemci IP adresi gibi bilgileri alabilmesi i\u00e7in \u00f6nemlidir.<\/p>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 kaydettikten sonra, etkinle\u015ftirmek i\u00e7in bir sembolik ba\u011flant\u0131 olu\u015fturun ve Nginx yap\u0131land\u0131rmas\u0131n\u0131 test edin:<\/p>\n<pre><code>\nsudo ln -s \/etc\/nginx\/sites-available\/my-node-app \/etc\/nginx\/sites-enabled\/\nsudo nginx -t\n<\/code><\/pre>\n<p>E\u011fer test ba\u015far\u0131l\u0131 olursa, Nginx&#8217;i yeniden ba\u015flat\u0131n:<\/p>\n<pre><code>\nsudo systemctl restart nginx\n<\/code><\/pre>\n<p>Art\u0131k alan ad\u0131n\u0131z veya sunucu IP adresiniz \u00fczerinden (port belirtmeden) Node.js uygulaman\u0131za eri\u015febiliyor olmal\u0131s\u0131n\u0131z.<\/p>\n<h3>SSL\/TLS Kurulumu (Certbot\/Let&#8217;s Encrypt)<\/h3>\n<p>G\u00fcvenli bir \u00fcretim ortam\u0131 i\u00e7in SSL\/TLS sertifikas\u0131 kullanmak zorunludur. Let&#8217;s Encrypt, \u00fccretsiz SSL sertifikalar\u0131 sa\u011flayan pop\u00fcler bir hizmettir ve Certbot arac\u0131 ile kolayca entegre edilebilir. \u0130lk olarak Certbot&#8217;u kural\u0131m:<\/p>\n<pre><code>\nsudo apt install certbot python3-certbot-nginx -y\n<\/code><\/pre>\n<p>\u015eimdi Nginx i\u00e7in SSL sertifikas\u0131 alabiliriz. Certbot, Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak alg\u0131layacak ve g\u00fcncelleyecektir:<\/p>\n<pre><code>\nsudo certbot --nginx -d your_domain.com -d www.your_domain.com\n<\/code><\/pre>\n<p>Certbot size baz\u0131 sorular soracak (e-posta adresi, hizmet \u015fartlar\u0131n\u0131 kabul etme vb.). \u0130\u015flem tamamland\u0131\u011f\u0131nda, Nginx yap\u0131land\u0131rma dosyan\u0131z otomatik olarak 443 portu i\u00e7in SSL ayarlar\u0131yla g\u00fcncellenecek ve HTTP istekleri HTTPS&#8217;e y\u00f6nlendirilecektir. Sertifikalar\u0131n otomatik olarak yenilenmesi i\u00e7in Certbot&#8217;un bir cron i\u015fi olu\u015fturdu\u011funu da unutmay\u0131n.<\/p>\n<blockquote>\n<p>Uzman \u0130pucu: Nginx yap\u0131land\u0131rmas\u0131nda <code>gzip on;<\/code> direktifini ekleyerek HTTP yan\u0131tlar\u0131n\u0131 s\u0131k\u0131\u015ft\u0131rabilir ve bant geni\u015fli\u011fi kullan\u0131m\u0131n\u0131 azaltarak performans\u0131 art\u0131rabilirsiniz. Ayr\u0131ca, statik dosyalar i\u00e7in <code>expires<\/code> direktifini kullanarak taray\u0131c\u0131 \u00f6nbelleklemesini etkinle\u015ftirmek, tekrar eden ziyaretlerde y\u00fckleme s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<\/blockquote>\n<h3>Mobil Uyumlu HTML \u00d6rne\u011fi (Frontend \u0130pu\u00e7lar\u0131)<\/h3>\n<p>Bu makale sunucu kurulumuyla ilgili olsa da, da\u011f\u0131tt\u0131\u011f\u0131n\u0131z uygulamalar\u0131n kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan mobil uyumlu olmas\u0131 kritik \u00f6neme sahiptir. Nginx, bu t\u00fcr responsive frontend dosyalar\u0131n\u0131 h\u0131zl\u0131ca sunabilir. \u0130\u015fte basit bir CSS media query \u00f6rne\u011fi:<\/p>\n<pre><code>\n<pre><code>\n<!DOCTYPE html><body>\n    <div class=\"container\">\n        <h1>Node.js Uygulaman\u0131z \u00dcretimde!<\/h1>\n        <p>Tebrikler! Uygulaman\u0131z Ubuntu \u00fczerinde Nginx ve PM2 ile ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7al\u0131\u015f\u0131yor. Bu sayfa, uygulaman\u0131z\u0131n mobil cihazlarda nas\u0131l g\u00f6r\u00fcnece\u011fini g\u00f6steren basit bir \u00f6rnek i\u00e7eriyor.<\/p>\n        <p>Taray\u0131c\u0131n\u0131z\u0131n boyutunu de\u011fi\u015ftirerek veya mobil bir cihazdan eri\u015ferek responsive tasar\u0131m\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n    <\/div>\n<\/body>\n<\/html>\n<\/code><\/pre>\n<p><\/code><\/p>\n<p>Bu HTML dosyas\u0131n\u0131 Nginx&#8217;in statik dosya sunumu i\u00e7in ayarlad\u0131\u011f\u0131n\u0131z bir dizine (\u00f6rne\u011fin <code>\/home\/nodeappuser\/my-app\/public\/index.html<\/code>) yerle\u015ftirerek, Nginx&#8217;in bu dosyay\u0131 do\u011frudan sunmas\u0131n\u0131 sa\u011flayabilirsiniz. Nginx, bu dosyalar\u0131 \u00e7ok h\u0131zl\u0131 bir \u015fekilde sunarak Node.js uygulaman\u0131z\u0131n \u00fczerindeki y\u00fck\u00fc azalt\u0131r.<\/p>\n<p>Nginx&#8217;in do\u011fru yap\u0131land\u0131r\u0131lmas\u0131, uygulaman\u0131z\u0131n hem g\u00fcvenli\u011fini hem de performans\u0131n\u0131 art\u0131r\u0131r. SSL\/TLS ile \u015fifrelenmi\u015f trafik, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n verilerini korurken, Nginx&#8217;in ters proxy yetenekleri uygulaman\u0131z\u0131n daha kararl\u0131 ve \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flar. Art\u0131k uygulaman\u0131z\u0131n temel da\u011f\u0131t\u0131m ve y\u00f6netim ad\u0131mlar\u0131n\u0131 tamamlad\u0131n\u0131z. Bir sonraki b\u00f6l\u00fcmde, g\u00fcvenlik ve performans optimizasyonlar\u0131na odaklanaca\u011f\u0131z.<\/p>\n<h2>G\u00fcvenlik ve Performans Optimizasyonlar\u0131 Nelerdir?<\/h2>\n<p>Bir Node.js uygulamas\u0131n\u0131 \u00fcretim ortam\u0131na da\u011f\u0131tmak, sadece uygulaman\u0131n \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda onun g\u00fcvenli ve m\u00fcmk\u00fcn olan en iyi performans\u0131 sunmas\u0131n\u0131 da gerektirir. Bu b\u00f6l\u00fcmde, sunucu ve uygulama d\u00fczeyinde uygulayabilece\u011finiz temel g\u00fcvenlik ve performans optimizasyonlar\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>G\u00fcvenlik Duvar\u0131 (UFW) Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Sunucunuzun g\u00fcvenli\u011fi i\u00e7in ilk ve en \u00f6nemli ad\u0131mlardan biri, bir g\u00fcvenlik duvar\u0131 yap\u0131land\u0131rmakt\u0131r. Ubuntu&#8217;da UFW (Uncomplicated Firewall) kullan\u0131m\u0131 kolay ve etkili bir se\u00e7enektir. Yaln\u0131zca uygulaman\u0131z\u0131n ve y\u00f6netim ara\u00e7lar\u0131n\u0131z\u0131n ihtiya\u00e7 duydu\u011fu portlar\u0131 a\u00e7arak, sunucunuza yetkisiz eri\u015fimi engelleyebilirsiniz.<\/p>\n<pre><code>\nsudo ufw allow OpenSSH # SSH eri\u015fimine izin ver\nsudo ufw allow 'Nginx Full' # Nginx'in HTTP ve HTTPS portlar\u0131na (80, 443) izin ver\nsudo ufw enable # G\u00fcvenlik duvar\u0131n\u0131 etkinle\u015ftir\nsudo ufw status # G\u00fcvenlik duvar\u0131 durumunu kontrol et\n<\/code><\/pre>\n<p>E\u011fer uygulaman\u0131z farkl\u0131 bir portta \u00e7al\u0131\u015f\u0131yorsa (\u00f6rne\u011fin PM2&#8217;nin izleme paneli i\u00e7in), o portu da a\u00e7man\u0131z gerekebilir. Ancak, gereksiz portlar\u0131 a\u00e7\u0131k b\u0131rakmaktan ka\u00e7\u0131n\u0131n. \u00d6rne\u011fin, Node.js uygulaman\u0131z 3000 portunda \u00e7al\u0131\u015fsa da, Nginx bu portu dahili olarak kulland\u0131\u011f\u0131 i\u00e7in d\u0131\u015far\u0131dan eri\u015fime a\u00e7man\u0131za gerek yoktur.<\/p>\n<h3>SSH G\u00fcvenli\u011fi<\/h3>\n<p>SSH, sunucunuza uzaktan eri\u015fim i\u00e7in kulland\u0131\u011f\u0131n\u0131z ana protokold\u00fcr ve bu nedenle \u00f6zellikle hedef al\u0131nan bir noktad\u0131r. SSH g\u00fcvenli\u011fini art\u0131rmak i\u00e7in \u015fu ad\u0131mlar\u0131 izleyin:<\/p>\n<ol>\n<li><strong>Parola yerine Anahtar Tabanl\u0131 Kimlik Do\u011frulama Kullan\u0131n<\/strong>: Bu, \u00e7ok daha g\u00fcvenlidir. Yerel makinenizde bir SSH anahtar \u00e7ifti olu\u015fturun (<code>ssh-keygen<\/code>) ve genel anahtar\u0131n\u0131z\u0131 sunucunuzdaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na kopyalay\u0131n.<\/li>\n<li><strong>Root Eri\u015fimi Kapat\u0131n<\/strong>: Root kullan\u0131c\u0131s\u0131n\u0131n do\u011frudan SSH ile giri\u015f yapmas\u0131n\u0131 engelleyin. Bunun yerine, normal bir kullan\u0131c\u0131yla giri\u015f yap\u0131n ve gerekti\u011finde <code>sudo<\/code> kullan\u0131n. <code>\/etc\/ssh\/sshd_config<\/code> dosyas\u0131nda <code>PermitRootLogin no<\/code> ayar\u0131n\u0131 yap\u0131n.<\/li>\n<li><strong>Varsay\u0131lan SSH Portunu De\u011fi\u015ftirin<\/strong>: SSH&#8217;in varsay\u0131lan 22 portunu farkl\u0131, rastgele bir porta (\u00f6rne\u011fin 2222) de\u011fi\u015ftirerek otomatik sald\u0131r\u0131lar\u0131 azaltabilirsiniz. <code>\/etc\/ssh\/sshd_config<\/code> dosyas\u0131nda <code>Port 2222<\/code> ayar\u0131n\u0131 yap\u0131n.<\/li>\n<li><strong>Fail2ban Kurun<\/strong>: Bu ara\u00e7, tekrar eden ba\u015far\u0131s\u0131z giri\u015f denemelerini alg\u0131lar ve sald\u0131rgan IP adreslerini ge\u00e7ici olarak engeller.<\/li>\n<\/ol>\n<p>Bu de\u011fi\u015fiklikleri yapt\u0131ktan sonra <code>sudo systemctl restart sshd<\/code> komutuyla SSH servisini yeniden ba\u015flatmay\u0131 unutmay\u0131n. Yeni portu UFW&#8217;de a\u00e7t\u0131\u011f\u0131n\u0131zdan da emin olun.<\/p>\n<h3>Ortam De\u011fi\u015fkenlerinin G\u00fcvenli Y\u00f6netimi<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz gibi, hassas bilgileri (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) kodunuzda veya Git deposunda tutmaktan ka\u00e7\u0131n\u0131n. <code>.env<\/code> dosyalar\u0131 iyi bir ba\u015flang\u0131\u00e7 olsa da, daha y\u00fcksek g\u00fcvenlik gerektiren durumlar i\u00e7in:<\/p>\n<ul>\n<li><strong>Sistem Ortam De\u011fi\u015fkenleri<\/strong>: Hassas bilgileri do\u011frudan sunucunun ortam de\u011fi\u015fkenleri olarak ayarlay\u0131n (\u00f6rne\u011fin <code>\/etc\/environment<\/code> dosyas\u0131na ekleyerek veya PM2&#8217;nin yap\u0131land\u0131rma dosyas\u0131nda <code>process.env.MY_SECRET<\/code> olarak referans vererek).<\/li>\n<li><strong>S\u0131r Y\u00f6netim Sistemleri<\/strong>: Kurumsal d\u00fczeyde uygulamalar i\u00e7in HashiCorp Vault, AWS Secrets Manager veya Azure Key Vault gibi \u00f6zel s\u0131r y\u00f6netim sistemleri kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn.<\/li>\n<\/ul>\n<h3>Performans \u0130pu\u00e7lar\u0131 ve Optimizasyonlar\u0131<\/h3>\n<ol>\n<li><strong>Gzip S\u0131k\u0131\u015ft\u0131rma<\/strong>: Nginx&#8217;i kullanarak HTTP yan\u0131tlar\u0131n\u0131 s\u0131k\u0131\u015ft\u0131r\u0131n. Bu, bant geni\u015fli\u011fi kullan\u0131m\u0131n\u0131 azalt\u0131r ve istemciler i\u00e7in y\u00fckleme s\u00fcrelerini h\u0131zland\u0131r\u0131r. Nginx yap\u0131land\u0131rman\u0131zda <code>gzip on;<\/code> ve ilgili ayarlar\u0131 ekleyin.<\/li>\n<li><strong>\u00d6nbellekleme<\/strong>: Nginx&#8217;i statik dosyalar (CSS, JS, resimler) i\u00e7in \u00f6nbellekleme yapacak \u015fekilde yap\u0131land\u0131r\u0131n. Ayr\u0131ca, Node.js uygulaman\u0131zda s\u0131k eri\u015filen veriler i\u00e7in Redis veya Memcached gibi bir \u00f6nbellek katman\u0131 kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn.<\/li>\n<li><strong>Veritaban\u0131 Optimizasyonu<\/strong>: Veritaban\u0131 sorgular\u0131n\u0131z\u0131 optimize edin, uygun indeksler kullan\u0131n ve N+1 sorgu sorunlar\u0131ndan ka\u00e7\u0131n\u0131n. Veritaban\u0131 ba\u011flant\u0131 havuzu (connection pooling) kullanmak da performans\u0131 art\u0131r\u0131r.<\/li>\n<li><strong>Node.js Uygulama Optimizasyonu<\/strong>:\n<ul>\n<li><strong>Asenkron \u0130\u015flemler<\/strong>: Blocking (engelleyici) i\u015flemleri minimize edin ve asenkron programlaman\u0131n avantajlar\u0131ndan tam olarak yararlan\u0131n.<\/li>\n<li><strong>Middleware Optimizasyonu<\/strong>: Gereksiz middleware&#8217;lerden ka\u00e7\u0131n\u0131n ve middleware s\u0131ralamas\u0131n\u0131 optimize edin.<\/li>\n<li><strong>Hata Y\u00f6netimi<\/strong>: Uygulaman\u0131zdaki hatalar\u0131 d\u00fczg\u00fcn bir \u015fekilde y\u00f6netin, b\u00f6ylece beklenmedik \u00e7\u00f6kmeler t\u00fcm uygulaman\u0131z\u0131 etkilemez.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Log Y\u00f6netimi<\/strong>: PM2 loglar\u0131n\u0131 d\u00fczenli olarak kontrol edin. Loglar\u0131n diskte \u00e7ok fazla yer kaplamamas\u0131 i\u00e7in log rotasyonu (logrotate) yap\u0131land\u0131r\u0131n. PM2, kendi log rotasyonunu da destekler.<\/li>\n<\/ol>\n<blockquote>\n<p>Uzman \u0130pucu: Uygulaman\u0131z\u0131n performans\u0131n\u0131 s\u00fcrekli izlemek i\u00e7in Prometheus, Grafana veya New Relic gibi izleme ara\u00e7lar\u0131n\u0131 kullan\u0131n. Bu ara\u00e7lar, performans darbo\u011fazlar\u0131n\u0131 erken tespit etmenize ve proaktif \u00f6nlemler alman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<\/blockquote>\n<h3>Otomatik Da\u011f\u0131t\u0131m (CI\/CD) Entegrasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri hata yapmaya a\u00e7\u0131kt\u0131r ve zaman al\u0131c\u0131d\u0131r. S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) boru hatlar\u0131, kod de\u011fi\u015fikliklerini otomatik olarak test etme ve \u00fcretim ortam\u0131na da\u011f\u0131tma yetene\u011fi sa\u011flayarak bu sorunlar\u0131 \u00e7\u00f6zer. Bu, geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131rken hatalar\u0131 azalt\u0131r.<\/p>\n<p>Basit bir CI\/CD ak\u0131\u015f\u0131 genellikle \u015funlar\u0131 i\u00e7erir:<\/p>\n<ol>\n<li>Geli\u015ftirici kodu Git deposuna (GitHub, GitLab, Bitbucket) g\u00f6nderir.<\/li>\n<li>CI\/CD arac\u0131 (GitHub Actions, GitLab CI\/CD, Jenkins) bu de\u011fi\u015fikli\u011fi alg\u0131lar.<\/li>\n<li>Kod testleri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r (birim testleri, entegrasyon testleri).<\/li>\n<li>Testler ba\u015far\u0131l\u0131 olursa, uygulama derlenir (e\u011fer varsa) ve \u00fcretim sunucusuna da\u011f\u0131t\u0131l\u0131r.<\/li>\n<\/ol>\n<p>\u00d6rnek bir GitHub Actions da\u011f\u0131t\u0131m beti\u011fi (basitle\u015ftirilmi\u015f):<\/p>\n<pre><code>\n<pre><code>\nname: Deploy Node.js App to Production\n\non:\n  push:\n    branches:\n      - main # main branch'ine yap\u0131lan push'larda tetiklenir\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout code\n      uses: actions\/checkout@v2\n\n    - name: Setup Node.js\n      uses: actions\/setup-node@v2\n      with:\n        node-version: '16' # Kullan\u0131lan Node.js versiyonu\n\n    - name: Install dependencies\n      run: npm install --production\n\n    - name: SSH into server and deploy\n      uses: appleboy\/ssh-action@master\n      with:\n        host: ${{ secrets.SSH_HOST }}\n        username: ${{ secrets.SSH_USERNAME }}\n        key: ${{ secrets.SSH_PRIVATE_KEY }}\n        script: |\n          cd \/home\/nodeappuser\/my-app\n          git pull origin main\n          npm install --production\n          pm2 reload my-node-app --env production # PM2 ile uygulamay\u0131 kesintisiz yeniden y\u00fckle\n<\/code><\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, GitHub Secrets kullanarak hassas bilgileri (SSH host, username, private key) g\u00fcvenli bir \u015fekilde sakl\u0131yoruz. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, bu beti\u011fi daha fazla test, linting ve hata kontrol\u00fc ad\u0131mlar\u0131yla geni\u015fletebilirsiniz.<\/p>\n<p>G\u00fcvenlik ve performans optimizasyonlar\u0131, uygulaman\u0131z\u0131n \u00fcretimde uzun \u00f6m\u00fcrl\u00fc ve ba\u015far\u0131l\u0131 olmas\u0131n\u0131n anahtar\u0131d\u0131r. S\u00fcrekli izleme ve proaktif yakla\u015f\u0131mlar, olas\u0131 sorunlar\u0131 b\u00fcy\u00fcmeden \u00e7\u00f6zmenize yard\u0131mc\u0131 olacakt\u0131r. CI\/CD entegrasyonu ise bu s\u00fcreci otomatikle\u015ftirerek insan hatas\u0131n\u0131 minimize eder ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi h\u0131zland\u0131r\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ba\u015far\u0131yla da\u011f\u0131tmak i\u00e7in gereken ad\u0131mlar\u0131 ve en iyi uygulamalar\u0131 derinlemesine inceledik. Sunucu haz\u0131rl\u0131\u011f\u0131ndan ba\u015flayarak, Node.js ve PM2 ile uygulama y\u00f6netimine, Nginx ile ters proxy yap\u0131land\u0131rmas\u0131ndan SSL\/TLS g\u00fcvenli\u011fine ve son olarak g\u00fcvenlik ile performans optimizasyonlar\u0131na kadar bir\u00e7ok kritik konuya de\u011findik. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n sadece \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flamak de\u011fil, ayn\u0131 zamanda g\u00fcvenli, kararl\u0131, y\u00fcksek performansl\u0131 ve kolay y\u00f6netilebilir bir yap\u0131ya sahip olmas\u0131n\u0131 sa\u011flamakt\u0131r.<\/p>\n<p>Unutmay\u0131n ki \u00fcretim ortam\u0131 kurulumu tek seferlik bir i\u015flem de\u011fildir. S\u00fcrekli izleme, d\u00fczenli g\u00fcncellemeler ve g\u00fcvenlik denetimleri, uygulaman\u0131z\u0131n uzun vadeli ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6neme sahiptir. Bu rehberdeki bilgileri uygulayarak, Node.js projelerinizi g\u00fcvenle canl\u0131ya alabilir ve kullan\u0131c\u0131lara kesintisiz bir deneyim sunabilirsiniz. Ba\u015far\u0131lar dileriz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>Node.js uygulamam\u0131 PM2 olmadan \u00e7al\u0131\u015ft\u0131rabilir miyim?<\/dt>\n<dd>Evet, <code>node index.js<\/code> komutuyla do\u011frudan \u00e7al\u0131\u015ft\u0131rabilirsiniz. Ancak bu, \u00fcretim ortam\u0131 i\u00e7in \u00f6nerilmez. PM2 olmadan uygulaman\u0131z \u00e7\u00f6kt\u00fc\u011f\u00fcnde otomatik olarak yeniden ba\u015flamaz, \u00e7ok \u00e7ekirdekli i\u015flemcilerden faydalanamaz ve log y\u00f6netimi gibi kritik \u00f6zelliklerden mahrum kal\u0131rs\u0131n\u0131z. PM2, \u00fcretimde kararl\u0131l\u0131k ve performans i\u00e7in vazge\u00e7ilmezdir.<\/dd>\n<dt>G\u00fcvenlik neden bu kadar \u00f6nemli, geli\u015ftirme ortam\u0131ndaki gibi b\u0131rakamaz m\u0131y\u0131m?<\/dt>\n<dd>Kesinlikle hay\u0131r. Geli\u015ftirme ortam\u0131 genellikle izole ve d\u00fc\u015f\u00fck riskli bir ortamd\u0131r. \u00dcretim ortam\u0131 ise herkese a\u00e7\u0131k ve potansiyel sald\u0131r\u0131lara maruz kalan bir aland\u0131r. Zay\u0131f g\u00fcvenlik, veri ihlallerine, hizmet kesintilerine, k\u00f6t\u00fc ama\u00e7l\u0131 yaz\u0131l\u0131m bula\u015fmalar\u0131na ve itibar kayb\u0131na yol a\u00e7abilir. G\u00fcvenlik duvar\u0131, SSH g\u00fc\u00e7lendirmesi ve ortam de\u011fi\u015fkeni y\u00f6netimi gibi ad\u0131mlar, uygulaman\u0131z\u0131 ve verilerinizi korumak i\u00e7in zorunludur.<\/dd>\n<dt>Performans i\u00e7in Nginx ve PM2 d\u0131\u015f\u0131nda ba\u015fka ne yapabilirim?<\/dt>\n<dd>Performans\u0131 art\u0131rmak i\u00e7in birka\u00e7 ek ad\u0131m atabilirsiniz:<\/p>\n<ul>\n<li><strong>Veritaban\u0131 Optimizasyonu:<\/strong> Sorgular\u0131n\u0131z\u0131 optimize edin, do\u011fru indeksleri kullan\u0131n ve veritaban\u0131 ba\u011flant\u0131 havuzu (connection pooling) kullan\u0131n.<\/li>\n<li><strong>\u00d6nbellekleme:<\/strong> Redis veya Memcached gibi bir \u00f6nbellek sunucusu kullanarak s\u0131k eri\u015filen verileri \u00f6nbelle\u011fe al\u0131n.<\/li>\n<li><strong>CDN (Content Delivery Network):<\/strong> Statik dosyalar\u0131n\u0131z\u0131 (resimler, CSS, JS) global bir CDN \u00fczerinden sunarak y\u00fckleme s\u00fcrelerini azalt\u0131n.<\/li>\n<li><strong>Kod Optimizasyonu:<\/strong> Node.js kodunuzdaki darbo\u011fazlar\u0131 tespit edin (profilleme ara\u00e7lar\u0131yla) ve optimize edin. Bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 kontrol edin.<\/li>\n<li><strong>HTTP\/2 Kullan\u0131m\u0131:<\/strong> Nginx ile HTTP\/2&#8217;yi etkinle\u015ftirerek daha h\u0131zl\u0131 ve verimli ileti\u015fim sa\u011flay\u0131n.<\/li>\n<\/ul>\n<\/dd>\n<dt>Node.js uygulamam\u0131 g\u00fcncellerken kesinti ya\u015famak istemiyorum, nas\u0131l yapabilirim?<\/dt>\n<dd>PM2&#8217;nin <code>pm2 reload my-node-app<\/code> komutunu kullanabilirsiniz. Bu komut, uygulaman\u0131z\u0131n yeni s\u00fcr\u00fcm\u00fcn\u00fc ba\u015flat\u0131rken eski s\u00fcr\u00fcm\u00fcn hala istekleri i\u015flemesine izin verir. Yeni s\u00fcr\u00fcm ba\u015far\u0131yla ba\u015flat\u0131ld\u0131\u011f\u0131nda, eski s\u00fcr\u00fcm gracefully (zarif\u00e7e) kapat\u0131l\u0131r. Bu sayede kullan\u0131c\u0131lar, uygulama g\u00fcncellemesi s\u0131ras\u0131nda herhangi bir kesinti ya\u015famazlar. CI\/CD boru hatlar\u0131n\u0131 kullanarak bu s\u00fcreci otomatikle\u015ftirmeniz de m\u00fcmk\u00fcnd\u00fcr.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js Uygulamas\u0131n\u0131 Ubuntu \u00dczerinde \u00dcretim Ortam\u0131na Kurulum Rehberi Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak&hellip;","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":[136],"tags":[],"class_list":{"0":"post-36163","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?<\/title>\n<meta name=\"description\" content=\"Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak bu, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda da ayn\u0131 performans\u0131 ve g\u00fcvenilirli\u011fi sunaca\u011f\u0131 anlam\u0131na gelmez. Bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131mak, g\u00fcvenlikten performansa, kesintisiz \u00e7al\u0131\u015fmadan kolay y\u00f6netilebilirli\u011fe kadar bir\u00e7ok kritik fakt\u00f6r\u00fc beraberinde getirir. Bu rehber, uygulaman\u0131z\u0131n canl\u0131ya al\u0131nma s\u00fcrecini ad\u0131m ad\u0131m, en iyi uygulamalarla ve pratik \u00f6rneklerle ele alarak, s\u0131f\u0131rdan uzman seviyesine kadar bilgi edinmenizi sa\u011flayacakt\u0131r.\" \/>\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\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak bu, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda da ayn\u0131 performans\u0131 ve g\u00fcvenilirli\u011fi sunaca\u011f\u0131 anlam\u0131na gelmez. Bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131mak, g\u00fcvenlikten performansa, kesintisiz \u00e7al\u0131\u015fmadan kolay y\u00f6netilebilirli\u011fe kadar bir\u00e7ok kritik fakt\u00f6r\u00fc beraberinde getirir. Bu rehber, uygulaman\u0131z\u0131n canl\u0131ya al\u0131nma s\u00fcrecini ad\u0131m ad\u0131m, en iyi uygulamalarla ve pratik \u00f6rneklerle ele alarak, s\u0131f\u0131rdan uzman seviyesine kadar bilgi edinmenizi sa\u011flayacakt\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-09T09:23:53+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=\"30 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?\",\"datePublished\":\"2025-12-09T09:23:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/\"},\"wordCount\":5158,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/\",\"name\":\"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-09T09:23:53+00:00\",\"description\":\"Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak bu, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda da ayn\u0131 performans\u0131 ve g\u00fcvenilirli\u011fi sunaca\u011f\u0131 anlam\u0131na gelmez. Bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131mak, g\u00fcvenlikten performansa, kesintisiz \u00e7al\u0131\u015fmadan kolay y\u00f6netilebilirli\u011fe kadar bir\u00e7ok kritik fakt\u00f6r\u00fc beraberinde getirir. Bu rehber, uygulaman\u0131z\u0131n canl\u0131ya al\u0131nma s\u00fcrecini ad\u0131m ad\u0131m, en iyi uygulamalarla ve pratik \u00f6rneklerle ele alarak, s\u0131f\u0131rdan uzman seviyesine kadar bilgi edinmenizi sa\u011flayacakt\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?\"}]},{\"@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":"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?","description":"Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak bu, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda da ayn\u0131 performans\u0131 ve g\u00fcvenilirli\u011fi sunaca\u011f\u0131 anlam\u0131na gelmez. Bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131mak, g\u00fcvenlikten performansa, kesintisiz \u00e7al\u0131\u015fmadan kolay y\u00f6netilebilirli\u011fe kadar bir\u00e7ok kritik fakt\u00f6r\u00fc beraberinde getirir. Bu rehber, uygulaman\u0131z\u0131n canl\u0131ya al\u0131nma s\u00fcrecini ad\u0131m ad\u0131m, en iyi uygulamalarla ve pratik \u00f6rneklerle ele alarak, s\u0131f\u0131rdan uzman seviyesine kadar bilgi edinmenizi sa\u011flayacakt\u0131r.","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\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?","og_description":"Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak bu, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda da ayn\u0131 performans\u0131 ve g\u00fcvenilirli\u011fi sunaca\u011f\u0131 anlam\u0131na gelmez. Bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131mak, g\u00fcvenlikten performansa, kesintisiz \u00e7al\u0131\u015fmadan kolay y\u00f6netilebilirli\u011fe kadar bir\u00e7ok kritik fakt\u00f6r\u00fc beraberinde getirir. Bu rehber, uygulaman\u0131z\u0131n canl\u0131ya al\u0131nma s\u00fcrecini ad\u0131m ad\u0131m, en iyi uygulamalarla ve pratik \u00f6rneklerle ele alarak, s\u0131f\u0131rdan uzman seviyesine kadar bilgi edinmenizi sa\u011flayacakt\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-09T09:23:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"30 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?","datePublished":"2025-12-09T09:23:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/"},"wordCount":5158,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/","name":"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-09T09:23:53+00:00","description":"Node.js uygulamalar\u0131n\u0131z\u0131 geli\u015ftirme ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131yor olabilirsiniz, ancak bu, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda da ayn\u0131 performans\u0131 ve g\u00fcvenilirli\u011fi sunaca\u011f\u0131 anlam\u0131na gelmez. Bir Node.js uygulamas\u0131n\u0131 Ubuntu sunucusu \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131mak, g\u00fcvenlikten performansa, kesintisiz \u00e7al\u0131\u015fmadan kolay y\u00f6netilebilirli\u011fe kadar bir\u00e7ok kritik fakt\u00f6r\u00fc beraberinde getirir. Bu rehber, uygulaman\u0131z\u0131n canl\u0131ya al\u0131nma s\u00fcrecini ad\u0131m ad\u0131m, en iyi uygulamalarla ve pratik \u00f6rneklerle ele alarak, s\u0131f\u0131rdan uzman seviyesine kadar bilgi edinmenizi sa\u011flayacakt\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamanizi-uretim-ortamina-tasimak-neden-hayati-onem-tasir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js Uygulaman\u0131z\u0131 \u00dcretim Ortam\u0131na Ta\u015f\u0131mak Neden Hayati \u00d6nem Ta\u015f\u0131r?"}]},{"@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\/36163","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=36163"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36163\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36163"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36163"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36163"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}