# Panduan Deployment ke cPanel Hosting

Panduan langkah demi langkah untuk men-deploy **HT Digital Wisuda POLINSADA** ke hosting cPanel.

## Daftar Isi
1. [Syarat Hosting](#1-syarat-hosting)
2. [Persiapan File](#2-persiapan-file)
3. [Upload ke cPanel](#3-upload-ke-cpanel)
4. [Setup Node.js App di cPanel](#4-setup-nodejs-app-di-cpanel)
5. [Inisialisasi Database](#5-inisialisasi-database)
6. [Build & Start Aplikasi](#6-build--start-aplikasi)
7. [Verifikasi](#7-verifikasi)
8. [Troubleshooting](#8-troubleshooting)
9. [Alternatif jika cPanel tidak mendukung](#9-alternatif-jika-cpanel-tidak-mendukung)

---

## 1. Syarat Hosting

**cPanel Anda HARUS mendukung:**
- ✅ **Node.js 18+** (cek di cPanel → Software → Setup Node.js App)
- ✅ **Phusion Passenger** (untuk menjalankan Node.js app)
- ✅ **WebSocket** (tanyakan ke provider hosting Anda — banyak shared cPanel MEMBLOKIR WebSocket)
- ✅ **Akses SSH/Terminal** (untuk build, opsional tapi sangat disarankan)
- ✅ **File write permission** (untuk SQLite db file)

**Jika cPanel Anda TIDAK mendukung WebSocket** (umum pada shared hosting murah):
- Aplikasi TIDAK akan berfungsi (suara tidak bisa mengalir)
- Gunakan [Alternative deployment](#9-alternatif-jika-cpanel-tidak-mendukung) di bawah

**Cek WebSocket support:**
Tanyakan ke provider: "Apakah WebSocket didukung untuk Node.js app via Passenger?"
Atau cek dokumentasi hosting Anda.

---

## 2. Persiapan File

Anda menerima file `ht-digital-polinsada.zip`. Isi:

```
ht-digital-polinsada/
├── server.js              ← entry point produksi (Next.js + socket.io embedded)
├── package.json
├── next.config.ts
├── tsconfig.json
├── .env.example           ← template environment variables
├── prisma/
│   ├── schema.prisma
│   ├── seed.ts
│   └── seed.js            ← versi Node.js (tanpa Bun)
├── public/
│   ├── manifest.webmanifest
│   ├── icon-*.png
│   └── apple-touch-icon.png
├── src/
│   ├── app/
│   ├── components/
│   ├── hooks/
│   └── lib/
├── README.md
└── DEPLOY-CPANEL.md       ← file ini
```

---

## 3. Upload ke cPanel

### Opsi A: Upload via File Manager (paling mudah)

1. Login ke cPanel Anda.
2. Buka **File Manager**.
3. Masuk ke folder aplikasi Anda (mis. `~/public_html/ht-polinsada` atau `~/ht-polinsada`).

   > **PENTING:** JANGAN taruh di `public_html` langsung jika app Node.js Anda di subdomain/subfolder. Gunakan subfolder khusus.

4. Klik **Upload** → pilih `ht-digital-polinsada.zip` → upload.
5. Setelah upload selesai, **Extract** zip ke folder tersebut.
6. Anda akan melihat semua file di folder tsb.

### Opsi B: Upload via SSH/SCP (lebih cepat)

```bash
# Dari komputer Anda:
scp ht-digital-polinsada.zip user@yourdomain.com:~/

# SSH ke server:
ssh user@yourdomain.com
mkdir -p ~/ht-polinsada
unzip ht-digital-polinsada.zip -d ~/ht-polinsada
cd ~/ht-polinsada
```

---

## 4. Setup Node.js App di cPanel

1. Di cPanel, buka **Software → Setup Node.js App** (atau **Node.js** di kategori Software).
2. Klik **Create Application**.
3. Isi form:
   - **Node.js version**: pilih versi terbaru yang tersedia (min. 18.x)
   - **Application mode**: `Production`
   - **Application root**: path ke folder Anda (mis. `/home/USER/ht-polinsada`)
   - **Application URL**: domain/subdomain Anda (mis. `ht.polinsada.ac.id`)
   - **Application startup file**: `server.js`
4. Di bagian **Environment variables**, klik **Add Variable** untuk masing-masing:
   - `NODE_ENV` = `production`
   - `PORT` = (kosongkan, Passenger akan set otomatis)
   - `DATABASE_URL` = `file:/home/USER/ht-polinsada/db/custom.db`
   - `RADIO_TOKEN_SECRET` = (generate dengan `openssl rand -hex 32` di SSH, paste di sini)
   - `EVENT_ACCESS_CODE` = `wisuda2026` (atau kode acara Anda)
5. Klik **Save** / **Create**.
6. cPanel akan tampilkan command untuk aktivasi environment, mis.:
   ```bash
   source /home/USER/nodevenv/ht-polinsada/12/bin/activate
   ```
   Catat ini — Anda butuh untuk langkah berikutnya.

---

## 5. Inisialisasi Database

### Via SSH (disarankan)

1. SSH ke server.
2. Aktivasi environment Node:
   ```bash
   source /home/USER/nodevenv/ht-polinsada/18/bin/activate
   cd /home/USER/ht-polinsada
   ```
3. Pastikan folder db ada dan writable:
   ```bash
   mkdir -p db
   chmod 755 db
   ```
4. Push schema Prisma:
   ```bash
   npm run db:push
   ```
   Atau jika `prisma` CLI belum terinstal:
   ```bash
   npx prisma db push --accept-data-loss
   ```
5. Seed data awal (admin + 6 kanal):
   ```bash
   npm run db:seed
   # atau jika Bun tidak tersedia:
   node prisma/seed.js
   ```
6. Verifikasi:
   ```bash
   npx prisma studio    # buka browser, lihat tabel User
   # atau cek langsung:
   ls -la db/custom.db
   ```

### Via cPanel Terminal (jika SSH tidak tersedia)

1. cPanel → **Advanced → Terminal**.
2. Jalankan command yang sama seperti di atas.

---

## 6. Build & Start Aplikasi

### Build Next.js

```bash
cd /home/USER/ht-polinsada
source /home/USER/nodevenv/ht-polinsada/18/bin/activate
npm install --production=false   # install semua deps (termasuk devDependencies untuk build)
npm run build                    # build Next.js (membutuhkan ~1-2 menit)
npm prune --production           # hapus devDependencies setelah build
```

Build akan menghasilkan folder `.next/` yang berisi aplikasi yang sudah di-compile.

### Start aplikasi

Di cPanel Node.js App (langkah 4 di atas):
1. Klik **Restart** pada aplikasi Anda.
2. Passenger akan menjalankan `server.js` otomatis.
3. Cek **logs** di cPanel → Node.js App → log viewer.

Atau via SSH (untuk testing manual):
```bash
cd /home/USER/ht-polinsada
source /home/USER/nodevenv/ht-polinsada/18/bin/activate
NODE_ENV=production node server.js
```

---

## 7. Verifikasi

1. Buka URL aplikasi Anda di browser: `https://ht.polinsada.ac.id/` (ganti dengan domain Anda).
2. Login:
   - Username: `admin`
   - Kode Akses: `wisuda2026`
3. Pastikan:
   - ✅ Halaman HT interface muncul (bukan error 500)
   - ✅ Tombol "TEKAN UNTUK BICARA" aktif
   - ✅ Status koneksi: "Tersambung" (ikon Wi-Fi hijau)
   - ✅ Anggota online: minimal 1 (admin sendiri)
4. Tes multi-perangkat:
   - Buka di HP Android (Chrome)
   - Login sebagai `marketing-nyoman` / `wisuda2026`
   - Pastikan keduanya melihat anggota online
   - Salah satu tekan PTT → yang lain harus lihat "SEDANG BERBICARA"
5. Jika suara tidak terdengar, baca [README - Kenapa tidak ada suara?](README.md#12-troubleshooting)

### Cek via curl (via SSH):
```bash
curl -k https://ht.polinsada.ac.id/ | head -20    # harus return HTML
curl -k https://ht.polinsada.ac.id/socket.io/?EIO=4&transport=polling   # harus return engine.io handshake
```

---

## 8. Troubleshooting

### Aplikasi tidak bisa start (502 Bad Gateway)

**Kemungkinan:**
- `server.js` tidak ditemukan → pastikan Application startup file = `server.js`
- Error sintaks → cek log:
  ```bash
  cat /home/USER/.cage/log/ht-polinsada.err.log
  ```
- Dependencies tidak terpasang → jalankan `npm install` lagi

### WebSocket tidak connect (stuck di "Menyambung...")

**Kemungkinan:**
- Hosting memblokir WebSocket → hubungi provider, tanya dukungan WebSocket
- Apache/Nginx di depan Passenger tidak forward Upgrade header → tambahkan `.htaccess`:
  ```apache
  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} websocket [NC]
  RewriteCond %{HTTP:Connection} upgrade [NC]
  RewriteRule ^/?(.*) "ws://127.0.0.1:%{ENV:PASSENGER_APP_PORT}/$1" [P,L]
  ```

### Database error "attempt to write a readonly database"

```bash
chmod -R 755 /home/USER/ht-polinsada/db
chmod 644 /home/USER/ht-polinsada/db/custom.db
chown -R $USER:$USER /home/USER/ht-polinsada/db
```

### Prisma client not generated

```bash
cd /home/USER/ht-polinsada
npx prisma generate
npx prisma db push --accept-data-loss
```

### Build gagal (memory limit)

Shared hosting sering batas memory 256MB. Tambah swap atau build lokal lalu upload `.next/`:
```bash
# Di komputer lokal:
npm run build
# Upload folder .next/ ke server via File Manager/SCP
```

### Port sudah dipakai

Passenger otomatis set PORT. **Jangan hardcode port**. Jika manual via SSH:
```bash
PORT=3000 node server.js   # ganti 3000 dengan port bebas
```

---

## 9. Alternatif jika cPanel tidak mendukung

Jika hosting cPanel Anda tidak mendukung WebSocket atau Node.js dengan baik, gunakan alternatif berikut:

### Opsi A: VPS Murah (disarankan)
- **Vultr / DigitalOcean / Hetzner**: mulai $5/bulan
- Full akses root, WebSocket bebas, port apa pun
- Setup: install Node.js + Caddy + upload file + jalankan `server.js`

### Opsi B: PaaS (paling mudah)
- **Railway.app** — auto-deploy dari GitHub, WebSocket support, $5 credit gratis
- **Render.com** — free tier + WebSocket
- **Fly.io** — deploy ke edge locations, WebSocket support

### Opsi C: Wi-Fi lokal tanpa internet (terbaik untuk acara)
- Satu laptop/komputer jadi server di jaringan Wi-Fi lokal
- Semua HP terhubung via IP lokal (mis. `http://192.168.1.50:3000/`)
- Tidak butuh internet, latensi rendah
- Lihat [README §6](README.md#6-menghubungkan-beberapa-hp-android) untuk detail

### Deploy ke Railway (paling cepat)
1. Push code ke GitHub repo
2. Login ke Railway.app → New Project → Deploy from GitHub
3. Pilih repo Anda
4. Set env vars: `DATABASE_URL`, `RADIO_TOKEN_SECRET`, `EVENT_ACCESS_CODE`
5. Railway auto-detect Node.js, build & deploy
6. Dapat URL seperti `ht-polinsada.up.railway.app`

---

## Ringkasan Checklist

- [ ] cPanel mendukung Node.js 18+ dan WebSocket
- [ ] Upload zip ke folder aplikasi
- [ ] Buat Node.js App di cPanel, entry point = `server.js`
- [ ] Set env vars (DATABASE_URL, RADIO_TOKEN_SECRET, EVENT_ACCESS_CODE)
- [ ] `npm install` + `npx prisma generate` + `npx prisma db push` + `node prisma/seed.js`
- [ ] `npm run build`
- [ ] Restart app di cPanel
- [ ] Buka URL, login sebagai admin / wisuda2026
- [ ] Cek status koneksi "Tersambung"
- [ ] Tes PTT dengan 2 perangkat

Jika ada kendala, lampirkan log dari cPanel → Node.js App → log viewer.
