# Deploy API Eco Laundry di cPanel

## 1. Pastikan hosting mendukung Node.js

Di cPanel cari **Setup Node.js App**, **Web Apps**, atau **Application Manager**. Pilih Node.js 22.x atau lebih baru. Buat subdomain API (contoh `api.domain-anda.com`), aktifkan SSL/HTTPS, buat aplikasi dengan Application Root yang dipilih dan Startup File `app.js`. Jika provider tidak mengaktifkan fitur ini, paket tidak dapat berjalan pada hosting tersebut; minta provider mengaktifkan Node.js/Passenger atau gunakan VPS/managed Node hosting. [Petunjuk Node.js cPanel](https://docs.cpanel.net/knowledge-base/web-services/how-to-install-a-node.js-application/).

## 2. Buat database

1. cPanel → **MySQL Databases**: buat database dan user database, lalu hubungkan user dengan **ALL PRIVILEGES**.
2. Catat nama database, user, password, host (umumnya `localhost`) dan port (umumnya `3306`). cPanel biasanya menambahkan prefix username pada nama database.
3. Buka **phpMyAdmin**, pilih database baru, lalu impor `backend/schema.sql`.

## 3. Unggah backend

Unggah isi folder `backend/` ke Application Root: `app.js`, `routes.js`, `auth.js`, `db.js`, `package.json`, `package-lock.json`. Jangan unggah `.env.example` sebagai `.env` tanpa mengganti seluruh nilai.

Di panel Node.js pilih **Run NPM Install** atau buka cPanel Terminal, masuk ke Application Root, lalu jalankan `npm ci --omit=dev`. Tambahkan environment variables pada pengaturan aplikasi:

| Nama | Nilai |
|---|---|
| `NODE_ENV` | `production` |
| `DB_HOST` | Host database dari provider |
| `DB_PORT` | `3306` atau port provider |
| `DB_NAME` | Nama database lengkap dengan prefix cPanel |
| `DB_USER` | User database lengkap dengan prefix cPanel |
| `DB_PASSWORD` | Password database |
| `JWT_SECRET` | Secret acak minimal 64 karakter |
| `JWT_EXPIRES_IN` | `12h` |
| `SETUP_KEY` | Kunci setup acak minimal 32 karakter |
| `TRIAL_DAYS` | `14` |
| `CORS_ORIGINS` | Origin web yang diizinkan; aplikasi native tidak memerlukan CORS browser |

Buat secret acak dari komputer sendiri: `node -e "console.log(require('node:crypto').randomBytes(48).toString('hex'))"`. Buat secret berbeda untuk JWT dan setup. Jangan kirim secret di chat atau commit ke repositori.

Simpan konfigurasi, restart aplikasi, lalu buka `https://api.domain-anda.com/api/health`. Respons berhasil berisi `ok: true`. Setelah database siap, buka aplikasi Expo dan gunakan Setup Administrator untuk mengirim `SETUP_KEY`. Setelah admin pertama dibuat, ganti `SETUP_KEY` menjadi nilai baru.

## 4. Hubungkan Expo

Di project Expo, buat `mobile/.env` dari `.env.example` dan isi `EXPO_PUBLIC_API_URL=https://api.domain-anda.com/api`. Untuk EAS Build, atur variable dengan nama yang sama pada project EAS. Jangan masukkan JWT secret atau password database ke aplikasi ponsel. Lanjutkan langkah di `BUILD_MOBILE.md`.

## 5. Peluncuran aman

Gunakan HTTPS; atur backup database berkala di luar akun hosting; buat akun staf terpisah; jangan letakkan `.env` atau backup SQL dalam document root; deploy lebih dahulu ke subdomain staging dan uji dengan data dummy sebelum pindah ke domain aktif. Kebijakan privasi, penghapusan data, dukungan, harga paket, dan payment gateway perlu ditetapkan sebelum menerima pelanggan berbayar.
