Deploy aplikasi CodeIgniter 4 (CI4) ke shared hosting (seperti Hostinger, Niagahoster, dll) seringkali membingungkan bagi pemula. Hal ini karena struktur folder CI4 (public, app, system) berbeda dengan struktur standar cPanel/hPanel yang mengharapkan semua file ada di dalam public_html.

Banyak orang melakukan kesalahan dengan menaruh semua file project di dalam public_html. Meskipun bisa jalan, cara ini tidak aman karena file sistem dan .env Anda terekspos ke publik.

Di artikel ini, saya akan membagikan cara deploy yang benar, aman, dan solusi untuk masalah umum saat upload file.

Persiapan: Struktur Folder yang Aman

Konsep kuncinya adalah: Pisahkan file publik dan file sistem.

  1. File yang boleh diakses publik (index.php, CSS, JS, Gambar) $\rightarrow$ Masuk ke public_html.
  2. File sistem (App, System, Writable, .env) $\rightarrow$ Masuk ke folder di luar public_html (kita sebut saja folder release atau ci4_core).

Langkah 1: Persiapan File Lokal

Sebelum upload, siapkan file di komputer Anda:

  1. Export Database: Ekspor database lokal Anda ke file .sql.
  2. Edit Konfigurasi: Pastikan app/Config/App.php atau .env siap untuk disesuaikan nanti.
  3. Compress Project: Zip seluruh folder project CI4 Anda. Ini mempercepat proses upload.

Langkah 2: Upload dan Ekstrak

  1. Login ke panel hosting (hPanel/cPanel).
  2. Buka File Manager.
  3. Upload file .zip project Anda ke direktori Root (sejajar dengan public_html, bukan di dalamnya).
  4. Ekstrak file tersebut. Rename foldernya menjadi release (atau nama lain yang Anda suka).

Struktur direktori Anda sekarang harus terlihat seperti ini:

/
├── domains/
│   └── [nama-domain-anda.com/](https://nama-domain-anda.com/)
│       ├── public_html/      <-- Folder Web Root
│       └── release/          <-- Folder Project CI4 Anda
│           ├── app/
│           ├── system/
│           ├── writable/
│           ├── public/       <-- (Isinya akan kita pindah)
│           └── .env

Langkah 3: Pindahkan File Publik

Masuk ke folder release/public/, pilih semua isinya (index.php, .htaccess, folder assets, dll), lalu Move (Pindahkan) semuanya ke dalam folder public_html.

Sekarang folder release/public/ sudah kosong dan bisa dihapus.

Langkah 4: Menyesuaikan index.php

Karena kita memisahkan file index.php dari file sistemnya, kita perlu memberitahu aplikasi di mana letak file Paths.php.

Buka file public_html/index.php, cari bagian require FCPATH dan ubah path-nya mengarah ke folder release:

// public_html/index.php

// Ubah baris ini:
// require FCPATH . '../app/Config/Paths.php';

// Menjadi seperti ini (sesuaikan 'release' dengan nama folder Anda):
require FCPATH . '../release/app/Config/Paths.php';

Langkah 5: Konfigurasi Database

  1. Buat Database MySQL baru di panel hosting. Catat nama database, user, dan password.
  2. Import file .sql Anda via phpMyAdmin.
  3. Di File Manager, buka file release/.env (jika belum ada, rename env menjadi .env).
  4. Sesuaikan konfigurasinya :
CI_ENVIRONMENT = production
app.baseURL = '[https://nama-domain-anda.com/](https://nama-domain-anda.com/)'

database.default.hostname = localhost (atau sesuaikan dengan IP db hosting)
database.default.database = nama_db_hosting
database.default.username = user_db_hosting
database.default.password = password_db_hosting
database.default.DBDriver = MySQLi

Masalah Umum: Gagal Upload Gambar (Permission & Path)

Salah satu masalah paling sering terjadi setelah deploy adalah fitur upload gambar (dari admin dashboard) gagal berfungsi. Biasanya penyebabnya ada dua: Folder Permission atau Salah Path.

  1. Perbaiki Folder Permission

    Folder tempat menyimpan file upload (misalnya public_html/uploads) harus memiliki izin tulis (write permission).

    • Di File Manager, klik kanan folder tujuan upload.
    • Pilih Permissions.
    • Ubah menjadi 755.
  2. Gunakan FCPATH, Bukan ROOTPATH

    Ini adalah kesalahan yang sering saya alami. Saat di lokal, mungkin kita menggunakan ROOTPATH. Namun dengan struktur hosting yang terpisah seperti di atas, ROOTPATH menunjuk ke folder release, sedangkan folder upload kita ada di public_html.

    Gunakan konstanta FCPATH yang secara otomatis menunjuk ke public_html.

    Kode Controller yang Salah (Jangan dipakai):

    // Ini akan gagal karena mencari folder di dalam 'release'
    $file->move(ROOTPATH . 'public/uploads', $fileName);
    

    Kode Controller yang Benar:

    // Gunakan FCPATH untuk menunjuk ke public_html
    $path = FCPATH . 'uploads/elearning/';
    
    if ($file->isValid() && ! $file->hasMoved()) {
       $file->move($path, $fileName);
    }
    

    Pastikan Anda juga menggunakan path yang sama saat melakukan pengecekan file (file_exists) atau menghapus file (unlink).

Kesimpulan

Dengan memisahkan folder public dan sistem, website CodeIgniter 4 Anda jauh lebih aman dari serangan langsung terhadap file konfigurasi. Meskipun langkahnya sedikit lebih panjang daripada sekadar “upload semua”, keamanan jangka panjang website Anda sangat berharga.

Selamat mencoba!