Guide Lengkap: Deploy Next.js + Bun + Nginx + PM2
Ini adalah panduan end-to-end untuk mendeploy aplikasi Next.js (menggunakan Bun) ke server Ubuntu, menjalankannya 24/7 dengan PM2, dan mengamankannya dengan Nginx (Reverse Proxy) + SSL.
🗺️ Arsitektur Final
Alur: Pengguna -> Internet -> Nginx (Handle SSL, Port 443) -> PM2 (Manajer Proses) -> Aplikasi Next.js (Bun, Port 3000)
1. Persiapan Server (Satu Kali Saja)
Lakukan ini jika server Anda masih baru.
Update Server:
sudo apt update && sudo apt upgrade -y
Install Kebutuhan Dasar:
sudo apt install -y nginx git curl
Install Bun:
curl -fsSL [https://bun.sh/install](https://bun.sh/install) | bash
# Muat ulang terminal
source ~/.bashrc
Install PM2 (Global):
bun install -g pm2
2. Setup Nginx + SSL (Satu Kali Saja)
Kita akan mengarahkan domainanda.com ke aplikasi Anda.
Buat Konfigurasi Nginx Awal:
Ganti domainanda.com dengan domain Anda.
sudo nano /etc/nginx/sites-available/domainanda.com
Tempelkan ini (Hanya untuk verifikasi SSL):
server {
listen 80;
listen [::]:80;
server_name domainanda.com [www.domainanda.com](https://www.domainanda.com);
root /var/www/html;
location ~ /.well-known/acme-challenge {
allow all;
}
}
Aktifkan Konfigurasi:
# Buat symlink
sudo ln -s /etc/nginx/sites-available/domainanda.com /etc/nginx/sites-enabled/
# Hapus default
sudo rm /etc/nginx/sites-enabled/default
# Tes & Restart
sudo nginx -t
sudo systemctl restart nginx
Install SSL (Certbot):
Pastikan domain Anda sudah mengarah ke IP server.
sudo apt install -y python3-certbot-nginx
# Jalankan certbot
sudo certbot --nginx -d domainanda.com -d [www.domainanda.com](https://www.domainanda.com)
(Pilih Opsi 2: Redirect saat ditanya untuk otomatis mengarahkan HTTP ke HTTPS).
Finalisasi Nginx (Reverse Proxy):
Certbot baru saja mengubah file Anda. Edit lagi:
sudo nano /etc/nginx/sites-available/domainanda.com
Cari blok server yang listen 443 ssl. Di dalamnya, temukan location / { ... }. Ubah blok location / itu menjadi seperti ini:
location / {
# Arahkan ke aplikasi Next.js Anda (yang akan jalan di port 3000)
proxy_pass http://localhost:3000;
# Header penting
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Tes dan Restart Nginx untuk terakhir kalinya:
sudo nginx -t
sudo systemctl restart nginx
Nginx Anda sekarang SIAP.
3. Setup Project (Satu Kali Saja)
Kita akan menghubungkan server ke repo GitHub Anda.
Di Server: Buat SSH Deploy Key
Setup SSH Deploy Key di Server
# Ganti label dengan nama proyek Anda
ssh-keygen -t ed25519 -C "nama-proyek-key"
# Saat ditanya "Enter file...", KETIK NAMA UNIK:
/home/root/.ssh/nama_proyek_key
# Saat ditanya "Enter passphrase...", JANGAN ISI APAPUN. Tekan Enter 2x.
Di Server: Salin Public Key
cat ~/.ssh/nama_proyek_key.pub
(Salin seluruh output ssh-ed25519 ... nama-proyek-key)
Di GitHub:
- Buka Repo ->
Settings->Deploy Keys->Add deploy key. - Title: “VPS Proyek” (atau nama deskriptif).
- Key: Paste key dari langkah 2
- JANGAN centang “Allow write access”.
- Klik
Add key.
Di Server: Konfigurasi SSH config
Ini memberitahu server untuk pakai key yang benar.
nano ~/.ssh/config
Tambahkan blok ini (Ganti IdentityFile dengan path yang Anda buat tadi):
Host github.com
HostName github.com
User git
IdentityFile /home/root/.ssh/nama_proyek_key
Di Server: Clone Project
# Buat folder jika belum
sudo mkdir -p /var/www
cd /var/www
# Clone pakai SSH, bukan HTTPS
git clone git@github.com:NAMA_ORGANISASI/NAMA_REPO.git
# Contoh: git clone git@github.com:nexera-id/nexera-website.git
4. 🚀 Launch Aplikasi (Pertama Kali)
Ini adalah langkah-langkah penting yang sering terlewat dan menyebabkan error.
Masuk ke Folder Project:
cd /var/www/NAMA_REPO
# Contoh: cd /var/www/nexera-website
Install Dependencies (SANGAT PENTING!):
Ini akan menginstal next dan semua paket lain dari package.json.
bun install
Build Project (SANGAT PENTING!):
Ini akan membuat folder .next versi produksi.
bun run build
Jalankan dengan PM2:
Sekarang jalankan perintah start (yaitu next start atau bun start).
pm2 start bun --name "next-app" -- start
Catatan: --name "next-app" adalah nama alias untuk PM2. Ganti sesuai keinginan Anda.
Cek Status:
pm2 list
Statusnya sekarang seharusnya online (hijau) dan CPU/Memory terisi.
Simpan Proses PM2:
Agar aplikasi otomatis nyala jika server reboot.
pm2 save
Selamat! Aplikasi Anda sekarang harusnya sudah bisa diakses di https://domainanda.com
5. 🔄 Alur Kerja Update (Setiap Ada Perubahan)
Ini adalah langkah yang akan Anda lakukan berulang kali setiap ingin rilis update.
Di Lokal (Komputer Anda):
Selesaikan kode Anda…
git add .
git commit -m "Update fitur X"
git push origin main
Di Server (via SSH):
Login dan masuk ke folder project.
cd /var/www/NAMA_REPO
# Contoh: cd /var/www/nexera-website
1. Ambil kode terbaru
git pull origin main
2. Install dependensi (jika ada yg baru di package.json)
bun install
3. Build ulang project
bun run build
4. Restart aplikasi di PM2 (0-downtime)
Gunakan nama alias yang Anda buat di langkah 4.
pm2 restart next-app
6. 📊 Cheat Sheet Perintah PM2
Gunakan ini untuk mengelola aplikasi Anda.
# Melihat daftar semua aplikasi
pm2 list
# Melihat log (Paling penting untuk debug)
pm2 logs next-app
# Melihat log error saja
pm2 logs next-app --err
# Merestart aplikasi
pm2 restart next-app
# Menghentikan aplikasi
pm2 stop next-app
# Menghapus aplikasi dari daftar
pm2 delete next-app
# Mengatur agar PM2 jalan saat startup
pm2 startup
# (Salin-tempel perintah yang diberikannya)
# Menyimpan proses saat ini untuk startup
pm2 save