diff --git a/deployment.md b/deployment.md new file mode 100644 index 0000000..895cdf1 --- /dev/null +++ b/deployment.md @@ -0,0 +1,111 @@ +# 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.js`**. + +Isinya menjalankan biner Next (`next start`) setelah build, mode **fork**, satu proses, **PORT** **3090** (sesuai alokasi server Anda). Ubah `PORT` di file tersebut atau lewat variabel lingkungan di server jika kebijakan port berubah. + +Beberapa tutorial memakai nama `ecosystem.config.js`; PM2 menerima nama apa pun asal Anda menjalankan `pm2 start `. + +### 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.js + ``` + + Untuk memakai blok `env_production` di file ecosystem: + + ```bash + pm2 start ecosystem.js --env production + ``` + +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.js` (`name`). + +## 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://`). diff --git a/ecosystem.js b/ecosystem.js new file mode 100644 index 0000000..18d61b8 --- /dev/null +++ b/ecosystem.js @@ -0,0 +1,29 @@ +/** + * PM2 ecosystem — jalankan dari root proyek setelah `npm run build`. + * Contoh: pm2 start ecosystem.js + */ +module.exports = { + apps: [ + { + name: "setrip", + cwd: __dirname, + script: "node_modules/next/dist/bin/next", + args: "start", + instances: 1, + exec_mode: "fork", + autorestart: true, + watch: false, + max_memory_restart: "512M", + env: { + NODE_ENV: "production", + PORT: 3090, + }, + // Override di server produksi, contoh: + // pm2 start ecosystem.js --env production + env_production: { + NODE_ENV: "production", + PORT: 3090, + }, + }, + ], +};