Paket 1 · Fondasi DevOpsModul H — Application Deployment & PM2

PM2 Configuration, Logs, Restart, dan Application Troubleshooting

Mengelola log PM2, rotasi log, restart yang aman, serta mendiagnosis error umum aplikasi Node.js di produksi.

Aplikasi produksi pasti mengalami masalah. Kemampuan membaca log, memilih jenis restart yang tepat, dan memahami error umum Node.js akan mempercepat pemulihan.

1. Melihat log

pm2 logs
pm2 logs app-prod
pm2 logs app-prod --lines 200
pm2 logs app-prod --err
pm2 logs app-prod --out
PerintahFungsi
pm2 logsSemua log aplikasi
--linesJumlah baris terakhir
--errHanya stderr
--outHanya stdout
--timestampTampilkan waktu

Lokasi log default: ~/.pm2/logs/. Jika memakai error_file/out_file di ecosystem, log berada di path tersebut.

Membersihkan log

pm2 flush app-prod
pm2 flush

2. Rotasi log

Log yang membesar bisa memenuhi disk. Gunakan pm2-logrotate:

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 20M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'

Cek konfigurasi:

pm2 conf pm2-logrotate

Rotasi juga untuk log aplikasi

Jika aplikasi menulis log sendiri (mis. Winston/Pino), gunakan logrotate sistem untuk file tersebut. PM2 logrotate hanya menangani log PM2.

3. Restart, reload, stop

pm2 restart app-prod
pm2 reload app-prod
pm2 stop app-prod
pm2 start app-prod
pm2 delete app-prod
pm2 restart all
PerintahEfek
restartStop lalu start, downtime singkat
reloadGanti proses bertahap (cluster), zero-downtime
stopHentikan tanpa menghapus konfigurasi
deleteHapus dari daftar PM2
restart allRestart semua aplikasi

Kapan memakai reload?

  • Aplikasi berjalan di cluster mode.
  • Perubahan kode sudah di-build.
  • Anda ingin meminimalkan downtime.

Gunakan restart bila aplikasi tidak mendukung cluster atau ada perubahan konfigurasi yang butuh mulai ulang penuh.

4. Melihat detail proses

pm2 describe app-prod
pm2 show app-prod
pm2 env 0
pm2 list

Informasi penting:

  • Status dan uptime.
  • Jumlah restart.
  • Penggunaan CPU/RAM.
  • Script, cwd, interpreter.
  • Environment variables.

Restart count yang terus naik menandakan aplikasi crash berulang.

5. Error umum dan solusinya

EADDRINUSE

Error: listen EADDRINUSE: address already in use :::3000

Penyebab: port sudah dipakai proses lain.

ss -tulpn | grep :3000
pm2 list
lsof -i :3000

Solusi: hentikan proses lama atau ganti PORT.

MODULE_NOT_FOUND

Error: Cannot find module 'express'

Penyebab: dependensi belum terpasang, cwd salah, atau NODE_PATH berbeda.

cd /srv/app
npm ci
pm2 describe app-prod | grep -E 'cwd|script'

Pastikan cwd di ecosystem mengarah ke direktori aplikasi.

ENOMEM / heap out of memory

JavaScript heap out of memory

Solusi:

  • Naikkan max_memory_restart dengan hati-hati.
  • Perbaiki memory leak.
  • Tambah RAM atau jumlah instance.
  • Set NODE_OPTIONS=--max-old-space-size=... bila perlu.
pm2 restart app-prod --update-env
free -h
pm2 monit

Permission denied

ls -l /srv/app
namei -l /srv/app/server.js

Pastikan user PM2 dapat membaca file dan menulis ke direktori log.

Aplikasi restart berulang

pm2 logs app-prod --lines 100
pm2 describe app-prod
journalctl -u pm2-deploy -n 100

Cari error pertama, bukan hanya error terakhir.

Environment tidak terbaca

pm2 env 0
pm2 restart app-prod --update-env

Setelah mengubah .env, jalankan --update-env atau pm2 reload ecosystem.config.js.

6. Health check dan kesiapan produksi

Tambahkan endpoint health check di aplikasi:

app.get('/health', (req, res) => {
  res.status(200).json({ status: 'ok', uptime: process.uptime() });
});

Uji:

curl -f http://127.0.0.1:3000/health

Gunakan health check setelah deployment untuk memastikan aplikasi benar-benar siap.

7. Checklist troubleshooting

  • pm2 list menunjukkan status online.
  • pm2 logs tidak menunjukkan error berulang.
  • Port aplikasi listen dan tidak konflik.
  • Environment dan .env terbaca.
  • Permission file dan log benar.
  • RAM/CPU tidak mentok.
  • Reverse proxy mengarah ke port yang benar.
  • Disk tidak penuh.
  • Log berotasi.

Praktik: diagnosa aplikasi down

# 1. Status
pm2 list

# 2. Log terakhir
pm2 logs app-prod --lines 100 --err

# 3. Detail
pm2 describe app-prod

# 4. Port
ss -tulpn | grep :3000

# 5. Resource
free -h
df -h
pm2 monit

# 6. Uji lokal
curl -I http://127.0.0.1:3000

Ikuti urutan ini sebelum mengubah konfigurasi. Sering kali akar masalah terlihat di log atau pada port yang konflik.

Ringkasan

  • pm2 logs dan pm2 describe adalah alat diagnosa utama.
  • Rotasi log mencegah disk penuh.
  • reload untuk zero-downtime, restart untuk mulai ulang penuh.
  • Pahami error umum: port konflik, modul hilang, memory, dan permission.
  • Biasakan health check setelah deploy.

Selanjutnya

On this page