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.
- File yang boleh diakses publik (index.php, CSS, JS, Gambar) $\rightarrow$ Masuk ke
public_html. - File sistem (App, System, Writable, .env) $\rightarrow$ Masuk ke folder di luar
public_html(kita sebut saja folderreleaseatauci4_core).
Langkah 1: Persiapan File Lokal
Sebelum upload, siapkan file di komputer Anda:
- Export Database: Ekspor database lokal Anda ke file
.sql. - Edit Konfigurasi: Pastikan
app/Config/App.phpatau.envsiap untuk disesuaikan nanti. - Compress Project: Zip seluruh folder project CI4 Anda. Ini mempercepat proses upload.
Langkah 2: Upload dan Ekstrak
- Login ke panel hosting (hPanel/cPanel).
- Buka File Manager.
- Upload file
.zipproject Anda ke direktori Root (sejajar denganpublic_html, bukan di dalamnya). - 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
- Buat Database MySQL baru di panel hosting. Catat nama database, user, dan password.
- Import file
.sqlAnda via phpMyAdmin. - Di File Manager, buka file
release/.env(jika belum ada, renameenvmenjadi.env). - 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.
-
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.
-
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,
ROOTPATHmenunjuk ke folderrelease, sedangkan folder upload kita ada dipublic_html.Gunakan konstanta
FCPATHyang secara otomatis menunjuk kepublic_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!