๐ŸŒ Panduan Memasang MonitorPIC di Web Hosting (cPanel)

Untuk hosting yang memakai cPanel (Niagahoster, Hostinger, Rumahweb, IDCloudHost, dan sejenisnya). Ikuti urut dari Langkah 0. Setiap langkah punya tanda โœ… supaya Anda tahu sudah benar. Tampilan menu cPanel tiap penyedia sedikit berbeda; nama menu yang dipakai di sini adalah nama bakunya.

Baca dulu: berbeda dengan laptop (XAMPP), di hosting aplikasi dapat dibuka siapa saja di internet. Karena itu Langkah 9 (ganti password admin) dan Langkah 13 (keamanan) bukan pilihan, wajib dikerjakan.
Batasan hosting biasa: (1) WhatsApp gateway lokal (Node.js) tidak bisa; pakai Fonnte. (2) Harus ada fitur Cron Jobs; tanpa itu reminder otomatis tidak jalan (hosting gratisan umumnya tidak punya). (3) Paket yang hanya menyediakan PHP 7.x tidak cocok; butuh PHP 8.0+.

Langkah 0 โ€“ Kumpulkan dulu (5 menit)

Siapkan catatan berikut. Tulis di Notepad, jangan di kertas yang terlihat orang lain.

Langkah 1 โ€“ Pastikan hosting memenuhi syarat

  1. Login cPanel โ†’ cari Select PHP Version (atau MultiPHP Manager).
  2. Pilih PHP 8.1 (atau 8.2/8.3) untuk domain Anda โ†’ Apply/Set as current.
  3. Di Select PHP Version โ†’ Extensions centang: pdo_mysql (kadang tertulis mysqlnd/pdo), mbstring, json, curl, openssl, zlib. Klik Save.
  4. Cari menu Cron Jobs di cPanel. Jika menu itu tidak ada, tanyakan ke support: "apakah paket ini mendukung cron job PHP CLI?".
โœ… Bila PHP โ‰ฅ 8.1, ekstensi di atas aktif, dan menu Cron Jobs ada, lanjut. Pemeriksaan otomatis lengkap ada di Langkah 8.

Langkah 2 โ€“ Domain/subdomain dan SSL (HTTPS)

  1. cPanel โ†’ Domains (atau Subdomains) โ†’ Create A New Domain / buat subdomain, mis. monitor pada perusahaan.com.
  2. Perhatikan kolom Document Root (mis. /home/akunanda/monitor.perusahaan.com). Catat: di sinilah semua berkas aplikasi diunggah (Langkah 4).
  3. cPanel โ†’ SSL/TLS Status โ†’ pilih domain/subdomain tadi โ†’ Run AutoSSL. Tunggu beberapa menit sampai gembok hijau.
  4. cPanel โ†’ Domains โ†’ aktifkan Force HTTPS Redirect untuk domain itu.
โœ… Membuka https://monitor.perusahaan.com menampilkan halaman default hosting dengan gembok (belum ada aplikasi, itu wajar).

Langkah 3 โ€“ Buat database MySQL

  1. cPanel โ†’ MySQLยฎ Databases.
  2. Bagian Create New Database: ketik nama, mis. monitorpic โ†’ Create Database. Hasil akhirnya berawalan nama akun, mis. akunanda_monitorpic.
  3. Bagian MySQL Users โ†’ Add New User: username mis. app (jadi akunanda_app). Klik Password Generator โ†’ Use Password (salin password panjang itu) โ†’ Create User.
  4. Bagian Add User To Database: pilih user dan database tadi โ†’ Add โ†’ centang ALL PRIVILEGES โ†’ Make Changes.
  5. Catat ke Notepad tiga hal: nama database lengkap, nama user lengkap, password.
Jangan memakai user root dan jangan memakai password yang sama dengan akun cPanel. Bila password mengandung tanda kutip tunggal ' atau garis miring terbalik \, buat ulang password lain agar tidak merusak config.php.
โœ… Di halaman MySQL Databases, database dan user tampil, dan user terdaftar di bagian Current Databases โ†’ Privileges: ALL PRIVILEGES.

Langkah 4 โ€“ Unggah berkas aplikasi

  1. Di komputer, ekstrak ZIP MonitorPIC. Anda akan mendapat folder (mis. monitorpic) berisi index.html, api.php, assets, inc, dll.
  2. Cara paling mudah: zip ulang isi folder itu (pilih semua berkas di dalam folder, bukan foldernya) menjadi aplikasi.zip.
  3. cPanel โ†’ File Manager โ†’ masuk ke Document Root dari Langkah 2 โ†’ tombol Upload โ†’ pilih aplikasi.zip โ†’ tunggu 100%.
  4. Kembali ke File Manager โ†’ klik kanan aplikasi.zip โ†’ Extract โ†’ Extract File(s). Lalu hapus aplikasi.zip.
  5. Klik Settings (pojok kanan atas File Manager) โ†’ centang Show Hidden Files (dotfiles) โ†’ Save. Ini agar berkas .htaccess terlihat.
โœ… Di Document Root terlihat langsung index.html, api.php, cron.php, .htaccess, folder assets, inc, uploads, logs. Bukan terbungkus lagi di dalam folder monitorpic/. Bila terbungkus, pindahkan isinya satu tingkat ke atas.

Langkah 5 โ€“ Isi database (impor)

Pakai berkas database_hosting.sql (bukan database.sql). Berkas hosting tidak memuat CREATE DATABASE (yang akan gagal di hosting) dan tidak memuat data/akun contoh. Hanya ada satu akun: admin.
  1. Unduh database_hosting.sql dari File Manager ke komputer Anda (klik kanan โ†’ Download), atau gunakan salinan hasil ekstrak di komputer.
  2. cPanel โ†’ phpMyAdmin. Di kolom kiri klik nama database Anda (mis. akunanda_monitorpic).
  3. Klik tab Import โ†’ Choose File โ†’ pilih database_hosting.sql โ†’ biarkan pengaturan bawaan โ†’ klik Import di bagian paling bawah.
  4. Tunggu pesan hijau "Import has been successfully finished".
โœ… Di kolom kiri phpMyAdmin tampil sekitar 25 tabel (users, tickets, settings, menus, โ€ฆ). Buka tabel users โ†’ Browse โ†’ hanya ada 1 baris (admin).
Sudah punya data di XAMPP dan ingin dipindah? Jangan pakai database_hosting.sql. Di XAMPP: phpMyAdmin โ†’ database monitorpic โ†’ Export โ†’ Quick โ†’ SQL. Impor berkas hasilnya ke database hosting (hapus baris CREATE DATABASE/USE bila ada). Salin juga isi folder uploads/ (dokumen tiket) ke hosting. Bila versi aplikasi di XAMPP lebih lama, jalankan php migrate.php (lihat Langkah 15). Setelah itu tetap ganti semua password akun contoh.

Langkah 6 โ€“ Buat config.php

  1. File Manager โ†’ klik kanan config.example.php โ†’ Copy โ†’ nama baru config.php (di folder yang sama).
  2. Klik kanan config.php โ†’ Edit (abaikan peringatan encoding โ†’ Edit).
  3. Ubah baris berikut sesuai catatan Langkah 3 (tanda kutip tunggal jangan dihapus):
define('DB_HOST', 'localhost');
define('DB_NAME', 'akunanda_monitorpic');   // nama database LENGKAP
define('DB_USER', 'akunanda_app');          // nama user LENGKAP
define('DB_PASS', 'password-dari-langkah-3');

define('VERIFY_SSL', true);                 // biarkan true
  1. Baris WhatsApp/Email diisi di Langkah 11 dan 12; sekarang biarkan. Klik Save Changes.
  2. Klik kanan config.php โ†’ Change Permissions โ†’ set 640 (Owner: baca+tulis; Group: baca; World: kosong) โ†’ Save. Bila nanti muncul error "tidak bisa membaca config", ubah ke 644.
Jika di Langkah 8 koneksi gagal dengan kode 2002, ganti DB_HOST dengan nilai dari halaman MySQL hosting Anda (sebagian hosting memakai nama server khusus, bukan localhost).

Langkah 7 โ€“ Izin folder

  1. Pastikan folder uploads, logs dapat ditulis: klik kanan folder โ†’ Change Permissions โ†’ 755 (bila nanti unggah dokumen gagal, ubah ke 775).
  2. Folder backups dibuat otomatis oleh aplikasi saat backup pertama. Bila gagal, buat folder baru bernama backups dan beri izin 755.
  3. Pastikan berkas .htaccess ada di folder utama dan di dalam uploads, logs, inc, tests, tools, migrations, docs. Berkas ini menolak akses web ke folder-folder internal tersebut.
โœ… Folder uploads dan logs berizin 755/775 dan masing-masing berisi .htaccess.

Langkah 8 โ€“ Jalankan pemeriksa otomatis (cek_hosting.php)

Berkas cek_hosting.php memeriksa PHP, ekstensi, config, folder, database, password bawaan, cron, dan HTTPS, dan memberi tahu apa yang perlu diperbaiki. Ia tidak mengubah data dan tidak menampilkan password.

  1. Edit config.php lagi dan tambahkan satu baris di paling bawah (ganti isinya dengan kata acak panjang buatan Anda, minimal 16 karakter):
define('SETUP_KEY', 'ganti-dengan-kata-acak-panjang-anda');
  1. Buka di browser: https://monitor.perusahaan.com/cek_hosting.php?k=ganti-dengan-kata-acak-panjang-anda
  2. Baca hasilnya. Arti penanda: [OK] baik ยท [GAGAL] harus diperbaiki ยท [PERIKSA] sebaiknya diperbaiki ยท [info] keterangan saja.
  3. Perbaiki setiap [GAGAL] sesuai petunjuk di sebelahnya, lalu muat ulang halaman sampai tidak ada [GAGAL]. Pada tahap ini wajar bila masih ada: "Password bawaan โ€ฆ admin" (diselesaikan di Langkah 9) dan "Cron belum pernah berjalan" (diselesaikan di Langkah 10).
  4. Setelah seluruh pemasangan selesai (Langkah 14), hapus baris SETUP_KEY dari config.php dan hapus berkas cek_hosting.php dari server.
Tanpa SETUP_KEY halaman ini menolak semua akses (403). Jangan biarkan SETUP_KEY dan cek_hosting.php terpasang selamanya.

Langkah 9 โ€“ Login pertama dan ganti password admin (WAJIB)

  1. Buka https://monitor.perusahaan.com/ โ†’ login admin / admin123.
  2. Segera klik nama akun (kanan atas) โ†’ Profil Saya โ†’ ganti password dengan yang kuat (โ‰ฅ 10 karakter, campuran huruf besar/kecil, angka, simbol; jangan memakai nama perusahaan). Isi juga No. WA (format 6281234567890, tanpa + dan tanpa 0 di depan) dan Email Anda โ†’ Simpan.
  3. Muat ulang cek_hosting.php?k=โ€ฆ; baris "Password bawaan/mudah ditebak" harus berubah menjadi [OK].
  4. Menu Administrasi โ†’ Parameter Sistem: isi nama aplikasi, kriteria password, jam bantuan, unit/kategori (Master), lalu buat akun PIC di Administrasi โ†’ Pengguna โ†’ Tambah (isi No. WA & Email asli, level pegawai, unit tanggung jawab).
Selama password masih admin123, siapa pun yang tahu alamat situs dapat masuk sebagai Admin. Kerjakan langkah ini segera setelah situs bisa dibuka.

Langkah 10 โ€“ Cron Job (pengganti Windows Task Scheduler)

cron.php harus dijalankan tiap 15 menit. Ia mengirim reminder terjadwal, memproses antrean notifikasi, pengingat persetujuan, ringkasan terjadwal, dan backup.

  1. cPanel โ†’ Cron Jobs. Bagian Add New Cron Job โ†’ Common Settings: pilih Once Per Fifteen Minutes (*/15 * * * *) (bila tidak ada, isi menit */15 dan kolom lain *).
  2. Kolom Command, isi (sesuaikan akunanda dan folder Document Root dari Langkah 2):
/usr/local/bin/php /home/akunanda/monitor.perusahaan.com/cron.php >/dev/null 2>&1
  1. Klik Add New Cron Job.
  2. Jika cron tidak jalan karena jalur PHP berbeda, lihat jalur yang disarankan hosting (sering /usr/local/bin/php, /opt/cpanel/ea-php81/root/usr/bin/php, atau php saja). Tanyakan support: "perintah cron untuk menjalankan PHP 8.1 CLI".
  3. Tunggu 15โ€“30 menit, lalu buka Admin โ†’ Kesehatan Sistem di aplikasi. Baris cron harus hijau (terakhir < 30 menit).
Tes cepat: tambahkan sementara cron * * * * * (tiap menit), tunggu 2 menit, cek Kesehatan Sistem, lalu ubah kembali ke tiap 15 menit.
โœ… Kesehatan Sistem menampilkan "cron" hijau dan logs/cron.log terisi.

Langkah 11 โ€“ WhatsApp lewat Fonnte

  1. Buka fonnte.com โ†’ daftar โ†’ login. Menu Device โ†’ Add Device โ†’ isi nomor WhatsApp pengirim (disarankan nomor khusus kantor).
  2. Di HP: WhatsApp โ†’ Perangkat tertaut โ†’ Tautkan perangkat โ†’ scan QR di Fonnte. Status device harus Connected.
  3. Salin Token device.
  4. Edit config.php:
define('WA_PROVIDER', 'fonnte');
define('FONNTE_TOKEN', 'tempel-token-di-sini');
define('WA_TEST_NUMBER', '6281234567890');   // sementara: semua pesan dialihkan ke nomor Anda sendiri
  1. Di aplikasi: Reminder โ†’ Jadwal & Template โ†’ Koneksi WhatsApp & Email โ†’ klik Tes kirim WA ke saya.
  2. Bila pesan tes sudah masuk dan isinya benar, kosongkan WA_TEST_NUMBER ('') agar pesan terkirim ke PIC sebenarnya.
Selama WA_TEST_NUMBER terisi, semua pesan dialihkan ke nomor itu dan PIC tidak menerima apa pun. Itu disengaja untuk uji coba; jangan lupa dikosongkan saat produksi. Harga/kuota Fonnte dapat berubah, cek di situs mereka.

Langkah 12 โ€“ Email (opsional)

Dua pilihan: akun email dari hosting Anda, atau Gmail dengan App Password.

  1. Email hosting: cPanel โ†’ Email Accounts โ†’ buat noreply@perusahaan.com. Lalu pada akun itu klik Connect Devices untuk melihat server SMTP (biasanya mail.perusahaan.com, port 465 SSL atau 587).
  2. Gmail: akun Google โ†’ Keamanan โ†’ aktifkan Verifikasi 2 langkah โ†’ myaccount.google.com/apppasswords โ†’ buat App Password (16 karakter, tanpa spasi). Server smtp.gmail.com port 587.
  3. Edit config.php:
define('SMTP_HOST', 'mail.perusahaan.com');
define('SMTP_PORT', 587);
define('SMTP_USER', 'noreply@perusahaan.com');
define('SMTP_PASS', 'password-email');
define('SMTP_FROM_NAME', 'MonitorPIC');
define('EMAIL_TEST_ADDRESS', 'emailanda@gmail.com');   // sementara, kosongkan saat produksi
  1. Aplikasi โ†’ Tes kirim Email ke saya. Cek juga folder Spam. Bila gagal: coba port 465 atau 587 bergantian dan pastikan SMTP_USER lengkap berbentuk alamat email.

Langkah 13 โ€“ Pemeriksaan keamanan (WAJIB)

Buka alamat-alamat berikut di browser (jendela Incognito). Hasil yang benar tertulis di kolom kanan.

AlamatHasil yang benar
/config.phpHalaman kosong atau 403. Tidak boleh menampilkan teks kode.
/database_hosting.sql dan /database.sql403 Forbidden (atau 404). Tidak boleh terunduh.
/backups/ dan /logs/cron.log403 / 404.
/uploads/403 / 404 (dokumen tiket diunduh lewat aplikasi, bukan alamat langsung).
/inc/lib.php, /tests/, /tools/, /migrations/403 / 404.
/lib.php, /cron.php, /migrate.php403 (atau pesan "CLI only").
http://monitor.perusahaan.com (tanpa s)Otomatis pindah ke https://.

Langkah 14 โ€“ Backup otomatis

  1. Admin โ†’ Parameter โ†’ Sistem โ†’ Backup Database Otomatis: aktifkan, jam 02:00, simpan 7 berkas โ†’ Simpan.
  2. Klik Backup sekarang. Harus muncul berkas monitorpic_AAAAMMDD_JJMMDD.sql.gz di daftar.
  3. Unduh satu berkas dari kartu itu dan simpan di tempat lain (komputer kantor/Google Drive). Ulangi minimal tiap minggu. Backup yang hanya ada di server hosting tidak menyelamatkan Anda bila akun hosting bermasalah.
  4. Backup tidak mencakup folder uploads/ (dokumen tiket). Unduh folder itu lewat File Manager (Compress โ†’ Download) sesekali.
  5. Sekarang hapus baris SETUP_KEY dari config.php dan hapus cek_hosting.php dari server. Hapus juga database_hosting.sql dari server (sudah ada di komputer Anda).

Cara memulihkan dari backup ada di docs/BACKUP.md (impor lewat phpMyAdmin pada database kosong atau database yang sama).

Langkah 15 โ€“ Memperbarui ke versi baru nanti

  1. Backup dulu (Langkah 14: Backup sekarang โ†’ unduh).
  2. Unggah ZIP versi baru dan ekstrak menimpa berkas lama. Jangan menimpa / hapus config.php, folder uploads/, backups/, logs/ (ZIP resmi memang tidak menyertakan config.php).
  3. Jangan impor ulang database_hosting.sql (itu menghapus semua data). Terapkan migrasi saja: bila hosting punya Terminal (cPanel โ†’ Terminal): cd ~/monitor.perusahaan.com && php migrate.php. Bila tidak ada Terminal: buat cron sekali jalan dengan perintah /usr/local/bin/php /home/akunanda/monitor.perusahaan.com/migrate.php >> /home/akunanda/monitor.perusahaan.com/logs/migrate.log 2>&1 di menit terdekat, tunggu, baca logs/migrate.log (harus ada "Tidak ada migrasi baru" atau daftar migrasi terapan), lalu hapus cron itu.
  4. Muat ulang aplikasi dengan Ctrl+F5 (agar JavaScript/CSS baru terpakai), lalu cek Admin โ†’ Kesehatan Sistem.

Langkah 16 โ€“ Bila ada masalah

GejalaPenyebab umum โ†’ perbaikan
Muncul "File config.php belum ada"Langkah 6 belum dikerjakan, atau nama salah (config.php, bukan config.example.php/config.php.txt).
Layar putih / "500 Internal Server Error"Buka cPanel โ†’ Errors atau berkas error_log di Document Root. Penyebab umum: PHP < 8.0 (Langkah 1), ekstensi belum aktif, salah ketik di config.php (tanda kutip/titik koma), atau .htaccess memuat perintah yang tidak diizinkan hosting (ganti nama sementara menjadi .htaccess.off untuk menguji, lalu hubungi support).
Login gagal "koneksi database"Jalankan cek_hosting.php: kode 1045 = user/password salah; 1044 = user belum ditambahkan ke database; 1049 = nama database salah; 2002 = DB_HOST salah.
Impor phpMyAdmin gagal / timeoutPastikan memakai database_hosting.sql (bukan database.sql). Bila "file terlalu besar" (jarang, berkas ยฑ20 KB), minta support menaikkan upload_max_filesize.
Halaman terbuka tapi tampilan berantakan / tombol tidak berfungsiCache lama: Ctrl+F5. Pastikan folder assets ikut terunggah lengkap (ada assets/css dan assets/js).
Dokumen tiket tidak bisa diunggahFolder uploads tidak bisa ditulis: izin 755 โ†’ 775. Periksa juga batas upload_max_filesize di Select PHP Version โ†’ Options.
Reminder tidak terkirim otomatisKesehatan Sistem: cron hijau? Jam tenang aktif? Frekuensi/hari/jam di Reminder โ†’ Jadwal sudah benar? WA_TEST_NUMBER masih terisi? Lihat Reminder โ†’ Riwayat dan logs/cron.log.
Jam pada pesan/laporan selisihZona waktu bawaan Asia/Jakarta diatur config.php. Pastikan baris date_default_timezone_set('Asia/Jakarta'); ada di bagian atas config.php (ada pada config.example.php).
Backup gagal "folder tidak dapat ditulis"Buat folder backups manual dan izin 755/775.
Saya lupa password adminphpMyAdmin โ†’ tabel users โ†’ ubah baris admin; atau gunakan fitur "Lupa password" (OTP WhatsApp) bila Fonnte aktif dan nomor WA admin terisi. Hubungi pengembang bila perlu menyetel ulang hash.

Ringkasan daftar centang

  1. โ˜ PHP 8.1+, ekstensi aktif, Cron Jobs tersedia
  2. โ˜ HTTPS aktif dan dipaksa
  3. โ˜ Database + user dibuat, ALL PRIVILEGES
  4. โ˜ Berkas diunggah ke Document Root, .htaccess ada
  5. โ˜ database_hosting.sql diimpor
  6. โ˜ config.php diisi, izin 640
  7. โ˜ cek_hosting.php tanpa [GAGAL]
  8. โ˜ Password admin diganti
  9. โ˜ Cron 15 menit hijau di Kesehatan Sistem
  10. โ˜ WA/Email diuji, lalu WA_TEST_NUMBER/EMAIL_TEST_ADDRESS dikosongkan
  11. โ˜ Tabel keamanan Langkah 13 lulus
  12. โ˜ Backup berjalan + salinan di luar hosting
  13. โ˜ SETUP_KEY, cek_hosting.php, database_hosting.sql dihapus dari server
Panduan ini ditulis tanpa dapat mencoba di hosting nyata Anda. Bila ada langkah yang berbeda di penyedia Anda, kirimkan nama penyedia dan tangkapan layar pesan galatnya; langkahnya akan disesuaikan.