🚀 Auto-Deploy Laravel ke Server via GitHub Actions



Auto-deploy adalah solusi efisien untuk mempercepat proses deployment Laravel ke server tanpa perlu SSH manual. Berikut ini dokumentasi lengkap yang saya gunakan untuk deploy otomatis ke server DigitalOcean (Ubuntu + Nginx + PHP-FPM) dengan GitHub Actions.


🧱 Stack & Struktur

  • Laravel sebagai backend framework
  • GitHub Actions untuk CI/CD
  • DigitalOcean VPS (Ubuntu)
  • PHP-FPM + Nginx sebagai web server
  • SSH Key Auth (tanpa password)
  • Supervisor untuk queue & schedule

🧩 1. Generate SSH Key untuk Auto-Deploy

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -C "auto-deploy" -N ""

Ini akan menghasilkan:

  • deploy_key (private key)
  • deploy_key.pub (public key)

📤 2. Tambahkan Public Key ke Server

cat ~/.ssh/deploy_key.pub | ssh tsw@your-server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Pastikan SSH bisa dilakukan tanpa password:

ssh -i ~/.ssh/deploy_key tsw@your-server-ip

🔐 3. Tambahkan Secrets di GitHub

Masuk ke:

Repo > Settings > Secrets and variables > Actions > New repository secret
Secret NameValue
STAGING_SERVER_HOSTIP server
STAGING_SERVER_USERtsw
STAGING_SERVER_SSH_KEY(isi dari deploy_key)

⚙️ 4. Setup Workflow GitHub Actions

Buat file: .github/workflows/deploy.yml

name: Deploy Laravel to Server

on:
  push:
    branches:
      - staging
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.STAGING_SERVER_HOST }}
          username: ${{ secrets.STAGING_SERVER_USER }}
          key: ${{ secrets.STAGING_SERVER_SSH_KEY }}
          script: |
            mkdir -p ~/.ssh
            ssh-keyscan github.com >> ~/.ssh/known_hosts

            cd /var/www/loan-staging

            git pull origin staging

            sudo chown -R tsw:tsw .
            sudo chmod -R ug+rw storage
            sudo chmod -R ug+rw bootstrap/cache

            composer install --no-interaction --prefer-dist --optimize-autoloader

            php artisan migrate --force
            php artisan config:cache
            php artisan route:cache

🧪 5. Test Push ke Staging

git add .
git commit -m "🚀 Setup auto-deploy staging"
git push origin staging

Lihat hasilnya di GitHub > Actions, pastikan semua step ✅ hijau.


🛠️ Fix: Permission Denied Setelah Ubah ke www-data

Saya sempat mengubah owner folder ke www-data:

sudo chown -R www-data:www-data storage bootstrap/cache

Ini menyebabkan error pada GitHub Actions karena user tsw tidak bisa akses file.

✅ Solusi:

sudo chown -R tsw:tsw /var/www/loan-staging
sudo chmod -R ug+rw storage
sudo chmod -R ug+rw bootstrap/cache

Atau, jika ingin www-data tetap bisa akses:

sudo usermod -a -G www-data tsw
sudo chown -R tsw:www-data /var/www/loan-staging
sudo chmod -R 775 /var/www/loan-staging

🔐 Fix Git SSH Error: Permission Denied

git@github.com: Permission denied (publickey)

✅ Solusi:

  1. Ubah Git remote ke SSH:
    git remote set-url origin git@github.com:username/repo.git
  2. Tambahkan GitHub ke known_hosts di server:
    ssh-keyscan github.com >> ~/.ssh/known_hosts

🧰 Tambahan: Supervisor Laravel Schedule

Buat file: /etc/supervisor/conf.d/laravel-schedule.conf

[program:laravel-schedule]
command=php /var/www/loan-staging/artisan schedule:run
user=tsw
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/schedule.log

Aktifkan Supervisor:


sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-schedule

✅ Kesimpulan

  • Gunakan user yang sama dengan SSH GitHub Actions (tsw)
  • Pastikan permission storage dan bootstrap/cache benar
  • Gunakan Git remote via SSH
  • Tambahkan GitHub ke known_hosts
  • Jangan pakai www-data penuh kecuali diperlukan

Dengan setup ini, setiap push ke staging atau main akan langsung di-deploy otomatis ke server. Siap lanjut ke deploy production, notifikasi Telegram, atau build frontend? Let’s go, kawan! 💪