<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>node..js &#8211; Saviorhost İnternet Hizmetleri</title>
	<atom:link href="https://saviorhost.com/blog/category/node-js/feed/" rel="self" type="application/rss+xml" />
	<link>https://saviorhost.com/blog</link>
	<description>Web projenizi kurtaran hosting sağlayıcısı: Savior Host!</description>
	<lastBuildDate>Sat, 18 Apr 2026 07:03:14 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://saviorhost.com/blog/wp-content/uploads/2018/07/cropped-favicon-150x150.png</url>
	<title>node..js &#8211; Saviorhost İnternet Hizmetleri</title>
	<link>https://saviorhost.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kısıtlı (Jailed) SSH Ortamında Node.js ve PM2 Kurulumu: Kesin Çözüm Rehberi</title>
		<link>https://saviorhost.com/blog/kisitli-jailed-ssh-ortaminda-node-js-ve-pm2-kurulumu-kesin-cozum-rehberi/</link>
					<comments>https://saviorhost.com/blog/kisitli-jailed-ssh-ortaminda-node-js-ve-pm2-kurulumu-kesin-cozum-rehberi/#respond</comments>
		
		<dc:creator><![CDATA[admincim]]></dc:creator>
		<pubDate>Sat, 18 Apr 2026 07:02:31 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Güvenlik]]></category>
		<category><![CDATA[Keyhelp]]></category>
		<category><![CDATA[node..js]]></category>
		<guid isPermaLink="false">https://saviorhost.com/blog/?p=2202</guid>

					<description><![CDATA[Paylaşımlı hosting sunucularında veya KeyHelp, cPanel, Plesk gibi kontrol panellerinde kısıtlı (Jailed) SSH erişimi ile Node.js uygulaması barındırmak genellikle kabusa...]]></description>
										<content:encoded><![CDATA[<p data-path-to-node="4">Paylaşımlı hosting sunucularında veya KeyHelp, cPanel, Plesk gibi kontrol panellerinde kısıtlı (Jailed) SSH erişimi ile Node.js uygulaması barındırmak genellikle kabusa dönüşebilir. Sunucu yöneticileri güvenlik amacıyla &#8220;Root&#8221; yetkilerini kapattığında, standart <code data-path-to-node="4" data-index-in-node="262">npm install</code>, derleme (build) işlemleri ve <code data-path-to-node="4" data-index-in-node="304">pm2</code> komutları ardı ardına <b data-path-to-node="4" data-index-in-node="330">EACCES (Yetki Reddedildi)</b> veya <b data-path-to-node="4" data-index-in-node="361">ERR_DLOPEN_FAILED</b> hataları vermeye başlar.</p>
<p data-path-to-node="5">Bu kapsamlı rehberde; Keyhel Panel&#8217;de Jailed SSH ortamında güvenlikten ödün vermeden, gerekli izinleri ayarlamayı, <b data-path-to-node="5" data-index-in-node="99">NVM (Node Version Manager)</b> kullanarak Node.js kurmayı ve uygulamalarınızı <b data-path-to-node="5" data-index-in-node="173">PM2</b> ile 7/24 kesintisiz nasıl çalıştıracağınızı adım adım anlatıyoruz.</p>
<hr data-path-to-node="6" />
<h2 data-path-to-node="7" id="1-adim-on-hazirlik-ek-ikili-dosyalar-ve-kutuphane-izinleri">1. Adım: Ön Hazırlık – &#8220;Ek İkili Dosyalar&#8221; ve Kütüphane İzinleri</h2>
<p data-path-to-node="8">Jailed SSH (Hapishane) ortamı, kullanıcıyı sadece belli başlı komutlarla sınırlandırır. NPM&#8217;in paketleri indirebilmesi, zipli dosyaları açabilmesi ve özellikle <b data-path-to-node="8" data-index-in-node="160">Vite/Rollup</b> gibi modern araçların Linux çekirdek kütüphanelerine ulaşıp derleme (build) yapabilmesi için sunucu panelinizden bazı komutlara izin vermeniz gerekir.</p>
<p data-path-to-node="9">Hosting panelinizden (Örn: KeyHelp&#8217;te <code data-path-to-node="9" data-index-in-node="38">Yapılandırma &gt; Sınırlandırılmış SSH &gt; Ek İkili Dosyalar</code> bölümüne) aşağıdaki listeyi eksiksiz olarak ekleyin ve kaydedin:</p>
<div class="code-block ng-tns-c515271043-343 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQjgI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-343 ng-star-inserted">
<p><span class="ng-tns-c515271043-343">Plaintext</span></p>
<div class="buttons ng-tns-c515271043-343 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-343">
<div class="animated-opacity ng-tns-c515271043-343">
<pre class="ng-tns-c515271043-343"><code class="code-container formatted ng-tns-c515271043-343" role="text" data-test-id="code-content">/usr/bin/node
/usr/bin/npm
/usr/local/bin/pm2
/usr/bin/sed
/usr/bin/awk
/usr/bin/tr
/usr/bin/uname
/usr/bin/tar
/usr/bin/gzip
/usr/bin/xz
/usr/bin/sort
/usr/bin/grep
/usr/bin/tail
/usr/bin/head
/usr/bin/cut
/usr/bin/wc
/usr/bin/dirname
/usr/bin/find
/usr/bin/tee
/usr/bin/sha256sum
/usr/bin/rm
/usr/bin/cp
/usr/bin/mv
/lib/x86_64-linux-gnu/librt.so.1
/usr/lib/x86_64-linux-gnu/librt.so.1
/lib64/librt.so.1
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="11"><i data-path-to-node="11" data-index-in-node="0">Not: Listenin sonundaki <code data-path-to-node="11" data-index-in-node="24">librt.so.1</code> yolları, Vite ve Rollup kullanan projelerde derleme sırasında alınan <code data-path-to-node="11" data-index-in-node="104">Error: librt.so.1: cannot open shared object file</code> (ERR_DLOPEN_FAILED) hatasının kesin çözümüdür.</i></p>
<hr data-path-to-node="12" />
<h2 data-path-to-node="13" id="2-neden-jailed-sshta-standart-node-js-kurulumu-coker">2. Neden Jailed SSH&#8217;ta Standart Node.js Kurulumu Çöker?</h2>
<p data-path-to-node="14">İzinleri verdikten sonra bile, sistem sizi genellikle <code data-path-to-node="14" data-index-in-node="54">/www</code> veya <code data-path-to-node="14" data-index-in-node="64">/home/kullaniciadi</code> gibi bir dizine hapseder. Ancak Node.js ve NPM, kurulum ve önbellek (cache) işlemleri için ana sunucu dizinlerine (<code data-path-to-node="14" data-index-in-node="198">/.npm</code>) erişmeye çalışır.</p>
<p data-path-to-node="15">Bu durum karşılaştığımız en meşhur hatayı doğurur: <code data-path-to-node="15" data-index-in-node="51">Error: EACCES: permission denied, mkdir '/.npm'</code></p>
<p data-path-to-node="16"><b data-path-to-node="16" data-index-in-node="0">Çözüm:</b> Uygulamaları &#8220;Root&#8221; düzeyinde değil, tamamen kullanıcının kendi izole alanında (Kapsayıcı mantığıyla) kurmaktır.</p>
<hr data-path-to-node="17" />
<h2 data-path-to-node="18" id="3-adim-adim-nvm-ile-ozel-node-js-motoru-kurmak">3. Adım Adım NVM ile Özel Node.js Motoru Kurmak</h2>
<p data-path-to-node="19">Her müşteriye veya projeye kendi bağımsız Node.js motorunu atamak için NVM kullanıyoruz. Bu sayede aynı sunucuda bir proje Node 18 ile çalışırken diğeri Node 20 ile çakışmadan çalışabilir.</p>
<p data-path-to-node="20">Terminalinize giriş yapın ve ortamı uyandırmak için şu komutları sırasıyla girin (NVM kurulu değilse standart cURL komutuyla kurabilirsiniz):</p>
<div class="code-block ng-tns-c515271043-344 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQjwI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-344 ng-star-inserted">
<p><span class="ng-tns-c515271043-344">Bash</span></p>
<div class="buttons ng-tns-c515271043-344 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-344">
<div class="animated-opacity ng-tns-c515271043-344">
<pre class="ng-tns-c515271043-344"><code class="code-container formatted ng-tns-c515271043-344" role="text" data-test-id="code-content"><span class="hljs-comment"># NVM'in yolunu belirleyin</span>
<span class="hljs-built_in">export</span> NVM_DIR=<span class="hljs-string">"/www/.nvm"</span>

<span class="hljs-comment"># NVM'i aktif edin</span>
[ -s <span class="hljs-string">"<span class="hljs-variable">$NVM_DIR</span>/nvm.sh"</span> ] &amp;&amp; \. <span class="hljs-string">"<span class="hljs-variable">$NVM_DIR</span>/nvm.sh"</span>

<span class="hljs-comment"># İstediğiniz Node sürümünü kurun ve kullanın (Örn: v20)</span>
nvm install 20
nvm use 20
</code></pre>
</div>
</div>
</div>
<hr data-path-to-node="22" />
<h2 data-path-to-node="23" id="4-npm-eacces-yetki-hatalarini-tamamen-asmak">4. NPM EACCES (Yetki) Hatalarını Tamamen Aşmak</h2>
<p data-path-to-node="24">NPM&#8217;in sunucu kök dizinlerine dosya yazmaya çalışmasını engellemek için ona &#8220;Ev&#8221; dizininin neresi olduğunu söylemeliyiz. Aşağıdaki komut, NPM&#8217;in tüm önbellek dosyalarını kısıtlı alanımız olan <code data-path-to-node="24" data-index-in-node="192">/www</code> içerisine yazmasını sağlar:</p>
<div class="code-block ng-tns-c515271043-345 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQkAI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-345 ng-star-inserted">
<p><span class="ng-tns-c515271043-345">Bash</span></p>
<div class="buttons ng-tns-c515271043-345 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-345">
<div class="animated-opacity ng-tns-c515271043-345">
<pre class="ng-tns-c515271043-345"><code class="code-container formatted ng-tns-c515271043-345" role="text" data-test-id="code-content"><span class="hljs-built_in">export</span> HOME=<span class="hljs-string">"/www"</span>
</code></pre>
</div>
</div>
</div>
<h3 data-path-to-node="26" id="surum-cakismalarini-eresolve-gidermek">Sürüm Çakışmalarını (ERESOLVE) Gidermek</h3>
<p data-path-to-node="27">Projelerinizde paket sürümleri uyuşmazlığı (<code data-path-to-node="27" data-index-in-node="44">npm error ERESOLVE</code>) yaşıyorsanız, NPM&#8217;e eski tip bağımlılık çözümlemeyi kullanmasını söyleyerek kurulumu zorlayabilirsiniz:</p>
<div class="code-block ng-tns-c515271043-346 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQkQI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-346 ng-star-inserted">
<p><span class="ng-tns-c515271043-346">Bash</span></p>
<div class="buttons ng-tns-c515271043-346 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-346">
<div class="animated-opacity ng-tns-c515271043-346">
<pre class="ng-tns-c515271043-346"><code class="code-container formatted ng-tns-c515271043-346" role="text" data-test-id="code-content">npm install --legacy-peer-deps
</code></pre>
</div>
</div>
</div>
<hr data-path-to-node="29" />
<h2 data-path-to-node="30" id="5-jailed-ortamda-pm2-kurulumu-ve-module_conf-json-hatasi-cozumu">5. Jailed Ortamda PM2 Kurulumu ve &#8220;module_conf.json&#8221; Hatası Çözümü</h2>
<p data-path-to-node="31">Uygulamanızı arka planda sürekli çalıştıracak olan PM2&#8217;yi kurmak, yetki sorunlarının en çok yaşandığı yerdir. PM2 logları ve PID dosyalarını ana dizindeki <code data-path-to-node="31" data-index-in-node="155">/.pm2</code> içine yazmaya çalışır. Bunu önlemek için PM2&#8217;nin çalışma alanını yeniden yönlendiriyoruz:</p>
<div class="code-block ng-tns-c515271043-347 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQkgI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-347 ng-star-inserted">
<p><span class="ng-tns-c515271043-347">Bash</span></p>
<div class="buttons ng-tns-c515271043-347 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-347">
<div class="animated-opacity ng-tns-c515271043-347">
<pre class="ng-tns-c515271043-347"><code class="code-container formatted ng-tns-c515271043-347" role="text" data-test-id="code-content"><span class="hljs-comment"># PM2'ye yeni bir ev gösteriyoruz</span>
<span class="hljs-built_in">export</span> PM2_HOME=<span class="hljs-string">"/www/.pm2"</span>

<span class="hljs-comment"># PM2'yi global olarak kuruyoruz</span>
npm install -g pm2
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="33">Kurulumun başarılı olup olmadığını test etmek için:</p>
<div class="code-block ng-tns-c515271043-348 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQkwI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-348 ng-star-inserted">
<p><span class="ng-tns-c515271043-348">Bash</span></p>
<div class="buttons ng-tns-c515271043-348 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-348">
<div class="animated-opacity ng-tns-c515271043-348">
<pre class="ng-tns-c515271043-348"><code class="code-container formatted ng-tns-c515271043-348" role="text" data-test-id="code-content">pm2 status
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="35"><i data-path-to-node="35" data-index-in-node="0">Bu komut size boş da olsa o meşhur PM2 tablosunu vermelidir.</i></p>
<hr data-path-to-node="36" />
<h2 data-path-to-node="37" id="6-uygulamayi-baslatmak-ve-pm2yi-kalici-hale-getirmek">6. Uygulamayı Başlatmak ve PM2&#8217;yi Kalıcı Hale Getirmek</h2>
<p data-path-to-node="38">Tüm altyapımız hazır. Şimdi Node.js veya derlenmiş (build edilmiş) projemizi canlıya alalım.</p>
<p data-path-to-node="39"><b data-path-to-node="39" data-index-in-node="0">1. Uygulamanızın klasörüne girin:</b></p>
<div class="code-block ng-tns-c515271043-349 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQlAI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-349 ng-star-inserted">
<p><span class="ng-tns-c515271043-349">Bash</span></p>
<div class="buttons ng-tns-c515271043-349 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-349">
<div class="animated-opacity ng-tns-c515271043-349">
<pre class="ng-tns-c515271043-349"><code class="code-container formatted ng-tns-c515271043-349" role="text" data-test-id="code-content"><span class="hljs-built_in">cd</span> /www/
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="41"><b data-path-to-node="41" data-index-in-node="0">2. PM2 ile uygulamayı başlatın:</b> Birden fazla uygulama barındırıyorsanız <code data-path-to-node="41" data-index-in-node="72">--name</code> parametresi ile isimleri birbirinden ayırmayı unutmayın.</p>
<div class="code-block ng-tns-c515271043-350 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQlQI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-350 ng-star-inserted">
<p><span class="ng-tns-c515271043-350">Bash</span></p>
<div class="buttons ng-tns-c515271043-350 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-350">
<div class="animated-opacity ng-tns-c515271043-350">
<pre class="ng-tns-c515271043-350"><code class="code-container formatted ng-tns-c515271043-350" role="text" data-test-id="code-content">pm2 start index.js --name <span class="hljs-string">"proje-adi"</span> --cwd /www/
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="43"><b data-path-to-node="43" data-index-in-node="0">3. İşlemi Kaydedin:</b> Sunucu herhangi bir sebeple yeniden başlatıldığında uygulamanızın otomatik olarak tekrar açılması için listeyi kaydedin:</p>
<div class="code-block ng-tns-c515271043-351 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQlgI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-351 ng-star-inserted">
<p><span class="ng-tns-c515271043-351">Bash</span></p>
<div class="buttons ng-tns-c515271043-351 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-351">
<div class="animated-opacity ng-tns-c515271043-351">
<pre class="ng-tns-c515271043-351"><code class="code-container formatted ng-tns-c515271043-351" role="text" data-test-id="code-content">pm2 save
</code></pre>
</div>
</div>
</div>
<hr data-path-to-node="45" />
<h2 data-path-to-node="46" id="bonus-ssh-her-acildiginda-ayarlari-korumak-bashrc-otomasyonu">Bonus: SSH Her Açıldığında Ayarları Korumak (.bashrc Otomasyonu)</h2>
<p data-path-to-node="47">Jailed SSH ortamları çok &#8220;unutkandır&#8221;. Terminali kapatıp açtığınızda <code data-path-to-node="47" data-index-in-node="69">pm2 status</code> veya <code data-path-to-node="47" data-index-in-node="85">npm</code> komutları tekrar hata verebilir. Çünkü girdiğimiz <code data-path-to-node="47" data-index-in-node="139">export</code> komutları hafızadan silinir.</p>
<p data-path-to-node="48">Her girişinizde tek bir kelimeyle ortamı hazırlamak için kendinize bir kısayol (alias) oluşturun:</p>
<div class="code-block ng-tns-c515271043-352 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiE5PCo5PaTAxUAAAAAHQAAAAAQlwI">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c515271043-352 ng-star-inserted">
<p><span class="ng-tns-c515271043-352">Bash</span></p>
<div class="buttons ng-tns-c515271043-352 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c515271043-352">
<div class="animated-opacity ng-tns-c515271043-352">
<pre class="ng-tns-c515271043-352"><code class="code-container formatted ng-tns-c515271043-352" role="text" data-test-id="code-content"><span class="hljs-built_in">echo</span> <span class="hljs-string">'alias start="export HOME=/www &amp;&amp; export PM2_HOME=/www/.pm2 &amp;&amp; export NVM_DIR=/www/.nvm &amp;&amp; [ -s \"\$NVM_DIR/nvm.sh\" ] &amp;&amp; . \"\$NVM_DIR/nvm.sh\" &amp;&amp; nvm use 20"'</span> &gt;&gt; /www/.bashrc
<span class="hljs-built_in">source</span> /www/.bashrc
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="50">Artık SSH&#8217;a her bağlandığınızda sadece <b data-path-to-node="50" data-index-in-node="39"><code data-path-to-node="50" data-index-in-node="39">start</code></b> yazıp Enter&#8217;a basmanız yeterlidir. Tüm NVM ve PM2 yollarınız saniyeler içinde arka planda hazır hale gelecektir.</p>
<hr data-path-to-node="51" />
<h3 data-path-to-node="52" id="ozet">Özet</h3>
<p data-path-to-node="53">Kısıtlı SSH izinleri, modern web uygulamaları geliştirmek için bir engel değildir. Doğru yapılandırılmış NVM ortamları, çekirdek <code data-path-to-node="53" data-index-in-node="129">librt</code> izinleri ve <code data-path-to-node="53" data-index-in-node="147">export</code> yönlendirmeleri ile ana sunucuya hiçbir zarar vermeden (Root yetkisi kullanmadan) tamamen izole, güvenli ve yüksek performanslı Node.js barındırma altyapıları kurabilirsiniz. Başarılar dileriz!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://saviorhost.com/blog/kisitli-jailed-ssh-ortaminda-node-js-ve-pm2-kurulumu-kesin-cozum-rehberi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
