Kembali ke Panduan Deploy

Online 24 jam — auto-restart, anti mati

Bikin bot & app hidup 24 jam dengan PM2

Bot-mu mati begitu kamu menutup terminal SSH? Atau app hilang setelah server reboot? Di panduan ini kamu akan memakai PM2 — manajer proses yang menjaga aplikasi tetap menyala, otomatis menghidupkannya lagi saat crash, dan menyalakannya otomatis setiap server reboot. Dijelaskan dari nol, pelan-pelan.

Tutup SSH, tetap jalan

App terus hidup walau terminal kamu tutup.

Auto-restart

Crash atau reboot? App nyala lagi sendiri.

Log & monitoring

Lihat log dan pemakaian RAM/CPU kapan saja.

Yang diasumsikan. Kamu sudah punya VPS (Ubuntu/Debian) dengan Node.js terpasang, dan sebuah aplikasi/bot Node.js yang bisa dijalankan manual (mis. node index.js atau npm start). Kalau belum punya bot, ikuti dulu panduan bot Telegram.
1
Pahami dulu

Kenapa butuh PM2?

Saat kamu menjalankan node index.jslewat SSH, proses itu "menempel" pada sesi terminalmu. Begitu kamu logout atau koneksi putus, prosesnya ikut mati — bot pun offline. Dan kalau server reboot, tidak ada yang menyalakannya kembali.

PM2 bertindak seperti penjaga setia: ia menjalankan appmu di latar belakang, mengawasinya, dan langsung menghidupkannya lagi kalau crash atau setelah reboot. Bandingkan dua dunia ini:

Tanpa PM2

  • Tutup SSH → bot mati
  • App crash → mati sampai kamu nyalakan manual
  • Server reboot → semua offline
  • Tidak ada catatan log yang rapi

Dengan PM2

  • Tutup SSH → tetap jalan
  • Crash → auto-restart instan
  • Reboot → nyala otomatis
  • Log & monitoring tersimpan
2
Checklist

Yang perlu kamu siapkan

Cukup tiga hal:

  • VPS dengan akses sudo (Ubuntu/Debian).
  • Node.js & npm sudah terpasang (cek: node -v dan npm -v).
  • Aplikasi/bot yang bisa dijalankan manual, mis. node index.js atau npm start.
3
Sekali pasang

Pasang PM2 di server

Masuk ke server lewat SSH, lalu pasang PM2 secara global memakai npm:

# DI SERVER — pasang PM2 secara global
sudo npm install -g pm2
 
# cek versinya
pm2 --version
deploy@server — cek PM2
deploy@server:~$ pm2 --version5.4.2# PM2 siap dipakai ✅
4
Mulai

Jalankan aplikasi dengan PM2

Masuk ke folder project-mu, lalu jalankan lewat PM2. Beri --name agar mudah dikenali. Pilih cara yang sesuai dengan tipe app-mu:

# Cara cepat: jalankan langsung satu file
pm2 start index.js --name bot-telegram
 
# Untuk app Next.js (script "start" di package.json)
pm2 start npm --name blog -- start
 
# Lihat daftar proses yang dikelola PM2
pm2 list

Cek hasilnya dengan pm2 list. Kolom status harus online:

deploy@server — daftar proses
deploy@server:~$ pm2 list┌────┬──────────────┬─────────┬─────────┐│ id │ name         │ status  │ cpu     │├────┼──────────────┼─────────┼─────────┤│ 0  │ bot-telegram │ online  │ 0%      │└────┴──────────────┴─────────┴─────────┘# status online = app berjalan ✅
Sekarang coba tutup terminal SSH-mu lalu buka lagi dan jalankan pm2 list — app tetap online. Itulah bedanya dengan node index.js biasa.
5
Lebih rapi

Buat file config (ecosystem)

Daripada mengetik opsi panjang tiap kali, simpan pengaturan dalam satu file ecosystem.config.js di folder project. Di sini kamu bisa atur batas RAM, variabel lingkungan, dan auto-restart:

GNU nano 7.2ecosystem.config.js
1module.exports = {2  apps: [3    {4      name: 'bot-telegram',5      script: './index.js',6      instances: 1,7      autorestart: true,          // nyala lagi kalau crash8      watch: false,               // true = restart saat file berubah9      max_memory_restart: '300M', // restart kalau RAM > 300MB10      env: {11        NODE_ENV: 'production',12      },13    },14  ],15}
^O Write Out^X Exit^W Where Is^K Cut

Teks lengkap yang bisa kamu salin:

// ecosystem.config.js  — taruh di folder project
module.exports = {
  apps: [
    {
      name: 'bot-telegram',
      script: './index.js',
      instances: 1,
      autorestart: true,          // nyala lagi kalau crash
      watch: false,               // true = restart saat file berubah
      max_memory_restart: '300M', // restart kalau RAM > 300MB
      env: {
        NODE_ENV: 'production',
        // TELEGRAM_TOKEN: 'isi-di-sini-atau-pakai-.env',
      },
    },
  ],
}

Lalu jalankan semuanya hanya dengan satu perintah:

# Jalankan semua app yang didefinisikan di ecosystem.config.js
pm2 start ecosystem.config.js
 
# Simpan daftar proses saat ini supaya bisa dipulihkan otomatis
pm2 save
autorestart: true membuat app nyala lagi saat crash. max_memory_restart melindungi server dari app yang bocor memori (memory leak) dengan me-restart-nya otomatis.
6
Wajib

Auto-start otomatis saat server reboot

Ini langkah paling penting agar app benar-benar hidup 24 jam. Tanpa ini, setiap server reboot semua app akan mati. Jalankan:

# 1) Bikin PM2 jalan otomatis tiap server reboot
pm2 startup
 
# Perintah ini akan MENAMPILKAN satu baris perintah "sudo env ..."
# COPY baris yang ditampilkan itu, lalu jalankan.
 
# 2) Setelah app jalan seperti yang kamu mau, kunci daftarnya:
pm2 save
Perintah pm2 startup akan menampilkan satu baris perintah yang diawali sudo env PATH=.... Kamu harus menyalin baris itu dan menjalankannya. Setelah itu jalankan pm2 save untuk mengunci daftar app saat ini.

Alur sederhananya seperti ini — tiga "rem pengaman" agar app selalu kembali hidup:

Server reboot
PM2 jalan otomatisdari pm2 startup
App hidup lagidari pm2 save
7
Pantau

Lihat log & monitoring

Kalau bot bertingkah aneh, log adalah tempat pertama untuk mencari tahu sebabnya. PM2 menyimpan semua output app-mu:

deploy@server — log real-time
deploy@server:~$ pm2 logs bot-telegram[bot-telegram] Bot started, polling...[bot-telegram] Pesan masuk dari @andi# Ctrl+C untuk keluar dari tampilan log

Untuk pantauan langsung RAM, CPU, dan jumlah restart tiap app, pakai dashboard bawaan PM2:

deploy@server — monitoring
deploy@server:~$ pm2 monitbot-telegram   CPU: 0%   MEM: 48.2 MB   ↺ 0# dashboard live di terminal
8
Contekan

Perintah harian PM2

Simpan tabel ini. Inilah perintah yang akan kamu pakai sehari-hari (ganti bot-telegram dengan nama app-mu):

PerintahFungsinya
pm2 listLihat semua app + status (online/stopped) & pemakaian RAM/CPU.
pm2 logsLihat log semua app secara real-time (Ctrl+C untuk keluar).
pm2 logs bot-telegramLihat log satu app saja berdasarkan nama.
pm2 restart bot-telegramRestart satu app (mis. setelah update kode).
pm2 reload blogReload tanpa downtime (cocok untuk web/app).
pm2 stop bot-telegramHentikan app tanpa menghapusnya dari daftar.
pm2 delete bot-telegramHapus app dari PM2 sepenuhnya.
pm2 monitDashboard live RAM/CPU/log per app di terminal.
9
Anti-stuck

Masalah umum & cara mengatasinya

Kalau ada yang belum jalan, cek tabel ini dulu sebelum panik:

GejalaSebabSolusi
App "errored" terus di pm2 listKode error saat start (token salah, port dipakai, dependency kurang).Baca penyebabnya: pm2 logs nama-app — perbaiki error lalu pm2 restart.
Setelah reboot, app tidak hidupLupa jalankan pm2 startup atau pm2 save.Ulangi: pm2 startup (jalankan baris yang ditampilkan), lalu pm2 save.
pm2: command not foundPM2 belum terpasang global / PATH npm belum termuat.Pasang ulang: sudo npm install -g pm2, lalu buka ulang sesi SSH.
App restart terus tiap beberapa detikApp crash berulang (loop). PM2 mencoba menghidupkan terus.Cek pm2 logs untuk error-nya; perbaiki dulu, baru pm2 restart.

Langkah berikutnya

App-mu kini hidup 24 jam. Sekarang amankan servernya dari serangan: firewall, kunci SSH, dan Fail2ban — biar tidur nyenyak.

Lanjutan: amankan server (Firewall, SSH Key, Fail2ban) →

Tutup pintu yang tidak perlu, ganti password dengan kunci, dan blokir penyerang otomatis. Lengkap dengan tombol salin.