# Panduan Hosting (Online)

Aplikasi ini butuh hosting yang mendukung **Node.js 20+** dan **MySQL/MariaDB**. Hosting yang hanya mendukung PHP tidak bisa dipakai.

Pilih salah satu:

- **A. Shared hosting cPanel** dengan menu **Setup Node.js App** — paling mudah, ada phpMyAdmin.
- **B. VPS Ubuntu** — kendali penuh, paling stabil untuk banyak perangkat scan.

Apa pun pilihannya, **wajib memakai HTTPS**: agar password login terenkripsi dan agar fitur NFC ponsel Android bisa berjalan.

---

## A. Shared hosting cPanel

### 1. Buat database
1. cPanel → **MySQL® Databases**.
2. *Create New Database*: misalnya `presensi` → nama lengkapnya menjadi `namaakun_presensi`.
3. *Add New User*: misalnya `presensi` dengan password kuat → `namaakun_presensi`.
4. *Add User To Database*: pilih user & database tadi → centang **ALL PRIVILEGES**.

Tabel tidak perlu dibuat manual — server membuatnya sendiri saat pertama kali jalan. (Alternatif manual: phpMyAdmin → pilih database → **Import** → `database/schema.mysql.sql`.)

### 2. Isi `config.js`
Buka `config.js` di komputer Anda, lalu sesuaikan:

```js
db: {
  host: 'localhost',
  port: 3306,
  user: 'namaakun_presensi',       // user dari langkah 1
  password: 'PASSWORD_DATABASE',   // password user dari langkah 1
  database: 'namaakun_presensi',   // database dari langkah 1
  autoCreateSchema: true,
},
timezone: '+07:00',                // WIB
adminAwal: {
  username: 'admin',
  password: 'PasswordAdminKuat123', // untuk login pertama, minimal 8 karakter
},
```

### 3. Unggah file
1. **Hapus folder `node_modules`** dari folder proyek (cPanel akan memasangnya sendiri; folder ini justru membuat instalasi gagal bila ikut diunggah).
2. Kompres ulang folder `presensi-nfc` menjadi zip.
3. cPanel → **File Manager** → buka folder home (BUKAN `public_html`) → **Upload** zip → klik kanan → **Extract**. Hasilnya misalnya `/home/namaakun/presensi-nfc`.

### 4. Buat aplikasi Node.js
cPanel → **Setup Node.js App** → **Create Application**:

| Isian | Nilai |
|---|---|
| Node.js version | 20 atau lebih baru |
| Application mode | Production |
| Application root | `presensi-nfc` |
| Application URL | domain/subdomain Anda, misalnya `presensi.domainanda.com` |
| Application startup file | `server.js` |

Klik **Create** → **Run NPM Install** → tunggu selesai → **Restart**.

> Isian "Environment variables" di halaman ini boleh dipakai sebagai pengganti mengedit `config.js`: `DB_USER`, `DB_PASSWORD`, `DB_NAME`, `ADMIN_PASSWORD`, `TZ_OFFSET`.

### 5. Aktifkan HTTPS
cPanel → **SSL/TLS Status** → centang domain → **Run AutoSSL**. Setelah sertifikat terbit, buka `https://presensi.domainanda.com`.

### 6. Masuk pertama kali
1. Login dengan `admin` dan password `adminAwal` dari `config.js`.
2. Klik **Ubah password** di sidebar dan ganti dengan password baru.
3. Kosongkan kembali `adminAwal.password` di `config.js` (tidak dipakai lagi setelah akun admin ada).
4. Menu **Pengguna** → buat akun **Petugas scan** untuk tiap perangkat scan.

### Bila aplikasi tidak bisa dibuka
- Setup Node.js App → klik aplikasi → periksa file log (`stderr.log` di folder aplikasi). Pesan galat database ditulis jelas, misalnya *"Username atau password MySQL salah"*.
- Setelah mengubah `config.js`, selalu klik **Restart**.

---

## B. VPS Ubuntu 22.04 / 24.04

Contoh untuk domain `presensi.domainanda.com` yang sudah diarahkan (A record) ke IP VPS.

### 1. Pasang paket
```bash
sudo apt update && sudo apt install -y mysql-server nginx unzip
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install -g pm2
```

### 2. Database & user
```bash
sudo mysql -e "CREATE DATABASE presensi_nfc CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'presensi'@'localhost' IDENTIFIED BY 'GANTI_PASSWORD_KUAT';
GRANT ALL PRIVILEGES ON presensi_nfc.* TO 'presensi'@'localhost'; FLUSH PRIVILEGES;"
```

### 3. Aplikasi
```bash
sudo mkdir -p /var/www && cd /var/www
sudo unzip ~/presensi-nfc.zip && sudo chown -R $USER: presensi-nfc && cd presensi-nfc
rm -rf node_modules && npm ci --omit=dev
nano config.js   # isi user 'presensi', password, database 'presensi_nfc', adminAwal.password
pm2 start server.js --name presensi
pm2 save && pm2 startup     # jalankan perintah yang ditampilkan agar hidup otomatis setelah reboot
```

### 4. Nginx + HTTPS
`/etc/nginx/sites-available/presensi`:
```nginx
server {
  server_name presensi.domainanda.com;
  client_max_body_size 10m;
  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}
```
```bash
sudo ln -s /etc/nginx/sites-available/presensi /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d presensi.domainanda.com
```

Port 3000 tidak perlu dibuka di firewall — hanya port 80 dan 443:
```bash
sudo ufw allow OpenSSH && sudo ufw allow 'Nginx Full' && sudo ufw enable
```

Perintah berguna: `pm2 logs presensi` (melihat log), `pm2 restart presensi` (setelah mengubah `config.js`).

### Backup harian (opsional)
```bash
crontab -e
# tambahkan baris berikut (backup setiap pukul 23:30, simpan 14 hari):
30 23 * * * mysqldump -upresensi -p'GANTI_PASSWORD_KUAT' presensi_nfc | gzip > ~/backup-presensi-$(date +\%F).sql.gz && find ~ -name 'backup-presensi-*' -mtime +14 -delete
```

---

## Daftar periksa keamanan

- [ ] Situs dibuka lewat `https://`
- [ ] Password admin awal sudah diganti, `adminAwal.password` di `config.js` dikosongkan
- [ ] User MySQL khusus aplikasi (bukan `root`) dengan password kuat
- [ ] Setiap perangkat scan memakai akun **Petugas scan**, bukan akun admin
- [ ] Backup database terjadwal (phpMyAdmin → Export, atau cron di VPS)
