Bagian 5 β Deploy Aplikasi Web Β· Langkah 21 dari 38
Deploy Aplikasi (Pilih Stack-mu)
Empat cabang yang mengikuti pola sama: install runtime β jalankan app β jaga tetap hidup β sambungkan ke nginx.
Pilih satu (atau lebih) stack yang mau kamu praktikkan di tab di bawah checklist ini. Tidak harus linear β satu step, satu progres, berapa pun tab yang kamu buka. Polanya selalu sama di semua tab: runtime β app β process manager β nginx β tes.
Ekosistem JavaScript β satu-satunya yang punya opsi PM2
1. Install Node.js lewat nvm
Jangan install node dari apt (versinya sering tertinggal) β pakai nvm (Node Version Manager): bisa ganti versi per proyek, tidak perlu sudo, dan bisa pasang versi LTS terbaru.
$curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bashscript installer resmi nvm
$source ~/.bashrc && nvm install --ltsreload shell supaya command nvm dikenal, lalu pasang LTS
$node -v && npm -vbukti terpasang
2. Buat aplikasi contoh
Express paling jelas untuk melihat pola 'proses listen di port':
$mkdir ~/webapp && cd ~/webapp && npm init -yfolder proyek + package.json otomatis
$npm install expressdependensi aplikasi tersimpan di package.json β resep yang bikin proyek bisa dibangun ulang di mana saja
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("<h1>Halo dari VM Xubuntu! π</h1><p>Jalan lewat PM2 + nginx.</p>");
});
app.listen(3000, () => console.log("app hidup di :3000"));$node app.jstes manual dulu β Ctrl+C untuk mati. Ini fase dev; sekarang kita buat 'produksi'.
3. Jaga hidup dengan PM2
$npm install -g pm2-g = global, supaya command pm2 tersedia
$cd ~/webapp && pm2 start app.js --name webappPM2 membaca app.js, menyalakannya di background, memberi nama 'webapp'
$pm2 list && pm2 logs webapp --lines 20status + log β lihat sendiri prosesnya online
$pm2 startup && pm2 savestartup = bikin systemd unit yang membangunkan PM2 saat boot; save = simpan daftar app yang harus dihidupkan
Coba buktikan auto-restart: kill $(pgrep -f 'node.*app.js') lalu pm2 list β status tetap online dengan restart count naik. PM2 menemukannya mati dan menyalakannya lagi β itulah pekerjaannya.
4. Sambungkan ke nginx
Pakai template dari step nginx tadi, arahkan proxy_pass ke 3000:
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}$sudo ln -s /etc/nginx/sites-available/webapp /etc/nginx/sites-enabled/ && sudo rm -f /etc/nginx/sites-enabled/defaultaktifkan site-mu, matikan halaman default nginx
$sudo nginx -t && sudo systemctl reload nginxpola wajib: tes dulu, baru reload
5. Tes
$curl -s http://127.0.0.1/di VM β harusnya keluar 'Halo dari VM Xubuntu!' lalu coba juga dari browser laptop: http://IP_VM
Command PM2 yang wajib tahu
| Command | Fungsi |
|---|---|
| pm2 list | semua app & statusnya |
| pm2 logs webapp | log real-time (Ctrl+C keluar) |
| pm2 restart webapp | restart (misal setelah update kode) |
| pm2 stop / delete webapp | hentikan / hapus dari daftar PM2 |
| pm2 save | simpan kondisi saat ini untuk bangkit lagi |
β Tanda berhasil β centang kalau sudah kamu lihat/buktikan sendiri
Tombol βlanjutβ terbuka setelah semua tercentang β bukan hukuman, tapi jaring pengaman: pastikan step ini benar-benar beres sebelum menumpuk step berikutnya di atasnya.
Lagi bermasalah?
PM2: app online tapi versi lama terus yang tampil setelah edit kode
PM2 menjalankan snapshot proses yang start tadi. Setelah edit kode: pm2 restart webapp. Untuk app yang butuh build (Next/Vite): build dulu, baru restart.
502 Bad Gateway dari nginx
nginx tidak menemukan yang listen di port tujuan. Cek proses aplikasi-mu hidup (pm2 list / systemctl status / ss -tlnp). Kalau hidup tapi port beda, sesuaikan proxy_pass. 502 = 'resepsionis mengantarkan tamu ke ruangan kosong' β gejala wajib hafal.
Aplikasi cuma listen di 127.0.0.1 padahal harusnya bisa dari luar VM?
Di setups ini TIDAK masalah β nginx-lah yang menerima dari luar lalu meneruskan ke loopback; itu justru desain yang benar (aplikasi tidak boleh listen 0.0.0.0 kalau sudah ada nginx). Yang boleh bikin pusing cuma saat tes curl langsung ke port app dari HOST β memang harus gagal, dan itu benar.