# Panduan Deploy ke Hostinger

## Prasyarat

- Hostinger **VPS** (Ubuntu 20.04/22.04) **atau** paket hosting yang mendukung Node.js
- Akses SSH ke server
- Domain yang sudah diarahkan ke IP server

---

## Bagian 1 – Persiapan File untuk Upload

### File yang perlu diupload (di komputer lokal):

Buat arsip ZIP dari seluruh proyek, **kecuali** folder dan file berikut:

```
node_modules/        ← jangan diupload, akan di-install ulang di server
backend/data/        ← jangan diupload, database akan dibuat otomatis
*.bat                ← tidak dibutuhkan di Linux
```

File minimal yang harus ada di server:
```
backend/
  server.js
frontend/
  (semua file dan folder)
package.json
package-lock.json
```

---

## Bagian 2 – Setup VPS Hostinger

### 2.1 Login ke server via SSH

```bash
ssh root@IP_SERVER_ANDA
```

### 2.2 Install Node.js (versi 20 atau lebih baru)

```bash
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
node -v   # cek versi
```

### 2.3 Install PM2 (process manager agar app tetap berjalan)

```bash
npm install -g pm2
```

### 2.4 Upload file proyek

Dari komputer lokal (PowerShell/Terminal), jalankan perintah ini:

```bash
# Buat folder di server
ssh root@IP_SERVER_ANDA "mkdir -p /var/www/pendataan-santri"

# Upload file (ganti path sesuai lokasi proyek di komputer)
scp -r ./backend ./frontend ./package.json ./package-lock.json \
  root@IP_SERVER_ANDA:/var/www/pendataan-santri/
```

Atau gunakan **FileZilla** (SFTP) untuk upload via GUI.

### 2.5 Install dependencies di server

```bash
cd /var/www/pendataan-santri
npm install --omit=dev
```

### 2.6 Buat folder data

```bash
mkdir -p /var/www/pendataan-santri/backend/data
```

---

## Bagian 3 – Konfigurasi Environment

Buat file `.env` di folder proyek **atau** set langsung saat menjalankan PM2:

```bash
# Environment variables penting:
PORT=3000                          # port server (jangan diubah jika pakai reverse proxy)
APP_TIMEZONE=Asia/Jakarta          # timezone
SEED_ADMIN_NAME=admin              # username admin pertama (sebelum ada data)
SEED_ADMIN_PASSWORD=gantiPasswordIni  # password admin pertama
```

> **PENTING**: Ganti `SEED_ADMIN_NAME` dan `SEED_ADMIN_PASSWORD` sebelum deploy.
> Password ini hanya berlaku saat database pertama kali dibuat (belum ada data pengurus).

---

## Bagian 4 – Jalankan Aplikasi dengan PM2

```bash
cd /var/www/pendataan-santri

# Jalankan dengan environment variables
PORT=3000 \
APP_TIMEZONE=Asia/Jakarta \
SEED_ADMIN_NAME=admin \
SEED_ADMIN_PASSWORD=gantiPasswordIni \
pm2 start backend/server.js --name "pendataan-santri"

# Simpan konfigurasi PM2 agar otomatis jalan setelah server restart
pm2 save
pm2 startup
# (jalankan perintah yang muncul dari output pm2 startup)
```

Cek status:
```bash
pm2 status
pm2 logs pendataan-santri
```

---

## Bagian 5 – Setup Reverse Proxy (Nginx)

Hostinger VPS biasanya menggunakan Nginx. Konfigurasi ini menghubungkan domain ke port 3000.

### 5.1 Install Nginx (jika belum ada)

```bash
apt-get install -y nginx
```

### 5.2 Buat konfigurasi virtual host

```bash
nano /etc/nginx/sites-available/pendataan-santri
```

Isi dengan:

```nginx
server {
    listen 80;
    server_name DOMAIN_ANDA.COM www.DOMAIN_ANDA.COM;

    # Ukuran upload maksimal (untuk foto profil dan logo)
    client_max_body_size 10M;

    location / {
        proxy_pass http://localhost: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;
    }
}
```

Ganti `DOMAIN_ANDA.COM` dengan domain yang sudah diarahkan ke server.

### 5.3 Aktifkan konfigurasi

```bash
ln -s /etc/nginx/sites-available/pendataan-santri /etc/nginx/sites-enabled/
nginx -t          # test konfigurasi
systemctl reload nginx
```

---

## Bagian 6 – SSL (HTTPS) dengan Let's Encrypt

```bash
apt-get install -y certbot python3-certbot-nginx
certbot --nginx -d DOMAIN_ANDA.COM -d www.DOMAIN_ANDA.COM
```

Certbot akan otomatis memperbarui konfigurasi Nginx untuk HTTPS.

Uji pembaruan otomatis:
```bash
certbot renew --dry-run
```

---

## Bagian 7 – Update Aplikasi (Deploy Ulang)

Saat ada perubahan kode, upload ulang file yang berubah lalu restart:

```bash
# Upload file baru (dari lokal)
scp -r ./backend ./frontend root@IP_SERVER_ANDA:/var/www/pendataan-santri/

# Di server: restart app
pm2 restart pendataan-santri
```

> **CATATAN**: Folder `backend/data/` berisi database SQLite — **jangan pernah dihapus** saat update.
> Data pengurus, santri, dan semua input tersimpan di sana.

---

## Bagian 8 – Backup Database

Database tersimpan di:
```
/var/www/pendataan-santri/backend/data/pendataan-santri.sqlite
```

Cara backup manual:
```bash
cp /var/www/pendataan-santri/backend/data/pendataan-santri.sqlite \
   /root/backup-santri-$(date +%Y%m%d).sqlite
```

Backup otomatis (tambahkan ke crontab):
```bash
crontab -e
# Tambahkan baris ini untuk backup setiap hari jam 02:00:
0 2 * * * cp /var/www/pendataan-santri/backend/data/pendataan-santri.sqlite /root/backup/db-$(date +\%Y\%m\%d).sqlite
```

---

## Ringkasan Port & Akses

| Komponen    | Port / URL                         |
|-------------|-------------------------------------|
| Node.js app | `localhost:3000` (internal saja)    |
| Nginx proxy | `http://DOMAIN_ANDA.COM` (port 80)  |
| HTTPS       | `https://DOMAIN_ANDA.COM` (port 443)|
| PWA install | Muncul otomatis di browser Chrome/Edge setelah HTTPS aktif |

---

## Troubleshooting

| Masalah | Solusi |
|---------|--------|
| App tidak jalan | `pm2 logs pendataan-santri` untuk lihat error |
| Port 3000 tidak bisa diakses dari luar | Normal — akses via Nginx (domain), bukan langsung port 3000 |
| Upload foto gagal | Cek `client_max_body_size` di Nginx |
| PWA tidak muncul tombol install | Pastikan HTTPS sudah aktif dan buka dari Chrome/Edge |
| Database hilang setelah update | Pastikan folder `backend/data/` tidak ikut dihapus |
