# Panduan Deploy ke Online (Shared Hosting cPanel + Node.js App Selector)

Target akhir:
- REST API PHP jalan di `https://karyaputrapomalaa.com/go-project/chatingan/api/...`
- WebSocket (Node.js) jalan di `wss://ws.karyaputrapomalaa.com` (subdomain terpisah)
- Flutter app & web monitoring connect ke dua alamat di atas lewat HTTPS/WSS

Semua alamat di bawah sudah saya isi dengan `karyaputrapomalaa.com` (domain kamu). Kalau nanti domainnya berubah, cari-ganti string itu di file ini + `config/config.php` + `lib/config/api_config.dart` + `monitoring/js/config.js`.

---

## 1. Buat subdomain untuk WebSocket

Di cPanel → **Domains** / **Subdomains** → buat subdomain baru, misal:
- Subdomain: `ws`
- Domain: `karyaputrapomalaa.com`
- Document root: boleh default (nanti diarahkan ulang otomatis oleh Node.js App Selector), misal `ws.karyaputrapomalaa.com`

## 2. Import database

cPanel → **phpMyAdmin** → tab **Import** → pilih file `sql/database.sql`.

Catat: username & password database yang dibuatkan cPanel (cPanel → **MySQL Databases**), biasanya formatnya `namacpanel_dbuser`, BUKAN `root`.

## 3. Upload backend PHP

Upload seluruh isi folder `backend/` (kecuali `ws-server/`, itu untuk langkah terpisah di bawah) ke `public_html/go-project/chatingan` lewat **File Manager** atau FTP.

### a. Edit `config/database.php`
```php
$host     = 'localhost';
$dbname   = 'namacpanel_appdb';       // sesuai nama DB di cPanel
$username = 'namacpanel_dbuser';      // BUKAN root
$password = 'password_db_kamu';
```

### b. Edit `config/config.php`
- `JWT_SECRET` → ganti dengan string acak panjang (contoh generate: `openssl rand -hex 32` kalau ada akses terminal, atau pakai password generator manapun, asal panjang & acak). **Catat nilainya**, dipakai lagi di langkah 4.
- `AUTH_BYPASS` → pastikan `false` (sudah saya set false di kode ini — jangan diubah balik ke `true` di production).
- `WS_BRIDGE_SECRET` → ganti dengan string acak lain (beda dari JWT_SECRET). **Catat nilainya**, dipakai lagi di langkah 4.
- `WS_INTERNAL_URL` → isi belakangan di langkah 5, setelah tahu port dari cPanel.
- `FCM_PROJECT_ID` & `FCM_SERVICE_ACCOUNT_PATH` → isi kalau mau notifikasi push aktif (lihat `README.md` bagian Firebase).

### c. Aktifkan HTTPS
cPanel → **SSL/TLS Status** → pastikan AutoSSL aktif untuk `karyaputrapomalaa.com` (biasanya otomatis, tunggu beberapa menit kalau baru).

Test: buka `https://karyaputrapomalaa.com/go-project/chatingan/api/chat/get_chat_list.php` di browser — harusnya dapat respons JSON `{"success":false,"message":"Token tidak ditemukan",...}` (itu normal, artinya PHP-nya jalan & AUTH_BYPASS sudah mati).

## 4. Setup Node.js App untuk WebSocket

cPanel → **Setup Node.js App** → **Create Application**:
- **Node.js version**: pilih yang terbaru yang tersedia (18+)
- **Application mode**: Production
- **Application root**: folder tempat kamu upload isi `ws-server/`, misal `ws-server` (upload lewat File Manager/FTP ke folder ini, di LUAR `public_html` kalau bisa, atau di `public_html/ws-server` juga tidak apa asal ada `.htaccess`/protection — tapi cPanel Node App biasanya punya folder kerja sendiri di luar public_html)
- **Application URL**: pilih subdomain `ws.karyaputrapomalaa.com` yang dibuat di langkah 1
- **Application startup file**: `app.js`

Setelah dibuat, cPanel akan menampilkan halaman detail app-nya. Di situ:

1. Klik **Run NPM Install** (menginstall `ws`, `jsonwebtoken`, `dotenv`).
2. Di bagian **Environment Variables**, tambahkan:
   - `JWT_SECRET` = (sama persis dengan yang di `config/config.php` langkah 3b)
   - `WS_BRIDGE_SECRET` = (sama persis dengan yang di `config/config.php` langkah 3b)
3. Klik **Save**, lalu **Restart** / **Start App**.
4. cPanel akan menampilkan port internal yang di-assign (biasanya terlihat di detail app, atau di file konfigurasi `.htaccess`/passenger yang dibuat otomatis di folder app itu — cek bagian "Detected Configuration Files" atau tanya support hosting kalau tidak kelihatan).

## 5. Sambungkan PHP ke Node.js

Balik ke `config/config.php` di backend PHP, isi:
```php
define('WS_INTERNAL_URL', 'http://127.0.0.1:PORT_DARI_LANGKAH_4');
```

## 6. Tes WebSocket server

Buka `https://ws.karyaputrapomalaa.com/health` di browser — harus muncul teks `ok`.

Kalau muncul error 502/503, cek log di cPanel Node.js App (tombol **Log**) — biasanya karena `JWT_SECRET`/`WS_BRIDGE_SECRET` belum di-set, atau `npm install` belum jalan.

## 7. Update & build ulang Flutter app

Di `lib/config/api_config.dart`, pastikan:
```dart
static const String baseUrl = 'https://karyaputrapomalaa.com/go-project/chatingan/api';
static const String wsHost = 'ws.karyaputrapomalaa.com';
```

Lalu build ulang:
```bash
flutter build apk --release
```

## 8. Update web monitoring (opsional, kalau dipakai)

Di `monitoring/js/config.js`, `API_BASE_URL` dan `WS_URL` sudah saya arahkan ke domain (ganti `karyaputrapomalaa.com` sesuai domain asli), dan `AUTH_BYPASS` sudah `false`.

## 9. Tes menyeluruh

1. Register 2 akun beda device/emulator.
2. Login kedua-duanya.
3. User A scan QR user B → chat harus langsung muncul di daftar chat User B **tanpa** B perlu scan ulang (ini bug #3 yang sekarang sudah diperbaiki di `start_chat.php`).
4. Kirim pesan dari A → harus langsung muncul di B tanpa buka-tutup chat.
5. Coba matikan wifi HP B sebentar lalu nyalakan lagi / minimize app lalu buka lagi → pesan yang sempat terlewat harus otomatis muncul (event `ws_synced`).

---

## Catatan keamanan sebelum benar-benar publik

- [ ] `AUTH_BYPASS` = `false` di `config/config.php` (sudah)
- [ ] `JWT_SECRET` sudah diganti dari default, dan **tidak sama** dengan `WS_BRIDGE_SECRET`
- [ ] `config/database.php` tidak lagi pakai user `root` tanpa password
- [ ] HTTPS aktif di domain utama & subdomain `ws.`
- [ ] `.htaccess` deny-all sudah ada di folder `config/`, `vendor/`, `websocket/`, `helpers/`, `sql/` (sudah saya tambahkan)
- [ ] File `config/firebase-service-account.json` (kalau ada) tidak ter-upload ke folder yang bisa diakses publik
