# PM2 ile Node.js uygulamasını arka planda çalıştırma ve otomatik başlatma

https://kervanhosting.com/bilgi-bankasi/makale/pm2-ile-node-js-uygulamasini-arka-planda-calistirma-ve-otomatik-baslatma

Node.js uygulamanızı SSH penceresinde `node index.js` diye çalıştırırsanız pencereyi kapattığınızda durur. Sunucu yeniden başlayınca kendiliğinden açılmaz. **PM2**, Node.js uygulamaları için yazılmış bir süreç yöneticisidir: uygulamayı arka planda çalıştırır, çökerse yeniden başlatır, günlükleri toplar ve sunucu açılışında otomatik başlatır. Python gibi diğer diller için systemd daha uygundur: [Gunicorn ve systemd](https://kervanhosting.com/bilgi-bankasi/makale/python-flask-django-uygulamasini-gunicorn-ve-systemd-ile-yayinlama).

## 1. Node.js ve PM2 kurulumu

```
sudo apt install -y nodejs npm
node -v
sudo npm install -g pm2
pm2 -v
```

Ubuntu deposundaki Node.js sürümü eski olabilir; güncel bir sürüm gerekiyorsa Node.js'in resmi depo yönergesini izleyin. Sürümünüzü uygulamanızın `package.json` dosyasındaki `engines` alanıyla karşılaştırın.

## 2. Uygulamayı başlatma

```
cd /srv/bot
npm install
pm2 start index.js --name bot
```

`--name` ile tanıdık bir ad verirsiniz. Komutun çıktısında uygulamanın durumu (`online`), kullandığı bellek ve işlemci tablosu görünür. Uygulamanızı `npm start` ile başlatıyorsanız: `pm2 start npm --name bot -- start`. Ortam değişkenlerini (token gibi) kod yerine `.env` dosyasında ya da PM2 ayar dosyasında tutun: [token güvenliği](https://kervanhosting.com/bilgi-bankasi/makale/bot-token-ve-gizli-bilgileri-guvende-tutma).

## 3. Sunucu açılışında otomatik başlatma

```
pm2 startup
pm2 save
```

`pm2 startup` bir komut yazdırır (`sudo env PATH=... pm2 startup systemd -u kullanici --hp /home/kullanici` gibi); o komutu olduğu gibi kopyalayıp çalıştırın. Bu, PM2'yi systemd servisi yapar. `pm2 save` o anda çalışan uygulamaların listesini kaydeder; sunucu yeniden başlayınca aynı listeyi ayağa kaldırır. Yeni bir uygulama ekledikten sonra `pm2 save`'i yeniden çalıştırmayı unutmayın, aksi halde yeniden başlatmada o uygulama gelmez.

## Günlük kullanım

```
pm2 list                  # çalışanların listesi
pm2 logs bot --lines 50   # günlükler (Ctrl+C ile çık)
pm2 restart bot           # yeniden başlat
pm2 stop bot              # durdur
pm2 delete bot            # listeden kaldır
pm2 monit                 # canlı kaynak izleme
```

Kodu güncellediğinizde (`git pull`, `npm install`) `pm2 restart bot` yeterlidir. Kesinti olmadan yeniden yükleme için küme modunda `pm2 reload` kullanılır.

## Günlük dosyaları büyümesin

PM2 günlüklerini `~/.pm2/logs/` altında tutar ve varsayılan olarak döndürmez; uzun süre sonra diski doldurabilir. Döndürme eklentisi kurun: `pm2 install pm2-logrotate`. Disk dolarsa: [log yönetimi](https://kervanhosting.com/bilgi-bankasi/makale/linux-logrotate-ile-log-dosyalarini-yonetme).

## Sık sorunlar

- **Uygulama sürekli yeniden başlıyor:** `pm2 logs bot` hatayı yazar. PM2 çökmeyi görüp yeniden başlatır ama sebebi çözmez. Eksik paket, yanlış port, bellek yetmemesi (`pm2 monit`) en sık nedenlerdir.
- **pm2 startup sonrası yeniden başlatınca uygulama gelmedi:** `pm2 save` yapılmamıştır, ya da `startup` farklı bir kullanıcıyla çalıştırılmıştır. Uygulamayı hangi kullanıcıyla başlattıysanız aynısıyla `startup` ve `save` yapın.
- **Dışarıdan erişemiyorum:** Port güvenlik duvarında kapalıdır ya da uygulama yalnızca yerelde dinliyordur. Önüne Nginx koymak daha düzgündür: [Nginx ters proxy](https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama).

Bu işlerle uğraşmak istemiyorsanız Discord botları ve küçük Node.js uygulamaları için hazır panelli çözümümüz var: [Bot ve Uygulama Hosting](https://kervanhosting.com/bot-hosting). Kendi sunucunuz için: [Linux VDS](https://kervanhosting.com/linux-vds).

## Sık sorulanlar

### PM2 mi systemd mi?

İkisi de çalışır. PM2 Node.js için kolaydır ve izleme ekranı sunar; systemd dile bağımsızdır ve tek araçla her şeyi yönetirsiniz. Birden fazla Node uygulamanız varsa PM2 pratiktir.

### PM2 root olarak mı çalışmalı?

Hayır; uygulamayı yetkisiz bir kullanıcıyla çalıştırın. root ile çalışırsa uygulamadaki bir açık sunucuyu tehlikeye atar.

### `npm install -g` izin hatası veriyor.

Genel kurulum yönetici yetkisi ister: komutun başına `sudo` ekleyin ya da `npm` için kullanıcıya özel bir kurulum dizini ayarlayın.

**İlgili makaleler**

- [Node.js veya Python uygulamamı sunucuda nasıl yayınlarım?](https://kervanhosting.com/bilgi-bankasi/makale/node-js-veya-python-uygulamami-sunucuda-nasil-yayinlarim)
- [Bir programı arka planda sürekli çalıştırma (screen, systemd)](https://kervanhosting.com/bilgi-bankasi/makale/bir-programi-arka-planda-surekli-calistirma-screen)
- [Nginx ters proxy: Node.js ya da Python uygulamasını Nginx arkasında yayınlama](https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama)

*Sorununuz çözülmediyse [destek talebi açın](https://kervanhosting.com/destek-taleplerim). Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.*
