{"id":31346,"date":"2025-10-08T22:41:15","date_gmt":"2025-10-08T19:41:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31346"},"modified":"2025-10-08T22:41:15","modified_gmt":"2025-10-08T19:41:15","slug":"node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/","title":{"rendered":"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi<\/h2>\n<p>Node.js, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bir JavaScript \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. H\u0131zl\u0131, \u00f6l\u00e7eklenebilir ve olay tabanl\u0131 mimarisi sayesinde sunucu taraf\u0131 uygulamalar, API&#8217;ler ve ger\u00e7ek zamanl\u0131 servisler olu\u015fturmak i\u00e7in idealdir. Ancak bir Node.js uygulamas\u0131n\u0131 geli\u015ftirme ortam\u0131ndan \u00fcretim ortam\u0131na ta\u015f\u0131mak, performans, g\u00fcvenlik ve kararl\u0131l\u0131k gibi bir\u00e7ok fakt\u00f6r\u00fc g\u00f6z \u00f6n\u00fcnde bulundurmay\u0131 gerektirir. Bu kapsaml\u0131 rehberde, Node.js uygulaman\u0131z\u0131 Ubuntu 18.04 sunucusu \u00fczerinde \u00fcretim ortam\u0131 i\u00e7in nas\u0131l ad\u0131m ad\u0131m kuraca\u011f\u0131n\u0131z\u0131, yap\u0131land\u0131raca\u011f\u0131n\u0131z\u0131 ve optimize edece\u011finizi detayl\u0131 bir \u015fekilde anlataca\u011f\u0131z.<\/p>\n<p>Ubuntu 18.04 (Bionic Beaver), uzun s\u00fcreli destek (LTS) sunan stabil bir i\u015fletim sistemi oldu\u011fu i\u00e7in \u00fcretim sunucular\u0131 i\u00e7in s\u0131k\u00e7a tercih edilir. Bu rehber, temel sunucu kurulumundan ba\u015flayarak, Node.js ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00f6netimi, uygulama s\u00fcre\u00e7lerinin s\u00fcrekli \u00e7al\u0131\u015f\u0131r halde tutulmas\u0131, ters proxy yap\u0131land\u0131rmas\u0131, SSL \u015fifrelemesi ve g\u00fcvenlik en iyi uygulamalar\u0131na kadar t\u00fcm kritik ad\u0131mlar\u0131 ele alacakt\u0131r.<\/p>\n<h3>1. Sunucu Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Node.js uygulaman\u0131z\u0131 kurmaya ba\u015flamadan \u00f6nce Ubuntu sunucunuzun temel haz\u0131rl\u0131klar\u0131n\u0131 tamamlaman\u0131z gerekmektedir. Bu ad\u0131mlar, sunucunuzun g\u00fcvenli\u011fini ve g\u00fcncelli\u011fini sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>1.1. Ubuntu Sistemini G\u00fcncelleme<\/h4>\n<p>\u0130lk ad\u0131m, sunucunuzdaki paket listelerini g\u00fcncellemek ve mevcut paketleri en son s\u00fcr\u00fcmlerine y\u00fckseltmektir. Bu, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapat\u0131r ve yaz\u0131l\u0131m uyumlulu\u011funu art\u0131r\u0131r.<\/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 t\u00fcm y\u00fckl\u00fc paketleri onay istemeden y\u00fckseltir.<\/p>\n<h4>1.2. G\u00fcvenlik Duvar\u0131 (UFW) Kurulumu ve Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Bir g\u00fcvenlik duvar\u0131, sunucunuza gelen ve giden a\u011f trafi\u011fini kontrol ederek istenmeyen eri\u015fimi engeller. Ubuntu&#8217;da UFW (Uncomplicated Firewall) kullan\u0131m\u0131 olduk\u00e7a kolayd\u0131r.<\/p>\n<p>SSH ba\u011flant\u0131n\u0131z\u0131n kesilmemesi i\u00e7in \u00f6ncelikle SSH portuna izin vermelisiniz (varsay\u0131lan 22). Ard\u0131ndan HTTP (80) ve HTTPS (443) portlar\u0131na da izin vererek web trafi\u011fini sa\u011flay\u0131n.<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow OpenSSH\nsudo ufw enable\nsudo ufw allow http\nsudo ufw allow https\nsudo ufw status<\/code><\/pre>\n<p><code>sudo ufw enable<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra bir uyar\u0131 alacaks\u0131n\u0131z. Bu komutun SSH ba\u011flant\u0131n\u0131z\u0131 kesebilece\u011fini belirtecektir. Ancak <code>ufw allow OpenSSH<\/code> komutunu \u00f6nceden verdi\u011fimiz i\u00e7in g\u00fcvenle <code>y<\/code> tu\u015funa bas\u0131p onaylayabilirsiniz. <code>sudo ufw status<\/code> komutu, g\u00fcvenlik duvar\u0131n\u0131z\u0131n durumunu ve hangi portlar\u0131n a\u00e7\u0131k oldu\u011funu g\u00f6sterir.<\/p>\n<h4>1.3. SSH Anahtar \u00c7ifti Olu\u015fturma ve Kullanma (\u00d6nerilen)<\/h4>\n<p>Parola tabanl\u0131 kimlik do\u011frulama yerine SSH anahtar \u00e7iftleri kullanmak, sunucu g\u00fcvenli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Kendi yerel makinenizde bir anahtar \u00e7ifti olu\u015fturup (e\u011fer yoksa) genel anahtar\u0131 sunucunuza kopyalayabilirsiniz.<\/p>\n<p>Yerel makinenizde:<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096<\/code><\/pre>\n<p>Sunucuya genel anahtar\u0131 kopyalama:<\/p>\n<pre><code class=\"language-bash\">ssh-copy-id kullan\u0131c\u0131ad\u0131@sunucu_ip_adresi<\/code><\/pre>\n<p>Ard\u0131ndan, sunucunuzda SSH yap\u0131land\u0131rma dosyas\u0131n\u0131 d\u00fczenleyerek parola tabanl\u0131 kimlik do\u011frulamay\u0131 devre d\u0131\u015f\u0131 b\u0131rakabilirsiniz (<code>\/etc\/ssh\/sshd_config<\/code> i\u00e7inde <code>PasswordAuthentication no<\/code> olarak ayarlay\u0131n ve <code>sudo systemctl restart ssh<\/code> ile servisi yeniden ba\u015flat\u0131n). Bu ad\u0131m, brute-force sald\u0131r\u0131lar\u0131na kar\u015f\u0131 ek bir koruma sa\u011flar.<\/p>\n<h3>2. Node.js ve npm Kurulumu<\/h3>\n<p>Node.js uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Node.js \u00e7al\u0131\u015fma zaman\u0131na ve paket y\u00f6neticisi npm&#8217;e (Node Package Manager) ihtiyac\u0131n\u0131z var. Node.js kurulumu i\u00e7in iki yayg\u0131n y\u00f6ntem bulunmaktad\u0131r: NVM (Node Version Manager) kullanmak veya APT paket y\u00f6neticisi ile do\u011frudan kurmak. NVM, farkl\u0131 Node.js versiyonlar\u0131 aras\u0131nda kolayca ge\u00e7i\u015f yapma imkan\u0131 sundu\u011fu i\u00e7in \u00fcretim ortamlar\u0131 da dahil olmak \u00fczere genellikle tercih edilen y\u00f6ntemdir.<\/p>\n<h4>2.1. NVM (Node Version Manager) ile Kurulum (\u00d6nerilen)<\/h4>\n<p>NVM, tek bir sunucuda birden fazla Node.js s\u00fcr\u00fcm\u00fcn\u00fc y\u00f6netmenize olanak tan\u0131r. Bu, farkl\u0131 projelerinizin farkl\u0131 Node.js s\u00fcr\u00fcmlerine ihtiya\u00e7 duymas\u0131 durumunda veya yeni Node.js s\u00fcr\u00fcmlerini test etmek istedi\u011finizde olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>NVM&#8217;yi kurmak i\u00e7in, GitHub deposundan en son kurulum script&#8217;ini indirebilir ve \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/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>(Not: <code>v0.39.1<\/code> yerine en son NVM s\u00fcr\u00fcm\u00fcn\u00fc kontrol edip kullanman\u0131z \u00f6nerilir.)<\/p>\n<p>Kurulum script&#8217;i, NVM&#8217;yi kullan\u0131c\u0131 dizininize kuracak ve kabuk yap\u0131land\u0131rma dosyan\u0131za (\u00f6rn. <code>.bashrc<\/code>, <code>.zshrc<\/code>) ilgili sat\u0131rlar\u0131 ekleyecektir. Kurulum tamamland\u0131ktan sonra, NVM&#8217;nin \u00e7al\u0131\u015fmas\u0131 i\u00e7in terminal oturumunuzu yeniden ba\u015flatman\u0131z veya yap\u0131land\u0131rma dosyan\u0131z\u0131 kaynak g\u00f6stermeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">source ~\/.bashrc<\/code><\/pre>\n<p>NVM&#8217;nin do\u011fru bir \u015fekilde kuruldu\u011funu do\u011frulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">nvm --version<\/code><\/pre>\n<p>\u015eimdi Node.js&#8217;nin en son LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fcn\u00fc NVM ile kurabiliriz:<\/p>\n<pre><code class=\"language-bash\">nvm install --lts<\/code><\/pre>\n<p>Bu komut, Node.js&#8217;nin en son LTS s\u00fcr\u00fcm\u00fcn\u00fc kuracak ve varsay\u0131lan olarak kullanmaya ba\u015flayacakt\u0131r. Belirli bir s\u00fcr\u00fcm\u00fc kurmak isterseniz (\u00f6rne\u011fin Node.js 18):<\/p>\n<pre><code class=\"language-bash\">nvm install 18\nnvm use 18\nnvm alias default 18<\/code><\/pre>\n<p><code>nvm use 18<\/code> komutu mevcut oturumunuz i\u00e7in Node.js 18&#8217;i etkinle\u015ftirir. <code>nvm alias default 18<\/code> komutu ise her yeni terminal oturumu a\u00e7t\u0131\u011f\u0131n\u0131zda Node.js 18&#8217;in otomatik olarak kullan\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Kurulumu 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<h4>2.2. Alternatif: Apt Paket Y\u00f6neticisi ile Kurulum<\/h4>\n<p>E\u011fer NVM&#8217;nin esnekli\u011fine ihtiyac\u0131n\u0131z yoksa ve tek bir Node.js s\u00fcr\u00fcm\u00fc sizin i\u00e7in yeterliyse, resmi NodeSource deposunu kullanarak APT ile kurulum yapabilirsiniz. Bu y\u00f6ntem daha basittir ancak farkl\u0131 Node.js s\u00fcr\u00fcmleri aras\u0131nda ge\u00e7i\u015f yapma imkan\u0131 sunmaz.<\/p>\n<p>\u00d6ncelikle, NodeSource deposunu sisteminize ekleyin. A\u015fa\u011f\u0131daki komutlar, Node.js&#8217;nin belirli bir LTS s\u00fcr\u00fcm\u00fcn\u00fc (\u00f6rne\u011fin 18.x) ekleyecektir:<\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/deb.nodesource.com\/setup_18.x | sudo -E bash -<\/code><\/pre>\n<p>(Not: <code>setup_18.x<\/code> yerine kurmak istedi\u011finiz Node.js s\u00fcr\u00fcm\u00fcne uygun <code>setup_XX.x<\/code> adresini kullanmal\u0131s\u0131n\u0131z.)<\/p>\n<p>Depo eklendikten sonra Node.js ve npm&#8217;i kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y nodejs<\/code><\/pre>\n<p>Bu komut, Node.js \u00e7al\u0131\u015fma zaman\u0131n\u0131 ve npm&#8217;i kurar. Apt ile kurulumda <code>npm<\/code> genellikle <code>nodejs<\/code> paketiyle birlikte gelir.<\/p>\n<p>Kurulumu 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>3. Uygulama Dosyalar\u0131n\u0131 Sunucuya Aktarma<\/h3>\n<p>Node.js ve npm kurulumu tamamland\u0131ktan sonra, Node.js uygulaman\u0131z\u0131n kaynak kodunu sunucuya aktarman\u0131z gerekir. Bu i\u015flem i\u00e7in birka\u00e7 y\u00f6ntem bulunmaktad\u0131r.<\/p>\n<h4>3.1. Git Kullanarak (En Yayg\u0131n)<\/h4>\n<p>E\u011fer projeniz bir Git deposunda (GitHub, GitLab, Bitbucket vb.) bar\u0131nd\u0131r\u0131l\u0131yorsa, Git kullanarak sunucuya klonlamak en pratik y\u00f6ntemdir.<\/p>\n<p>\u00d6ncelikle Git&#8217;i kurun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install git -y<\/code><\/pre>\n<p>Ard\u0131ndan, uygulaman\u0131z i\u00e7in uygun bir dizin olu\u015fturun (\u00f6rne\u011fin <code>\/var\/www\/my-app<\/code>) ve bu dizine giderek projenizi klonlay\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/www\/my-app\nsudo chown -R $USER:$USER \/var\/www\/my-app\ncd \/var\/www\/my-app\ngit clone https:\/\/github.com\/kullaniciadi\/projeadi.git .<\/code><\/pre>\n<p><code>chown<\/code> komutu, olu\u015fturdu\u011funuz dizinin sahipli\u011fini mevcut kullan\u0131c\u0131ya verir, b\u00f6ylece dosyalar\u0131 d\u00fczenleme ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleme yetkiniz olur. <code>.git<\/code> ile biten klonlama komutu, deponun i\u00e7eri\u011fini mevcut dizine kopyalar. E\u011fer projeniz \u00f6zel bir depodaysa, SSH anahtarlar\u0131 veya ki\u015fisel eri\u015fim belirte\u00e7leri (PAT) kullanman\u0131z gerekebilir.<\/p>\n<h4>3.2. SCP Kullanarak (K\u00fc\u00e7\u00fck Projeler veya \u0130lk Aktar\u0131m \u0130\u00e7in)<\/h4>\n<p>SCP (Secure Copy Protocol), dosyalar\u0131 SSH \u00fczerinden g\u00fcvenli bir \u015fekilde kopyalamak i\u00e7in kullan\u0131labilir. Bu y\u00f6ntem genellikle daha k\u00fc\u00e7\u00fck projeler veya tek seferlik aktar\u0131mlar i\u00e7in uygundur.<\/p>\n<p>Yerel makinenizden:<\/p>\n<pre><code class=\"language-bash\">scp -r \/yerel\/yol\/projeadi kullan\u0131c\u0131ad\u0131@sunucu_ip_adresi:\/var\/www\/my-app<\/code><\/pre>\n<p>Bu komut, <code>\/yerel\/yol\/projeadi<\/code> dizinindeki t\u00fcm dosyalar\u0131 ve alt dizinleri sunucudaki <code>\/var\/www\/my-app<\/code> dizinine kopyalar.<\/p>\n<h4>3.3. FTP\/SFTP Kullanarak (Daha Az G\u00fcvenli\/Otomasyon \u0130\u00e7in Uygun De\u011fil)<\/h4>\n<p>SFTP, SSH&#8217;nin bir par\u00e7as\u0131 olarak g\u00fcvenli dosya transferi sa\u011flar ve FileZilla gibi GUI ara\u00e7lar\u0131yla kullan\u0131labilir. Ancak otomasyon ve s\u00fcrekli da\u011f\u0131t\u0131m s\u00fcre\u00e7leri i\u00e7in Git veya SCP daha \u00e7ok tercih edilir. FTP ise \u015fifrelenmedi\u011fi i\u00e7in \u00fcretim ortamlar\u0131nda kesinlikle \u00f6nerilmez.<\/p>\n<h3>4. Node.js Uygulamas\u0131n\u0131 Yap\u0131land\u0131rma ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme<\/h3>\n<p>Uygulama dosyalar\u0131n\u0131 sunucuya aktard\u0131ktan sonra, uygulaman\u0131z\u0131 \u00e7al\u0131\u015f\u0131r hale getirmek i\u00e7in gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemeniz ve ortam de\u011fi\u015fkenlerini yap\u0131land\u0131rman\u0131z gerekir.<\/p>\n<h4>4.1. Proje Dizinine Gitme<\/h4>\n<p>Uygulaman\u0131z\u0131n k\u00f6k dizinine gidin:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/my-app<\/code><\/pre>\n<h4>4.2. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme<\/h4>\n<p><code>package.json<\/code> dosyas\u0131nda tan\u0131mlanan t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek i\u00e7in npm&#8217;i kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">npm install --production<\/code><\/pre>\n<p><code>--production<\/code> bayra\u011f\u0131, yaln\u0131zca <code>dependencies<\/code> alt\u0131nda listelenen paketleri y\u00fckler ve <code>devDependencies<\/code> alt\u0131ndaki geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 atlar. Bu, \u00fcretim ortam\u0131nda gereksiz paketlerin y\u00fcklenmesini \u00f6nler ve disk alan\u0131ndan tasarruf sa\u011flar.<\/p>\n<h4>4.3. Ortam De\u011fi\u015fkenleri<\/h4>\n<p>Node.js uygulamalar\u0131 genellikle veritaban\u0131 ba\u011flant\u0131 bilgileri, API anahtarlar\u0131 veya uygulama portu gibi hassas veya ortama \u00f6zg\u00fc bilgileri ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netir. Bu, kodunuzu de\u011fi\u015ftirmeden farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) farkl\u0131 yap\u0131land\u0131rmalar kullanman\u0131za olanak tan\u0131r.<\/p>\n<p>*   <strong><code>.env<\/code> Dosyas\u0131 (dotenv ile):<\/strong> E\u011fer uygulaman\u0131z <code>dotenv<\/code> paketi kullan\u0131yorsa, proje dizininizin k\u00f6k\u00fcnde bir <code>.env<\/code> dosyas\u0131 olu\u015fturup ortam de\u011fi\u015fkenlerinizi buraya yazabilirsiniz:<\/p>\n<pre><code class=\"language-\">PORT=3000\n    DB_HOST=localhost\n    DB_USER=myuser\n    DB_PASS=mypassword\n    NODE_ENV=production<\/code><\/pre>\n<p>    <code>.env<\/code> dosyas\u0131n\u0131 <code>git ignore<\/code> listenize ekleyerek depoya y\u00fcklememeye \u00f6zen g\u00f6sterin.<\/p>\n<p>*   <strong>Sistem Ortam De\u011fi\u015fkenleri:<\/strong> Ortam de\u011fi\u015fkenlerini do\u011frudan sunucu ortam\u0131na da ayarlayabilirsiniz. Bu, \u00f6zellikle hassas veriler i\u00e7in daha g\u00fcvenli olabilir. <code>systemd<\/code> servis dosyas\u0131nda veya PM2 yap\u0131land\u0131rmas\u0131nda bu de\u011fi\u015fkenleri tan\u0131mlayabilirsiniz. Ge\u00e7ici olarak ayarlamak i\u00e7in <code>export<\/code> komutunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">export PORT=3000\n    export NODE_ENV=production<\/code><\/pre>\n<p>    Ancak bu de\u011fi\u015fkenler oturum kapand\u0131\u011f\u0131nda kaybolur. Kal\u0131c\u0131 hale getirmek i\u00e7in PM2 veya systemd servis dosyalar\u0131nda tan\u0131mlamak en iyi yoldur.<\/p>\n<h4>4.4. Uygulaman\u0131n Test Edilmesi<\/h4>\n<p>Uygulaman\u0131z\u0131n do\u011fru bir \u015fekilde kuruldu\u011fundan ve \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in ge\u00e7ici olarak ba\u015flatabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">npm start\n<h2>veya<\/h2>\nnode app.js<\/code><\/pre>\n<p>(Uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 dosyas\u0131 <code>app.js<\/code> veya <code>server.js<\/code> gibi farkl\u0131 bir isimde olabilir.)<\/p>\n<p>Uygulaman\u0131z\u0131n belirledi\u011finiz portta (\u00f6rne\u011fin 3000) \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n. <code>curl http:\/\/localhost:3000<\/code> komutu ile veya bir web taray\u0131c\u0131s\u0131ndan <code>http:\/\/sunucu_ip_adresi:3000<\/code> adresine giderek test edebilirsiniz. Test tamamland\u0131\u011f\u0131nda <code>Ctrl+C<\/code> ile uygulamay\u0131 durdurabilirsiniz.<\/p>\n<h3>5. Uygulamay\u0131 S\u00fcrekli \u00c7al\u0131\u015f\u0131r Halde Tutma<\/h3>\n<p>\u00dcretim ortam\u0131nda bir Node.js uygulamas\u0131n\u0131n s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 hayati \u00f6nem ta\u015f\u0131r. Uygulama \u00e7\u00f6kse bile otomatik olarak yeniden ba\u015flat\u0131lmal\u0131 ve sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda da otomatik olarak ba\u015flamal\u0131d\u0131r. Bu g\u00f6revi yerine getirmek i\u00e7in PM2 veya <code>systemd<\/code> servisleri kullan\u0131labilir.<\/p>\n<h4>5.1. PM2 Kurulumu ve Kullan\u0131m\u0131 (\u00d6nerilen S\u00fcre\u00e7 Y\u00f6neticisi)<\/h4>\n<p>PM2, Node.js uygulamalar\u0131 i\u00e7in pop\u00fcler bir s\u00fcre\u00e7 y\u00f6neticisidir. Uygulamalar\u0131 arka planda \u00e7al\u0131\u015ft\u0131r\u0131r, \u00e7\u00f6kt\u00fc\u011f\u00fcnde otomatik olarak yeniden ba\u015flat\u0131r, loglar\u0131 y\u00f6netir ve performans\u0131 izler.<\/p>\n<p>PM2&#8217;yi global olarak kurun:<\/p>\n<pre><code class=\"language-bash\">npm install pm2 -g<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131 PM2 ile ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">pm2 start \/var\/www\/my-app\/app.js --name \"my-node-app\"<\/code><\/pre>\n<p><code>\/var\/www\/my-app\/app.js<\/code> yerine uygulaman\u0131z\u0131n ana giri\u015f dosyas\u0131n\u0131n yolunu belirtmelisiniz. <code>--name<\/code> bayra\u011f\u0131 ile uygulaman\u0131za okunabilir bir isim verebilirsiniz.<\/p>\n<p>Uygulaman\u0131z\u0131n <code>package.json<\/code> dosyas\u0131nda bir <code>start<\/code> script&#8217;iniz varsa, PM2&#8217;yi bu script&#8217;i kullanarak da ba\u015flatabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/my-app\npm2 start npm --name \"my-node-app\" -- run start<\/code><\/pre>\n<p>PM2, uygulaman\u0131z\u0131 varsay\u0131lan olarak <code>cluster<\/code> modunda ba\u015flatmayacakt\u0131r. \u00c7oklu \u00e7ekirdeklerden faydalanmak ve daha y\u00fcksek performans elde etmek i\u00e7in <code>cluster<\/code> modunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pm2 start app.js -i max --name \"my-node-app\"<\/code><\/pre>\n<p><code>-i max<\/code> bayra\u011f\u0131, PM2&#8217;nin CPU \u00e7ekirdek say\u0131s\u0131 kadar uygulama \u00f6rne\u011fi ba\u015flatmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>PM2 komutlar\u0131:<br \/>\n*   <code>pm2 list<\/code>: \u00c7al\u0131\u015fan t\u00fcm PM2 s\u00fcre\u00e7lerini listeler.<br \/>\n*   <code>pm2 logs<\/code>: Uygulaman\u0131z\u0131n loglar\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <code>pm2 monit<\/code>: Uygulamalar\u0131n\u0131z\u0131n CPU, bellek kullan\u0131m\u0131n\u0131 ger\u00e7ek zamanl\u0131 izler.<br \/>\n*   <code>pm2 stop my-node-app<\/code>: Uygulamay\u0131 durdurur.<br \/>\n*   <code>pm2 restart my-node-app<\/code>: Uygulamay\u0131 yeniden ba\u015flat\u0131r.<br \/>\n*   <code>pm2 delete my-node-app<\/code>: Uygulamay\u0131 PM2 listesinden siler.<\/p>\n<p><strong>Otomatik Ba\u015flang\u0131\u00e7 (Startup Script):<\/strong><br \/>\nSunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda PM2 ve y\u00f6netti\u011fi uygulamalar\u0131n otomatik olarak ba\u015flamas\u0131 i\u00e7in bir startup script&#8217;i olu\u015fturman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">pm2 startup systemd\npm2 save<\/code><\/pre>\n<p><code>pm2 startup systemd<\/code> komutu, PM2&#8217;nin sunucu a\u00e7\u0131l\u0131\u015f\u0131nda otomatik olarak ba\u015flamas\u0131 i\u00e7in bir <code>systemd<\/code> servisi olu\u015fturur. <code>pm2 save<\/code> komutu ise mevcut PM2 s\u00fcre\u00e7 listesini kaydeder, b\u00f6ylece sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda bu s\u00fcre\u00e7ler otomatik olarak ba\u015flat\u0131l\u0131r.<\/p>\n<h4>5.2. Alternatif: systemd Servisi Olarak \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>PM2 kullanmak istemiyorsan\u0131z, Node.js uygulaman\u0131z\u0131 do\u011frudan bir <code>systemd<\/code> servisi olarak da yap\u0131land\u0131rabilirsiniz. Bu, daha d\u00fc\u015f\u00fck seviyeli bir kontrol sa\u011flar ancak PM2&#8217;nin sundu\u011fu izleme ve y\u00f6netim \u00f6zelliklerinden yoksundur.<\/p>\n<p>Uygulaman\u0131z i\u00e7in bir <code>systemd<\/code> servis dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/systemd\/system\/my-node-app.service<\/code><\/pre>\n<p>Dosyaya a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin (yollar\u0131 ve kullan\u0131c\u0131 ad\u0131n\u0131 kendi ortam\u0131n\u0131za g\u00f6re d\u00fczenleyin):<\/p>\n<pre><code class=\"language-ini\">[Unit]\nDescription=My Node.js Application\nAfter=network.target\n\n[Service]\nUser=www-data             # Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 kullan\u0131c\u0131 (daha g\u00fcvenli)\nWorkingDirectory=\/var\/www\/my-app\nExecStart=\/usr\/bin\/node \/var\/www\/my-app\/app.js\nRestart=always\nRestartSec=10\nStandardOutput=syslog\nStandardError=syslog\nSyslogIdentifier=my-node-app\nEnvironment=NODE_ENV=production PORT=3000\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>*   <code>User<\/code>: Uygulaman\u0131n hangi kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. <code>root<\/code> olarak \u00e7al\u0131\u015ft\u0131rmaktan ka\u00e7\u0131n\u0131n. <code>www-data<\/code> genellikle iyi bir se\u00e7enektir.<br \/>\n*   <code>WorkingDirectory<\/code>: Uygulaman\u0131z\u0131n k\u00f6k dizini.<br \/>\n*   <code>ExecStart<\/code>: Node.js y\u00fcr\u00fct\u00fclebilir dosyas\u0131n\u0131n yolu ve uygulaman\u0131z\u0131n ana giri\u015f dosyas\u0131n\u0131n yolu. NVM kullan\u0131yorsan\u0131z, buradaki <code>\/usr\/bin\/node<\/code> yolunu NVM&#8217;nin Node.js y\u00fcr\u00fct\u00fclebilir dosyas\u0131n\u0131n yoluna (<code>\/home\/kullaniciadi\/.nvm\/versions\/node\/vXX.X.X\/bin\/node<\/code>) de\u011fi\u015ftirmelisiniz. Bu yolu <code>which node<\/code> komutuyla bulabilirsiniz.<br \/>\n*   <code>Environment<\/code>: Ortam de\u011fi\u015fkenlerini burada do\u011frudan tan\u0131mlayabilirsiniz.<br \/>\n*   <code>Restart=always<\/code>: Uygulama \u00e7\u00f6kerse otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Dosyay\u0131 kaydedip kapat\u0131n. Ard\u0131ndan <code>systemd<\/code>&#8216;yi yeniden y\u00fckleyin, servisi ba\u015flat\u0131n ve otomatik ba\u015flatma i\u00e7in etkinle\u015ftirin:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl start my-node-app\nsudo systemctl enable my-node-app\nsudo systemctl status my-node-app<\/code><\/pre>\n<p><code>sudo systemctl status my-node-app<\/code> komutu, servisinizin durumunu kontrol etmenizi sa\u011flar.<\/p>\n<h3>6. Ters Proxy (Reverse Proxy) Kurulumu<\/h3>\n<p>Node.js uygulamalar\u0131n\u0131z\u0131 do\u011frudan internete a\u00e7mak yerine, bir ters proxy (Nginx gibi) kullanmak en iyi uygulamad\u0131r. Ters proxy, istemci isteklerini al\u0131r ve bunlar\u0131 Node.js uygulaman\u0131za y\u00f6nlendirir. Bu, bir\u00e7ok avantaj sa\u011flar:<\/p>\n<p>*   <strong>Y\u00fck Dengeleme:<\/strong> Birden fazla Node.js s\u00fcrecini y\u00f6netebilir.<br \/>\n*   <strong>SSL Sonland\u0131rma:<\/strong> SSL sertifikalar\u0131n\u0131 y\u00f6netebilir ve \u015fifrelemeyi sa\u011flayabilir.<br \/>\n*   <strong>Statik Dosya Sunma:<\/strong> Resimler, CSS, JavaScript gibi statik dosyalar\u0131 daha verimli bir \u015fekilde sunabilir.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> DDoS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma, IP k\u0131s\u0131tlamalar\u0131 gibi g\u00fcvenlik katmanlar\u0131 ekleyebilir.<br \/>\n*   <strong>Port Y\u00f6netimi:<\/strong> Node.js uygulaman\u0131z\u0131n farkl\u0131 bir portta (\u00f6rne\u011fin 3000) \u00e7al\u0131\u015fmas\u0131na izin verirken, Nginx standart HTTP (80) ve HTTPS (443) portlar\u0131ndan hizmet verebilir.<\/p>\n<h4>6.1. Nginx Kurulumu<\/h4>\n<p>Nginx&#8217;i kurmak i\u00e7in APT paket y\u00f6neticisini kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo apt install nginx -y<\/code><\/pre>\n<p>Nginx servisini ba\u015flat\u0131n ve otomatik ba\u015flamas\u0131 i\u00e7in etkinle\u015ftirin:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl start nginx\nsudo systemctl enable nginx<\/code><\/pre>\n<h4>6.2. Nginx Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Uygulaman\u0131z i\u00e7in yeni bir Nginx yap\u0131land\u0131rma dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/sites-available\/my-node-app<\/code><\/pre>\n<p>Dosyaya a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin (alan ad\u0131n\u0131z\u0131 ve Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 portu kendi de\u011ferlerinizle de\u011fi\u015ftirin):<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name example.com www.example.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    # \u0130ste\u011fe ba\u011fl\u0131: Statik dosyalar\u0131 do\u011frudan Nginx \u00fczerinden sunmak i\u00e7in\n    # location \/static\/ {\n    #     root \/var\/www\/my-app\/public; # Statik dosyalar\u0131n\u0131z\u0131n yolu\n    #     expires 30d;\n    #     add_header Cache-Control \"public, no-transform\";\n    # }\n}<\/code><\/pre>\n<p>*   <code>listen 80<\/code>: Nginx&#8217;in HTTP isteklerini 80 numaral\u0131 porttan dinlemesini sa\u011flar.<br \/>\n*   <code>server_name<\/code>: Uygulaman\u0131z\u0131n eri\u015filece\u011fi alan adlar\u0131.<br \/>\n*   <code>proxy_pass http:\/\/localhost:3000<\/code>: Gelen istekleri Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 <code>localhost:3000<\/code> adresine y\u00f6nlendirir.<br \/>\n*   <code>proxy_set_header<\/code> sat\u0131rlar\u0131, Node.js uygulaman\u0131z\u0131n istemci IP adresi gibi ger\u00e7ek istek bilgilerine eri\u015fmesini sa\u011flar.<\/p>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 kaydettikten sonra, <code>sites-enabled<\/code> dizinine bir sembolik link olu\u015fturarak Nginx&#8217;in bu yap\u0131land\u0131rmay\u0131 kullanmas\u0131n\u0131 sa\u011flay\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my-node-app \/etc\/nginx\/sites-enabled\/<\/code><\/pre>\n<p>Varsay\u0131lan Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131n (\u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek i\u00e7in):<\/p>\n<pre><code class=\"language-bash\">sudo unlink \/etc\/nginx\/sites-enabled\/default<\/code><\/pre>\n<p>Nginx yap\u0131land\u0131rmas\u0131n\u0131 test 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\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart nginx<\/code><\/pre>\n<p>Art\u0131k web taray\u0131c\u0131n\u0131zdan <code>http:\/\/example.com<\/code> adresine gitti\u011finizde, Nginx iste\u011fi Node.js uygulaman\u0131za y\u00f6nlendirecek ve uygulaman\u0131z\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<h3>7. SSL\/TLS \u015eifrelemesi (HTTPS) Kurulumu<\/h3>\n<p>Web sitenizin g\u00fcvenli\u011fini sa\u011flamak ve arama motoru s\u0131ralamalar\u0131n\u0131 iyile\u015ftirmek i\u00e7in HTTPS kullanmak zorunludur. Let&#8217;s Encrypt, \u00fccretsiz SSL\/TLS sertifikalar\u0131 sunar ve Certbot arac\u0131 ile kolayca kurulabilir.<\/p>\n<h4>7.1. Certbot Kurulumu<\/h4>\n<p>Certbot ve Nginx eklentisini kurun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install certbot python3-certbot-nginx -y<\/code><\/pre>\n<h4>7.2. Let&#8217;s Encrypt Sertifikas\u0131 Alma<\/h4>\n<p>A\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n. Certbot, Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak alg\u0131lar ve sertifikay\u0131 kurar:<\/p>\n<pre><code class=\"language-bash\">sudo certbot --nginx -d example.com -d www.example.com<\/code><\/pre>\n<p><code>example.com<\/code> ve <code>www.example.com<\/code> yerine kendi alan adlar\u0131n\u0131z\u0131 yaz\u0131n.<\/p>\n<p>Certbot size baz\u0131 sorular soracakt\u0131r:<br \/>\n*   E-posta adresinizi girin.<br \/>\n*   Let&#8217;s Encrypt Hizmet \u015eartlar\u0131n\u0131 kabul edin.<br \/>\n*   E-posta adresinizi payla\u015fmak isteyip istemedi\u011finizi se\u00e7in.<br \/>\n*   HTTP trafi\u011fini otomatik olarak HTTPS&#8217;ye y\u00f6nlendirmek isteyip istemedi\u011finizi se\u00e7in (genellikle <code>2: Redirect<\/code> se\u00e7ene\u011fi \u00f6nerilir).<\/p>\n<p>Ba\u015far\u0131l\u0131 bir kurulumdan sonra, Certbot Nginx yap\u0131land\u0131rma dosyan\u0131z\u0131 otomatik olarak g\u00fcncelleyecek ve HTTPS&#8217;yi etkinle\u015ftirecektir.<\/p>\n<h4>7.3. Otomatik Yenileme<\/h4>\n<p>Let&#8217;s Encrypt sertifikalar\u0131 90 g\u00fcn ge\u00e7erlidir. Certbot, bu sertifikalar\u0131 otomatik olarak yenilemek i\u00e7in bir <code>cron<\/code> i\u015fi veya <code>systemd<\/code> zamanlay\u0131c\u0131s\u0131 kurar. Yenileme i\u015fleminin do\u011fru \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, yenileme i\u015flemini ger\u00e7ek sertifikalar\u0131 yenilemeden sim\u00fcle eder. E\u011fer herhangi bir hata yoksa, sertifikalar\u0131n\u0131z otomatik olarak yenilenecektir. Yenileme zamanlay\u0131c\u0131s\u0131n\u0131n durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">systemctl status certbot.timer<\/code><\/pre>\n<h3>8. Log Y\u00f6netimi ve \u0130zleme<\/h3>\n<p>\u00dcretim ortam\u0131ndaki bir uygulaman\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 anlamak i\u00e7in loglar\u0131 izlemek ve y\u00f6netmek \u00e7ok \u00f6nemlidir.<\/p>\n<h4>8.1. PM2 Loglar\u0131<\/h4>\n<p>PM2, uygulaman\u0131z\u0131n <code>stdout<\/code> ve <code>stderr<\/code> \u00e7\u0131kt\u0131lar\u0131n\u0131 otomatik olarak log dosyalar\u0131na y\u00f6nlendirir.<br \/>\n*   Loglar\u0131 g\u00f6r\u00fcnt\u00fclemek: <code>pm2 logs my-node-app<\/code><br \/>\n*   Belirli bir say\u0131da son sat\u0131r\u0131 g\u00f6r\u00fcnt\u00fclemek: <code>pm2 logs my-node-app --lines 100<\/code><br \/>\n*   Log dosyalar\u0131n\u0131n konumunu bulmak: <code>pm2 show my-node-app<\/code> (bu komut, log dosyalar\u0131n\u0131n yollar\u0131n\u0131 da g\u00f6sterecektir).<\/p>\n<h4>8.2. Nginx Loglar\u0131<\/h4>\n<p>Nginx, eri\u015fim loglar\u0131n\u0131 (<code>access.log<\/code>) ve hata loglar\u0131n\u0131 (<code>error.log<\/code>) <code>\/var\/log\/nginx\/<\/code> dizininde tutar.<br \/>\n*   Eri\u015fim loglar\u0131n\u0131 g\u00f6r\u00fcnt\u00fclemek: <code>tail -f \/var\/log\/nginx\/access.log<\/code><br \/>\n*   Hata loglar\u0131n\u0131 g\u00f6r\u00fcnt\u00fclemek: <code>tail -f \/var\/log\/nginx\/error.log<\/code><\/p>\n<h4>8.3. Logrotate<\/h4>\n<p>Log dosyalar\u0131 zamanla b\u00fcy\u00fcyebilir ve disk alan\u0131n\u0131 t\u00fcketebilir. <code>logrotate<\/code> arac\u0131, log dosyalar\u0131n\u0131 otomatik olarak s\u0131k\u0131\u015ft\u0131r\u0131r, ar\u015fivler ve siler. \u00c7o\u011fu Linux da\u011f\u0131t\u0131m\u0131nda varsay\u0131lan olarak kuruludur ve Nginx i\u00e7in zaten yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r. PM2 i\u00e7in de manuel olarak bir <code>logrotate<\/code> yap\u0131land\u0131rmas\u0131 ekleyebilirsiniz.<\/p>\n<p><code>\/etc\/logrotate.d\/pm2<\/code> dosyas\u0131 olu\u015fturarak:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/logrotate.d\/pm2<\/code><\/pre>\n<p>\u0130\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi olabilir (PM2 log dosyalar\u0131n\u0131n yollar\u0131n\u0131 kendi sisteminize g\u00f6re d\u00fczenleyin):<\/p>\n<pre><code class=\"language-\">\/home\/kullaniciadi\/.pm2\/logs\/*.log {\n    daily\n    missingok\n    rotate 7\n    compress\n    delaycompress\n    notifempty\n    create 0640 kullan\u0131c\u0131ad\u0131 www-data\n    sharedscripts\n    postrotate\n        \/usr\/bin\/pm2 reloadLogs all > \/dev\/null\n    endscript\n}<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma, PM2 loglar\u0131n\u0131 g\u00fcnl\u00fck olarak d\u00f6nd\u00fcr\u00fcr, 7 g\u00fcn boyunca saklar ve s\u0131k\u0131\u015ft\u0131r\u0131r.<\/p>\n<h4>8.4. \u0130zleme Ara\u00e7lar\u0131 (Opsiyonel)<\/h4>\n<p>Daha geli\u015fmi\u015f izleme ve uyar\u0131lar i\u00e7in Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana) gibi ara\u00e7lar\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bunlar, uygulaman\u0131z\u0131n ve sunucunuzun performans metriklerini derinlemesine analiz etmenizi sa\u011flar.<\/p>\n<h3>9. Ek G\u00fcvenlik \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Bir Node.js uygulamas\u0131n\u0131 \u00fcretimde \u00e7al\u0131\u015ft\u0131rmak sadece kurulumla bitmez; s\u00fcrekli g\u00fcvenlik ve bak\u0131m gerektirir.<\/p>\n<h4>9.1. S\u00fcrekli G\u00fcncelleme<\/h4>\n<p>*   <strong>\u0130\u015fletim Sistemi:<\/strong> Sunucunuzu d\u00fczenli olarak <code>sudo apt update && sudo apt upgrade -y<\/code> komutlar\u0131yla g\u00fcncel tutun.<br \/>\n*   <strong>Node.js:<\/strong> NVM kullan\u0131yorsan\u0131z, <code>nvm install latest_lts_version<\/code> ve <code>nvm use latest_lts_version<\/code> ile Node.js&#8217;yi g\u00fcncelleyebilirsiniz.<br \/>\n*   <strong>npm Paketleri:<\/strong> Uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 d\u00fczenli olarak g\u00fcncelleyin. <code>npm outdated<\/code> ile eski paketleri g\u00f6rebilir, <code>npm update<\/code> veya <code>npm audit fix<\/code> ile g\u00fcncelleyebilirsiniz. <code>npm audit<\/code> komutu, bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kontrol eder.<\/p>\n<h4>9.2. Minimum Yetki Prensibi<\/h4>\n<p>Node.js uygulaman\u0131z\u0131 asla <code>root<\/code> kullan\u0131c\u0131s\u0131 olarak \u00e7al\u0131\u015ft\u0131rmay\u0131n. PM2 veya <code>systemd<\/code> servis dosyas\u0131nda <code>User<\/code> direktifi ile uygulamay\u0131 <code>www-data<\/code> gibi d\u00fc\u015f\u00fck yetkili bir kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131n. Bu, olas\u0131 bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131n\u0131n t\u00fcm sunucuya yay\u0131lmas\u0131n\u0131 engeller.<\/p>\n<h4>9.3. G\u00fc\u00e7l\u00fc Parolalar ve SSH Anahtarlar\u0131<\/h4>\n<p>T\u00fcm sunucu kullan\u0131c\u0131lar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc ve benzersiz parolalar kullan\u0131n. SSH anahtar \u00e7iftleri kullanmak, parola tabanl\u0131 kimlik do\u011frulamadan \u00e7ok daha g\u00fcvenlidir.<\/p>\n<h4>9.4. Yedekleme Stratejisi<\/h4>\n<p>Uygulama dosyalar\u0131n\u0131z\u0131n ve e\u011fer varsa veritaban\u0131n\u0131z\u0131n d\u00fczenli yedeklerini al\u0131n. Felaket kurtarma durumunda bu yedekler hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h4>9.5. G\u00fcvenlik Ba\u015fl\u0131klar\u0131<\/h4>\n<p>Nginx yap\u0131land\u0131rman\u0131za g\u00fcvenlik ba\u015fl\u0131klar\u0131 ekleyerek yayg\u0131n web g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 koruma sa\u011flayabilirsiniz. \u00d6rne\u011fin, <code>Content-Security-Policy<\/code>, <code>X-Frame-Options<\/code>, <code>X-Content-Type-Options<\/code> gibi ba\u015fl\u0131klar\u0131 ekleyebilirsiniz.<\/p>\n<pre><code class=\"language-nginx\"># \/etc\/nginx\/sites-available\/my-node-app dosyan\u0131za server blo\u011fu i\u00e7ine ekleyin\nadd_header X-Frame-Options \"SAMEORIGIN\";\nadd_header X-XSS-Protection \"1; mode=block\";\nadd_header X-Content-Type-Options \"nosniff\";\nadd_header Referrer-Policy \"no-referrer-when-downgrade\";\nadd_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;<\/code><\/pre>\n<h4>9.6. Rate Limiting (\u0130stek S\u0131n\u0131rlama)<\/h4>\n<p>DDoS sald\u0131r\u0131lar\u0131na veya a\u015f\u0131r\u0131 kaynak t\u00fcketimine kar\u015f\u0131 Nginx \u00fczerinde istek s\u0131n\u0131rlamas\u0131 uygulayabilirsiniz:<\/p>\n<pre><code class=\"language-nginx\"># \/etc\/nginx\/nginx.conf veya \/etc\/nginx\/conf.d\/rate-limit.conf i\u00e7ine ekleyin\nlimit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r\/s;\n\n<h2>\/etc\/nginx\/sites-available\/my-node-app dosyan\u0131za location blo\u011fu i\u00e7ine ekleyin<\/h2>\nlocation \/ {\n    limit_req zone=mylimit burst=10 nodelay;\n    # ... di\u011fer proxy_pass ayarlar\u0131\n}<\/code><\/pre>\n<p>Bu \u00f6rnek, IP ba\u015f\u0131na saniyede 5 istekle s\u0131n\u0131rlar ve 10 iste\u011fe kadar ani art\u0131\u015flara izin verir.<\/p>\n<h3>10. Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 rehberde, Node.js uygulaman\u0131z\u0131 Ubuntu 18.04 sunucusu \u00fczerinde \u00fcretim ortam\u0131 i\u00e7in ba\u015far\u0131yla kurmak i\u00e7in gereken t\u00fcm temel ad\u0131mlar\u0131 ele ald\u0131k. Sunucu haz\u0131rl\u0131\u011f\u0131ndan ba\u015flayarak, Node.js ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00f6netimi, PM2 ile s\u00fcrekli \u00e7al\u0131\u015fma, Nginx ile ters proxy yap\u0131land\u0131rmas\u0131, Let&#8217;s Encrypt ile SSL \u015fifrelemesi ve \u00f6nemli g\u00fcvenlik ipu\u00e7lar\u0131na kadar bir\u00e7ok konuyu detayland\u0131rd\u0131k.<\/p>\n<p>Bir Node.js uygulamas\u0131n\u0131 \u00fcretim ortam\u0131nda \u00e7al\u0131\u015ft\u0131rmak, performans, g\u00fcvenlik ve kararl\u0131l\u0131k aras\u0131nda bir denge kurmay\u0131 gerektirir. Bu ad\u0131mlar\u0131 dikkatlice takip ederek, uygulaman\u0131z i\u00e7in sa\u011flam ve g\u00fcvenli bir temel olu\u015fturmu\u015f olursunuz. Ancak unutulmamal\u0131d\u0131r ki, \u00fcretim ortamlar\u0131 s\u00fcrekli bak\u0131m, izleme ve g\u00fcvenlik g\u00fcncellemeleri gerektirir. S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) boru hatlar\u0131 kurarak da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi otomatikle\u015ftirmek ve geli\u015fmi\u015f izleme ara\u00e7lar\u0131 kullanarak uygulaman\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 s\u00fcrekli kontrol etmek, uzun vadede uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi\nNode.js, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bi","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-31346","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>Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi - 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\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi\" \/>\n<meta property=\"og:description\" content=\"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi Node.js, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-08T19:41:15+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=\"21 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-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi\",\"datePublished\":\"2025-10-08T19:41:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/\"},\"wordCount\":3353,\"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\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/\",\"name\":\"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-08T19:41:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi\"}]},{\"@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 Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi - 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\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi","og_description":"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi Node.js, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bi","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-08T19:41:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi","datePublished":"2025-10-08T19:41:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/"},"wordCount":3353,"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\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/","name":"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-08T19:41:15+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulamasini-ubuntu-18-04-uzerinde-uretim-ortami-icin-kurulum-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js Uygulamas\u0131n\u0131 Ubuntu 18.04 \u00dczerinde \u00dcretim Ortam\u0131 \u0130\u00e7in Kurulum Rehberi"}]},{"@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\/31346","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=31346"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31346\/revisions"}],"predecessor-version":[{"id":31347,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31346\/revisions\/31347"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31346"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31346"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}