🚀 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 Name | Value |
---|---|
STAGING_SERVER_HOST | IP server |
STAGING_SERVER_USER | tsw |
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:
- Ubah Git remote ke SSH:
git remote set-url origin git@github.com:username/repo.git
- 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
danbootstrap/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! 💪