# 🚀 Panduan Deploy Marketing Suite ke Rumahweb

Panduan lengkap men-deploy aplikasi Next.js 16 ini ke hosting Rumahweb.
Pilih salah satu dari dua jalur sesuai paket yang Anda miliki.

---

## Ringkasan cepat

| Paket Rumahweb | Bisa? | Cara |
|---|---|---|
| **Cloud VPS / VPS** | ✅ Paling ideal | Jalur A — Node.js + PM2 + Nginx |
| **Shared hosting dengan "Setup Node.js App"** | ✅ Bisa | Jalur B — cPanel Node.js |
| **Shared hosting PHP saja** | ❌ Tidak bisa | Perlu upgrade ke VPS |

**Kenapa?** Aplikasi ini butuh Node.js server (bukan PHP). Semua fitur
(API routes, AI, parser Excel, TikTok MCP) berjalan di server Node.

---

## Yang dibutuhkan

- Node.js **20 atau lebih baru** (disarankan 22 LTS)
- RAM minimal **1 GB** (2 GB lebih nyaman)
- Disk **500 MB** kosong
- Domain/subdomain yang sudah diarahkan ke hosting

---

# Jalur A — Cloud VPS (paling direkomendasikan)

## A1. Masuk ke VPS

```bash
ssh root@IP_VPS_ANDA
```

## A2. Install Node.js 22

```bash
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs git nginx
node -v    # harus v22.x
npm -v
```

## A3. Buat user aplikasi (praktik aman)

```bash
adduser --disabled-password --gecos "" marketing
usermod -aG sudo marketing
su - marketing
```

## A4. Ambil kode dari GitHub

```bash
cd ~
git clone https://github.com/zhangpros/marketing-suite-grason.git
cd marketing-suite-grason
```

> Repo ini **private**. Saat diminta login, gunakan **Personal Access Token**
> GitHub (Settings → Developer settings → Personal access tokens → Fine-grained
> tokens → beri akses baca ke repo ini), bukan password akun.

## A5. Install dependency & build

```bash
npm ci
npm run build
```

Proses build memakan waktu 2–5 menit dan RAM cukup besar. Jika VPS hanya
1 GB, tambahkan swap dulu:

```bash
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```

## A6. Siapkan file environment

```bash
cp .env.production.example .env.production
nano .env.production
```

Isi minimal:

```env
SITE_PASSWORD=password-kuat-anda
NEXT_PUBLIC_APP_URL=https://domain-anda.com
```

Simpan (Ctrl+O, Enter, Ctrl+X).

> **Penting:** `.env.production` tidak boleh di-commit ke Git.

## A7. Siapkan paket standalone

Next.js sudah dikonfigurasi `output: 'standalone'`. Setelah build:

```bash
cp -r public .next/standalone/
cp -r .next/static .next/standalone/.next/
```

## A8. Jalankan dengan PM2 (auto-restart)

```bash
sudo npm install -g pm2

cd ~/marketing-suite-grason/.next/standalone
cp ~/marketing-suite-grason/.env.production .env.production

PORT=3000 pm2 start server.js --name marketing-suite
pm2 save
pm2 startup
# jalankan perintah yang muncul dari pm2 startup
```

Cek status:

```bash
pm2 status
pm2 logs marketing-suite --lines 30
```

## A9. Pasang Nginx sebagai reverse proxy

```bash
sudo nano /etc/nginx/sites-available/marketing-suite
```

Isi:

```nginx
server {
    listen 80;
    server_name domain-anda.com www.domain-anda.com;

    client_max_body_size 100M;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
}
```

Aktifkan:

```bash
sudo ln -s /etc/nginx/sites-available/marketing-suite /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

## A10. HTTPS gratis (Let's Encrypt)

```bash
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d domain-anda.com -d www.domain-anda.com
```

Pilih **redirect HTTP ke HTTPS** saat ditanya.

## A11. Verifikasi

Buka `https://domain-anda.com` → harus muncul halaman login Marketing Suite.

> **Penting untuk fitur suara:** mikrofon hanya aktif di HTTPS. Karena itu
> langkah A10 wajib, bukan opsional.

## A12. Update aplikasi di kemudian hari

```bash
cd ~/marketing-suite-grason
git pull
npm ci
npm run build
cp -r public .next/standalone/
cp -r .next/static .next/standalone/.next/
cp .env.production .next/standalone/.env.production
pm2 restart marketing-suite
```

---

# Jalur B — Shared Hosting dengan cPanel Node.js

> Hanya berlaku bila panel cPanel Anda punya menu **Setup Node.js App**
> (biasanya di bagian "Software"). Kalau tidak ada, gunakan Jalur A.

## B1. Cek versi Node.js

Di cPanel → **Setup Node.js App** → **Create Application**.
Pastikan pilihan Node.js tersedia versi **20 atau 22**.

Jika hanya tersedia versi lama (14/16/18), aplikasi ini **tidak akan jalan**.

## B2. Upload kode

**Cara 1 — via Git (bila tersedia):**

cPanel → **Git™ Version Control** → Create → clone
`https://github.com/zhangpros/marketing-suite-grason.git`

**Cara 2 — via File Manager:**

1. Di komputer, jalankan:
   ```bash
   npm ci
   npm run build
   cp -r public .next/standalone/
   cp -r .next/static .next/standalone/.next/
   ```
2. Zip isi folder `.next/standalone` (bukan foldernya, tapi isinya).
3. Upload ke `~/marketing-suite` lewat File Manager, lalu Extract.

## B3. Buat aplikasi Node di cPanel

**Setup Node.js App** → **Create Application**:

| Field | Isi |
|---|---|
| Node.js version | 22 (atau 20) |
| Application mode | Production |
| Application root | `marketing-suite` |
| Application URL | domain/subdomain Anda |
| Application startup file | `server.js` |

Klik **Create**.

## B4. Isi Environment Variables

Masih di halaman aplikasi, bagian **Environment variables**, tambahkan:

```
SITE_PASSWORD = password-kuat-anda
NEXT_PUBLIC_APP_URL = https://domain-anda.com
NODE_ENV = production
```

Klik **Save**.

## B5. Install dependency (bila belum)

Masuk ke terminal cPanel (atau tombol **Run NPM Install**):

```bash
source /home/USERNAME/nodevenv/marketing-suite/22/bin/activate
cd ~/marketing-suite
npm ci --omit=dev
```

## B6. Restart

Klik **Restart** di Setup Node.js App.

## B7. Verifikasi

Buka domain Anda → halaman login harus muncul.

Jika muncul error 503 atau "Passenger", cek:
- File `server.js` ada di `~/marketing-suite/`
- Startup file sudah diisi `server.js`
- Log error di `~/marketing-suite/stderr.log`

---

# Environment Variables — referensi

| Variable | Wajib | Fungsi |
|---|---|---|
| `SITE_PASSWORD` | ✅ | Password login aplikasi |
| `NEXT_PUBLIC_APP_URL` | ✅ | URL publik (untuk OAuth callback) |
| `SITE_PASSWORD_VIEWER` | – | Password role viewer (read-only) |
| `NEXT_PUBLIC_SUPABASE_URL` | – | Sinkron data antar perangkat |
| `NEXT_PUBLIC_SUPABASE_ANON_KEY` | – | Kunci publik Supabase |
| `OPENAI_API_KEY` | – | AI (bisa diisi di browser) |
| `ELEVENLABS_API_KEY` | – | Suara cloning Aria |
| `TELEGRAM_BOT_TOKEN` | – | Notulen rapat ke Telegram |
| `GOOGLE_*` | – | Mode live Google Sheets |

---

# Supabase (opsional, untuk sinkron antar perangkat)

Tanpa Supabase, data tersimpan di **localStorage browser** — artinya data yang
diimport di laptop tidak muncul di HP.

Untuk mengaktifkan sinkron:

1. Buat project gratis di https://supabase.com
2. Buka **SQL Editor** → paste seluruh isi `supabase/SETUP_ALL.sql` → Run
3. Buka **Settings → API**, copy **Project URL** dan **anon public key**
4. Isi di `.env.production`:
   ```env
   NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
   NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
   ```
5. Rebuild + restart aplikasi

---

# Troubleshooting

## Aplikasi tidak mau start

```bash
pm2 logs marketing-suite --lines 50
```

Penyebab umum:
- `SITE_PASSWORD` belum diisi (tetap jalan, tapi pakai `admin123` — **jangan**)
- Port 3000 sudah dipakai aplikasi lain → ganti `PORT=3001`
- Node.js versi terlalu lama → minimal v20

## Halaman blank / error 500

Cek apakah folder `public` dan `.next/static` sudah disalin ke
`.next/standalone/`. Ini langkah yang paling sering terlewat.

## Fitur suara tidak jalan

- Harus **HTTPS** (bukan HTTP)
- Browser harus **Chrome atau Edge**
- Izin mikrofon harus diizinkan

## Import Excel gagal / lambat

File GMV Max bisa 50 MB. Pastikan:
- `client_max_body_size 100M;` di Nginx
- Browser tidak kehabisan memori (tutup tab lain)

## Build kehabisan memori di VPS 1 GB

Tambahkan swap 2 GB (lihat langkah A5).

---

# Keamanan

- ✅ `.env.production` **tidak** ikut Git (sudah ada di `.gitignore`)
- ✅ API key AI bisa diisi lewat browser, tidak perlu disimpan di server
- ✅ Ganti `SITE_PASSWORD` default sebelum online
- ✅ Gunakan HTTPS (wajib untuk mikrofon)
- ⚠️ Jangan pernah commit `.env.production` atau membagikan isinya
