{"id":32062,"date":"2025-10-17T08:41:03","date_gmt":"2025-10-17T05:41:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32062"},"modified":"2025-10-17T08:41:03","modified_gmt":"2025-10-17T05:41:03","slug":"linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/","title":{"rendered":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Linux tabanl\u0131 bir Sanal \u00d6zel Sunucu (VPS) \u00fczerinde Node.js kullanarak arka planda s\u00fcrekli \u00e7al\u0131\u015fan, kullan\u0131c\u0131 etkile\u015fimi gerektirmeyen uygulamalar yani &#8220;daemon&#8221;lar geli\u015ftirmek, modern web ve sistem y\u00f6netimi g\u00f6revleri i\u00e7in olduk\u00e7a yayg\u0131n ve g\u00fc\u00e7l\u00fc bir yakla\u015f\u0131md\u0131r. Bu makale, Node.js&#8217;in asenkron do\u011fas\u0131n\u0131 Linux&#8217;un sa\u011flam s\u00fcre\u00e7 y\u00f6netimi \u00f6zellikleriyle birle\u015ftirerek, g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir daemon&#8217;lar olu\u015fturman\u0131n t\u00fcm ad\u0131mlar\u0131n\u0131 detayl\u0131 bir \u015fekilde ele alacakt\u0131r. Temel bir Node.js uygulamas\u0131n\u0131n nas\u0131l yaz\u0131laca\u011f\u0131ndan, Linux&#8217;un <code>systemd<\/code> servis y\u00f6neticisi ile nas\u0131l entegre edilece\u011fine ve bir VPS \u00fczerinde nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131na kadar her a\u015famay\u0131 kapsayaca\u011f\u0131z.<\/p>\n<h3>I. Daemon Kavram\u0131 ve Neden Gereklidir?<\/h3>\n<p>Daemon, Unix benzeri i\u015fletim sistemlerinde arka planda \u00e7al\u0131\u015fan, do\u011frudan bir kullan\u0131c\u0131 aray\u00fcz\u00fc veya etkile\u015fimi olmayan bir bilgisayar program\u0131d\u0131r. Bu programlar genellikle sistem ba\u015flat\u0131ld\u0131\u011f\u0131nda otomatik olarak ba\u015flar ve sistem kapanana kadar s\u00fcrekli olarak \u00e7al\u0131\u015f\u0131r. &#8220;Daemon&#8221; terimi, bilgisayar bilimleri literat\u00fcr\u00fcnde, kullan\u0131c\u0131n\u0131n do\u011frudan kontrol\u00fc d\u0131\u015f\u0131nda \u00e7al\u0131\u015fan &#8220;cin&#8221; benzeri s\u00fcre\u00e7leri tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Peki, daemon&#8217;lara neden ihtiyac\u0131m\u0131z var? Bir\u00e7ok kritik sistem g\u00f6revi ve uygulama, s\u00fcrekli \u00e7al\u0131\u015fma gerektirir. \u00d6rne\u011fin, bir web sunucusu (Apache, Nginx), veritaban\u0131 sunucusu (MySQL, PostgreSQL), e-posta sunucusu (Postfix), SSH sunucusu veya bir sistem izleme arac\u0131 gibi uygulamalar, kullan\u0131c\u0131 oturumu a\u00e7\u0131k olsun veya olmas\u0131n, s\u00fcrekli olarak hizmet vermelidir. Daemon&#8217;lar, bu t\u00fcr uygulamalar\u0131n g\u00fcvenilir bir \u015fekilde arka planda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayarak sistemin genel i\u015flevselli\u011fini ve kararl\u0131l\u0131\u011f\u0131n\u0131 temin eder. Kaynaklar\u0131 verimli kullan\u0131r, belirli olaylar\u0131 dinler veya d\u00fczenli aral\u0131klarla g\u00f6revleri yerine getirirler. Linux&#8217;ta daemon&#8217;lar genellikle <code>init<\/code> (eski sistemlerde) veya <code>systemd<\/code> (modern sistemlerde) gibi sistem y\u00f6neticileri taraf\u0131ndan ba\u015flat\u0131l\u0131r, durdurulur ve y\u00f6netilir.<\/p>\n<h3>II. Node.js Neden Daemon Geli\u015ftirmek \u0130\u00e7in \u0130yi Bir Se\u00e7imdir?<\/h3>\n<p>Node.js, sunucu taraf\u0131 uygulamalar ve \u00f6zellikle I\/O yo\u011fun i\u015f y\u00fckleri i\u00e7in tasarlanm\u0131\u015f, olay odakl\u0131, asenkron bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Bu \u00f6zellikleri, onu daemon geli\u015ftirmek i\u00e7in olduk\u00e7a cazip bir se\u00e7enek haline getirir:<\/p>\n<p>*   <strong>Asenkron ve Olay Odakl\u0131 Mimari:<\/strong> Node.js&#8217;in tek i\u015f par\u00e7ac\u0131kl\u0131, olay d\u00f6ng\u00fcs\u00fc tabanl\u0131 yap\u0131s\u0131, e\u015fzamanl\u0131 ba\u011flant\u0131lar\u0131 veya g\u00f6revleri bloklamadan verimli bir \u015fekilde y\u00f6netmesini sa\u011flar. Bu, \u00f6zellikle bir a\u011f portunu dinleyen veya dosya sistemi olaylar\u0131n\u0131 izleyen daemon&#8217;lar i\u00e7in idealdir.<br \/>\n*   <strong>H\u0131zl\u0131 Geli\u015ftirme ve Geni\u015f Ekosistem:<\/strong> JavaScript&#8217;in h\u0131zl\u0131 geli\u015ftirme yetenekleri ve npm (Node Package Manager) arac\u0131l\u0131\u011f\u0131yla eri\u015filebilen binlerce haz\u0131r k\u00fct\u00fcphane, daemon geli\u015ftirme s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r. Logging, konfig\u00fcrasyon y\u00f6netimi, s\u00fcre\u00e7 kontrol\u00fc gibi bir\u00e7ok yayg\u0131n ihtiya\u00e7 i\u00e7in haz\u0131r \u00e7\u00f6z\u00fcmler mevcuttur.<br \/>\n*   <strong>Platform Ba\u011f\u0131ms\u0131zl\u0131k:<\/strong> Node.js, Linux, Windows ve macOS dahil olmak \u00fczere \u00e7e\u015fitli i\u015fletim sistemlerinde \u00e7al\u0131\u015fabilir. Bu, geli\u015ftirme ortam\u0131n\u0131z ile \u00fcretim ortam\u0131n\u0131z aras\u0131nda tutarl\u0131l\u0131k sa\u011flar.<br \/>\n*   <strong>D\u00fc\u015f\u00fck Kaynak T\u00fcketimi (Do\u011fru Kullan\u0131ld\u0131\u011f\u0131nda):<\/strong> Node.js, do\u011fru tasar\u0131mla, \u00f6zellikle I\/O bekleme s\u00fcrelerinin uzun oldu\u011fu durumlarda, di\u011fer baz\u0131 dillerden daha az bellek ve CPU kullanabilir.<br \/>\n*   <strong>Geni\u015f Topluluk ve Destek:<\/strong> Node.js&#8217;in b\u00fcy\u00fck ve aktif bir toplulu\u011fu vard\u0131r. Bu, kar\u015f\u0131la\u015f\u0131lan sorunlar i\u00e7in h\u0131zl\u0131 destek bulmay\u0131 ve s\u00fcrekli geli\u015fen ara\u00e7 ve k\u00fct\u00fcphanelerden faydalanmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>III. Temel Bir Node.js Daemon Uygulamas\u0131 Geli\u015ftirme<\/h3>\n<p>Bir Node.js daemon&#8217;\u0131 geli\u015ftirmeye ba\u015flamadan \u00f6nce, temel bir proje yap\u0131s\u0131 olu\u015fturmak ve gerekli ara\u00e7lar\u0131 kurmak \u00f6nemlidir.<\/p>\n<h4>A. Proje Yap\u0131s\u0131 ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h4>\n<p>\u00d6ncelikle projemiz i\u00e7in bir dizin olu\u015fturup i\u00e7ine girelim:<\/p>\n<pre><code class=\"language-bash\">mkdir my-nodejs-daemon\ncd my-nodejs-daemon\nnpm init -y<\/code><\/pre>\n<p>Bu komutlar, projemiz i\u00e7in <code>package.json<\/code> dosyas\u0131n\u0131 olu\u015fturacakt\u0131r. \u015eimdi, daemon&#8217;\u0131m\u0131z i\u00e7in faydal\u0131 olabilecek baz\u0131 NPM paketlerini kural\u0131m:<\/p>\n<p>*   <code>winston<\/code>: Profesyonel ve esnek g\u00fcnl\u00fckleme (logging) i\u00e7in.<br \/>\n*   <code>dotenv<\/code>: Ortam de\u011fi\u015fkenlerini <code>.env<\/code> dosyas\u0131ndan y\u00fcklemek i\u00e7in.<br \/>\n*   <code>commander<\/code>: Komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 kolayca ayr\u0131\u015ft\u0131rmak i\u00e7in (iste\u011fe ba\u011fl\u0131, ancak faydal\u0131).<\/p>\n<pre><code class=\"language-bash\">npm install winston dotenv commander<\/code><\/pre>\n<h4>B. Basit Bir &#8220;Hello Daemon&#8221; Uygulamas\u0131<\/h4>\n<p>\u015eimdi <code>index.js<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve temel daemon mant\u0131\u011f\u0131n\u0131 yazal\u0131m. Bu \u00f6rnek, her 5 saniyede bir log yazan ve d\u00fczg\u00fcn kapanmay\u0131 ele alan basit bir uygulama olacakt\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ index.js\nrequire('dotenv').config(); \/\/ Ortam de\u011fi\u015fkenlerini y\u00fckle\n\nconst winston = require('winston');\nconst { Command } = require('commander');\nconst program = new Command();\n\n\/\/ Commander ile komut sat\u0131r\u0131 arg\u00fcmanlar\u0131n\u0131 tan\u0131mla\nprogram\n  .option('-p, --port <number>', 'Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 port', '3000')\n  .option('-e, --env <string>', '\u00c7al\u0131\u015fma ortam\u0131 (development, production)', 'development')\n  .parse(process.argv);\n\nconst options = program.opts();\n\n\/\/ Winston logger konfig\u00fcrasyonu\nconst logger = winston.createLogger({\n  level: options.env === 'production' ? 'info' : 'debug',\n  format: winston.format.combine(\n    winston.format.timestamp(),\n    winston.format.json()\n  ),\n  transports: [\n    new winston.transports.Console(),\n    new winston.transports.File({ filename: 'error.log', level: 'error' }),\n    new winston.transports.File({ filename: 'combined.log' })\n  ],\n});\n\nlet counter = 0;\nlet intervalId;\n\nfunction startDaemon() {\n  logger.info(<code>Daemon ba\u015flat\u0131l\u0131yor. Ortam: ${options.env}, Port: ${options.port}<\/code>);\n  intervalId = setInterval(() => {\n    counter++;\n    logger.info(<code>Daemon \u00e7al\u0131\u015f\u0131yor. Saya\u00e7: ${counter}<\/code>);\n    \/\/ Burada ger\u00e7ek daemon i\u015f mant\u0131\u011f\u0131 yer alacak\n    \/\/ \u00d6rne\u011fin, bir API \u00e7a\u011fr\u0131s\u0131, dosya okuma, veritaban\u0131 sorgusu vb.\n  }, 5000); \/\/ Her 5 saniyede bir \u00e7al\u0131\u015f\u0131r\n}\n\nfunction stopDaemon() {\n  logger.info('Daemon durduruluyor...');\n  if (intervalId) {\n    clearInterval(intervalId);\n  }\n  logger.info('Daemon ba\u015far\u0131yla durduruldu.');\n  process.exit(0); \/\/ Uygulamadan \u00e7\u0131k\n}\n\n\/\/ SIGTERM ve SIGINT sinyallerini yakalayarak d\u00fczg\u00fcn kapanma sa\u011fla\nprocess.on('SIGTERM', () => {\n  logger.warn('SIGTERM sinyali al\u0131nd\u0131. Daemon durduruluyor...');\n  stopDaemon();\n});\n\nprocess.on('SIGINT', () => {\n  logger.warn('SIGINT sinyali al\u0131nd\u0131. Daemon durduruluyor...');\n  stopDaemon();\n});\n\n\/\/ Yakalanmayan istisnalar\u0131 ve reddedilen Promise'lar\u0131 ele al\nprocess.on('uncaughtException', (err) => {\n  logger.error('Yakalanmayan istisna:', err);\n  \/\/ Hata durumunda daemon'\u0131 durdurabilir veya yeniden ba\u015flatma sinyali g\u00f6nderebiliriz\n  stopDaemon();\n});\n\nprocess.on('unhandledRejection', (reason, promise) => {\n  logger.error('Yakalanmayan Promise Reddi:', { reason, promise });\n  \/\/ Hata durumunda daemon'\u0131 durdurabilir veya yeniden ba\u015flatma sinyali g\u00f6nderebiliriz\n  stopDaemon();\n});\n\nstartDaemon();<\/code><\/pre>\n<p>Bu kod par\u00e7as\u0131, bir Node.js daemon&#8217;\u0131n\u0131n temel bile\u015fenlerini g\u00f6sterir:<br \/>\n*   <strong>Ba\u015flatma:<\/strong> <code>startDaemon<\/code> fonksiyonu, daemon&#8217;\u0131n ana i\u015f mant\u0131\u011f\u0131n\u0131 ba\u015flatan bir <code>setInterval<\/code> d\u00f6ng\u00fcs\u00fc i\u00e7erir.<br \/>\n*   <strong>D\u00fczg\u00fcn Kapanma:<\/strong> <code>process.on('SIGTERM')<\/code> ve <code>process.on('SIGINT')<\/code> kullan\u0131m\u0131, sistem taraf\u0131ndan g\u00f6nderilen durdurma sinyallerini (\u00f6rne\u011fin <code>kill<\/code> komutu veya <code>systemctl stop<\/code>) yakalayarak uygulaman\u0131n temiz bir \u015fekilde kapanmas\u0131n\u0131 sa\u011flar. Bu, a\u00e7\u0131k dosya tan\u0131mlay\u0131c\u0131lar\u0131n\u0131, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 vb. kapatmak i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Hata Y\u00f6netimi:<\/strong> <code>uncaughtException<\/code> ve <code>unhandledRejection<\/code> olaylar\u0131, beklenmedik hatalar\u0131n uygulaman\u0131n \u00e7\u00f6kmesine neden olmas\u0131n\u0131 engellemek ve bu hatalar\u0131 loglamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>C. Konfig\u00fcrasyon Y\u00f6netimi<\/h4>\n<p>Daemon&#8217;lar genellikle farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) farkl\u0131 ayarlarla \u00e7al\u0131\u015f\u0131r. Bu ayarlar\u0131 y\u00f6netmek i\u00e7in \u00e7e\u015fitli y\u00f6ntemler vard\u0131r:<\/p>\n<p>*   <strong>Ortam De\u011fi\u015fkenleri (<code>.env<\/code> ve <code>dotenv<\/code>):<\/strong> Hassas bilgiler (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) i\u00e7in en iyi y\u00f6ntemdir. <code>dotenv<\/code> paketi, <code>.env<\/code> dosyas\u0131ndaki de\u011fi\u015fkenleri <code>process.env<\/code>&#8216;e y\u00fckler.<\/p>\n<pre><code class=\"language-\"># .env dosyas\u0131 \u00f6rne\u011fi\n    DATABASE_URL=\"mongodb:\/\/localhost:27017\/my_daemon_db\"\n    API_KEY=\"your_secret_api_key\"<\/code><\/pre>\n<p>*   <strong>Komut Sat\u0131r\u0131 Arg\u00fcmanlar\u0131 (<code>commander<\/code>):<\/strong> Uygulama ba\u015flat\u0131l\u0131rken dinamik ayarlar ge\u00e7irmek i\u00e7in kullan\u0131l\u0131r. Yukar\u0131daki \u00f6rnekte <code>port<\/code> ve <code>env<\/code> arg\u00fcmanlar\u0131n\u0131 tan\u0131mlad\u0131k.<br \/>\n*   <strong>JSON\/YAML Konfig\u00fcrasyon Dosyalar\u0131:<\/strong> Daha karma\u015f\u0131k yap\u0131land\u0131r\u0131lm\u0131\u015f ayarlar i\u00e7in bir <code>config.json<\/code> veya <code>config.yaml<\/code> dosyas\u0131 olu\u015fturulabilir ve uygulama ba\u015flat\u0131l\u0131rken bu dosyadan okunabilir.<\/p>\n<h4>D. G\u00fcnl\u00fckleme (Logging)<\/h4>\n<p>Daemon&#8217;lar arka planda \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, ne yapt\u0131klar\u0131n\u0131, ne zaman hata verdiklerini veya ne zaman \u00f6nemli olaylar\u0131n ger\u00e7ekle\u015fti\u011fini anlamak i\u00e7in kapsaml\u0131 g\u00fcnl\u00fckleme (logging) hayati \u00f6neme sahiptir. <code>console.log<\/code> yeterli de\u011fildir \u00e7\u00fcnk\u00fc log seviyeleri, dosya rotasyonu veya farkl\u0131 ta\u015f\u0131y\u0131c\u0131lar (konsol, dosya, uzak sunucu) gibi geli\u015fmi\u015f \u00f6zellikler sunmaz.<\/p>\n<p><code>winston<\/code> gibi bir k\u00fct\u00fcphane, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lar:<br \/>\n*   <strong>Log Seviyeleri:<\/strong> <code>debug<\/code>, <code>info<\/code>, <code>warn<\/code>, <code>error<\/code> gibi seviyelerle loglar\u0131n \u00f6nem derecesini belirtir. \u00dcretimde sadece <code>info<\/code> ve \u00fczeri loglar\u0131 g\u00f6stermek, geli\u015ftirme ortam\u0131nda ise t\u00fcm <code>debug<\/code> loglar\u0131n\u0131 g\u00f6rmek isteyebilirsiniz.<br \/>\n*   <strong>Ta\u015f\u0131y\u0131c\u0131lar (Transports):<\/strong> Loglar\u0131 farkl\u0131 hedeflere (konsol, dosya, veritaban\u0131, uzak log sunucusu) g\u00f6nderme yetene\u011fi.<br \/>\n*   <strong>Formatlama:<\/strong> Log mesajlar\u0131n\u0131n JSON, d\u00fcz metin veya \u00f6zel formatlarda olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Yukar\u0131daki <code>index.js<\/code> \u00f6rne\u011finde <code>winston<\/code> kullan\u0131m\u0131n\u0131 g\u00f6rebilirsiniz. <code>combined.log<\/code> t\u00fcm loglar\u0131, <code>error.log<\/code> ise sadece hata loglar\u0131n\u0131 tutar.<\/p>\n<h4>E. Hata Y\u00f6netimi<\/h4>\n<p>Sa\u011flam bir daemon, hatalar\u0131 sadece loglamakla kalmamal\u0131, ayn\u0131 zamanda onlar\u0131 d\u00fczg\u00fcn bir \u015fekilde ele almal\u0131 ve uygulaman\u0131n \u00e7\u00f6kmesini engellemelidir.<\/p>\n<p>*   <strong><code>try...catch<\/code> Bloklar\u0131:<\/strong> Asenkron olmayan kodlarda veya <code>async\/await<\/code> yap\u0131lar\u0131nda senkron hatalar\u0131 yakalamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong><code>process.on('uncaughtException')<\/code>:<\/strong> Node.js olay d\u00f6ng\u00fcs\u00fcn\u00fc t\u0131kayan ve yakalanmayan senkron istisnalar\u0131 yakalar. Bu olay tetiklendi\u011finde uygulaman\u0131n tutars\u0131z bir durumda olabilece\u011fi unutulmamal\u0131d\u0131r. Genellikle uygulamay\u0131 temiz bir \u015fekilde kapat\u0131p yeniden ba\u015flatmak en iyi yakla\u015f\u0131md\u0131r.<br \/>\n*   <strong><code>process.on('unhandledRejection')<\/code>:<\/strong> Bir Promise&#8217;in reddedilmesi durumunda ve bu reddedilmenin hi\u00e7bir <code>catch<\/code> blo\u011fu taraf\u0131ndan yakalanmamas\u0131 durumunda tetiklenir. <code>uncaughtException<\/code> gibi, bu da uygulaman\u0131n potansiyel olarak tutars\u0131z bir duruma girmesine neden olabilir.<\/p>\n<p>Hata durumunda uygulaman\u0131n ne yapaca\u011f\u0131na karar vermek \u00f6nemlidir. Basit bir yeniden ba\u015flatma, genellikle ge\u00e7ici sorunlar\u0131 \u00e7\u00f6zebilir. Ancak s\u00fcrekli hatalar, daha derinlemesine bir inceleme gerektirir.<\/p>\n<h3>IV. Daemon&#8217;\u0131 Linux Ortam\u0131na Uygun Hale Getirme<\/h3>\n<p>Bir Node.js uygulamas\u0131n\u0131 bir daemon olarak \u00e7al\u0131\u015ft\u0131rmak i\u00e7in, onu arka plana atma, PID (Process ID) dosyas\u0131 olu\u015fturma gibi Linux&#8217;a \u00f6zg\u00fc baz\u0131 kavramlar\u0131 anlamak gerekir.<\/p>\n<h4>A. Arka Plana Atma (Backgrounding)<\/h4>\n<p>Bir uygulamay\u0131 do\u011frudan terminalden <code>node index.js<\/code> komutuyla ba\u015flatt\u0131\u011f\u0131n\u0131zda, terminal oturumu kapand\u0131\u011f\u0131nda uygulama da kapan\u0131r. Bunu \u00f6nlemek i\u00e7in uygulamay\u0131 arka plana atmak gerekir.<\/p>\n<p>*   <strong><code>nohup<\/code> ve <code>&<\/code>:<\/strong> En basit y\u00f6ntemdir ancak profesyonel bir daemon y\u00f6netimi i\u00e7in \u00f6nerilmez.<\/p>\n<pre><code class=\"language-bash\">nohup node index.js &<\/code><\/pre>\n<p>    <code>nohup<\/code>, terminal oturumu kapansa bile s\u00fcrecin \u00e7al\u0131\u015fmaya devam etmesini sa\u011flar. <code>&<\/code> ise s\u00fcreci arka plana atar. Ancak bu y\u00f6ntem, s\u00fcrecin durumunu izleme, otomatik yeniden ba\u015flatma gibi \u00f6zellikler sunmaz.<br \/>\n*   <strong>S\u00fcre\u00e7 Y\u00f6neticileri (<code>pm2<\/code>, <code>forever<\/code>):<\/strong> Daha profesyonel ve \u00f6nerilen y\u00f6ntemdir. Bu ara\u00e7lar, uygulaman\u0131z\u0131 daemonize eder, \u00e7\u00f6kt\u00fc\u011f\u00fcnde otomatik olarak yeniden ba\u015flat\u0131r, loglar\u0131 y\u00f6netir ve k\u00fcmeleme (clustering) gibi geli\u015fmi\u015f \u00f6zellikler sunar. <code>pm2<\/code> bu konuda en pop\u00fcler olanlardan biridir. Ancak bu makalede <code>systemd<\/code> entegrasyonuna odaklanaca\u011f\u0131m\u0131z i\u00e7in <code>pm2<\/code>&#8216;yi daha sonra, geli\u015fmi\u015f konularda ele alaca\u011f\u0131z.<\/p>\n<h4>B. \u00c7ift \u00c7atallanma (Double Fork) Prensibi<\/h4>\n<p>Geleneksel Linux daemon&#8217;lar\u0131, ebeveyn s\u00fcre\u00e7ten ba\u011f\u0131ms\u0131z hale gelmek ve arka planda \u00e7al\u0131\u015fmak i\u00e7in &#8220;\u00e7ift \u00e7atallanma&#8221; (double fork) ad\u0131 verilen bir mekanizma kullan\u0131r. Bu s\u00fcre\u00e7 \u00f6zetle \u015f\u00f6yledir:<br \/>\n1.  Orijinal s\u00fcre\u00e7 bir \u00e7ocuk s\u00fcre\u00e7 \u00e7atallan\u0131r.<br \/>\n2.  Ebeveyn s\u00fcre\u00e7 hemen \u00e7\u0131kar.<br \/>\n3.  \u00c7ocuk s\u00fcre\u00e7 bir oturum lideri olur.<br \/>\n4.  \u00c7ocuk s\u00fcre\u00e7 bir kez daha \u00e7atallan\u0131r.<br \/>\n5.  \u0130kinci \u00e7ocuk s\u00fcre\u00e7, yeni oturumun lideri olmayan tek s\u00fcre\u00e7tir ve bu sayede bir terminalden tamamen ba\u011f\u0131ms\u0131z hale gelir.<br \/>\n6.  \u0130kinci \u00e7ocuk s\u00fcre\u00e7, standart giri\u015f\/\u00e7\u0131k\u0131\u015f\/hata ak\u0131\u015flar\u0131n\u0131 <code>\/dev\/null<\/code>&#8216;a y\u00f6nlendirir.<\/p>\n<p>Node.js geli\u015ftiricileri olarak, genellikle bu d\u00fc\u015f\u00fck seviyeli detaylarla do\u011frudan u\u011fra\u015fmam\u0131za gerek kalmaz. <code>systemd<\/code> gibi servis y\u00f6neticileri veya <code>pm2<\/code> gibi s\u00fcre\u00e7 y\u00f6neticileri, bu ad\u0131mlar\u0131 bizim i\u00e7in otomatik olarak halleder.<\/p>\n<h4>C. Process ID (PID) Dosyas\u0131<\/h4>\n<p>Bir daemon \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, genellikle bir PID dosyas\u0131 (<code>.pid<\/code> uzant\u0131l\u0131 bir metin dosyas\u0131) olu\u015fturulur. Bu dosya, \u00e7al\u0131\u015fan daemon&#8217;\u0131n s\u00fcre\u00e7 kimli\u011fini (PID) i\u00e7erir. Bu PID, daemon&#8217;\u0131 durdurmak, yeniden ba\u015flatmak veya durumunu kontrol etmek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-bash\">kill $(cat \/var\/run\/my-daemon.pid)<\/code><\/pre>\n<p>PID dosyas\u0131 genellikle <code>\/var\/run\/<\/code> dizininde veya uygulaman\u0131n kendi \u00e7al\u0131\u015fma dizininde saklan\u0131r. <code>systemd<\/code> kullan\u0131rken, genellikle <code>systemd<\/code> bu dosyay\u0131 sizin i\u00e7in y\u00f6netir ve manuel olarak olu\u015fturman\u0131za gerek kalmaz.<\/p>\n<h3>V. systemd ile Daemon Y\u00f6netimi<\/h3>\n<p>Modern Linux da\u011f\u0131t\u0131mlar\u0131nda (Ubuntu, CentOS, Debian vb.), <code>systemd<\/code> sistem ve servis y\u00f6neticisi olarak kullan\u0131l\u0131r. <code>systemd<\/code>, daemon&#8217;lar\u0131 y\u00f6netmek, otomatik ba\u015flatma sa\u011flamak, yeniden ba\u015flatma stratejileri belirlemek ve loglar\u0131 toplamak i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yol sunar.<\/p>\n<h4>A. systemd Nedir ve Neden Kullan\u0131l\u0131r?<\/h4>\n<p><code>systemd<\/code>, Linux \u00e7ekirde\u011fi taraf\u0131ndan ba\u015flat\u0131lan ilk s\u00fcre\u00e7 olan <code>init<\/code> s\u00fcrecinin yerini alan bir sistem ve servis y\u00f6neticisidir. G\u00f6revleri \u015funlar\u0131 i\u00e7erir:<br \/>\n*   <strong>Servis Y\u00f6netimi:<\/strong> Sistem servislerini (daemon&#8217;lar\u0131) ba\u015flatma, durdurma, yeniden ba\u015flatma, durumunu sorgulama.<br \/>\n*   <strong>Otomatik Ba\u015flatma:<\/strong> Sistem a\u00e7\u0131l\u0131\u015f\u0131nda servisleri otomatik olarak ba\u015flatma.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> Servislerin do\u011fru s\u0131rayla ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flama (\u00f6rne\u011fin, bir web sunucusu veritaban\u0131 ba\u015flamadan ba\u015flamamal\u0131d\u0131r).<br \/>\n*   <strong>Kaynak Kontrol\u00fc:<\/strong> CGroup&#8217;lar arac\u0131l\u0131\u011f\u0131yla servislere kaynak limitleri atama.<br \/>\n*   <strong>Log Toplama:<\/strong> T\u00fcm servislerin standart \u00e7\u0131kt\u0131 ve hata \u00e7\u0131kt\u0131lar\u0131n\u0131 <code>journald<\/code> arac\u0131l\u0131\u011f\u0131yla merkezi olarak toplama.<\/p>\n<p><code>systemd<\/code> kullanmak, Node.js daemon&#8217;\u0131n\u0131z\u0131n g\u00fcvenilirli\u011fini ve y\u00f6netilebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h4>B. Bir systemd Servis Dosyas\u0131 Olu\u015fturma<\/h4>\n<p>Bir Node.js uygulamas\u0131n\u0131 <code>systemd<\/code> servisi olarak \u00e7al\u0131\u015ft\u0131rmak i\u00e7in, <code>\/etc\/systemd\/system\/<\/code> dizininde bir <code>.service<\/code> dosyas\u0131 olu\u015fturmam\u0131z gerekir. Bu dosya, <code>systemd<\/code>&#8216;ye uygulamam\u0131z\u0131 nas\u0131l ba\u015flataca\u011f\u0131n\u0131, durduraca\u011f\u0131n\u0131 ve y\u00f6netece\u011fini s\u00f6yler.<\/p>\n<p>\u00d6rnek olarak, <code>my-nodejs-daemon.service<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-ini\"># \/etc\/systemd\/system\/my-nodejs-daemon.service\n[Unit]\nDescription=My Node.js Daemon Service\nAfter=network.target\n\n[Service]\nExecStart=\/usr\/bin\/node \/home\/your_user\/my-nodejs-daemon\/index.js --env production --port 4000\nWorkingDirectory=\/home\/your_user\/my-nodejs-daemon\nRestart=always\nRestartSec=5\nStandardOutput=syslog\nStandardError=syslog\nSyslogIdentifier=my-nodejs-daemon\nUser=your_user\nGroup=your_user\nEnvironment=NODE_ENV=production\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Bu dosyadaki b\u00f6l\u00fcmleri inceleyelim:<\/p>\n<p>*   <strong><code>[Unit]<\/code>:<\/strong> Servis hakk\u0131nda genel bilgiler ve ba\u011f\u0131ml\u0131l\u0131klar.<br \/>\n    *   <code>Description<\/code>: Servisin k\u0131sa a\u00e7\u0131klamas\u0131.<br \/>\n    *   <code>After=network.target<\/code>: Servisin a\u011f servisi ba\u015flad\u0131ktan sonra ba\u015flamas\u0131n\u0131 sa\u011flar. Di\u011fer ba\u011f\u0131ml\u0131l\u0131klar (\u00f6rne\u011fin veritaban\u0131) buraya eklenebilir.<br \/>\n*   <strong><code>[Service]<\/code>:<\/strong> Servisin nas\u0131l \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131yla ilgili komutlar ve ayarlar.<br \/>\n    *   <code>ExecStart<\/code>: Servisi ba\u015flatmak i\u00e7in \u00e7al\u0131\u015ft\u0131r\u0131lacak komut. Burada Node.js yorumlay\u0131c\u0131s\u0131 (<code>\/usr\/bin\/node<\/code>) ve uygulama dosyam\u0131z\u0131n tam yolu (<code>\/home\/your_user\/my-nodejs-daemon\/index.js<\/code>) belirtilir. Komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 (<code>--env production --port 4000<\/code>) da buraya eklenebilir.<br \/>\n    *   <code>WorkingDirectory<\/code>: Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 dizin. Bu, g\u00f6receli yollarla dosyalara eri\u015fim i\u00e7in \u00f6nemlidir.<br \/>\n    *   <code>Restart=always<\/code>: Servis beklenmedik bir \u015fekilde \u00e7\u00f6kerse veya kapan\u0131rsa otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar. Di\u011fer se\u00e7enekler <code>on-failure<\/code>, <code>on-abnormal<\/code>, <code>no<\/code> olabilir.<br \/>\n    *   <code>RestartSec=5<\/code>: Yeniden ba\u015flatma denemeleri aras\u0131nda 5 saniye bekler.<br \/>\n    *   <code>StandardOutput=syslog<\/code>, <code>StandardError=syslog<\/code>: Uygulaman\u0131n standart \u00e7\u0131kt\u0131 ve hata \u00e7\u0131kt\u0131lar\u0131n\u0131 <code>syslog<\/code>&#8216;a (yani <code>journald<\/code>&#8216;ye) y\u00f6nlendirir. Bu, loglar\u0131 <code>journalctl<\/code> ile izlemeyi sa\u011flar. Alternatif olarak <code>file:\/path\/to\/log.log<\/code> da kullan\u0131labilir.<br \/>\n    *   <code>SyslogIdentifier=my-nodejs-daemon<\/code>: Loglarda bu servisi tan\u0131mlamak i\u00e7in kullan\u0131lan etiket.<br \/>\n    *   <code>User=your_user<\/code>, <code>Group=your_user<\/code>: Servisin hangi kullan\u0131c\u0131 ve grup alt\u0131nda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. <strong>G\u00fcvenlik nedeniyle, root kullan\u0131c\u0131s\u0131 yerine ayr\u0131cal\u0131ks\u0131z bir kullan\u0131c\u0131 kullanmak \u015fiddetle tavsiye edilir.<\/strong><br \/>\n    *   <code>Environment=NODE_ENV=production<\/code>: Uygulama i\u00e7in ortam de\u011fi\u015fkeni tan\u0131mlar. <code>.env<\/code> dosyas\u0131 kullan\u0131yorsan\u0131z bu gerekli olmayabilir veya ek ortam de\u011fi\u015fkenleri tan\u0131mlayabilirsiniz.<br \/>\n*   <strong><code>[Install]<\/code>:<\/strong> Servisin nas\u0131l etkinle\u015ftirilece\u011fiyle ilgili bilgiler.<br \/>\n    *   <code>WantedBy=multi-user.target<\/code>: Servisin \u00e7ok kullan\u0131c\u0131l\u0131 sistem durumunda (normal \u00e7al\u0131\u015fma modu) etkinle\u015ftirilmesi gerekti\u011fini belirtir.<\/p>\n<p><strong>\u00d6nemli:<\/strong> <code>your_user<\/code> ve <code>\/home\/your_user\/my-nodejs-daemon\/<\/code> yollar\u0131n\u0131 kendi kullan\u0131c\u0131 ad\u0131n\u0131za ve projenizin dizinine g\u00f6re g\u00fcncellemeyi unutmay\u0131n. Node.js yorumlay\u0131c\u0131s\u0131n\u0131n yolu da sisteminize g\u00f6re de\u011fi\u015febilir (\u00f6rne\u011fin <code>\/usr\/local\/bin\/node<\/code> veya <code>nvm<\/code> kullan\u0131yorsan\u0131z belirli bir s\u00fcr\u00fcm\u00fcn yolu). <code>which node<\/code> komutuyla do\u011fru yolu bulabilirsiniz.<\/p>\n<h4>C. systemd Servisini Y\u00f6netme<\/h4>\n<p>Servis dosyas\u0131n\u0131 olu\u015fturduktan sonra, <code>systemctl<\/code> komutuyla onu y\u00f6netebiliriz:<\/p>\n<p>1.  <strong>systemd&#8217;yi Yeniden Y\u00fckle:<\/strong> Yeni servis dosyas\u0131n\u0131 okumas\u0131 i\u00e7in <code>systemd<\/code>&#8216;yi bilgilendirin.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload<\/code><\/pre>\n<p>2.  <strong>Servisi Etkinle\u015ftir (Enable):<\/strong> Sistem a\u00e7\u0131l\u0131\u015f\u0131nda otomatik olarak ba\u015flamas\u0131 i\u00e7in servisi etkinle\u015ftirin.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl enable my-nodejs-daemon.service<\/code><\/pre>\n<p>3.  <strong>Servisi Ba\u015flat:<\/strong> Servisi manuel olarak ba\u015flat\u0131n.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl start my-nodejs-daemon.service<\/code><\/pre>\n<p>4.  <strong>Servisin Durumunu Kontrol Et:<\/strong> Servisin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131, son loglar\u0131n\u0131 ve varsa hatalar\u0131n\u0131 g\u00f6r\u00fcn.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status my-nodejs-daemon.service<\/code><\/pre>\n<p>5.  <strong>Servisi Durdur:<\/strong> Servisi durdurun.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl stop my-nodejs-daemon.service<\/code><\/pre>\n<p>6.  <strong>Servisi Yeniden Ba\u015flat:<\/strong> Servisi durdurup tekrar ba\u015flat\u0131n.<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart my-nodejs-daemon.service<\/code><\/pre>\n<p>7.  <strong>Loglar\u0131 \u0130zle:<\/strong> Servisin <code>syslog<\/code>&#8216;a g\u00f6nderdi\u011fi loglar\u0131 <code>journalctl<\/code> ile g\u00f6r\u00fcnt\u00fcleyin.<\/p>\n<pre><code class=\"language-bash\">sudo journalctl -u my-nodejs-daemon.service -f<\/code><\/pre>\n<p>    <code>-f<\/code> (follow) bayra\u011f\u0131, loglar\u0131 ger\u00e7ek zamanl\u0131 olarak izlemenizi sa\u011flar.<\/p>\n<h3>VI. Node.js Daemon&#8217;\u0131n\u0131 Bir VPS \u00dczerinde Da\u011f\u0131tma ve Y\u00f6netme<\/h3>\n<p>\u015eimdiye kadar geli\u015ftirdi\u011fimiz Node.js daemon&#8217;\u0131n\u0131 bir VPS \u00fczerine nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ve y\u00f6netece\u011fimizi ele alal\u0131m.<\/p>\n<h4>A. Geli\u015ftirme Ortam\u0131 Kurulumu<\/h4>\n<p>VPS&#8217;nize SSH ile ba\u011fland\u0131ktan sonra, Node.js ve npm&#8217;i kurman\u0131z gerekir. <code>nvm<\/code> (Node Version Manager) kullanmak, farkl\u0131 Node.js s\u00fcr\u00fcmleri aras\u0131nda kolayca ge\u00e7i\u015f yapman\u0131z\u0131 sa\u011flad\u0131\u011f\u0131 i\u00e7in \u00f6nerilir.<\/p>\n<pre><code class=\"language-bash\"># nvm kurulumu (e\u011fer y\u00fckl\u00fc de\u011filse)\ncurl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash\nsource ~\/.bashrc # veya ~\/.zshrc\n\n<h2>En son LTS Node.js s\u00fcr\u00fcm\u00fcn\u00fc kur<\/h2>\nnvm install --lts\nnvm use --lts\nnvm alias default 'lts\/*' # Varsay\u0131lan olarak LTS s\u00fcr\u00fcm\u00fcn\u00fc kullan\n\n<h2>Node.js ve npm'in kuruldu\u011funu do\u011frula<\/h2>\nnode -v\nnpm -v\n\n<h2>Git kurulumu (e\u011fer y\u00fckl\u00fc de\u011filse)<\/h2>\nsudo apt update\nsudo apt install git # Debian\/Ubuntu i\u00e7in\n<h2>sudo yum install git # CentOS\/RHEL i\u00e7in<\/code><\/pre>\n<\/h2>\n<h4>B. Kodun VPS&#8217;e Aktar\u0131lmas\u0131<\/h4>\n<p>Projenizi VPS&#8217;e aktarmak i\u00e7in birka\u00e7 y\u00f6ntem vard\u0131r:<\/p>\n<p>*   <strong>Git ile Klonlama (\u00d6nerilen):<\/strong> Kodunuzu bir Git deposunda (GitHub, GitLab, Bitbucket) tutuyorsan\u0131z, VPS&#8217;te klonlamak en kolay y\u00f6ntemdir.<\/p>\n<pre><code class=\"language-bash\">cd \/home\/your_user\/\n    git clone https:\/\/github.com\/your_username\/my-nodejs-daemon.git<\/code><\/pre>\n<p>    Bu, <code>\/home\/your_user\/my-nodejs-daemon<\/code> dizinini olu\u015fturacakt\u0131r.<br \/>\n*   <strong>SCP veya SFTP ile Manuel Aktar\u0131m:<\/strong> E\u011fer kodunuz bir Git deposunda de\u011filse veya \u00f6zel dosyalar\u0131n\u0131z varsa, <code>scp<\/code> (Secure Copy Protocol) veya bir SFTP istemcisi (FileZilla gibi) kullanabilirsiniz.<\/p>\n<pre><code class=\"language-bash\"># Yerel makinenizden VPS'e\n    scp -r \/path\/to\/local\/my-nodejs-daemon your_user@your_vps_ip:\/home\/your_user\/<\/code><\/pre>\n<h4>C. Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Kurulumu<\/h4>\n<p>Proje dizininize gidin ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">cd \/home\/your_user\/my-nodejs-daemon\nnpm install --production<\/code><\/pre>\n<p><code>--production<\/code> bayra\u011f\u0131, sadece \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n (<code>dependencies<\/code>) y\u00fcklenmesini sa\u011flar, geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131 (<code>devDependencies<\/code>) atlan\u0131r. Bu, disk alan\u0131 ve kurulum s\u00fcresi a\u00e7\u0131s\u0131ndan faydal\u0131d\u0131r.<\/p>\n<p>E\u011fer <code>.env<\/code> dosyan\u0131z varsa, onu da proje dizininize kopyalamay\u0131 unutmay\u0131n ve i\u00e7eri\u011finin hassas bilgiler i\u00e7erdi\u011finden emin olun.<\/p>\n<h4>D. Daemon&#8217;\u0131n Ba\u015flat\u0131lmas\u0131 ve Test Edilmesi<\/h4>\n<p>1.  <strong>systemd Servis Dosyas\u0131n\u0131 Olu\u015fturun:<\/strong> Daha \u00f6nce bahsedilen <code>my-nodejs-daemon.service<\/code> dosyas\u0131n\u0131 <code>\/etc\/systemd\/system\/<\/code> dizininde olu\u015fturun ve <code>ExecStart<\/code>, <code>WorkingDirectory<\/code>, <code>User<\/code>, <code>Group<\/code> gibi yollar\u0131 ve kullan\u0131c\u0131 adlar\u0131n\u0131 VPS&#8217;nize g\u00f6re g\u00fcncelleyin.<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/systemd\/system\/my-nodejs-daemon.service\n    # \u0130\u00e7eri\u011fi yap\u0131\u015ft\u0131r\u0131n ve d\u00fczenleyin<\/code><\/pre>\n<p>2.  <strong>systemd&#8217;yi Yeniden Y\u00fckle ve Servisi Etkinle\u015ftir\/Ba\u015flat:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\n    sudo systemctl enable my-nodejs-daemon.service\n    sudo systemctl start my-nodejs-daemon.service<\/code><\/pre>\n<p>3.  <strong>Durumu Kontrol Edin ve Loglar\u0131 \u0130zleyin:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo systemctl status my-nodejs-daemon.service\n    sudo journalctl -u my-nodejs-daemon.service -f<\/code><\/pre>\n<p>    Loglarda &#8220;Daemon ba\u015flat\u0131l\u0131yor&#8221; ve &#8220;Daemon \u00e7al\u0131\u015f\u0131yor&#8221; mesajlar\u0131n\u0131 g\u00f6rmelisiniz. Herhangi bir hata durumunda, <code>journalctl<\/code> \u00e7\u0131kt\u0131s\u0131 sorunu gidermenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h4>E. G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h4>\n<p>Bir VPS \u00fczerinde daemon \u00e7al\u0131\u015ft\u0131r\u0131rken g\u00fcvenlik her zaman \u00f6ncelikli olmal\u0131d\u0131r:<\/p>\n<p>*   <strong>Ayr\u0131cal\u0131ks\u0131z Kullan\u0131c\u0131 ile \u00c7al\u0131\u015ft\u0131rma:<\/strong> Daemon&#8217;\u0131n\u0131z\u0131 <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine \u00f6zel, ayr\u0131cal\u0131ks\u0131z bir kullan\u0131c\u0131 (\u00f6rne\u011fin <code>nodejsuser<\/code> veya kendi kullan\u0131c\u0131 ad\u0131n\u0131z) alt\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131n. Bu, bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131 durumunda sisteminize verilebilecek zarar\u0131 s\u0131n\u0131rlar. <code>systemd<\/code> servis dosyas\u0131ndaki <code>User<\/code> ve <code>Group<\/code> y\u00f6nergelerini kullan\u0131n.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenlerini Gizli Tutma:<\/strong> Hassas bilgileri (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) do\u011frudan kod i\u00e7ine yazmak yerine ortam de\u011fi\u015fkenleri (<code>.env<\/code> dosyas\u0131) veya <code>systemd<\/code> servis dosyas\u0131ndaki <code>Environment<\/code> y\u00f6nergesi ile y\u00f6netin. Bu dosyalar\u0131n do\u011fru izinlere sahip oldu\u011fundan emin olun.<br \/>\n*   <strong>Firewall Kurallar\u0131:<\/strong> Sadece gerekli portlar\u0131 a\u00e7\u0131n. \u00d6rne\u011fin, daemon&#8217;\u0131n\u0131z bir web sunucusu de\u011filse ve d\u0131\u015far\u0131dan eri\u015filmesi gerekmiyorsa, portlar\u0131n\u0131 kapat\u0131n veya sadece belirli IP adreslerinden eri\u015fime izin verin. <code>ufw<\/code> (Ubuntu Firewall) veya <code>firewalld<\/code> (CentOS\/RHEL) gibi ara\u00e7lar\u0131 kullan\u0131n.<br \/>\n*   <strong>G\u00fcnl\u00fck G\u00fcncellemeler:<\/strong> \u0130\u015fletim sisteminizi ve Node.js ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 d\u00fczenli olarak g\u00fcncelleyin. Bu, bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 korunman\u0131z\u0131 sa\u011flar.<br \/>\n*   <strong>Eri\u015fim Kontrol\u00fc:<\/strong> Proje dizininizin izinlerini do\u011fru ayarlay\u0131n. Sadece daemon&#8217;\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 kullan\u0131c\u0131n\u0131n okuma\/yazma eri\u015fimi olmal\u0131d\u0131r.<\/p>\n<h3>VII. Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Daemon&#8217;\u0131n\u0131z\u0131 daha sa\u011flam, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir hale getirmek i\u00e7in baz\u0131 geli\u015fmi\u015f konular\u0131 ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurabilirsiniz.<\/p>\n<h4>A. S\u00fcre\u00e7 Y\u00f6neticileri (PM2, Forever)<\/h4>\n<p><code>systemd<\/code> g\u00fc\u00e7l\u00fc bir sistem y\u00f6neticisi olsa da, Node.js uygulamalar\u0131na \u00f6zel baz\u0131 \u00f6zellikler sunan s\u00fcre\u00e7 y\u00f6neticileri (process managers) vard\u0131r:<\/p>\n<p>*   <strong>PM2 (Process Manager 2):<\/strong> Node.js uygulamalar\u0131 i\u00e7in pop\u00fcler bir s\u00fcre\u00e7 y\u00f6neticisidir. \u00d6zellikleri:<br \/>\n    *   <strong>Otomatik Yeniden Ba\u015flatma:<\/strong> Uygulama \u00e7\u00f6kt\u00fc\u011f\u00fcnde veya belle\u011fi a\u015ft\u0131\u011f\u0131nda otomatik olarak yeniden ba\u015flat\u0131r.<br \/>\n    *   <strong>K\u00fcmeleme (Clustering):<\/strong> Node.js&#8217;in tek i\u015f par\u00e7ac\u0131kl\u0131 do\u011fas\u0131n\u0131 a\u015fmak i\u00e7in uygulaman\u0131z\u0131 birden fazla CPU \u00e7ekirde\u011finde \u00e7al\u0131\u015ft\u0131rabilir, y\u00fck dengeleme sa\u011flar.<br \/>\n    *   <strong>S\u0131f\u0131r Kesintiyle Yeniden Y\u00fckleme:<\/strong> Uygulama g\u00fcncellemelerini s\u0131f\u0131r kesintiyle da\u011f\u0131tman\u0131za olanak tan\u0131r.<br \/>\n    *   <strong>\u0130zleme ve Metrikler:<\/strong> CPU, bellek kullan\u0131m\u0131 gibi metrikleri izlemenizi sa\u011flar.<br \/>\n    *   <strong>systemd Entegrasyonu:<\/strong> <code>pm2 startup<\/code> komutu ile <code>pm2<\/code>&#8216;yi bir <code>systemd<\/code> servisi olarak kolayca kurabilir ve ard\u0131ndan Node.js uygulamalar\u0131n\u0131z\u0131 <code>pm2<\/code> alt\u0131nda y\u00f6netebilirsiniz. Bu durumda <code>systemd<\/code> <code>pm2<\/code>&#8216;yi, <code>pm2<\/code> de Node.js uygulaman\u0131z\u0131 y\u00f6netir.<\/p>\n<p><code>pm2<\/code> kullanmak isterseniz:<\/p>\n<pre><code class=\"language-bash\">npm install -g pm2\npm2 start index.js --name my-nodejs-daemon --output \/path\/to\/log.log --error \/path\/to\/error.log\npm2 startup systemd # pm2'yi systemd servisi olarak kurar\nsudo env PATH=$PATH:\/usr\/bin \/usr\/local\/lib\/node_modules\/pm2\/bin\/pm2 startup systemd -u your_user --hp \/home\/your_user # Komut \u00e7\u0131kt\u0131s\u0131n\u0131 kullan\u0131n\npm2 save # \u00c7al\u0131\u015fan s\u00fcre\u00e7leri kaydeder<\/code><\/pre>\n<h4>B. \u0130zleme ve Uyar\u0131lar (Monitoring &#038; Alerting)<\/h4>\n<p>Daemon&#8217;\u0131n\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 s\u00fcrekli izlemek ve sorunlar ortaya \u00e7\u0131kt\u0131\u011f\u0131nda otomatik olarak uyar\u0131lmak kritik \u00f6neme sahiptir.<\/p>\n<p>*   <strong>Log Toplama:<\/strong> <code>journald<\/code> loglar\u0131 toplasa da, daha b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in ELK Stack (Elasticsearch, Logstash, Kibana) veya Grafana Loki gibi merkezi loglama \u00e7\u00f6z\u00fcmleri kullan\u0131labilir. Bu, t\u00fcm servislerinizin loglar\u0131n\u0131 tek bir yerden araman\u0131z\u0131 ve analiz etmenizi sa\u011flar.<br \/>\n*   <strong>Metrik Toplama:<\/strong> Prometheus gibi ara\u00e7lar, uygulaman\u0131z\u0131n CPU, bellek kullan\u0131m\u0131, istek say\u0131s\u0131, hata oran\u0131 gibi metriklerini toplayabilir. Grafana ile bu metrikleri g\u00f6rselle\u015ftirebilirsiniz.<br \/>\n*   <strong>Uyar\u0131lar:<\/strong> Prometheus Alertmanager veya do\u011frudan log izleme ara\u00e7lar\u0131 (\u00f6rne\u011fin Logstash&#8217;in uyar\u0131 eklentileri) arac\u0131l\u0131\u011f\u0131yla e-posta, Slack veya PagerDuty gibi kanallar \u00fczerinden uyar\u0131lar alabilirsiniz.<\/p>\n<h4>C. Otomatik Da\u011f\u0131t\u0131m (CI\/CD)<\/h4>\n<p>Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri hata yapmaya a\u00e7\u0131kt\u0131r ve zaman al\u0131c\u0131d\u0131r. CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatlar\u0131, kodunuzu her de\u011fi\u015fiklikte otomatik olarak test etmenizi ve VPS&#8217;inize da\u011f\u0131tman\u0131z\u0131 sa\u011flar.<\/p>\n<p>*   <strong>Ara\u00e7lar:<\/strong> GitHub Actions, GitLab CI\/CD, Jenkins, CircleCI gibi ara\u00e7lar, kod deponuzdaki de\u011fi\u015fiklikleri alg\u0131layabilir, testleri \u00e7al\u0131\u015ft\u0131rabilir, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyebilir ve ard\u0131ndan <code>ssh<\/code> veya <code>scp<\/code> kullanarak g\u00fcncellenmi\u015f kodu VPS&#8217;inize aktarabilir ve <code>systemctl restart my-nodejs-daemon.service<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilir.<\/p>\n<h4>D. Veritaban\u0131 Ba\u011flant\u0131lar\u0131 ve Kal\u0131c\u0131l\u0131k<\/h4>\n<p>E\u011fer daemon&#8217;\u0131n\u0131z bir veritaban\u0131 kullan\u0131yorsa:<\/p>\n<p>*   <strong>Ba\u011flant\u0131 Havuzlar\u0131 (Connection Pooling):<\/strong> Her istek veya g\u00f6rev i\u00e7in yeni bir veritaban\u0131 ba\u011flant\u0131s\u0131 a\u00e7mak yerine, ba\u011flant\u0131 havuzlar\u0131 kullanarak ba\u011flant\u0131 y\u00f6netimini optimize edin. Bu, performans\u0131 art\u0131r\u0131r ve kaynak t\u00fcketimini azalt\u0131r.<br \/>\n*   <strong>Yeniden Ba\u011flanma Stratejileri:<\/strong> Veritaban\u0131 ba\u011flant\u0131s\u0131 kesildi\u011finde, daemon&#8217;\u0131n\u0131z\u0131n otomatik olarak yeniden ba\u011flanmaya \u00e7al\u0131\u015fmas\u0131 \u00f6nemlidir. Geriye d\u00f6n\u00fck \u00fcstel bekleme (exponential backoff) stratejisi ile denemeler yapmak, veritaban\u0131n\u0131n kurtarma s\u00fcresi boyunca a\u015f\u0131r\u0131 y\u00fcklenmesini \u00f6nler.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, bir Linux VPS \u00fczerinde Node.js ile g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir bir daemon uygulamas\u0131n\u0131n nas\u0131l geli\u015ftirilece\u011fini ve y\u00f6netilece\u011fini kapsaml\u0131 bir \u015fekilde inceledik. Node.js&#8217;in asenkron ve olay odakl\u0131 yap\u0131s\u0131n\u0131n, arka plan g\u00f6revleri i\u00e7in ne kadar uygun oldu\u011funu g\u00f6rd\u00fck. Temel bir Node.js daemon uygulamas\u0131n\u0131n nas\u0131l yaz\u0131laca\u011f\u0131n\u0131, g\u00fcnl\u00fckleme ve hata y\u00f6netimi gibi kritik y\u00f6nlerini ele ald\u0131k. Ard\u0131ndan, Linux&#8217;un g\u00fc\u00e7l\u00fc <code>systemd<\/code> servis y\u00f6neticisi ile Node.js daemon&#8217;\u0131n\u0131 entegre etmenin ad\u0131mlar\u0131n\u0131, bir servis dosyas\u0131n\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ve y\u00f6netilece\u011fini \u00f6\u011frendik. Son olarak, bir VPS \u00fczerinde da\u011f\u0131t\u0131m, g\u00fcvenlik ipu\u00e7lar\u0131 ve <code>pm2<\/code> gibi s\u00fcre\u00e7 y\u00f6neticileri, izleme ve CI\/CD gibi geli\u015fmi\u015f konulara de\u011findik.<\/p>\n<p>Art\u0131k Node.js&#8217;in esnekli\u011fi ile Linux&#8217;un sa\u011flaml\u0131\u011f\u0131n\u0131 birle\u015ftirerek kendi arka plan servislerinizi olu\u015fturmak ve y\u00f6netmek i\u00e7in gerekli bilgi ve ara\u00e7lara sahipsiniz. Bu rehberdeki prensipleri uygulayarak, web uygulamalar\u0131n\u0131zdan sistem izleme ara\u00e7lar\u0131na kadar \u00e7e\u015fitli g\u00f6revleri yerine getiren g\u00fcvenilir ve y\u00fcksek performansl\u0131 daemon&#8217;lar geli\u015ftirebilirsiniz. Unutmay\u0131n, iyi bir daemon, sadece \u00e7al\u0131\u015fmakla kalmaz, ayn\u0131 zamanda kolayca izlenebilir, y\u00f6netilebilir ve hatalara kar\u015f\u0131 diren\u00e7li olmal\u0131d\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber\nLinux tabanl\u0131 bir Sanal \u00d6zel Sunucu (VPS) \u00fczerinde Node.js kullanarak arka pla","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":[241],"tags":[],"class_list":{"0":"post-32062","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-linux","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>Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: 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\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber Linux tabanl\u0131 bir Sanal \u00d6zel Sunucu (VPS) \u00fczerinde Node.js kullanarak arka pla\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T05:41:03+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=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-17T05:41:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/\"},\"wordCount\":3662,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Linux\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/\",\"name\":\"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-17T05:41:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: 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":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: 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\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber","og_description":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber Linux tabanl\u0131 bir Sanal \u00d6zel Sunucu (VPS) \u00fczerinde Node.js kullanarak arka pla","og_url":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-17T05:41:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-17T05:41:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/"},"wordCount":3662,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Linux"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/","name":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-17T05:41:03+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/linux-vps-uzerinde-node-js-ile-daemon-yazmak-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Linux VPS \u00dczerinde Node.js ile Daemon Yazmak: 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\/32062","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=32062"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32062\/revisions"}],"predecessor-version":[{"id":32063,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32062\/revisions\/32063"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}