{"id":37500,"date":"2026-01-06T17:40:51","date_gmt":"2026-01-06T14:40:51","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37500"},"modified":"2026-01-06T17:40:51","modified_gmt":"2026-01-06T14:40:51","slug":"ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/","title":{"rendered":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern web geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131 prototipleme ve \u00f6l\u00e7eklenebilir uygulamalar olu\u015fturmak i\u00e7in Node.js giderek daha pop\u00fcler hale gelmektedir. Bir ekip olarak \u00e7al\u0131\u015f\u0131rken, herkesin tutarl\u0131 ve verimli bir geli\u015ftirme ortam\u0131na sahip olmas\u0131 kritik \u00f6neme sahiptir. Sanal \u00d6zel Sunucu (VPS), bu t\u00fcr bir ortam\u0131 sa\u011flamak i\u00e7in m\u00fckemmel bir platform sunar. VPS, payla\u015f\u0131ml\u0131 bar\u0131nd\u0131rma hizmetlerine k\u0131yasla daha fazla kontrol, esneklik ve izolasyon sa\u011flarken, \u00f6zel sunucular\u0131n maliyetinden ve karma\u015f\u0131kl\u0131\u011f\u0131ndan ka\u00e7\u0131nman\u0131z\u0131 sa\u011flar. Bu kapsaml\u0131 rehberde, bir ekip i\u00e7in VPS \u00fczerinde g\u00fcvenli, \u00f6l\u00e7eklenebilir ve i\u015fbirli\u011fine dayal\u0131 bir Node.js geli\u015ftirme ortam\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 anlataca\u011f\u0131z. Ama\u00e7, sadece Node.js&#8217;i \u00e7al\u0131\u015ft\u0131rmak de\u011fil, ayn\u0131 zamanda g\u00fcvenlik, s\u00fcr\u00fcm kontrol\u00fc, veritaban\u0131 y\u00f6netimi ve s\u00fcrekli \u00e7al\u0131\u015fma gibi kritik unsurlar\u0131 da entegre etmektir.<\/p>\n<h3>\u00d6n Haz\u0131rl\u0131klar<\/h3>\n<p>VPS \u00fczerinde ba\u015far\u0131l\u0131 bir geli\u015ftirme ortam\u0131 kurmak i\u00e7in baz\u0131 temel \u00f6n haz\u0131rl\u0131klar yapmak gereklidir. Bu ad\u0131mlar, kurulum s\u00fcrecinin sorunsuz ilerlemesini sa\u011flayacak ve gelecekteki olas\u0131 sorunlar\u0131 minimize edecektir.<\/p>\n<h4>VPS Se\u00e7imi ve Kaynak Planlamas\u0131<\/h4>\n<p>\u0130lk ad\u0131m, ihtiya\u00e7lar\u0131n\u0131za uygun bir VPS sa\u011flay\u0131c\u0131s\u0131 ve plan\u0131 se\u00e7mektir. Pop\u00fcler sa\u011flay\u0131c\u0131lar aras\u0131nda DigitalOcean, Linode, Vultr, AWS Lightsail ve Google Cloud Platform (Compute Engine) bulunmaktad\u0131r. Se\u00e7im yaparken a\u015fa\u011f\u0131daki fakt\u00f6rleri g\u00f6z \u00f6n\u00fcnde bulundurun:<br \/>\n*   <strong>\u0130\u015fletim Sistemi:<\/strong> Ubuntu Server (LTS s\u00fcr\u00fcmleri \u00f6nerilir) veya Debian gibi Linux da\u011f\u0131t\u0131mlar\u0131 Node.js geli\u015ftirme i\u00e7in idealdir. Bu rehberde Ubuntu Server \u00fczerinde ilerleyece\u011fiz.<br \/>\n*   <strong>CPU:<\/strong> Uygulamalar\u0131n\u0131z\u0131n i\u015flem y\u00fck\u00fcne ba\u011fl\u0131 olarak yeterli \u00e7ekirdek say\u0131s\u0131na sahip bir plan se\u00e7in. Genellikle 1-2 \u00e7ekirdek ba\u015flang\u0131\u00e7 i\u00e7in yeterlidir.<br \/>\n*   <strong>RAM:<\/strong> Node.js uygulamalar\u0131 belle\u011fi etkin kullanabilir. Uygulaman\u0131z\u0131n ve veritaban\u0131n\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re 2GB veya daha fazla RAM tercih edin. Ekip \u00fcyelerinin ayn\u0131 anda test yapaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnerek biraz daha y\u00fcksek bir RAM ba\u015flang\u0131c\u0131 iyi olabilir.<br \/>\n*   <strong>Disk Alan\u0131:<\/strong> Kodunuz, ba\u011f\u0131ml\u0131l\u0131klar, veritaban\u0131 ve log dosyalar\u0131 i\u00e7in yeterli disk alan\u0131 sa\u011flay\u0131n. SSD tabanl\u0131 depolama, performans a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck avantaj sa\u011flar. 40-80GB ba\u015flang\u0131\u00e7 i\u00e7in iyi bir noktad\u0131r.<br \/>\n*   <strong>Veri Transferi (Bant Geni\u015fli\u011fi):<\/strong> Uygulaman\u0131z\u0131n tahmini trafi\u011fini kar\u015f\u0131layacak bir bant geni\u015fli\u011fi limiti olan bir plan se\u00e7in.<br \/>\n*   <strong>Konum:<\/strong> Kullan\u0131c\u0131lar\u0131n\u0131za veya ekip \u00fcyelerinize co\u011frafi olarak yak\u0131n bir veri merkezi se\u00e7mek gecikmeyi azalt\u0131r.<\/p>\n<h4>Alan Ad\u0131 ve DNS Ayarlar\u0131 (Opsiyonel ama \u00d6nerilir)<\/h4>\n<p>Uygulamalar\u0131n\u0131za kolayca eri\u015fmek ve SSL sertifikas\u0131 kurmak i\u00e7in bir alan ad\u0131na sahip olmak \u00f6nemlidir. Alan ad\u0131n\u0131z\u0131 bir DNS sa\u011flay\u0131c\u0131s\u0131 (\u00f6rn. Cloudflare) \u00fczerinden y\u00f6netmek, DNS kay\u0131tlar\u0131n\u0131 ayarlamay\u0131 ve gelecekteki de\u011fi\u015fiklikleri kolayla\u015ft\u0131r\u0131r. VPS&#8217;nizin IP adresini alan ad\u0131n\u0131za (A kayd\u0131) y\u00f6nlendirin.<\/p>\n<h4>SSH Eri\u015fimi ve G\u00fcvenlik \u0130lkeleri<\/h4>\n<p>VPS&#8217;nize g\u00fcvenli bir \u015fekilde eri\u015fmek i\u00e7in SSH (Secure Shell) kullanacaks\u0131n\u0131z. SSH anahtar tabanl\u0131 kimlik do\u011frulama, parola tabanl\u0131 kimlik do\u011frulamadan \u00e7ok daha g\u00fcvenlidir. Bu nedenle, yerel makinenizde bir SSH anahtar \u00e7ifti olu\u015fturman\u0131z ve genel anahtar\u0131n\u0131z\u0131 VPS&#8217;ye y\u00fcklemeniz \u015fiddetle tavsiye edilir.<br \/>\n*   <strong>Anahtar Olu\u015fturma (Yerel Makine):<\/strong> <code>ssh-keygen -t rsa -b 4096 -C \"email@example.com\"<\/code> komutu ile anahtar\u0131n\u0131z\u0131 olu\u015fturun.<br \/>\n*   <strong>Genel Anahtar\u0131 Kopyalama:<\/strong> <code>ssh-copy-id kullan\u0131c\u0131@sunucu_ip_adresi<\/code> komutu veya manuel olarak <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na ekleyerek genel anahtar\u0131n\u0131z\u0131 VPS&#8217;ye kopyalay\u0131n.<\/p>\n<h3>VPS Temel Kurulumu ve G\u00fcvenli\u011fi<\/h3>\n<p>VPS&#8217;nizin ilk kurulumu ve temel g\u00fcvenlik \u00f6nlemlerinin al\u0131nmas\u0131, sa\u011flam bir geli\u015ftirme ortam\u0131n\u0131n temelini olu\u015fturur.<\/p>\n<h4>Sistem G\u00fcncelleme ve Y\u00fckseltme<\/h4>\n<p>Yeni bir VPS ba\u015flatt\u0131ktan sonra yapman\u0131z gereken ilk \u015fey, i\u015fletim sistemini g\u00fcncellemektir. Bu, en son g\u00fcvenlik yamalar\u0131n\u0131 ve yaz\u0131l\u0131m paketlerini alman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<h4>Yeni Bir Kullan\u0131c\u0131 Olu\u015fturma ve Sudo Yetkileri Verme<\/h4>\n<p>VPS&#8217;ye varsay\u0131lan &#8216;root&#8217; kullan\u0131c\u0131s\u0131 yerine, daha az yetkiye sahip ayr\u0131 bir kullan\u0131c\u0131 ile eri\u015fmek en iyi g\u00fcvenlik uygulamas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo adduser yeni_kullanici\nsudo usermod -aG sudo yeni_kullanici<\/code><\/pre>\n<p>\u015eimdi bu yeni kullan\u0131c\u0131ya ge\u00e7i\u015f yap\u0131n ve root kullan\u0131c\u0131s\u0131ndan \u00e7\u0131k\u0131\u015f yap\u0131n.<\/p>\n<h4>SSH Anahtar Tabanl\u0131 Kimlik Do\u011frulama Kurulumu ve Parola ile Giri\u015fi Devre D\u0131\u015f\u0131 B\u0131rakma<\/h4>\n<p>Yeni olu\u015fturdu\u011funuz kullan\u0131c\u0131n\u0131n SSH anahtar\u0131n\u0131 VPS&#8217;ye ekleyin ve parola ile giri\u015fi devre d\u0131\u015f\u0131 b\u0131rakarak g\u00fcvenli\u011fi art\u0131r\u0131n.<br \/>\n1.  <strong>Anahtar\u0131 Kopyalama:<\/strong> Yerel makinenizden <code>ssh-copy-id yeni_kullanici@sunucu_ip_adresi<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n.<br \/>\n2.  <strong>SSH Yap\u0131land\u0131rmas\u0131n\u0131 D\u00fczenleme:<\/strong> <code>sudo nano \/etc\/ssh\/sshd_config<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 bulun\/de\u011fi\u015ftirin:<\/p>\n<pre><code class=\"language-\">PermitRootLogin no\n    PasswordAuthentication no\n    PubkeyAuthentication yes<\/code><\/pre>\n<p>3.  <strong>SSH Servisini Yeniden Ba\u015flatma:<\/strong> <code>sudo systemctl restart sshd<\/code><br \/>\nBu ad\u0131mdan sonra, sadece SSH anahtar\u0131n\u0131zla yeni kullan\u0131c\u0131n\u0131zla giri\u015f yapabileceksiniz.<\/p>\n<h4>G\u00fcvenlik Duvar\u0131 (UFW) Kurulumu ve Ayarlar\u0131<\/h4>\n<p>UFW (Uncomplicated Firewall), Ubuntu&#8217;daki g\u00fcvenlik duvar\u0131n\u0131 y\u00f6netmeyi kolayla\u015ft\u0131r\u0131r. Yaln\u0131zca ihtiyac\u0131n\u0131z olan portlar\u0131 a\u00e7arak sunucunuzu koruyun.<\/p>\n<pre><code class=\"language-bash\">sudo apt install ufw -y\nsudo ufw allow OpenSSH\nsudo ufw allow http\nsudo ufw allow https\nsudo ufw enable\nsudo ufw status<\/code><\/pre>\n<p>Bu komutlar SSH, HTTP (80) ve HTTPS (443) portlar\u0131n\u0131 a\u00e7ar. Node.js uygulaman\u0131z farkl\u0131 bir portta \u00e7al\u0131\u015facaksa (\u00f6rn. 3000), o portu da a\u00e7man\u0131z gerekir: <code>sudo ufw allow 3000\/tcp<\/code>.<\/p>\n<h4>Fail2Ban Kurulumu (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilir)<\/h4>\n<p>Fail2Ban, sunucunuza yap\u0131lan kaba kuvvet sald\u0131r\u0131lar\u0131n\u0131 engelleyerek g\u00fcvenli\u011fi art\u0131r\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo apt install fail2ban -y\nsudo systemctl enable fail2ban\nsudo systemctl start fail2ban<\/code><\/pre>\n<p>Varsay\u0131lan yap\u0131land\u0131rma \u00e7o\u011fu durum i\u00e7in yeterlidir, ancak <code>sudo nano \/etc\/fail2ban\/jail.local<\/code> dosyas\u0131n\u0131 d\u00fczenleyerek daha fazla \u00f6zelle\u015ftirme yapabilirsiniz.<\/p>\n<h3>Node.js Kurulumu ve Y\u00f6netimi<\/h3>\n<p>Birden fazla Node.js projesi veya farkl\u0131 Node.js s\u00fcr\u00fcmleriyle \u00e7al\u0131\u015fmak zorunda kalabilece\u011finiz i\u00e7in, Node Version Manager (NVM) kullanmak en iyi y\u00f6ntemdir.<\/p>\n<h4>Neden NVM Kullanmal\u0131y\u0131z?<\/h4>\n<p>NVM, farkl\u0131 Node.js s\u00fcr\u00fcmlerini kolayca kurman\u0131za, y\u00f6netmenize ve aralar\u0131nda ge\u00e7i\u015f yapman\u0131za olanak tan\u0131r. Bu, \u00f6zellikle ekip \u00fcyelerinin farkl\u0131 projeler i\u00e7in farkl\u0131 Node.js s\u00fcr\u00fcmlerine ihtiya\u00e7 duyabilece\u011fi durumlarda \u00e7ok \u00f6nemlidir.<\/p>\n<h4>NVM Kurulumu<\/h4>\n<p>NVM&#8217;i y\u00fcklemek i\u00e7in a\u015fa\u011f\u0131daki komutlar\u0131 kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">curl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash<\/code><\/pre>\n<p>Kurulumdan sonra, terminalinizi kapat\u0131p yeniden a\u00e7\u0131n veya <code>source ~\/.bashrc<\/code> (veya <code>~\/.zshrc<\/code> gibi kulland\u0131\u011f\u0131n\u0131z shell&#8217;e g\u00f6re) komutunu \u00e7al\u0131\u015ft\u0131r\u0131n.<br \/>\nNVM&#8217;in do\u011fru y\u00fcklendi\u011fini kontrol etmek i\u00e7in: <code>nvm --version<\/code><\/p>\n<h4>Node.js ve NPM Kurulumu<\/h4>\n<p>NVM ile belirli bir Node.js s\u00fcr\u00fcm\u00fcn\u00fc kurmak \u00e7ok kolayd\u0131r:<\/p>\n<pre><code class=\"language-bash\">nvm install 18 # En son LTS s\u00fcr\u00fcm\u00fcn\u00fc kurar (veya istedi\u011finiz s\u00fcr\u00fcm\u00fc belirtin, \u00f6rn. nvm install 16.14.0)\nnvm use 18 # Bu s\u00fcr\u00fcm\u00fc kullanmak i\u00e7in ayarlar\nnvm alias default 18 # Her yeni kabuk oturumunda bu s\u00fcr\u00fcm\u00fc varsay\u0131lan yapar\nnode -v # Node.js s\u00fcr\u00fcm\u00fcn\u00fc kontrol edin\nnpm -v # NPM s\u00fcr\u00fcm\u00fcn\u00fc kontrol edin<\/code><\/pre>\n<h4>Gerekli Global Paketler (\u0130ste\u011fe Ba\u011fl\u0131)<\/h4>\n<p>Baz\u0131 paketler geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131rmak i\u00e7in global olarak y\u00fcklenebilir:<br \/>\n*   <strong>PM2:<\/strong> Node.js uygulamalar\u0131n\u0131 \u00fcretimde s\u00fcrekli \u00e7al\u0131\u015ft\u0131rmak ve y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. (<code>npm install -g pm2<\/code>)<br \/>\n*   <strong>Nodemon:<\/strong> Geli\u015ftirme s\u0131ras\u0131nda dosya de\u011fi\u015fikliklerini alg\u0131lay\u0131p Node.js uygulamas\u0131n\u0131 otomatik olarak yeniden ba\u015flat\u0131r. (<code>npm install -g nodemon<\/code>)<\/p>\n<h3>Veritaban\u0131 Kurulumu (\u00d6rnek: PostgreSQL veya MongoDB)<\/h3>\n<p>\u00c7o\u011fu Node.js uygulamas\u0131 bir veritaban\u0131na ihtiya\u00e7 duyar. Se\u00e7iminiz uygulaman\u0131z\u0131n gereksinimlerine ba\u011fl\u0131 olacakt\u0131r (ili\u015fkisel mi yoksa NoSQL mi). Burada iki pop\u00fcler se\u00e7ene\u011fin kurulumunu ele alaca\u011f\u0131z.<\/p>\n<h4>PostgreSQL Kurulumu ve Temel Ayarlar\u0131<\/h4>\n<p>PostgreSQL, g\u00fc\u00e7l\u00fc ve g\u00fcvenilir bir ili\u015fkisel veritaban\u0131 y\u00f6netim sistemidir.<\/p>\n<pre><code class=\"language-bash\">sudo apt install postgresql postgresql-contrib -y\nsudo systemctl enable postgresql\nsudo systemctl start postgresql<\/code><\/pre>\n<p><strong>Kullan\u0131c\u0131 ve Veritaban\u0131 Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres\npsql<\/code><\/pre>\n<p>PostgreSQL komut sat\u0131r\u0131nda:<\/p>\n<pre><code class=\"language-sql\">CREATE DATABASE myapp_db;\nCREATE USER myapp_user WITH PASSWORD 'guclu_sifre';\nGRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;\n\\q<\/code><\/pre>\n<p><code>exit<\/code> komutuyla <code>postgres<\/code> kullan\u0131c\u0131s\u0131ndan \u00e7\u0131k\u0131n.<\/p>\n<p><strong>Uzaktan Eri\u015fim K\u0131s\u0131tlamalar\u0131:<\/strong><br \/>\nG\u00fcvenlik i\u00e7in, PostgreSQL&#8217;e uzaktan eri\u015fimi yaln\u0131zca belirli IP adresleriyle veya hi\u00e7 k\u0131s\u0131tlamak isteyebilirsiniz. <code>sudo nano \/etc\/postgresql\/14\/main\/postgresql.conf<\/code> (s\u00fcr\u00fcm numaras\u0131 de\u011fi\u015febilir) dosyas\u0131nda <code>listen_addresses = 'localhost'<\/code> sat\u0131r\u0131n\u0131 bulun ve gerekti\u011finde d\u00fczenleyin. <code>sudo nano \/etc\/postgresql\/14\/main\/pg_hba.conf<\/code> dosyas\u0131nda da eri\u015fim kurallar\u0131n\u0131 belirleyebilirsiniz.<\/p>\n<h4>MongoDB Kurulumu ve Temel Ayarlar\u0131<\/h4>\n<p>MongoDB, esnek \u015femas\u0131 ve y\u00fcksek \u00f6l\u00e7eklenebilirli\u011fi ile pop\u00fcler bir NoSQL veritaban\u0131d\u0131r.<br \/>\n1.  <strong>GPG Anahtar\u0131n\u0131 \u0130\u00e7e Aktarma:<\/strong><\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/www.mongodb.org\/static\/pgp\/server-6.0.asc | \\\n       sudo gpg --dearmor -o \/usr\/share\/keyrings\/mongodb-archive-keyring.gpg<\/code><\/pre>\n<p>2.  <strong>Depoyu Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-bash\">echo \"deb [ arch=amd64,arm64 signed-by=\/usr\/share\/keyrings\/mongodb-archive-keyring.gpg ] https:\/\/repo.mongodb.org\/apt\/ubuntu $(lsb_release -cs)\/mongodb-org\/6.0 multiverse\" | sudo tee \/etc\/apt\/sources.list.d\/mongodb-org-6.0.list<\/code><\/pre>\n<p>3.  <strong>Y\u00fckleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt install -y mongodb-org<\/code><\/pre>\n<p>4.  <strong>Servisi Ba\u015flatma:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl enable mongod\n    sudo systemctl start mongod\n    sudo systemctl status mongod<\/code><\/pre>\n<p><strong>Kullan\u0131c\u0131 ve Veritaban\u0131 Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-bash\">mongosh<\/code><\/pre>\n<p>MongoDB kabu\u011funda:<\/p>\n<pre><code class=\"language-javascript\">use myapp_db\ndb.createUser(\n   {\n     user: \"myapp_user\",\n     pwd: \"guclu_sifre\",\n     roles: [ { role: \"readWrite\", db: \"myapp_db\" } ]\n   }\n)\nexit<\/code><\/pre>\n<p><strong>Uzaktan Eri\u015fim K\u0131s\u0131tlamalar\u0131:<\/strong><br \/>\nMongoDB&#8217;nin varsay\u0131lan olarak yaln\u0131zca localhost&#8217;tan eri\u015filebilir olmas\u0131 gerekir. <code>sudo nano \/etc\/mongod.conf<\/code> dosyas\u0131nda <code>bindIp<\/code> ayar\u0131n\u0131 kontrol edin. G\u00fcvenlik i\u00e7in <code>bindIp: 127.0.0.1<\/code> olarak kalmal\u0131d\u0131r. Uzaktan eri\u015fim gerekiyorsa, g\u00fcvenlik duvar\u0131 kurallar\u0131 ve kimlik do\u011frulama ile dikkatli olun.<\/p>\n<h3>S\u00fcr\u00fcm Kontrol\u00fc ve Kod Da\u011f\u0131t\u0131m\u0131<\/h3>\n<p>Ekip \u00e7al\u0131\u015fmas\u0131nda s\u00fcr\u00fcm kontrol\u00fc vazge\u00e7ilmezdir. Git, kodunuzu y\u00f6netmek ve ekip \u00fcyeleri aras\u0131nda i\u015fbirli\u011fi yapmak i\u00e7in standartt\u0131r.<\/p>\n<h4>Git Kurulumu<\/h4>\n<pre><code class=\"language-bash\">sudo apt install git -y<\/code><\/pre>\n<p><strong>Git Yap\u0131land\u0131rmas\u0131:<\/strong><\/p>\n<pre><code class=\"language-bash\">git config --global user.name \"Ekip \u00dcyesi Ad\u0131\"\ngit config --global user.email \"ekip.uyesi@example.com\"<\/code><\/pre>\n<h4>Git Repository Klonlama<\/h4>\n<p>Uygulama kodunuzu VPS&#8217;ye \u00e7ekmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/ # Veya tercih etti\u011finiz bir dizin\ngit clone git@github.com:kullanici\/repo.git\ncd repo\nnpm install<\/code><\/pre>\n<p>E\u011fer \u00f6zel bir depoyu klonluyorsan\u0131z, VPS&#8217;nizde de bir SSH anahtar \u00e7ifti olu\u015fturman\u0131z ve genel anahtar\u0131n\u0131z\u0131 GitHub\/GitLab\/Bitbucket gibi s\u00fcr\u00fcm kontrol sa\u011flay\u0131c\u0131n\u0131za eklemeniz gerekebilir.<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096 -C \"vps-repo-key\"\ncat ~\/.ssh\/id_rsa.pub # Bu anahtar\u0131 s\u00fcr\u00fcm kontrol sa\u011flay\u0131c\u0131n\u0131za ekleyin<\/code><\/pre>\n<h4>Ortam De\u011fi\u015fkenleri Y\u00f6netimi<\/h4>\n<p>Hassas bilgiler (veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131) do\u011frudan koda yaz\u0131lmamal\u0131d\u0131r. Bunun yerine ortam de\u011fi\u015fkenleri kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong><code>.env<\/code> Dosyas\u0131:<\/strong> Projenizin k\u00f6k dizininde bir <code>.env<\/code> dosyas\u0131 olu\u015fturun ve hassas bilgileri buraya yaz\u0131n. Bu dosyay\u0131 <code>.gitignore<\/code>&#8216;a eklemeyi unutmay\u0131n.<\/p>\n<pre><code class=\"language-\">DB_HOST=localhost\n    DB_USER=myapp_user\n    DB_PASS=guclu_sifre\n    NODE_ENV=development<\/code><\/pre>\n<p>*   <strong><code>dotenv<\/code> Paketi:<\/strong> Node.js uygulaman\u0131zda <code>dotenv<\/code> paketini kullanarak bu de\u011fi\u015fkenleri y\u00fckleyin.<\/p>\n<pre><code class=\"language-bash\">npm install dotenv<\/code><\/pre>\n<p>    Uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 dosyas\u0131nda (\u00f6rn. <code>app.js<\/code>):<\/p>\n<pre><code class=\"language-javascript\">require('dotenv').config();\n    const dbHost = process.env.DB_HOST;\n    \/\/ ...<\/code><\/pre>\n<p>*   <strong>PM2 ile Ortam De\u011fi\u015fkenleri:<\/strong> PM2 ile uygulama ba\u015flat\u0131rken de ortam de\u011fi\u015fkenleri tan\u0131mlayabilirsiniz.<\/p>\n<h3>Uygulama Y\u00f6netimi ve S\u00fcrekli \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Geli\u015ftirme ortam\u0131nda bile, uygulaman\u0131z\u0131n \u00e7\u00f6kmesi durumunda otomatik olarak yeniden ba\u015flamas\u0131 veya arka planda s\u00fcrekli \u00e7al\u0131\u015fmas\u0131 \u00f6nemlidir. PM2 bu konuda m\u00fckemmel bir ara\u00e7t\u0131r.<\/p>\n<h4>PM2 Kurulumu ve Kullan\u0131m\u0131<\/h4>\n<p>PM2&#8217;yi global olarak kurduysan\u0131z:<\/p>\n<pre><code class=\"language-bash\">npm install -g pm2<\/code><\/pre>\n<p><strong>Uygulama Ba\u015flatma:<\/strong><\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/repo\npm2 start app.js --name \"my-node-app\"<\/code><\/pre>\n<p>*   <code>app.js<\/code> yerine ana Node.js dosyan\u0131z\u0131n ad\u0131n\u0131 yaz\u0131n.<br \/>\n*   <code>--name<\/code> ile uygulaman\u0131za kolayca tan\u0131nabilir bir isim verin.<br \/>\n*   <code>--watch<\/code> ekleyerek dosya de\u011fi\u015fikliklerinde otomatik yeniden ba\u015flatma sa\u011flayabilirsiniz (geli\u015ftirme i\u00e7in idealdir).<br \/>\n*   <code>pm2 start ecosystem.config.js<\/code> ile daha karma\u015f\u0131k yap\u0131land\u0131rmalar i\u00e7in bir yap\u0131land\u0131rma dosyas\u0131 kullanabilirsiniz.<\/p>\n<p><strong>PM2 Komutlar\u0131:<\/strong><br \/>\n*   <code>pm2 list<\/code>: \u00c7al\u0131\u015fan uygulamalar\u0131 listeler.<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 kald\u0131r\u0131r.<br \/>\n*   <code>pm2 logs my-node-app<\/code>: Uygulaman\u0131n loglar\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <code>pm2 monit<\/code>: T\u00fcm uygulamalar\u0131n kaynak kullan\u0131m\u0131n\u0131 izler.<\/p>\n<h4>PM2 Ba\u015flang\u0131\u00e7ta \u00c7al\u0131\u015ft\u0131rma (Startup Script)<\/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 startup script&#8217;ini olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">pm2 startup systemd\npm2 save<\/code><\/pre>\n<p>Bu komutlar, mevcut PM2 s\u00fcre\u00e7lerini kaydeder ve sunucu her ba\u015flad\u0131\u011f\u0131nda otomatik olarak yeniden y\u00fcklenmelerini sa\u011flayan bir <code>systemd<\/code> servisi olu\u015fturur.<\/p>\n<h3>Web Sunucusu ve Ters Proxy (Nginx)<\/h3>\n<p>Nginx, Node.js uygulamalar\u0131n\u0131z\u0131n \u00f6n\u00fcne bir ters proxy olarak yerle\u015ftirilerek performans, g\u00fcvenlik ve ek \u00f6zellikler sa\u011flar.<\/p>\n<h4>Neden Nginx?<\/h4>\n<p>*   <strong>Ters Proxy:<\/strong> Gelen HTTP isteklerini Node.js uygulaman\u0131za y\u00f6nlendirir.<br \/>\n*   <strong>Y\u00fck Dengeleme:<\/strong> Birden fazla Node.js \u00f6rne\u011fi aras\u0131nda trafi\u011fi da\u011f\u0131tabilir.<br \/>\n*   <strong>Statik Dosya Sunumu:<\/strong> Nginx, statik dosyalar\u0131 (CSS, JS, resimler) Node.js&#8217;ten daha verimli bir \u015fekilde sunabilir.<br \/>\n*   <strong>SSL\/TLS \u015eifrelemesi:<\/strong> Let&#8217;s Encrypt ile kolayca SSL sertifikas\u0131 entegrasyonu sa\u011flar.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> Do\u011frudan Node.js uygulaman\u0131z\u0131n d\u0131\u015f d\u00fcnyaya a\u00e7\u0131k olmas\u0131n\u0131 engeller.<\/p>\n<h4>Nginx Kurulumu<\/h4>\n<pre><code class=\"language-bash\">sudo apt install nginx -y\nsudo ufw allow 'Nginx HTTP' # E\u011fer HTTPS kullanacaksan\u0131z 'Nginx HTTPS' veya 'Nginx Full'\nsudo systemctl enable nginx\nsudo systemctl start nginx<\/code><\/pre>\n<h4>Nginx Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Node.js 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>Dosyan\u0131n i\u00e7ine 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 g\u00fcncelleyin):<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name your_domain.com www.your_domain.com;\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    }\n}<\/code><\/pre>\n<p>Yap\u0131land\u0131rma dosyas\u0131n\u0131 etkinle\u015ftirin ve Nginx&#8217;i yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my-node-app \/etc\/nginx\/sites-enabled\/\nsudo nginx -t # Yap\u0131land\u0131rma dosyas\u0131n\u0131 test edin\nsudo systemctl restart nginx<\/code><\/pre>\n<h4>SSL\/TLS \u015eifrelemesi (Let&#8217;s Encrypt ile Certbot)<\/h4>\n<p>Uygulaman\u0131z\u0131n g\u00fcvenli\u011fini art\u0131rmak i\u00e7in HTTPS kullanmak zorunludur. Let&#8217;s Encrypt, \u00fccretsiz SSL sertifikalar\u0131 sa\u011flar ve Certbot arac\u0131yla kolayca kurulabilir.<\/p>\n<pre><code class=\"language-bash\">sudo snap install core\nsudo snap refresh core\nsudo snap install --classic certbot\nsudo ln -s \/snap\/bin\/certbot \/usr\/bin\/certbot\nsudo certbot --nginx -d your_domain.com -d www.your_domain.com<\/code><\/pre>\n<p>Certbot, Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak g\u00fcncelleyecek ve sertifikalar\u0131n\u0131z\u0131 yenilemek i\u00e7in bir cron job olu\u015fturacakt\u0131r.<\/p>\n<h3>Geli\u015ftirme Ortam\u0131 Ekip \u0130\u00e7in Optimizasyonu<\/h3>\n<p>Bir ekip olarak \u00e7al\u0131\u015f\u0131rken, ortam\u0131n i\u015fbirli\u011fini desteklemesi ve tutarl\u0131l\u0131\u011f\u0131 sa\u011flamas\u0131 \u00f6nemlidir.<\/p>\n<h4>Ortak Dizinler ve \u0130zinler<\/h4>\n<p>T\u00fcm ekip \u00fcyelerinin kod depolar\u0131na ve log dosyalar\u0131na eri\u015febilmesi i\u00e7in uygun dizin izinlerini ayarlay\u0131n. \u00d6rne\u011fin, <code>\/var\/www\/<\/code> dizinini veya projenizin bulundu\u011fu dizini bir grup (\u00f6rn. <code>www-data<\/code> veya \u00f6zel bir <code>dev-team<\/code> grubu) i\u00e7in yaz\u0131labilir hale getirebilirsiniz.<\/p>\n<pre><code class=\"language-bash\">sudo groupadd dev-team\nsudo usermod -aG dev-team yeni_kullanici\nsudo chown -R yeni_kullanici:dev-team \/var\/www\/repo\nsudo chmod -R 775 \/var\/www\/repo<\/code><\/pre>\n<p>Ekip \u00fcyeleri sunucuya SSH ile ba\u011flan\u0131p kodu \u00e7ekebilir, test edebilir.<\/p>\n<h4>Ortak Ba\u011f\u0131ml\u0131l\u0131klar ve <code>package-lock.json<\/code><\/h4>\n<p>Ekip i\u00e7inde herkesin ayn\u0131 ba\u011f\u0131ml\u0131l\u0131k s\u00fcr\u00fcmlerini kulland\u0131\u011f\u0131ndan emin olmak i\u00e7in <code>package-lock.json<\/code> (veya <code>yarn.lock<\/code>) dosyas\u0131n\u0131 Git&#8217;e commit edin. Bu, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yor&#8221; sorunlar\u0131n\u0131 \u00f6nler.<\/p>\n<pre><code class=\"language-bash\">npm install # package-lock.json'a g\u00f6re ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurar<\/code><\/pre>\n<h4>Otomatik Da\u011f\u0131t\u0131m (CI\/CD Temelleri)<\/h4>\n<p>Basit bir CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) ak\u0131\u015f\u0131 kurmak, geli\u015ftirme verimlili\u011fini art\u0131r\u0131r. \u00d6rne\u011fin, GitHub Actions veya GitLab CI\/CD kullanarak, bir <code>main<\/code> branch&#8217;ine yap\u0131lan her push&#8217;ta sunucunuzda otomatik olarak <code>git pull<\/code>, <code>npm install<\/code> ve <code>pm2 restart<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz.<br \/>\nBunun i\u00e7in sunucunuzda bir da\u011f\u0131t\u0131m anahtar\u0131 (deploy key) olu\u015fturup s\u00fcr\u00fcm kontrol sa\u011flay\u0131c\u0131n\u0131za eklemeniz ve CI\/CD yap\u0131land\u0131rma dosyan\u0131zda (\u00f6rn. <code>.github\/workflows\/deploy.yml<\/code>) SSH \u00fczerinden komutlar\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir.<\/p>\n<h4>Geli\u015ftirme ve \u00dcretim Ortamlar\u0131 Aras\u0131ndaki Farklar (<code>NODE_ENV<\/code>)<\/h4>\n<p>Uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 (\u00f6rn. loglama seviyesi, hata ay\u0131klama modu) ortam\u0131na g\u00f6re de\u011fi\u015ftirmek i\u00e7in <code>NODE_ENV<\/code> ortam de\u011fi\u015fkenini kullan\u0131n.<br \/>\n*   Geli\u015ftirme ortam\u0131nda: <code>NODE_ENV=development<\/code><br \/>\n*   \u00dcretim ortam\u0131nda: <code>NODE_ENV=production<\/code><br \/>\nPM2 ile ba\u015flat\u0131rken bu de\u011fi\u015fkeni ayarlayabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pm2 start app.js --name \"my-node-app\" --env development<\/code><\/pre>\n<p>Veya <code>ecosystem.config.js<\/code> dosyas\u0131nda:<\/p>\n<pre><code class=\"language-javascript\">module.exports = {\n  apps : [{\n    name   : \"my-node-app\",\n    script : \".\/app.js\",\n    env: {\n      \"NODE_ENV\": \"development\",\n    },\n    env_production : {\n       \"NODE_ENV\": \"production\"\n    }\n  }]\n};<\/code><\/pre>\n<p>Sonra <code>pm2 start ecosystem.config.js --env production<\/code> ile ba\u015flatabilirsiniz.<\/p>\n<h4>Log Y\u00f6netimi<\/h4>\n<p>PM2, uygulama loglar\u0131n\u0131 y\u00f6netmek i\u00e7in yerle\u015fik \u00f6zelliklere sahiptir. <code>pm2 logs<\/code> komutuyla loglar\u0131 ger\u00e7ek zamanl\u0131 olarak izleyebilirsiniz. Loglar\u0131n \u00e7ok b\u00fcy\u00fcmesini engellemek i\u00e7in PM2&#8217;nin log rotasyonunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pm2 install pm2-logrotate<\/code><\/pre>\n<p>Bu mod\u00fcl, log dosyalar\u0131n\u0131 belirli boyutlara ula\u015ft\u0131\u011f\u0131nda otomatik olarak d\u00f6nd\u00fcr\u00fcr ve s\u0131k\u0131\u015ft\u0131r\u0131r.<\/p>\n<h4>\u0130zleme ve Performans (\u0130ste\u011fe Ba\u011fl\u0131)<\/h4>\n<p>Uygulaman\u0131z\u0131n performans\u0131n\u0131 ve sa\u011fl\u0131\u011f\u0131n\u0131 izlemek i\u00e7in ek ara\u00e7lar kullanabilirsiniz.<br \/>\n*   <strong>Prometheus ve Grafana:<\/strong> Sunucu metriklerini ve uygulama metriklerini toplamak ve g\u00f6rselle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir kombinasyondur.<br \/>\n*   <strong>New Relic, Datadog:<\/strong> Ticari \u00e7\u00f6z\u00fcmler, daha kapsaml\u0131 uygulama performans\u0131 izleme (APM) ve hata raporlama \u00f6zellikleri sunar.<br \/>\n*   <strong>PM2 Monit:<\/strong> PM2&#8217;nin kendi izleme aray\u00fcz\u00fc, temel CPU ve bellek kullan\u0131m\u0131n\u0131 g\u00f6sterir.<\/p>\n<h3>Sorun Giderme ve Yayg\u0131n Hatalar<\/h3>\n<p>Kurulum s\u0131ras\u0131nda veya sonras\u0131nda kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcmleri:<\/p>\n<p>*   <strong>Port \u00c7ak\u0131\u015fmalar\u0131:<\/strong> Uygulaman\u0131z\u0131n dinledi\u011fi portun ba\u015fka bir servis taraf\u0131ndan kullan\u0131l\u0131p kullan\u0131lmad\u0131\u011f\u0131n\u0131 kontrol edin. <code>sudo lsof -i :PORT_NUMARASI<\/code> veya <code>sudo netstat -tulnp | grep PORT_NUMARASI<\/code> komutlar\u0131 yard\u0131mc\u0131 olabilir.<br \/>\n*   <strong>\u0130zin Hatalar\u0131:<\/strong> Dosya veya dizin izinlerinin yanl\u0131\u015f ayarlanmas\u0131 yayg\u0131n bir sorundur. <code>chmod<\/code> ve <code>chown<\/code> komutlar\u0131n\u0131 do\u011fru kulland\u0131\u011f\u0131n\u0131zdan emin olun. \u00d6zellikle log dosyalar\u0131 veya ge\u00e7ici dizinler i\u00e7in yazma izinleri \u00f6nemlidir.<br \/>\n*   <strong>A\u011f Yap\u0131land\u0131rmas\u0131 (G\u00fcvenlik Duvar\u0131):<\/strong> G\u00fcvenlik duvar\u0131n\u0131z\u0131n (UFW) uygulaman\u0131z\u0131n kulland\u0131\u011f\u0131 portlar\u0131 a\u00e7t\u0131\u011f\u0131ndan emin olun. <code>sudo ufw status<\/code> komutunu kontrol edin.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Sorunlar\u0131:<\/strong> <code>npm install<\/code> s\u0131ras\u0131nda veya uygulama ba\u015flat\u0131l\u0131rken ba\u011f\u0131ml\u0131l\u0131k hatalar\u0131 al\u0131yorsan\u0131z, <code>node_modules<\/code> dizinini silip <code>npm cache clean --force<\/code> ve ard\u0131ndan tekrar <code>npm install<\/code> deneyin.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri Y\u00fcklenmiyor:<\/strong> <code>.env<\/code> dosyas\u0131n\u0131n do\u011fru yerde oldu\u011fundan ve <code>dotenv<\/code> paketinin uygulaman\u0131zda erken bir a\u015famada \u00e7a\u011fr\u0131ld\u0131\u011f\u0131ndan emin olun. PM2 ile ba\u015flat\u0131rken de ortam de\u011fi\u015fkenlerinin do\u011fru ayarland\u0131\u011f\u0131n\u0131 kontrol edin.<br \/>\n*   <strong>Nginx 502 Bad Gateway:<\/strong> Bu genellikle Nginx&#8217;in Node.js uygulaman\u0131za ula\u015famad\u0131\u011f\u0131 anlam\u0131na gelir. Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan, do\u011fru portu dinledi\u011finden ve Nginx yap\u0131land\u0131rman\u0131zdaki <code>proxy_pass<\/code> adresinin do\u011fru oldu\u011fundan emin olun. PM2 loglar\u0131n\u0131 kontrol edin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bir ekip i\u00e7in VPS \u00fczerinde Node.js geli\u015ftirme ortam\u0131 kurmak, ilk ba\u015fta karma\u015f\u0131k g\u00f6r\u00fcnebilir ancak do\u011fru ad\u0131mlar\u0131 takip ederek g\u00fcvenli, verimli ve i\u015fbirli\u011fine a\u00e7\u0131k bir platform olu\u015fturmak m\u00fcmk\u00fcnd\u00fcr. Bu rehberde, temel VPS kurulumundan g\u00fcvenlik ayarlar\u0131na, Node.js ve veritaban\u0131 kurulumundan uygulama y\u00f6netimine ve Nginx ile ters proxy yap\u0131land\u0131rmas\u0131na kadar t\u00fcm \u00f6nemli ad\u0131mlar\u0131 ele ald\u0131k.<\/p>\n<p>Unutmay\u0131n ki geli\u015ftirme ortam\u0131n\u0131z s\u00fcrekli evrilecektir. Ekibinizin ihtiya\u00e7lar\u0131 de\u011fi\u015ftik\u00e7e veya yeni teknolojiler ortaya \u00e7\u0131kt\u0131k\u00e7a ortam\u0131n\u0131z\u0131 g\u00fcncellemeyi ve optimize etmeyi ihmal etmeyin. G\u00fcvenlik en \u00f6nemli \u00f6nceliklerden biri olmal\u0131 ve d\u00fczenli g\u00fcncellemeler, g\u00fc\u00e7l\u00fc parolalar ve eri\u015fim k\u0131s\u0131tlamalar\u0131 gibi iyi uygulamalar her zaman takip edilmelidir. Bu kapsaml\u0131 rehber sayesinde, ekibiniz Node.js projelerini VPS \u00fczerinde ba\u015far\u0131yla geli\u015ftirip da\u011f\u0131tabilecek sa\u011flam bir temele sahip olacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nModern web geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131 prototipleme","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-37500","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>Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber Giri\u015f Modern web geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131 prototipleme\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-06T14:40:51+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-01-06T14:40:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/\"},\"wordCount\":2789,\"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\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/\",\"name\":\"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-06T14:40:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber","og_description":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber Giri\u015f Modern web geli\u015ftirme d\u00fcnyas\u0131nda, h\u0131zl\u0131 prototipleme","og_url":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-06T14:40:51+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber","datePublished":"2026-01-06T14:40:51+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/"},"wordCount":2789,"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\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/","name":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-06T14:40:51+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ekip-icin-vps-uzerinde-node-js-gelistirme-ortami-kurulumu-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ekip \u0130\u00e7in VPS \u00dczerinde Node.js Geli\u015ftirme Ortam\u0131 Kurulumu: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37500","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=37500"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37500\/revisions"}],"predecessor-version":[{"id":37501,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37500\/revisions\/37501"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37500"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37500"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}