# Deploy Setrip dengan PM2 Panduan ini untuk menjalankan aplikasi **Next.js** (setrip) di server Linux/VPS menggunakan **PM2**. Pastikan **PostgreSQL** sudah tersedia dan URL-nya sesuai dengan variabel lingkungan aplikasi. ## Prasyarat - Node.js **20.x** (disarankan, selaras dengan `@types/node` di proyek) - npm atau pnpm/yarn (contoh di bawah memakai **npm**) - PM2 terpasang global: `npm install -g pm2` - Basis data PostgreSQL dan file `.env` di server (lihat bagian Lingkungan) ## File PM2 Konfigurasi PM2 ada di root repositori: **`ecosystem.config.js`** (nama ini disengaja). ### Jangan `pm2 start ecosystem.js` kecuali itu skrip Node Jika Anda menjalankan `pm2 start ecosystem.js` pada file yang isinya hanya `module.exports = { apps: [...] }`, PM2 menganggapnya **skrip aplikasi biasa** dan menjalankannya dengan `node ecosystem.js`. Akibatnya: - Nama proses di daftar PM2 jadi **`ecosystem`** (bukan `setrip`). - Next.js **tidak** dijalankan lewat entri `apps` Anda. Gunakan selalu: ```bash pm2 start ecosystem.config.js --env production ``` Isi file menjalankan biner Next (`next start`) setelah build, mode **fork**, satu proses, **PORT** **3090**. Ubah `PORT` di file tersebut jika kebijakan port berubah. ### Berapa port yang dibutuhkan? Untuk **trafik HTTP/HTTPS ke aplikasi Next.js**, cukup **satu port** yang didengarkan oleh `next start` — di setup ini **3090** (atau satu port lain yang Anda set). **PostgreSQL** memakai port tersendiri (biasanya **5432**) di mesin tempat database berjalan. Itu bukan “port kedua untuk publik” dari aplikasi web: koneksi DB terjadi dari server aplikasi ke database (localhost atau jaringan internal). Di firewall publik Anda biasanya hanya membuka **80/443** (reverse proxy) atau **3090** jika diakses langsung tanpa proxy. ## Langkah deploy (pertama kali) 1. **Clone** repositori ke server (misalnya `/var/www/setrip`). 2. **Masuk** ke folder proyek dan pasang dependensi produksi: ```bash cd /var/www/setrip npm ci ``` 3. **Lingkungan** — salin atau buat `.env` / `.env.production` di server (jangan commit rahasia ke git). Minimal sesuai kebutuhan aplikasi Anda, contoh: - `DATABASE_URL` — koneksi PostgreSQL - `NEXTAUTH_SECRET` — string acak yang kuat - `NEXTAUTH_URL` — URL publik aplikasi (harus cocok dengan yang dibuka browser), misalnya `https://domain-anda.com` atau `http://host:3090` jika tanpa HTTPS dan akses langsung ke port tersebut 4. **Prisma** — generate client dan terapkan migrasi (jika memakai migrasi): ```bash npx prisma generate npx prisma migrate deploy ``` 5. **Build** Next.js: ```bash npm run build ``` 6. **Mulai** dengan PM2: ```bash pm2 start ecosystem.config.js --env production ``` Tanpa `--env production` tetap jalan; variabel default memakai blok `env` di file. 7. **Simpan** daftar proses agar bangkit lagi setelah reboot: ```bash pm2 save pm2 startup ``` Ikuti perintah yang dikeluarkan PM2 (biasanya menyalin satu baris `sudo env ...`). ## Perintah PM2 yang sering dipakai | Perintah | Keterangan | |----------|------------| | `pm2 status` | Status semua aplikasi | | `pm2 logs setrip` | Log aplikasi bernama `setrip` | | `pm2 reload setrip` | Reload tanpa downtime (berguna setelah deploy baru) | | `pm2 restart setrip` | Restart proses | | `pm2 stop setrip` | Menghentikan aplikasi | | `pm2 delete setrip` | Menghapus aplikasi dari daftar PM2 | ## Deploy ulang (update kode) Di server, setelah `git pull` (atau salin artefak baru): ```bash cd /var/www/setrip npm ci npx prisma generate npx prisma migrate deploy npm run build pm2 reload setrip ``` Jika nama aplikasi di PM2 berbeda, ganti `setrip` dengan nama di `ecosystem.config.js` (`name`). ### Hapus proses PM2 yang salah (nama `ecosystem`) Jika Anda pernah menjalankan `pm2 start ecosystem.js` dan muncul proses bernama `ecosystem`: ```bash pm2 stop ecosystem pm2 delete ecosystem ``` Atau pakai id dari `pm2 status` (contoh id `9`): ```bash pm2 stop 9 pm2 delete 9 ``` Lalu mulai lagi dengan `pm2 start ecosystem.config.js --env production` dan `pm2 save`. ## Reverse proxy (opsional) Agar bisa HTTPS dan port 80/443, letakkan **Nginx** (atau Caddy) di depan aplikasi yang mendengarkan di `127.0.0.1:3090`. Pastikan `NEXTAUTH_URL` memakai skema dan host yang sama dengan yang diakses pengguna. ## Pemecahan masalah - **502 / tidak terhubung** — cek `pm2 logs setrip`, pastikan PostgreSQL dapat dijangkau dari server, dan `PORT` tidak bentrok dengan layanan lain. - **Error Prisma** — pastikan `npx prisma generate` dijalankan setelah `npm ci` di setiap deploy, dan `DATABASE_URL` benar. - **NextAuth** — `NEXTAUTH_URL` harus persis URL publik (termasuk `https://`).