Personal Notes Parmi

MyUnlimitedhost MySoftware Hosting

Q: saya baru saya membeli ( lagi ) sebuah hosting baru untuk keperluan belajar dan laboratorium/test. Ada saran dan sebagainya untuk memeriksa hal-hal seperlunya. Misalnya melalui perintah terminal atatau ada cara lain ?

A: Selamat atas hosting barunya! Berikut beberapa hal penting yang perlu diperiksa setelah membeli hosting baru.

1. Informasi Server Dasar

# Cek OS dan versi kernel
uname -a
cat /etc/os-release

# Cek uptime dan load
uptime

# Cek hostname
hostname -f

2. Resource & Hardware

# RAM
free -h

# CPU info
nproc
cat /proc/cpuinfo | grep "model name" | head -1

# Disk usage dan partisi
df -h
lsblk

3. Jaringan

# IP publik
curl ifconfig.me
# atau
curl ipinfo.io

# Interface jaringan
ip addr show

# Cek koneksi & latency
ping -c 4 google.com

# Port yang sedang terbuka/listening
ss -tulpn
# atau
netstat -tulpn

4. Web Server (kalau ada)

# Cek Apache
apache2 -v
systemctl status apache2

# Cek Nginx
nginx -v
systemctl status nginx

# Cek PHP
php -v

# Cek MySQL/MariaDB
mysql --version
systemctl status mysql

5. Keamanan Awal

# Cek user yang ada
cat /etc/passwd | grep -v nologin

# Cek SSH config
cat /etc/ssh/sshd_config | grep -E "Port|PermitRootLogin|PasswordAuth"

# Cek firewall (UFW)
ufw status verbose

# Cek firewall (iptables)
iptables -L -n

6. Update & Patch

# Debian/Ubuntu
apt update && apt list --upgradable

# CentOS/RHEL/AlmaLinux
yum check-update
# atau
dnf check-update

7. Cek via Panel (Non-Terminal)

Kalau hosting kamu pakai control panel, bisa cek lewat UI: - cPanel → Resource Usage, MySQL DB, File Manager - Plesk → Dashboard overview - DirectAdmin → System Info - Webmin → System → System Information


Checklist Prioritas Awal

Prioritas Item
🔴 Wajib Ganti password root/SSH
🔴 Wajib Aktifkan firewall (UFW)
🔴 Wajib Update semua package
🟡 Penting Nonaktifkan root login SSH
🟡 Penting Setup SSH key-based auth
🟢 Opsional Install monitoring (htop, netdata)

Hosting kamu pakai OS apa dan jenis apa (VPS, shared, dedicated)? Bisa saya bantu lebih spesifik sesuai setup-nya.

Q: shared hosting

jadi memang terkunci root, menggunakan cpanel, sepertinya cukup lengkap

hasil cek di terminal :

nproc cat /proc/cpuinfo | grep "model name" | head -1 12 model name : Intel(R) Xeon(R) E-2236 CPU @ 3.40GHz

A: Server ini spesifiknya sangat bagus untuk shared hosting! Berikut analisisnya:

Penilaian Keseluruhan: 🟢 Excellent

RAM — 🟢 Luar Biasa

Total: 62GB | Used: 44GB | Available: 17GB
  • 62GB RAM di shared hosting itu sangat besar — kebanyakan shared hosting hanya 8–16GB total
  • 17GB masih available, artinya server tidak overloaded
  • Tidak ada Swap — ini tanda server cukup RAM, tidak perlu swap sama sekali

PHP — 🟢 Sangat Lengkap

  • Default: PHP 8.3.27 — versi modern dan up-to-date
  • Tersedia 12 versi PHP sekaligus (5.6 sampai 8.5!)
  • Ada ionCube dan SourceGuardian — bisa jalankan script ter-enkripsi/ter-encode
  • Bisa ganti versi per-domain via cPanel MultiPHP Manager

Git — 🟢 Bagus

  • Git 2.48.2 — ini versi terbaru (released Feb 2025), sangat fresh

ulimit — 🟡 Perlu Diperhatikan

Parameter Nilai Keterangan
open files 65,535 ✅ Besar, bagus untuk web apps
max user processes 254,851 ✅ Sangat longgar
stack size 8MB ✅ Normal
core dump 0 ✅ Dinonaktifkan (aman)
virtual memory unlimited ✅ Tidak dibatasi
cpu time unlimited ✅ Tidak ada throttle CPU

Secara keseluruhan ulimit-nya sangat longgar untuk shared hosting — biasanya shared hosting lebih ketat.


Yang Perlu Dicatat

# python3 tidak tersedia — kalau butuh, cek alternatif
which python        # mungkin ada Python 2
ls ~/virtualenv/    # cPanel kadang sediakan Python via virtualenv

Untuk lab/testing, Python bisa di-setup manual via cPanel "Setup Python App" kalau tersedia.


Kesimpulan

Ini bukan shared hosting "biasa" — kemungkinan besar ini high-end shared / reseller hosting di server yang sangat powerful. Untuk keperluan belajar dan lab, resource-nya lebih dari cukup.

Langkah selanjutnya yang disarankan: 1. Buat subdomain untuk isolasi tiap project lab 2. Set PHP version per subdomain sesuai kebutuhan 3. Cek apakah ada akses Composer dan Node.js

Mau dicek Composer dan Node.js-nya juga?

Q:

A: Jalankan perintah ini:

# Composer
composer --version
which composer

# Node.js & NPM
node --version
npm --version
which node

# Alternatif node via NVM (sering dipakai di cPanel)
nvm --version
ls ~/.nvm/versions/node/ 2>/dev/null

# Python alternatif
which python
python --version 2>&1

# Bonus: cek tools development lainnya
which composer
which ruby
ruby --version 2>/dev/null
go version 2>/dev/null

Paste hasilnya di sini ya — kita lihat seberapa lengkap toolchain-nya!

Q: sepertinya tidak aktif atau tidak ada :

Composer

composer --version which composer

Node.js & NPM

node --version npm --version which node

Alternatif node via NVM (sering dipakai di cPanel)

nvm --version ls ~/.nvm/versions/node/ 2>/dev/null

Python alternatif

which python python --version 2>&1

Bonus: cek tools development lainnya

which composer which ruby ruby --version 2>/dev/null go version 2>/dev/null bash: composer: command not found /usr/bin/which: no composer in (/home/anekakeb/.local/bin:/home/anekakeb/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/root/.local/bin:/root/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/share/Modules/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) bash: node: command not found bash: npm: command not found /usr/bin/which: no node in (/home/anekakeb/.local/bin:/home/anekakeb/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/root/.local/bin:/root/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/share/Modules/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) bash: nvm: command not found /usr/bin/which: no python in (/home/anekakeb/.local/bin:/home/anekakeb/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/root/.local/bin:/root/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/share/Modules/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) bash: python: command not found /usr/bin/which: no composer in (/home/anekakeb/.local/bin:/home/anekakeb/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/root/.local/bin:/root/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/share/Modules/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) /usr/bin/ruby ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]

A: Ruby ada! Dan yang lainnya bisa di-install manual. Berikut ringkasannya:

Status Toolchain

Tool Status Keterangan
PHP 8.3 ✅ Ada Default, lengkap
Git 2.48 ✅ Ada Versi terbaru
Ruby 3.0.7 ✅ Ada Cukup fresh
Composer ❌ Tidak ada Perlu install manual
Node.js / NPM ❌ Tidak ada Perlu install manual
Python ❌ Tidak ada Via cPanel app

Solusi Install Manual (tanpa root)

1. Composer — paling mudah

# Download dan install ke ~/bin
mkdir -p ~/bin
cd ~
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=$HOME/bin --filename=composer
php -r "unlink('composer-setup.php');"

# Test
composer --version

2. Node.js via NVM — cara terbaik tanpa root

# Install NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# Reload shell
source ~/.bashrc

# Install Node versi LTS
nvm install --lts
nvm use --lts

# Test
node --version
npm --version

3. Python via cPanel UI

Di cPanel cari menu "Setup Python App" atau "Python Selector" → buat virtual environment per project.


Tambahkan ke PATH (supaya permanen)

Edit ~/.bashrc:

echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

Coba install Composer dulu — paling simpel dan sering dibutuhkan untuk PHP projects. Mau dicoba?

Q: Wah, lengkap sekali! Ada Setup Node.js App dan Setup Python App langsung dari cPanel. Ini lebih mudah dan lebih stabil daripada install manual via terminal.

Yang Tersedia di cPanel-mu

Menu Fungsi
Setup Node.js App Buat environment Node.js per-domain/subdomain
Setup Python App Buat virtualenv Python per-domain/subdomain
MultiPHP Manager Ganti versi PHP per domain
MultiPHP INI Editor Edit php.ini per domain
Select PHP Version Pilih PHP + aktifkan/nonaktifkan extension
Application Manager Kelola app yang sudah dibuat
Softaculous 1-click install WordPress, Laravel, dll
PHP PEAR Packages Install PHP library via PEAR

Rekomendasi untuk Lab/Testing

Langkah yang disarankan:

1. Setup Node.js App — klik menu tersebut, cek versi Node.js apa saja yang tersedia (biasanya ada pilihan 18, 20, 22 LTS)

2. Setup Python App — sama, cek versi Python yang tersedia (biasanya 3.9–3.12)

3. MultiPHP Manager — assign versi PHP berbeda per subdomain, contoh:

lab-laravel.domain.com  → PHP 8.3
lab-legacy.domain.com   → PHP 7.4
lab-node.domain.com     → Node.js app

4. Composer — tetap perlu install manual via terminal seperti tadi, karena cPanel tidak menyediakannya langsung


Saran Struktur Lab

Buat subdomain terpisah untuk tiap eksperimen supaya tidak saling ganggu:

laravel.domain.com
node.domain.com
python.domain.com
test.domain.com

Mau mulai dari mana — Node.js, Python, atau Composer dulu?

A: Bagus, langkah yang tepat! Subdomain itu cara paling rapi untuk isolasi tiap project lab.

Cara Buat Subdomain di cPanel

  1. Login cPanel → cari menu "Domains" atau "Subdomains"
  2. Ketik nama subdomain, pilih domain utama
  3. Document root akan otomatis terisi, bisa dibiarkan default
  4. Klik Create

Saran Nama Subdomain untuk Lab

laravel.domain.com      → project PHP/Laravel
node.domain.com         → Node.js experiments  
python.domain.com       → Python/Flask/Django
test.domain.com         → umum / sandbox
dev.domain.com          → development aktif
api.domain.com          → REST API testing

Sesuaikan dengan rencana belajar kamu — tidak perlu buat semua sekaligus, buat sesuai kebutuhan saja.


Tips

  • Document root tiap subdomain terpisah, jadi file tidak tercampur
  • Bisa assign PHP version berbeda per subdomain via MultiPHP Manager setelah subdomain dibuat
  • Subdomain bisa dihapus kapan saja kalau sudah tidak dipakai

Sambil buat subdomain, install Composer dulu via terminal — itu yang paling sering dibutuhkan pertama kali untuk PHP projects:

mkdir -p ~/bin
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=$HOME/bin --filename=composer
php -r "unlink('composer-setup.php');"
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
composer --version

Kabari kalau subdomain sudah jadi — kita lanjut setup berikutnya! 🚀

A: Tidak perlu pindah folder! Composer di-install global ke ~/bin — jadi bisa dipakai dari subdomain/folder mana saja.

Analoginya:

~/bin/composer          ← install sekali di sini
    ↓ bisa dipanggil dari mana saja
~/public_html/          ✅
~/laravel.domain.com/   ✅
~/node.domain.com/      ✅
~/test.domain.com/      ✅

Langsung jalankan saja dari posisi folder manapun kamu berada sekarang, semua perintah ini aman dieksekusi berurutan:

mkdir -p ~/bin
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=$HOME/bin --filename=composer
php -r "unlink('composer-setup.php');"
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
composer --version

Setelah selesai, cek hasilnya dengan composer --version — kalau muncul versi, berarti sukses dan siap dipakai di seluruh project! 🎯

Q: hasil :

mkdir -p ~/bin php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php composer-setup.php --install-dir=$HOME/bin --filename=composer php -r "unlink('composer-setup.php');" echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc source ~/.bashrc composer --version All settings correct for using Composer Downloading... Composer (version 2.9.7) successfully installed to: /home/anekakeb/bin/composer Use it: php /home/anekakeb/bin/composer Composer version 2.9.7 2026-04-14 13:31:52 PHP version 8.3.27 (/opt/alt/php83/usr/bin/php) Run the "diagnose" command to get more detailed diagnostics output.

A: Composer berhasil! 🎉

Hasil Instalasi

Item Detail
Composer v2.9.7 (April 2026 — terbaru!)
PHP 8.3.27
Lokasi /home/anekakeb/bin/composer

Sekarang Toolchain Kamu

Tool Status Versi
PHP 8.3.27
Git 2.48.2
Composer 2.9.7
Ruby 3.0.7
Node.js Via cPanel
Python Via cPanel

Langkah Selanjutnya

Sekarang sudah bisa langsung buat project Laravel misalnya:

cd ~/laravel.domain.com/public_html
composer create-project laravel/laravel .

Atau setup Node.js via cPanel dulu kalau mau eksplorasi ke sana.

Mau lanjut ke mana — coba Laravel, atau setup Node.js/Python via cPanel dulu?

Q: saya akan coba setup Node.js via cpanel dulu, sambil di pandu, saya coba periksa dan buka

A: Klik "Create Application" — setelah terbuka, ceritakan atau screenshot form yang muncul.

Biasanya ada field seperti: - Node.js version — pilihan versi yang tersedia - Application mode — Development / Production - Application root — folder project - Application URL — subdomain yang dipakai - Application startup file — biasanya app.js atau server.js

Isi dulu bagian Node.js version — versi apa saja yang tersedia di dropdown-nya? 👀

Q: A: Terlihat formnya. Satu catatan dulu — Node.js 10.24.1 itu sudah sangat lama (EOL 2021). Cek dulu apakah ada versi lebih baru di dropdown.

Klik dropdown "10.24.1" — versi apa saja yang muncul?

Idealnya pilih yang 18.x atau 20.x (LTS) untuk lab/testing. Kalau tersedia, kita isi form dengan benar setelahnya. 👀

A: Bagus! Pilih 22.x LTS (bukan 24 yang bleeding edge) untuk lab — lebih stabil.

Cari di dropdown versi 22.x terbaru yang tersedia, biasanya 22.16.x atau sejenisnya.


Setelah pilih versi, isi form seperti ini:

Field Isi
Node.js version 22.x.x (LTS)
Application mode Development
Application root node.anekakebutuhan.com
Application URL pilih domain → isi subdomain node
Application startup file app.js

Application root diisi nama folder — sebaiknya sama dengan subdomain yang sudah kamu buat tadi. Ini folder di mana file Node.js project akan disimpan.


Isi dulu, lalu scroll ke bawah — jangan klik Create dulu, kabari kalau sudah terisi semua! 👀

A: Perfect! 22.18.0 itu versi LTS terbaru di branch 22 — pilihan terbaik! ✅

Pilih Development untuk mode-nya (sudah benar).


Sekarang tutup dropdown itu, lalu isi:

Field Isi
Application root node.anekakebutuhan.com
Application URL pilih anekakebutuhan.com → ketik node di kotak sebelahnya
Application startup file app.js

Environment variable dikosongkan dulu, tidak perlu diisi sekarang.

Setelah semua terisi, screenshot dulu sebelum klik Create — kita cek bersama! 👀

A: Sempurna! Semua sudah terisi dengan benar! ✅

Field Nilai Status
Node.js version 22.18.0
Application mode Development
Application root node.anekakebutuhan.com
Application URL node.anekakebutuhan.com
Application startup file app.js

Sekarang scroll ke bawah dan klik tombol "Create"!

Tunggu beberapa detik sampai proses selesai, lalu kabari hasilnya — biasanya langsung redirect ke halaman detail aplikasi yang baru dibuat. 👀

A: Node.js app berhasil dibuat dan langsung RUNNING! 🎉

Status

Item Status
App status ✅ Running (ada tombol STOP/RESTART)
Node.js ✅ 22.18.0
URL node.anekakebutuhan.com (ada tombol OPEN)
NPM Install ⏳ Belum dijalankan

Langkah Selanjutnya

1. Buat file app.js dulu via terminal:

cd ~/node.anekakebutuhan.com
cat > app.js << 'EOF'
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello dari Node.js 22! Server berjalan normal.');
});

server.listen(3000, () => {
  console.log('Server running...');
});
EOF

2. Kembali ke cPanel, klik RESTART

3. Klik tombol OPEN — cek apakah muncul pesan di browser


Coba buat file app.js dulu, kabari hasilnya! 👀

A: Ada info penting di banner biru! cPanel memberikan perintah untuk masuk ke virtual environment Node.js:

source /home/anakekeb/nodevenv/node.anekakebutuhan.com/22/bin/activate && cd /home/anekakeb/node.anekakebutuhan.com

Jalankan perintah itu di terminal, lalu buat file app.js:

# 1. Aktifkan virtual environment Node.js
source /home/anekakeb/nodevenv/node.anekakebutuhan.com/22/bin/activate && cd /home/anekakeb/node.anekakebutuhan.com

# 2. Cek node & npm sudah aktif
node --version
npm --version

# 3. Buat file app.js
cat > app.js << 'EOF'
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello dari Node.js 22! Server berjalan normal.');
});

server.listen(3000, () => {
  console.log('Server running...');
});
EOF

Setelah itu kembali ke cPanel dan klik RESTART, lalu klik OPEN.

Coba jalankan dulu perintah pertama — kabari hasilnya! 👀

A: 🎉 BERHASIL! Node.js 22 sudah berjalan sempurna!


Recap Progress Hari Ini

Tool Status
PHP 8.3.27
Git 2.48.2
Composer 2.9.7
Ruby 3.0.7
Node.js 22.18.0 ✅ Running!

Server kamu makin lengkap. Sekarang tinggal Python yang belum di-setup.


Mau Lanjut Ke Mana?

  1. Setup Python App — via cPanel, sama seperti tadi Node.js
  2. Coba Express.js — framework Node.js paling populer, install via npm
  3. Coba Laravel — pakai Composer yang sudah ada
  4. Biarkan dulu — sudah cukup untuk sesi ini

Pilih mana? 😄

A: Jalankan perintah ini di terminal:

# 1. Aktifkan virtual environment Node.js dulu
source /home/anekakeb/nodevenv/node.anekakebutuhan.com/22/bin/activate && cd /home/anekakeb/node.anekakebutuhan.com

# 2. Init project & install Express
npm init -y
npm install express

Tunggu sampai selesai, kabari hasilnya — terutama apakah npm install express berhasil tanpa error! 👀

A: Express berhasil diinstall! 65 packages, 0 vulnerabilities. 🎉

Sekarang update file app.js dengan Express:

cat > app.js << 'EOF'
const express = require('express');
const app = express();

app.use(express.json());

// Route utama
app.get('/', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    timestamp: new Date().toISOString()
  });
});

// Route test
app.get('/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

app.listen(3000, () => {
  console.log('Express server running...');
});
EOF

Setelah itu kembali ke cPanel → klik RESTART, tunggu beberapa detik, lalu klik OPEN.

Coba juga akses: - https://anekakebutuhan.com/node/ — response utama - https://anekakebutuhan.com/node/hello/Budi — response dynamic

Kabari hasilnya! 👀

A: Masih response lama — berarti file app.js belum terupdate, atau RESTART belum mengambil file baru.

Cek dulu isi file app.js sekarang:

cat ~/node.anekakebutuhan.com/app.js

Kabari hasilnya — apakah isinya sudah Express atau masih http yang lama? 👀

Q: https://anekakebutuhan.com/node/hello/Budi

Cannot GET /node/hello/Budi

A: Berarti Express sudah jalan, tapi routing-nya belum mengenali prefix /node/. Ini karena app berjalan di subdirectory /node/ bukan di root /.

Fix app.js:

cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();

app.use(express.json());

// Route utama
app.get('/', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    timestamp: new Date().toISOString()
  });
});

// Route test
app.get('/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

app.listen(3000, () => {
  console.log('Express server running...');
});
EOF

Lalu RESTART di cPanel, kemudian coba akses: - https://anekakebutuhan.com/node/ - https://anekakebutuhan.com/node/hello/Budi

Kabari hasilnya! 👀

Q: A: Masalahnya jelas — cPanel me-proxy request dengan prefix /node/ ke app, tapi Express tidak tahu soal prefix itu. Perlu ditambahkan router dengan prefix /node:

cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();

app.use(express.json());

// Dengan prefix /node
app.get('/node', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    timestamp: new Date().toISOString()
  });
});

app.get('/node/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

// Fallback
app.use((req, res) => {
  res.status(404).json({ error: 'Route tidak ditemukan', path: req.path });
});

app.listen(3000, () => {
  console.log('Express server running...');
});
EOF

Lalu RESTART di cPanel, coba lagi akses kedua URL tadi. Kabari hasilnya! 👀

A: File sudah benar. Berarti masalahnya ada di cPanel — kemungkinan ada file index.html atau file statis yang menimpa route /node/.

Cek:

ls -la ~/node.anekakebutuhan.com/

Kabari isinya — apakah ada file index.html atau folder public? 👀

A: Ketemu! Ada file .htaccess — itu yang kemungkinan besar menimpa routing. Cek isinya:

cat ~/node.anekakebutuhan.com/.htaccess

Kabari isinya! 👀

A: .htaccess di subdomain ini aman — hanya konfigurasi PHP error log, tidak ada yang menimpa routing.

Berarti masalahnya ada di .htaccess domain root anekakebutuhan.com. Cek:

cat ~/public_html/.htaccess

Kabari isinya! 👀

A: Ketemu masalahnya! Di .htaccess root ada rule "C. MAIN ROUTING" yang menangkap semua request termasuk /node/ dan meneruskan ke index.php.

Tapi sebenarnya ini wajar — Node.js app di cPanel berjalan sebagai reverse proxy di subdomain terpisah node.anekakebutuhan.com, bukan sebagai path /node/ di domain utama.

Coba akses langsung via subdomain:

https://node.anekakebutuhan.com/
https://node.anekakebutuhan.com/hello/Budi

Dan update app.js kembali ke route tanpa prefix /node:

cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();

app.use(express.json());

app.get('/', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    timestamp: new Date().toISOString()
  });
});

app.get('/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

app.use((req, res) => {
  res.status(404).json({ error: 'Route tidak ditemukan', path: req.path });
});

app.listen(3000, () => {
  console.log('Express server running...');
});
EOF

Lalu RESTART di cPanel, kemudian coba akses https://node.anekakebutuhan.com/ dan https://node.anekakebutuhan.com/hello/Budi. Kabari hasilnya! 👀

A: Subdomain node.anekakebutuhan.com masih dibaca sebagai static file server oleh Apache/LiteSpeed, bukan diarahkan ke Node.js app.

Cek .htaccess di subdomain tersebut:

cat ~/node.anekakebutuhan.com/.htaccess

Kemungkinan perlu ditambahkan rule proxy ke port Node.js. Tapi dulu kabari isi .htaccess-nya — kita lihat apa yang sudah ada! 👀

A: Masalahnya jelas — .htaccess subdomain tidak punya rule proxy ke Node.js. cPanel seharusnya menambahkan ini otomatis, tapi ternyata tidak.

Tambahkan manual:

cat >> ~/node.anekakebutuhan.com/.htaccess << 'EOF'

# Node.js Proxy
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ http://127.0.0.1:3000/$1 [P,L]
</IfModule>
EOF

Lalu coba akses lagi https://node.anekakebutuhan.com/ dan https://node.anekakebutuhan.com/hello/Budi.

Kabari hasilnya! 👀

A: Progress! 503 berarti proxy sudah bekerja, tapi port 3000 tidak bisa dijangkau — di shared hosting port langsung biasanya diblokir.

Cek port berapa sebenarnya Node.js app berjalan:

cat ~/node.anekakebutuhan.com/tmp/pids/server.pid 2>/dev/null
ls ~/node.anekakebutuhan.com/tmp/
cat ~/node.anekakebutuhan.com/stderr.log

Dan cek juga:

# Lihat port yang dipakai oleh proses node milik kamu
ss -tulpn | grep node

Kabari hasilnya — kita cari port yang benar! 👀

A: stderr.log kosong dan ss tidak tersedia. Coba cara lain:

# Cek proses node dan portnya
ps aux | grep node
netstat -tulpn 2>/dev/null | grep node

# Cek port via file cPanel
cat ~/nodevenv/node.anekakebutuhan.com/22/bin/activate | grep PORT
ls ~/nodevenv/node.anekakebutuhan.com/

Kabari hasilnya! 👀

A: Ketemu! Prosesnya berjalan sebagai lsnode (LiteSpeed Node) bukan Node.js biasa — artinya LiteSpeed server yang handle proxy-nya secara otomatis, bukan via .htaccess manual.

Hapus dulu rule proxy yang tadi kita tambahkan:

# Backup dulu
cp ~/node.anekakebutuhan.com/.htaccess ~/node.anekakebutuhan.com/.htaccess.bak

# Hapus rule proxy yang kita tambahkan
cat > ~/node.anekakebutuhan.com/.htaccess << 'EOF'
# BEGIN cPanel-generated php ini directives, do not edit
# Manual editing of this file may result in unexpected behavior.
<IfModule php8_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</IfModule>
<IfModule lsapi_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</tml:IfModule>
EOF

Lalu RESTART di cPanel, dan coba akses lagi: - https://node.anekakebutuhan.com/ - https://node.anekakebutuhan.com/hello/Budi

LiteSpeed seharusnya otomatis proxy ke lsnode. Kabari hasilnya! 👀

A: Masalahnya sekarang jelas — subdomain menampilkan list file berarti LiteSpeed melayani sebagai static file server, bukan meneruskan ke Node.js app.

Perhatikan dari screenshot — tidak ada file .htaccess terlihat! Berarti .htaccess kita tadi hilang atau tidak tersimpan dengan benar.

Cek dulu:

ls -la ~/node.anekakebutuhan.com/.htaccess
cat ~/node.anekakebutuhan.com/.htaccess

Kabari hasilnya! 👀

A: Ada typo di .htaccess kita tadi — </tml:IfModule> seharusnya </IfModule>. Sekarang perbaiki sekaligus tambahkan rule untuk disable directory listing:

cat > ~/node.anekakebutuhan.com/.htaccess << 'EOF'
# BEGIN cPanel-generated php ini directives, do not edit
# Manual editing of this file may result in unexpected behavior.
<IfModule php8_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</IfModule>
<IfModule lsapi_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</IfModule>

Options -Indexes
EOF

Lalu coba akses lagi https://node.anekakebutuhan.com/ — apakah masih list folder atau sudah berubah? 👀

Kalau masih belum proxy ke Node.js, kita perlu cek cara LiteSpeed melakukan routing ke lsnode di server ini — mungkin ada konfigurasi khusus dari hosting provider-nya.

A: Bagus, directory listing sudah diblokir! Sekarang tinggal arahkan ke Node.js app.

Di LiteSpeed, proxy ke Node.js biasanya via .htaccess dengan cara berbeda:

cat > ~/node.anekakebutuhan.com/.htaccess << 'EOF'
# BEGIN cPanel-generated php ini directives, do not edit
<IfModule php8_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</IfModule>
<IfModule lsapi_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</IfModule>

Options -Indexes

# LiteSpeed Node.js proxy
RewriteEngine On
RewriteRule ^(.*)$ http://localhost:3000/$1 [P,L]
EOF

Lalu RESTART di cPanel, coba akses lagi. Kabari hasilnya! 👀

Kalau masih 503/404, kemungkinan port 3000 memang tidak bisa diakses langsung dan kita perlu tanya ke hosting provider port berapa yang diassign untuk Node.js app ini.

A: 503 berarti proxy jalan tapi port 3000 salah. cPanel LiteSpeed biasanya assign port otomatis, bukan 3000.

Cek port yang diassign:

# Cek environment variable dari cPanel
cat ~/nodevenv/node.anekakebutuhan.com/22/bin/activate

# Cek package.json
cat ~/node.anekakebutuhan.com/package.json

Kabari isinya — terutama cari kata PORT di file activate! 👀

A: Tidak ada info PORT di sana. Di cPanel LiteSpeed, port di-assign dinamis dan Node.js app harus membaca dari environment variable PORT, bukan hardcode 3000.

Update app.js:

cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();

// cPanel LiteSpeed assign port via environment variable
const PORT = process.env.PORT || 3000;

app.use(express.json());

app.get('/', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    port: PORT,
    timestamp: new Date().toISOString()
  });
});

app.get('/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

app.use((req, res) => {
  res.status(404).json({ error: 'Route tidak ditemukan', path: req.path });
});

app.listen(PORT, () => {
  console.log(`Express running on port ${PORT}`);
});
EOF

Lalu hapus rule proxy dari .htaccess — biarkan LiteSpeed yang handle sendiri:

cat > ~/node.anekakebutuhan.com/.htaccess << 'EOF'
# BEGIN cPanel-generated php ini directives, do not edit
<IfModule php8_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</IfModule>
<IfModule lsapi_module>
   php_value error_log "/home/anekakeb/logs/php.error.log"
   php_flag log_errors On
</IfModule>
Options -Indexes
EOF

Lalu RESTART di cPanel, coba akses https://node.anekakebutuhan.com/. Kabari hasilnya! 👀

A: 403 lagi — LiteSpeed tidak otomatis proxy ke Node.js.

Coba cek apakah ada file konfigurasi khusus yang dibuat cPanel untuk routing Node.js:

# Cek folder public
ls -la ~/node.anekakebutuhan.com/public/

# Cek apakah ada .htaccess di dalam public
cat ~/node.anekakebutuhan.com/public/.htaccess 2>/dev/null

# Cek file konfigurasi LiteSpeed
find ~/ -name "*.conf" 2>/dev/null | grep -i node
find ~/ -name "httpd.conf" 2>/dev/null

Kabari hasilnya!

Kemungkinan besar di hosting ini Node.js app harus diletakkan di folder public bukan di root subdomain. 👀

A: Folder public kosong, tidak ada .conf yang relevan.

Ini kemungkinan besar masalah document root — cPanel mungkin set document root subdomain ke /public bukan ke root folder.

Coba pindahkan app.js ke dalam folder public dan buat .htaccess di sana:

# Copy app.js ke public
cp ~/node.anekakebutuhan.com/app.js ~/node.anekakebutuhan.com/public/

# Buat .htaccess di dalam public
cat > ~/node.anekakebutuhan.com/public/.htaccess << 'EOF'
Options -Indexes
RewriteEngine On
RewriteRule ^(.*)$ http://localhost:$PORT/$1 [P,L]
EOF

Sebenarnya pendekatan lain yang lebih bersih — cek dulu document root subdomain via cPanel:

Buka cPanel → Domains → lihat kolom Document Root untuk node.anekakebutuhan.com — folder apa yang tertulis di sana?

Ini akan menentukan langkah selanjutnya! 👀

A: Dari File Manager terlihat struktur foldernya. Perhatikan ada folder public — di LiteSpeed/cPanel, document root biasanya diarahkan ke folder public ini.

Coba taruh app.js di dalam folder public:

# Buat app.js di dalam folder public
cat > ~/node.anekakebutuhan.com/public/app.js << 'EOF'
const express = require('express');
const app = express();

const PORT = process.env.PORT || 3000;

app.use(express.json());

app.get('/', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    port: PORT,
    timestamp: new Date().toISOString()
  });
});

app.get('/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

app.listen(PORT, () => {
  console.log(`Express running on port ${PORT}`);
});
EOF

Lalu di cPanel Setup Node.js App → edit app → ganti Application startup file menjadi public/app.jsSaveRestart.

Coba akses lagi https://node.anekakebutuhan.com/. Kabari! 👀

A: Perhatikan di screenshot — Application URL masih anekakebutuhan.com/node bukan node.anekakebutuhan.com!

Ini yang menyebabkan confusion dari tadi. cPanel mendaftarkan app di path /node di domain utama, bukan di subdomain.

Coba akses via URL yang benar:

https://anekakebutuhan.com/node/
https://anekakebutuhan.com/node/hello/Budi

Tapi sebelumnya, kembalikan startup file ke app.js (bukan public/app.js):

Di cPanel → Setup Node.js App → edit → ganti Application startup file kembali ke app.jsSaveRestart.

Lalu akses https://anekakebutuhan.com/node/ — ini URL yang sebenarnya! 👀

A: Hampir! Response pertama masih dari app.js lama yang pakai http biasa. Berarti file app.js belum terupdate dengan versi Express.

Cek isi app.js sekarang:

cat ~/node.anekakebutuhan.com/app.js

Kabari isinya! 👀

A: File sudah benar dengan Express! Masalahnya sama seperti tadi — route /hello/Budi tidak dikenali karena prefix /node/.

Update app.js dengan prefix /node:

cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();

const PORT = process.env.PORT || 3000;

app.use(express.json());

app.get('/node', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    port: PORT,
    timestamp: new Date().toISOString()
  });
});

app.get('/node/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

app.use((req, res) => {
  res.status(404).json({ error: 'Route tidak ditemukan', path: req.path });
});

app.listen(PORT, () => {
  console.log(`Express running on port ${PORT}`);
});
EOF

Lalu RESTART di cPanel, coba akses: - https://anekakebutuhan.com/node/ - https://anekakebutuhan.com/node/hello/Budi

Kabari! 👀

A: Tentu, santai saja! Bisa dilanjutkan kapan saja. 😄


Catatan untuk Dilanjutkan

Masalah yang sedang kita debug: cPanel me-strip atau tidak me-strip prefix /node/ sebelum diteruskan ke Express — kita belum tahu pasti mana yang terjadi.

Yang perlu dicoba saat lanjut nanti:

# Tambahkan logging di app.js untuk lihat path asli yang diterima
cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.use((req, res, next) => {
  console.log('PATH:', req.path, '| URL:', req.url);
  next();
});

app.use('*', (req, res) => {
  res.json({ path: req.path, url: req.url, method: req.method });
});

app.listen(PORT, () => console.log(`Running on ${PORT}`));
EOF

Dengan ini kita bisa tahu path apa yang sebenarnya diterima oleh Express dari cPanel — lalu routing bisa disesuaikan.


Sampai jumpa, semoga harinya menyenangkan! 🙏

A: Berarti Express menerima request tapi tidak match route manapun. Coba jalankan app.js logging dulu:

cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.use((req, res) => {
  res.json({ 
    path: req.path, 
    url: req.url, 
    method: req.method,
    port: PORT
  });
});

app.listen(PORT, () => console.log(`Running on ${PORT}`));
EOF

RESTART di cPanel, lalu akses https://anekakebutuhan.com/node/ — kita lihat JSON yang keluar untuk tahu path apa yang sebenarnya diterima Express! 👀

A: Berarti request bahkan tidak sampai ke Express! cPanel/LiteSpeed yang menangkap duluan sebelum diteruskan ke Node.js.

Cek stderr.log untuk lihat apakah ada error:

cat ~/node.anekakebutuhan.com/stderr.log
tail -f ~/node.anekakebutuhan.com/stderr.log

Dan cek apakah proses node masih berjalan:

ps aux | grep node

Kabari hasilnya! 👀

A: Proses lsnode berjalan tapi request tidak sampai ke Express. Ini masalah LiteSpeed routing.

Coba tambahkan RewriteBase yang benar di .htaccess domain utama — tapi sebenarnya cara paling bersih adalah ubah Application URL di cPanel dari path /node menjadi langsung ke subdomain.

Coba di cPanel → Setup Node.js App → edit → ubah: - Application URL: ganti dropdown ke node.anekakebutuhan.com dan kosongkan field path-nya

Seperti ini:

Domain:  node.anekakebutuhan.com
Path:    (kosong)

Apakah dropdown Application URL bisa dipilih node.anekakebutuhan.com? 👀

A: Bagus! Sekarang Application URL sudah ke node.anekakebutuhan.com dengan path kosong. Tapi startup file masih public/app.js — ganti dulu ke app.js:

  1. Ubah Application startup file dari public/app.jsapp.js
  2. Klik Save
  3. Klik Restart

Lalu klik OPEN — seharusnya langsung ke https://node.anekakebutuhan.com/.

Kabari hasilnya! 👀

A: 🎉 BREAKTHROUGH! Express sekarang menerima request dengan benar!

Terlihat: - path: "/" — route sudah bersih tanpa prefix /node/ - port: 3000 — berjalan di port 3000

Sekarang update app.js dengan route yang benar:

cat > ~/node.anekakebutuhan.com/app.js << 'EOF'
const express = require('express');
const app = express();

const PORT = process.env.PORT || 3000;

app.use(express.json());

app.get('/', (req, res) => {
  res.json({
    status: 'ok',
    message: 'Hello dari Express.js!',
    node_version: process.version,
    port: PORT,
    timestamp: new Date().toISOString()
  });
});

app.get('/hello/:name', (req, res) => {
  res.json({
    message: `Halo, ${req.params.name}!`
  });
});

app.use((req, res) => {
  res.status(404).json({ error: 'Route tidak ditemukan', path: req.path });
});

app.listen(PORT, () => console.log(`Express running on port ${PORT}`));
EOF

RESTART di cPanel, lalu coba: - https://node.anekakebutuhan.com/ - https://node.anekakebutuhan.com/hello/Budi

Kabari! 👀

A: 🎉🎉🎉 FULLY WORKING!

Express.js berjalan sempurna di Node.js 22.18.0!


Recap Perjalanan Tadi

Masalahnya ternyata di Application URL — awalnya di-set ke anekakebutuhan.com/node (path di domain utama), padahal seharusnya langsung ke subdomain node.anekakebutuhan.com dengan path kosong. Setelah diperbaiki, LiteSpeed langsung proxy dengan benar ke Express.


Status Toolchain Lengkap

Tool Status Versi
PHP 8.3.27
Git 2.48.2
Composer 2.9.7
Ruby 3.0.7
Node.js + Express 22.18.0
Python Belum setup

Mau lanjut ke mana sekarang? 1. Setup Python App via cPanel 2. Coba Laravel via Composer 3. Eksplorasi Express lebih lanjut — middleware, REST API, dll

A: Aman dan jangan diubah! Ini sudah sempurna. ✅

Bagian paling penting adalah blok CloudLinux Passenger yang ditambahkan otomatis oleh cPanel:

Directive Fungsi
PassengerAppRoot Lokasi folder app
PassengerBaseURI "/" Mount di root subdomain — inilah yang membuat routing bersih tanpa prefix
PassengerNodejs Path ke Node.js versi 22 yang benar
PassengerAppType node Memberitahu LiteSpeed ini adalah Node.js app
PassengerStartupFile app.js Entry point app

Options -Indexes juga bagus — directory listing diblokir. 👍


Jangan pernah edit blok CLOUDLINUX PASSENGER secara manual — kalau perlu ubah konfigurasi, lakukan via cPanel Setup Node.js App, nanti blok ini diupdate otomatis.

Lanjut setup Python? 😄

A: Selamat pagi! 😄

Ya betul, ada beberapa "sampah" dari troubleshoot kemarin yang perlu dibersihkan. Mari cek dulu:

# Cek semua file di folder node
ls -la ~/node.anekakebutuhan.com/

# Cek isi folder public (kita sempat taruh app.js di sini)
ls -la ~/node.anekakebutuhan.com/public/

# Cek .htaccess backup yang kita buat
ls -la ~/node.anekakebutuhan.com/.htaccess*

Kabari hasilnya — yang perlu dibersihkan kemungkinan: - ~/node.anekakebutuhan.com/public/app.js — file duplikat - ~/node.anekakebutuhan.com/.htaccess.bak — backup yang tidak diperlukan - ~/node.anekakebutuhan.com/composer-setup.php — kalau ada sisa instalasi composer

Cek dulu, kita bersihkan bersama! 👀

A: Ketemu sampahnya! Bersihkan sekaligus:

# Hapus file duplikat dan sampah troubleshoot
rm ~/node.anekakebutuhan.com/.htaccess.bak
rm ~/node.anekakebutuhan.com/public/app.js
rm ~/node.anekakebutuhan.com/public/.htaccess

# Verifikasi hasil
ls -la ~/node.anekakebutuhan.com/
ls -la ~/node.anekakebutuhan.com/public/

Setelah bersih, cek app masih jalan normal dengan akses https://node.anekakebutuhan.com/ — pastikan masih response JSON yang benar. 👀

A: Bersih dan berfungsi normal! ✅

status:       "ok"
message:      "Hello dari Express.js!"
node_version: "v22.18.0"
port:         3000
timestamp:    2026-05-12T00:58:28.827Z

Semua rapih sekarang. Siap lanjut ke tahap berikutnya!

Mau lanjut ke mana pagi ini? 1. Setup Python App via cPanel 2. Coba Laravel via Composer 3. Eksplorasi Express lebih lanjut — REST API, middleware, dll

A: Silakan buka cPanel → klik "Setup Python App"

Setelah terbuka, klik "Create Application" — lalu screenshot atau ceritakan form yang muncul, terutama versi Python apa saja yang tersedia di dropdown! 👀

A: Pilih 3.9.23 — Python 2.7 sudah EOL sejak 2020, jangan dipakai.

Idealnya Python 3.11 atau 3.12, tapi kalau maksimal yang tersedia 3.9 ya itu yang terbaik.


Isi form seperti ini:

Field Isi
Python version 3.9.23
Application root python.anekakebutuhan.com
Application URL python.anekakebutuhan.com + path kosong
Application startup file app.py
Application Entry point app

Isi semua, screenshot dulu sebelum klik Create! 👀

A: Sempurna! Semua sudah terisi dengan benar! ✅

Field Nilai
Python version 3.9.23
Application root python.anekakebutuhan.com
Application URL python.anekakebutuhan.com (kosong)
Application startup file app.py
Application Entry point app

Klik Create! 🚀

A: Python app berhasil dibuat dan langsung RUNNING! 🎉

Bedanya dengan Node.js, Python pakai WSGI dan ada tombol "Run Pip Install" untuk install package.


Sekarang buat file app.py via terminal:

# Aktifkan virtual environment Python
source ~/virtualenv/python.anekakebutuhan.com/3.9/bin/activate && cd ~/python.anekakebutuhan.com

# Cek Python version
python --version
pip --version

Kabari hasilnya dulu — kita pastikan virtual environment aktif dengan benar sebelum buat app.py! 👀

A: Python virtual environment aktif! ✅

Sekarang install Flask dan buat app.py:

# Install Flask
pip install flask

# Buat app.py
cat > ~/python.anekakebutuhan.com/app.py << 'EOF'
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify({
        'status': 'ok',
        'message': 'Hello dari Python Flask!',
        'python_version': '3.9.23'
    })

@app.route('/hello/<name>')
def hello(name):
    return jsonify({
        'message': f'Halo, {name}!'
    })

if __name__ == '__main__':
    app.run()
EOF

Setelah selesai, kembali ke cPanel → RESTART, lalu klik OPEN.

Kabari hasilnya! 👀

A: 🎉 Python Flask langsung berhasil! Jauh lebih mudah dari Node.js kemarin!

Coba juga route kedua:

https://python.anekakebutuhan.com/hello/Budi

Kalau berhasil, Python Flask sudah fully working! 👀

A: 🎉 Perfect! Langsung berhasil tanpa drama! 😄


Status Toolchain Lengkap Sekarang

Tool Status Versi
PHP 8.3.27
Git 2.48.2
Composer 2.9.7
Ruby 3.0.7
Node.js + Express 22.18.0
Python + Flask 3.9.23

Server lab kamu sekarang sudah sangat lengkap! 🚀


Mau lanjut ke mana sekarang? 1. Laravel via Composer 2. Eksplorasi Flask lebih lanjut — REST API, routing, template 3. Eksplorasi Express lebih lanjut — middleware, REST API 4. Hal lain yang ingin dicoba

A: Siap! Mari setup Laravel.

Pertama, buat subdomain dulu kalau belum ada — misalnya laravel.anekakebutuhan.com. Sudah ada subdomainnya?

Dan sambil itu, jalankan perintah ini di terminal untuk cek versi PHP dan Composer siap:

php --version
composer --version

Kabari hasilnya! 👀

A: Sempurna! PHP 8.3.27 dan Composer 2.9.7 siap. ✅

Subdomain laravel.anekakebutuhan.com sudah dibuat belum? Kalau sudah, langsung jalankan:

cd ~/laravel.anekakebutuhan.com
composer create-project laravel/laravel .

Proses ini agak lama (download banyak package) — sambil tunggu kabari kalau ada pesan error atau progress yang muncul! 👀

A: Folder laravel.anekakebutuhan.com sudah ada isinya (dibuat otomatis cPanel saat buat subdomain). Cek dulu isinya:

ls -la ~/laravel.anekakebutuhan.com/

Kabari isinya — kalau hanya file default cPanel (cgi-bin, php.ini, dll) kita install ke subfolder saja atau bersihkan dulu! 👀

A: Hanya file default cPanel. Gunakan flag --ignore-platform-reqs untuk install ke folder yang tidak kosong:

cd ~/laravel.anekakebutuhan.com
composer create-project laravel/laravel . --ignore-platform-reqs

Proses ini akan makan waktu 1-3 menit — tunggu sampai selesai! 👀

A: Composer tidak mau install ke folder yang ada isinya. Solusinya install ke subfolder dulu lalu pindahkan:

cd ~/laravel.anekakebutuhan.com

# Install ke subfolder sementara
composer create-project laravel/laravel tmp_laravel

# Pindahkan semua isi ke folder utama
mv tmp_laravel/{.,}* . 2>/dev/null
rm -rf tmp_laravel

Atau cara lebih simpel — hapus file default cPanel dulu:

cd ~/laravel.anekakebutuhan.com
rm -f php.ini .user.ini error_log
rm -rf cgi-bin

# Coba install lagi
composer create-project laravel/laravel .

Coba cara kedua dulu — lebih simpel! 👀

A: 🎉 Laravel berhasil diinstall sempurna!

Terlihat semua berjalan mulus: - ✅ Application key generated - ✅ Database SQLite dibuat otomatis - ✅ Migrations berhasil — users, cache, jobs table sudah terbuat


Sekarang perlu set document root ke folder public milik Laravel. Cek dulu:

ls ~/laravel.anekakebutuhan.com/public/

Lalu di cPanel → Domains → cari laravel.anekakebutuhan.com → edit Document Root menjadi:

laravel.anekakebutuhan.com/public

Ini penting karena Laravel harus diakses via folder public, bukan root folder! 👀

A: Hasil ls nya tidak muncul — coba jalankan lagi:

ls -la ~/laravel.anekakebutuhan.com/public/

Kabari hasilnya! 👀

A: Folder public sudah ada dengan index.php dan .htaccess.

Sekarang ubah Document Root di cPanel:

  1. cPanel → Domains
  2. Cari laravel.anekakebutuhan.com
  3. Klik Manage atau Edit
  4. Ubah Document Root dari laravel.anekakebutuhan.com menjadi laravel.anekakebutuhan.com/public
  5. Klik Save

Setelah itu akses https://laravel.anekakebutuhan.com/ — seharusnya muncul halaman welcome Laravel! 👀

A: 🎉🎉🎉 Laravel 13.8.0 berhasil!

Halaman welcome Laravel muncul sempurna — versi terbaru pula!


Status Toolchain — LENGKAP!

Tool Status Versi
PHP 8.3.27
Git 2.48.2
Composer 2.9.7
Ruby 3.0.7
Node.js + Express 22.18.0
Python + Flask 3.9.23
Laravel 13.8.0

Server lab kamu sekarang production-grade untuk belajar! 🚀


Langkah Selanjutnya untuk Laravel

Beberapa hal yang bisa dieksplorasi:

  1. Buat database MySQL di cPanel → setup .env Laravel
  2. Buat route & controller pertama
  3. Install Laravel Breeze — authentication scaffolding
  4. Explore Artisan — CLI tool Laravel

Mau mulai dari mana? 😄

A: Buat database MySQL dulu di cPanel:

  1. cPanel → MySQL Databases
  2. Buat database baru — misalnya anekakeb_laravel
  3. Buat user baru — misalnya anekakeb_laraveluser
  4. Set password yang kuat
  5. Add user to database → pilih All Privileges

Setelah selesai, kabari: - Nama database - Nama user - Password (boleh di-share di sini atau langsung kita masukkan ke .env)

Kita lanjut setup .env Laravel setelah database siap! 👀

A: Oke, sekarang update file .env Laravel:

cd ~/laravel.anekakebutuhan.com

# Edit konfigurasi database di .env
sed -i 's/DB_CONNECTION=sqlite/DB_CONNECTION=mysql/' .env
sed -i 's/# DB_HOST=127.0.0.1/DB_HOST=localhost/' .env
sed -i 's/# DB_PORT=3306/DB_PORT=3306/' .env
sed -i 's/# DB_DATABASE=laravel/DB_DATABASE=anekakeb_laravel/' .env
sed -i 's/# DB_USERNAME=root/DB_USERNAME=anekakeb_laraveluser/' .env
sed -i 's/# DB_PASSWORD=/DB_PASSWORD=Rahasia1234/' .env

Lalu verifikasi hasilnya:

grep DB_ .env

Kabari hasilnya! 👀

A: Sempurna! Konfigurasi database sudah benar. ✅

Sekarang jalankan migration ke MySQL:

cd ~/laravel.anekakebutuhan.com
php artisan migrate

Kabari hasilnya! 👀

A: 🎉 Migration ke MySQL berhasil sempurna!

Semua tabel sudah terbuat di MySQL: - ✅ migrations table - ✅ users table - ✅ cache table - ✅ jobs table


Sekarang lanjut install Laravel Breeze untuk authentication (login, register, dashboard) — ini cara tercepat belajar struktur Laravel:

cd ~/laravel.anekakebutuhan.com

# Install Breeze
composer require laravel/breeze --dev

# Install scaffolding Breeze (pilih Blade)
php artisan breeze:install blade

# Jalankan migration untuk tabel auth
php artisan migrate

Proses composer require agak lama sedikit. Kabari hasilnya! 👀

A: Breeze berhasil install! Ada satu peringatan kecil:

  • laravel/breeze ^2.4 terinstall
  • Breeze scaffolding installed successfully
  • Nothing to migrate (tabel sudah ada)
  • ⚠️ npm: command not found — CSS/JS belum di-compile

Perlu compile asset via Node.js. Gunakan Node.js yang ada di virtual environment:

cd ~/laravel.anekakebutuhan.com

# Aktifkan Node.js
source ~/nodevenv/node.anekakebutuhan.com/22/bin/activate

# Cek npm
npm --version

# Install dependencies & compile
npm install && npm run build

Kabari hasilnya! 👀

A: vite tidak ditemukan karena node_modules Laravel belum diinstall. Jalankan:

cd ~/laravel.anekakebutuhan.com

# Install node dependencies Laravel (bukan dari nodevenv)
# Deactivate dulu nodevenv
deactivate

# Install ulang dengan npm yang benar
npm install
npm run build

Kalau masih error, coba:

cd ~/laravel.anekakebutuhan.com
cat package.json
ls node_modules/.bin/vite 2>/dev/null || echo "vite tidak ada"

Kabari hasilnya! 👀

A: npm tidak tersedia di PATH setelah deactivate. Gunakan npm dari nodevenv tapi jalankan vite secara langsung:

cd ~/laravel.anekakebutuhan.com

# Aktifkan nodevenv lagi
source ~/nodevenv/node.anekakebutuhan.com/22/bin/activate

# Install node_modules Laravel dulu (di folder laravel, bukan nodevenv)
npm install --prefix ~/laravel.anekakebutuhan.com

# Jalankan vite build langsung
./node_modules/.bin/vite build

Kabari hasilnya! 👀

A: node_modules Laravel belum terinstall dengan benar — hanya 66 packages itu milik nodevenv, bukan Laravel. Cek package.json Laravel:

cat ~/laravel.anekakebutuhan.com/package.json
ls ~/laravel.anekakebutuhan.com/node_modules/ 2>/dev/null | head -10

Kabari hasilnya! 👀

A: node_modules Laravel kosong — belum diinstall sama sekali. npm install tadi salah target. Jalankan dengan benar:

cd ~/laravel.anekakebutuhan.com

# Pastikan nodevenv aktif
source ~/nodevenv/node.anekakebutuhan.com/22/bin/activate

# Install node_modules di folder Laravel ini
npm install

# Cek vite sudah ada
ls node_modules/.bin/vite

# Build
npm run build

Kuncinya adalah cd ke folder Laravel dulu sebelum npm install — supaya package.json Laravel yang terbaca, bukan yang lain. Kabari hasilnya! 👀

A: Masalahnya jelas — npm install selalu membaca package.json dari nodevenv (66 packages), bukan dari folder Laravel. Ini karena node_modules di Laravel di-symlink ke nodevenv.

Cek:

ls -la ~/laravel.anekakebutuhan.com/node_modules

Kemungkinan ini symlink seperti di folder node tadi. Kalau iya, kita perlu hapus symlink dan install ulang:

# Hapus symlink node_modules
rm ~/laravel.anekakebutuhan.com/node_modules

# Install fresh
cd ~/laravel.anekakebutuhan.com
source ~/nodevenv/node.anekakebutuhan.com/22/bin/activate
npm install

ls node_modules/.bin/vite

Kabari hasilnya! 👀

A: Masalahnya jelas — npm install selalu membaca package.json dari nodevenv (66 packages), bukan dari folder Laravel. Ini karena node_modules di Laravel di-symlink ke nodevenv.

Cek:

ls -la ~/laravel.anekakebutuhan.com/node_modules

Kemungkinan ini symlink seperti di folder node tadi. Kalau iya, kita perlu hapus symlink dan install ulang:

# Hapus symlink node_modules
rm ~/laravel.anekakebutuhan.com/node_modules

# Install fresh
cd ~/laravel.anekakebutuhan.com
source ~/nodevenv/node.anekakebutuhan.com/22/bin/activate
npm install

ls node_modules/.bin/vite

Kabari hasilnya! 👀

A: Ketemu masalahnya! npm yang aktif adalah dari nodevenv (~/nodevenv/node.anekakebutuhan.com/22/bin/npm) dan dia membaca package.json dari nodevenv juga, bukan dari folder Laravel.

Solusinya — gunakan npm dengan explicit package.json Laravel:

cd ~/laravel.anekakebutuhan.com

# Gunakan node dari nodevenv tapi npm ci dengan package-lock
source ~/nodevenv/node.anekakebutuhan.com/22/bin/activate

# Hapus package-lock.json dulu kalau ada
rm -f package-lock.json

# Set npm prefix ke folder saat ini
npm install --userconfig /dev/null --prefix /home/anekakeb/laravel.anekakebutuhan.com vite laravel-vite-plugin @tailwindcss/vite @tailwindcss/forms tailwindcss alpinejs autoprefixer concurrently postcss

# Cek
ls node_modules/.bin/vite 2>/dev/null || echo "masih tidak ada"

Kabari hasilnya! 👀

A: 77 packages terinstall tapi vite masih tidak ada. Cek dimana node_modules terinstall:

find /home/anekakeb -name "vite" -type f 2>/dev/null | head -5
ls -la ~/laravel.anekakebutuhan.com/

Kabari hasilnya! 👀

A: Ada file .npmrc di folder Laravel! Itu yang menyebabkan npm tidak install ke folder yang benar. Cek isinya:

cat ~/laravel.anekakebutuhan.com/.npmrc

Kabari isinya! 👀

A: Ketemu! .npmrc ada ignore-scripts=true — ini yang mencegah install berjalan normal. Tambahkan juga prefix yang benar:

# Override .npmrc dan install
cd ~/laravel.anekakebutuhan.com
source ~/nodevenv/node.anekakebutuhan.com/22/bin/activate

# Install dengan ignore .npmrc
npm install --ignore-scripts=false --prefix /home/anekakeb/laravel.anekakebutuhan.com

# Cek
ls node_modules/.bin/vite 2>/dev/null || echo "masih tidak ada"

Kabari hasilnya! 👀

A: npm masih tidak install ke folder Laravel. Masalahnya ada di nodevenv yang override semua config.

Coba pendekatan berbeda — gunakan node langsung dari opt:

# Gunakan node/npm langsung tanpa nodevenv
/opt/alt/alt-nodejs22/root/usr/bin/npm install --prefix /home/anekakeb/laravel.anekakebutuhan.com

# Cek
ls /home/anekakeb/laravel.anekakebutuhan.com/node_modules/.bin/vite 2>/dev/null || echo "masih tidak ada"

Kabari hasilnya! 👀

A: 🎉 Vite sudah terinstall! 139 packages berhasil!

Sekarang build assets Laravel:

/opt/alt/alt-nodejs22/root/usr/bin/npm run build --prefix /home/anekakeb/laravel.anekakebutuhan.com

Kabari hasilnya! 👀

A: Error-nya jelas — bootstrap.js tidak ditemukan di resources/js/. Cek:

ls ~/laravel.anekakebutuhan.com/resources/js/

Kabari hasilnya! 👀

A: Hanya ada app.js, file bootstrap.js tidak ada — seharusnya dibuat oleh Breeze tapi tidak terbuat karena npm tidak tersedia saat itu.

Buat file bootstrap.js:

cat > ~/laravel.anekakebutuhan.com/resources/js/bootstrap.js << 'EOF'
import axios from 'axios';
window.axios = axios;
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
EOF

Lalu install axios dan build ulang:

cd ~/laravel.anekakebutuhan.com
/opt/alt/alt-nodejs22/root/usr/bin/npm install axios
/opt/alt/alt-nodejs22/root/usr/bin/npm run build --prefix /home/anekakeb/laravel.anekakebutuhan.com

Kabari hasilnya! 👀

A: 🎉 Build berhasil sempurna!

  • ✅ 56 modules transformed
  • ✅ CSS: 35.47 kB (gzip: 6.97 kB)
  • ✅ JS: 86.49 kB (gzip: 31.55 kB)
  • ✅ Built in 862ms

Sekarang coba akses: - https://laravel.anekakebutuhan.com/ — halaman welcome - https://laravel.anekakebutuhan.com/login — halaman login Breeze - https://laravel.anekakebutuhan.com/register — halaman register

Kabari tampilannya! 👀 Q: https://laravel.anekakebutuhan.com/ --> sepertinya ok, ada login dsb nya

https://laravel.anekakebutuhan.com/login --> sepertinya OK , skrinsut #2

https://laravel.anekakebutuhan.com/register --> OK, lihat skrinsut #3

A: 🎉🎉🎉 Laravel + Breeze FULLY WORKING!

Semua halaman tampil sempurna: - ✅ Welcome page dengan tombol Login & Register - ✅ Halaman Login dengan form lengkap - ✅ Halaman Register dengan Name, Email, Password


Coba register user baru sekarang — isi form register dengan data test, klik REGISTER — pastikan bisa masuk ke dashboard! 👀

A: 🎉 "You're logged in!" — Sempurna!

Laravel 13 + Breeze + MySQL + Authentication semuanya berjalan mulus!


Recap Pencapaian Hari Ini

Tool Status
PHP 8.3.27 Ready
Git 2.48.2 Ready
Composer 2.9.7 Ready
Node.js 22.18.0 + Express Ready
Python 3.9.23 + Flask Ready
Laravel 13.8.0 + Breeze + MySQL Ready

Server lab kamu sekarang lengkap dan production-grade! 🚀


Silakan ke pelanggan dulu — kalau mau lanjut eksplorasi Laravel atau yang lain, tinggal lanjutkan chat ini. Semoga lancar kunjungannya! 🙏

A: Siap! Sambil meeting, kita bisa mulai yang ringan dulu. 😄

Mau eksplorasi yang mana dulu:

  1. Route & Controller — buat halaman sederhana
  2. Eloquent ORM — buat model & tabel baru, CRUD sederhana
  3. Blade Template — buat layout & komponen view
  4. Artisan CLI — eksplorasi command-command useful

Pilih sesuai waktu yang tersedia — kalau singkat pilih no 1, kalau punya waktu lebih pilih no 2! 👀

A: Oke! Kita buat route dan controller sederhana.

Jalankan perintah ini untuk buat controller baru:

cd ~/laravel.anekakebutuhan.com
php artisan make:controller PageController

Kabari hasilnya! 👀

A: Buat dulu file view-nya, baru kita test. Jalankan:

# Buat folder pages
mkdir -p ~/laravel.anekakebutuhan.com/resources/views/pages

# Buat view home
cat > ~/laravel.anekakebutuhan.com/resources/views/pages/home.blade.php << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>{{ $title }}</title>
</head>
<body>
    <h1>{{ $title }}</h1>
    <p>{{ $message }}</p>
    <a href="/about">About</a> | <a href="/contact">Contact</a>
</body>
</html>
EOF

# Buat view about
cat > ~/laravel.anekakebutuhan.com/resources/views/pages/about.blade.php << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>{{ $title }}</title>
</head>
<body>
    <h1>{{ $title }}</h1>
    <p>{{ $description }}</p>
    <a href="/home-page">Home</a> | <a href="/contact">Contact</a>
</body>
</html>
EOF

# Buat view contact
cat > ~/laravel.anekakebutuhan.com/resources/views/pages/contact.blade.php << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>{{ $title }}</title>
</head>
<body>
    <h1>{{ $title }}</h1>
    <p>Hubungi kami di: admin@anekakebutuhan.com</p>
    <a href="/home-page">Home</a> | <a href="/about">About</a>
</body>
</html>
EOF

Setelah itu coba akses: - https://laravel.anekakebutuhan.com/home-page - https://laravel.anekakebutuhan.com/about - https://laravel.anekakebutuhan.com/contact

Kabari hasilnya! 👀

A: 🎉 Route & Controller & Blade View semua berjalan sempurna!

Kamu sudah memahami konsep dasar Laravel: - Route → mendefinisikan URL - Controller → logika/data - Blade View → tampilan HTML dengan variabel {{ $var }}


Ini alur yang terjadi saat akses /home-page:

Browser → Route (web.php) → PageController@home → view pages/home → HTML

Mau lanjut ke level berikutnya? Pilihan:

  1. Perbaiki tampilan — extend layout Breeze yang sudah ada supaya lebih rapi
  2. Lanjut ke Eloquent ORM — buat model, tabel, dan CRUD sederhana
  3. Route dengan parameter/user/{id}, /post/{slug} dll

Yang mana? 😄

Kita extend layout Breeze yang sudah ada. Lihat dulu struktur views yang ada:

ls ~/laravel.anekakebutuhan.com/resources/views/
ls ~/laravel.anekakebutuhan.com/resources/views/layouts/ 2>/dev/null
ls ~/laravel.anekakebutuhan.com/resources/views/components/ 2>/dev/null

Kabari hasilnya! 👀

A: Breeze sudah punya layout lengkap! Ada layouts/app.blade.php untuk halaman yang sudah login dan layouts/guest.blade.php untuk halaman publik.

Sekarang update ketiga view kita untuk extend layout Breeze:

# Update home.blade.php
cat > ~/laravel.anekakebutuhan.com/resources/views/pages/home.blade.php << 'EOF'
<x-guest-layout>
    <div class="mb-4 text-sm text-gray-600">
        <h1 class="text-2xl font-bold text-gray-800 mb-2">{{ $title }}</h1>
        <p>{{ $message }}</p>
    </div>
    <div class="flex gap-4 mt-4">
        <a href="/about" class="text-indigo-600 hover:underline">About</a>
        <a href="/contact" class="text-indigo-600 hover:underline">Contact</a>
    </div>
</x-guest-layout>
EOF

# Update about.blade.php
cat > ~/laravel.anekakebutuhan.com/resources/views/pages/about.blade.php << 'EOF'
<x-guest-layout>
    <div class="mb-4 text-sm text-gray-600">
        <h1 class="text-2xl font-bold text-gray-800 mb-2">{{ $title }}</h1>
        <p>{{ $description }}</p>
    </div>
    <div class="flex gap-4 mt-4">
        <a href="/home-page" class="text-indigo-600 hover:underline">Home</a>
        <a href="/contact" class="text-indigo-600 hover:underline">Contact</a>
    </div>
</x-guest-layout>
EOF

# Update contact.blade.php
cat > ~/laravel.anekakebutuhan.com/resources/views/pages/contact.blade.php << 'EOF'
<x-guest-layout>
    <div class="mb-4 text-sm text-gray-600">
        <h1 class="text-2xl font-bold text-gray-800 mb-2">{{ $title }}</h1>
        <p>Hubungi kami di: admin@anekakebutuhan.com</p>
    </div>
    <div class="flex gap-4 mt-4">
        <a href="/home-page" class="text-indigo-600 hover:underline">Home</a>
        <a href="/about" class="text-indigo-600 hover:underline">About</a>
    </div>
</x-guest-layout>
EOF

Coba akses ketiga URL tadi — tampilannya sekarang pakai styling Breeze/Tailwind! 👀

A: 🎉 Tampilan sudah pakai layout Breeze!

Semua halaman sekarang punya: - ✅ Logo Laravel di atas - ✅ Card putih dengan shadow - ✅ Background abu-abu Tailwind - ✅ Link berwarna indigo

Tampilannya konsisten dengan halaman login/register Breeze!


Mau lanjut ke mana sekarang?

  1. Eloquent ORM — buat model, tabel, CRUD sederhana
  2. Route dengan parameter/post/{id}, /user/{slug}
  3. Layout app.blade.php — halaman dengan navbar (khusus user yang sudah login)

A: Kita buat model dan tabel baru. Jalankan:

cd ~/laravel.anekakebutuhan.com

# Buat model Post sekaligus migration-nya
php artisan make:model Post -m

Kabari hasilnya! 👀

A: Model dan migration berhasil dibuat! Sekarang edit migration untuk tambah kolom:

cat > ~/laravel.anekakebutuhan.com/database/migrations/2026_05_12_034805_create_posts_table.php << 'EOF'
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->string('author')->default('Admin');
            $table->boolean('is_published')->default(false);
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
EOF

Lalu jalankan migration:

php artisan migrate

Kabari hasilnya! 👀

A: Tabel posts berhasil dibuat! Sekarang edit model Post:

cat > ~/laravel.anekakebutuhan.com/app/Models/Post.php << 'EOF'
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = [
        'title',
        'content', 
        'author',
        'is_published',
    ];

    protected $casts = [
        'is_published' => 'boolean',
    ];
}
EOF

Lalu isi tabel dengan data dummy via Tinker:

php artisan tinker --execute="
App\Models\Post::insert([
    ['title' => 'Post Pertama', 'content' => 'Ini konten post pertama.', 'author' => 'Budi', 'is_published' => true, 'created_at' => now(), 'updated_at' => now()],
    ['title' => 'Post Kedua', 'content' => 'Ini konten post kedua.', 'author' => 'Siti', 'is_published' => true, 'created_at' => now(), 'updated_at' => now()],
    ['title' => 'Draft Post', 'content' => 'Ini masih draft.', 'author' => 'Budi', 'is_published' => false, 'created_at' => now(), 'updated_at' => now()],
]);
echo 'Done!';
"

Kabari hasilnya! 👀

A: Data berhasil dimasukkan! (warning stat on filename itu tidak berbahaya, hanya quirk dari cPanel). ✅

Sekarang buat controller untuk Post:

php artisan make:controller PostController

Lalu isi:

cat > ~/laravel.anekakebutuhan.com/app/Http/Controllers/PostController.php << 'EOF'
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    // Tampilkan semua post yang published
    public function index()
    {
        $posts = Post::where('is_published', true)->latest()->get();
        return view('posts.index', compact('posts'));
    }

    // Tampilkan detail satu post
    public function show($id)
    {
        $post = Post::findOrFail($id);
        return view('posts.show', compact('post'));
    }
}
EOF

Tambah route:

cat >> ~/laravel.anekakebutuhan.com/routes/web.php << 'EOF'

// Routes Post
Route::get('/posts', [App\Http\Controllers\PostController::class, 'index']);
Route::get('/posts/{id}', [App\Http\Controllers\PostController::class, 'show']);
EOF

Kabari hasilnya! 👀

A: Sekarang buat view untuk posts:

# Buat folder posts
mkdir -p ~/laravel.anekakebutuhan.com/resources/views/posts

# Buat view index
cat > ~/laravel.anekakebutuhan.com/resources/views/posts/index.blade.php << 'EOF'
<x-guest-layout>
    <h1 class="text-2xl font-bold text-gray-800 mb-4">Daftar Post</h1>

    @foreach($posts as $post)
    <div class="mb-4 p-4 bg-white rounded shadow">
        <h2 class="text-lg font-semibold">{{ $post->title }}</h2>
        <p class="text-sm text-gray-500">oleh {{ $post->author }} · {{ $post->created_at->diffForHumans() }}</p>
        <p class="text-gray-600 mt-2">{{ Str::limit($post->content, 100) }}</p>
        <a href="/posts/{{ $post->id }}" class="text-indigo-600 hover:underline text-sm mt-2 inline-block">Baca selengkapnya →</a>
    </div>
    @endforeach
</x-guest-layout>
EOF

# Buat view show
cat > ~/laravel.anekakebutuhan.com/resources/views/posts/show.blade.php << 'EOF'
<x-guest-layout>
    <a href="/posts" class="text-indigo-600 hover:underline text-sm">← Kembali</a>

    <div class="mt-4">
        <h1 class="text-2xl font-bold text-gray-800">{{ $post->title }}</h1>
        <p class="text-sm text-gray-500 mt-1">oleh {{ $post->author }} · {{ $post->created_at->diffForHumans() }}</p>
        <div class="mt-4 text-gray-700">{{ $post->content }}</div>
    </div>
</x-guest-layout>
EOF

Coba akses: - https://laravel.anekakebutuhan.com/posts - https://laravel.anekakebutuhan.com/posts/1

Kabari hasilnya! 👀

A: 🎉 Eloquent ORM berjalan sempurna!

Yang sudah berhasil: - ✅ Model Post dengan $fillable dan $casts - ✅ Migration & tabel MySQL - ✅ Query where, latest(), get() - ✅ findOrFail() untuk detail - ✅ diffForHumans() untuk timestamp - ✅ Str::limit() untuk truncate teks - ✅ Draft post tidak tampil (filter is_published)


Kamu sudah kuasai konsep inti Laravel:

Route → Controller → Model (Eloquent) → View (Blade)

Mau lanjut ke mana?

  1. CRUD lengkap — tambah form Create, Edit, Delete post
  2. Route parameter/posts/{slug} pakai slug bukan ID
  3. Layout app.blade.php — halaman dengan navbar untuk user login
  4. Seeder & Factory — generate data dummy otomatis

A: Kita buat CRUD lengkap. Mulai dari controller dulu — update PostController dengan method tambahan:

cat > ~/laravel.anekakebutuhan.com/app/Http/Controllers/PostController.php << 'EOF'
<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        $posts = Post::latest()->get();
        return view('posts.index', compact('posts'));
    }

    public function create()
    {
        return view('posts.create');
    }

    public function store(Request $request)
    {
        $request->validate([
            'title'   => 'required|min:3',
            'content' => 'required|min:10',
            'author'  => 'required',
        ]);

        Post::create([
            'title'        => $request->title,
            'content'      => $request->content,
            'author'       => $request->author,
            'is_published' => $request->has('is_published'),
        ]);

        return redirect('/posts')->with('success', 'Post berhasil dibuat!');
    }

    public function show($id)
    {
        $post = Post::findOrFail($id);
        return view('posts.show', compact('post'));
    }

    public function edit($id)
    {
        $post = Post::findOrFail($id);
        return view('posts.edit', compact('post'));
    }

    public function update(Request $request, $id)
    {
        $request->validate([
            'title'   => 'required|min:3',
            'content' => 'required|min:10',
            'author'  => 'required',
        ]);

        $post = Post::findOrFail($id);
        $post->update([
            'title'        => $request->title,
            'content'      => $request->content,
            'author'       => $request->author,
            'is_published' => $request->has('is_published'),
        ]);

        return redirect('/posts')->with('success', 'Post berhasil diupdate!');
    }

    public function destroy($id)
    {
        $post = Post::findOrFail($id);
        $post->delete();
        return redirect('/posts')->with('success', 'Post berhasil dihapus!');
    }
}
EOF

Update routes:

# Hapus routes post lama, ganti dengan resource route
php artisan tinker --execute="
\$content = file_get_contents('routes/web.php');
\$content = preg_replace('/\/\/ Routes Post.*$/s', '// Routes Post
Route::resource(\'posts\', App\Http\Controllers\PostController::class);', \$content);
file_put_contents('routes/web.php', \$content);
echo 'Done!';
"

Kabari hasilnya! 👀

A: Berhasil! Sekarang buat semua view CRUD: !!! full !!!