Featured image of post Auto Deploy Laravel Ke Cpanel Dengan Github Actions

Auto Deploy Laravel Ke Cpanel Dengan Github Actions

Sekali setup, setiap push ke `main` langsung deploy otomatis, kita tidak perlu repot setup FTP, tidak perlu login cPanel manual lagi.

Shared hosting cPanel masih jadi pilihan banyak developer karena harganya terjangkau dan mudah dikelola. Masalahnya, proses deploy-nya biasanya manual - upload file lewat FTP atau File Manager satu per satu, lalu jalankan migration sendiri. Dengan GitHub Actions, semua itu bisa diotomatisasi. Setiap kali push ke branch main, server langsung pull code terbaru, install dependency, build assets, dan jalankan migration.

Baca juga artikel sebelumnya untuk tau Cara Deploy Web Laravel Ke Hosting Cpanel


TL;DR

  • Clone repo langsung ke folder public_html
  • Tambah .htaccess di root project supaya traffic diarahkan ke public/
  • Install Node.js via NVM di terminal cPanel
  • Generate SSH key di server, simpan private key ke GitHub Secrets
  • Buat file .github/workflows/deploy.yml, push, dan selesai

Step 1. Clone Project ke public_html

Buka cPanel → Terminal, lalu clone repo langsung ke folder public_html. Karena public_html adalah web root default domain, kita pakai folder ini sebagai project root Laravel.

1
2
3
4
cd ~
rm -rf public_html
git clone https://github.com/username/nama-repo.git public_html
cd ~/public_html

Tip: Backup dulu isi public_html kalau ada file penting di sana sebelum di-remove.


Step 1.1: tambahan jika repo yang digunakan adalah repo private

Jika repo yang digunakan adalah private, clone via HTTPS akan minta autentikasi. Cara paling proper di server adalah pakai SSH deploy key.

Generate SSH key di cPanel Terminal:

1
ssh-keygen -t ed25519 -C "cpanel-deploy-key" -f ~/.ssh/deploy_key

Tekan Enter saat diminta passphrase (biarkan kosong).

Tampilkan public key-nya:

1
cat ~/.ssh/deploy_key.pub

Copy seluruh output-nya.

Tambahkan ke GitHub:

  1. Buka repository GitHub → Settings → Deploy keys
  2. Klik Add deploy key
  3. Isi Title (contoh: cpanel-production)
  4. Paste public key tadi ke kolom Key
  5. Centang Allow write access jika diperlukan (untuk deployment biasanya tidak perlu)
  6. Klik Add key

Buat SSH config supaya git tahu pakai key mana:

~/.ssh/config

1
2
3
Host github.com
  IdentityFile ~/.ssh/deploy_key
  IdentitiesOnly yes
1
chmod 600 ~/.ssh/config

Sekarang clone pakai SSH URL, bukan HTTPS:

1
2
3
cd ~
rm -rf public_html
git clone [email protected]:username/nama-repo.git public_html

Tip: SSH URL ada di halaman repo GitHub → tombol Code → tab SSH.

Step 2. Setup .htaccess untuk Redirect ke public/

Laravel serve request dari subfolder public/, bukan dari root project. Buat file .htaccess di root public_html supaya semua traffic diarahkan ke sana — tanpa /public/ muncul di URL.

~/public_html/.htaccess

1
2
3
4
5
6
7
8
9
Options -MultiViews -Indexes
RewriteEngine On

RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^public/(.*)$ /public/$1 [L,QSA]

Step 3. Install Dependency dan Konfigurasi .env

Install Composer dependency, buat file .env, lalu generate application key dan jalankan migration.

1
2
3
4
cd ~/public_html
composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev
cp .env.example .env
nano .env

Isi bagian database di .env dengan kredensial dari cPanel. Perlu diingat, nama database dan username di cPanel selalu ada prefix sesuai nama akun cPanel-nya (contoh: myaccount_laraveldb).

1
2
3
php artisan key:generate
php artisan migrate --force
chmod -R 775 storage bootstrap/cache

Step 4. Install Node.js via NVM

Karena kita pakai Vite untuk build assets, kita perlu Node.js di server. Cara paling aman di shared hosting adalah lewat NVM.

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash

Versi diatas adalah versi paling baru saat artikel ini ditulis. untuk melihat versi nvm paling baru bisa cek dokumentasi di [nvm-sh/nvm]

Setelah install, load NVM ke shell dan install Node.js LTS:

1
2
3
4
5
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

nvm install --lts
nvm alias default 20

Supaya NVM tetap ter-load waktu GitHub Actions konek via SSH, tambahkan baris di atas ke ~/.bashrc dan source ~/.bashrc di ~/.bash_profile.

Step 5. Generate SSH Key dan Simpan ke GitHub Secrets

GitHub Actions butuh akses SSH ke server. Generate key pair di cPanel Terminal:

1
2
3
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions
cat ~/.ssh/github_actions.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys

Sebenarnya kita juga bisa menggunakan key yang sama yang dibuat pada Step 1.1 jika tidak ingin membuat key ssh yang berbeda

Tampilkan private key, lalu copy seluruh isinya termasuk baris -----BEGIN----- dan -----END-----:

1
cat ~/.ssh/github_actions

Buka repository GitHub → Settings → Secrets and variables → Actions, lalu tambahkan 5 secrets ini:

Secret Value
SSH_HOST IP atau hostname server
SSH_USERNAME Username cPanel
SSH_KEY Private key dari langkah di atas
SSH_PORT 22
PROJECT_PATH /home/cpaneluser/public_html

Step 6. Buat Workflow GitHub Actions

Di project lokal, buat file workflow-nya:

1
mkdir -p .github/workflows

.github/workflows/deploy.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
name: Deploy via remote SSH

on:
  push:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Execute remote SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            cd ${{ secrets.PROJECT_PATH }}
            git pull origin main
            composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev
            npm ci
            npm run build
            php artisan migrate --force
            php artisan optimize:clear
            php artisan config:cache
            php artisan route:cache
            php artisan view:cache
            php artisan event:cache
            echo "Deployment completed successfully!"            

Step 7. Push dan Verifikasi

Commit workflow-nya dan push ke main:

1
2
3
git add .github/workflows/deploy.yml
git commit -m "Add GitHub Actions auto-deploy workflow"
git push origin main

Push ini sendiri sudah langsung trigger deployment pertama. Pantau hasilnya di tab Actions di GitHub — setiap step akan muncul log-nya secara real-time.

Kalau semua step hijau, buka domain dan verifikasi. Mulai sekarang, setiap git push origin main = deploy otomatis ke server.

Troubleshooting Cepat

  • npm: command not found — NVM belum ter-load di SSH session. Tambahkan export NVM_DIR dan source NVM di awal blok script: di workflow.
  • Permission denied (publickey) — Cek ulang chmod 700 ~/.ssh dan chmod 600 ~/.ssh/authorized_keys.
  • Site 404 / directory listing — File .htaccess di ~/public_html belum ada atau isinya salah. Ulangi langkah 2.
  • Migration gagal — Cek prefix nama database dan username di .env, sesuaikan dengan nama akun cPanel.

Jika ada kendala lain, silakan tanyakan di komentar atau boleh juga hubungi saya :).


Setup ini memang butuh waktu di awal, tapi setelahnya workflow deploy jadi jauh lebih rapi. Tidak ada lagi upload manual, tidak ada lagi lupa jalankan migration. Semua jalan otomatis setiap kali kita push.

Selamat ngoding!

Dibangun dengan Hugo
Tema Stack dirancang oleh Jimmy