Skip to content

Auto Deploy Laravel via GitHub Actions (Tanpa Docker)

Ini adalah rangkuman lengkap tentang cara melakukan auto deploy Laravel menggunakan GitHub Actions tanpa Docker. Saya membuat ini dengan bantuan chatGPT, termasuk rangkuman yang akan kamu di bawah ini.

  • Laravel app ter-deploy otomatis setiap push ke branch prod

  • Server ringan (RAM 2GB), tidak menggunakan Docker

  • User deploy non-root, tanpa password

  • Aman dan terpisah antara:

    • SSH key untuk GitHub β†’ Server
    • SSH key untuk Server β†’ GitHub
  • Support multiple repository dengan key & remote berbeda


Terminal window
sudo adduser --disabled-password --gecos "" deploy

Ini membuat user deploy tanpa password login dan tanpa sudo secara default.


πŸ” 2. Setup SSH Key untuk GitHub Actions β†’ Server (akses SSH)

Section titled β€œπŸ” 2. Setup SSH Key untuk GitHub Actions β†’ Server (akses SSH)”
Terminal window
ssh-keygen -t ed25519 -f ~/.ssh/github_deploy_key -C "github-deploy"
  • Upload private key ke GitHub Repo:

    • Settings β†’ Secrets β†’ Actions β†’ SSH_PRIVATE_KEY
    • Value: isi dari github_deploy_key (private)
  • Tempatkan public key di server (user deploy):

Terminal window
sudo mkdir -p /home/deploy/.ssh
sudo nano /home/deploy/.ssh/authorized_keys
# Paste isi github_deploy_key.pub
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh

πŸ—οΈ 3. Setup SSH Key untuk Server β†’ GitHub (akses git pull)

Section titled β€œπŸ—οΈ 3. Setup SSH Key untuk Server β†’ GitHub (akses git pull)”
Terminal window
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_repo_x -C "server-github"
chmod 600 ~/.ssh/id_ed25519_repo_x
  • Tambahkan public key id_ed25519_repo_x.pub ke GitHub repo:

    Repo β†’ Settings β†’ Deploy Keys β†’ Add Deploy Key βœ… Centang Allow write access jika perlu


βš™οΈ 4. Konfigurasi SSH Client (~/.ssh/config) untuk Multi Repo

Section titled β€œβš™οΈ 4. Konfigurasi SSH Client (~/.ssh/config) untuk Multi Repo”
# Repo 1
Host repo.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_repo
IdentitiesOnly yes

Bisa ditambahkan lagi untuk repo lain:

# Repo Kasir
Host kasir.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_kasir
IdentitiesOnly yes

Terminal window
cd /var/www/your-repo
git remote set-url origin git@your-repo:username/repo.git

your-repo adalah nama repomu bisa akan dibuat alias untuk remote ssh.

Harus sesuai dengan Host di SSH config

Verifikasi:

Terminal window
git remote -v

Terminal window
ssh-keyscan github.com >> ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts

Diperlukan agar git pull tidak gagal karena fingerprint unknown.


πŸ“‚ 7. Atur Akses Folder Laravel untuk User deploy

Section titled β€œπŸ“‚ 7. Atur Akses Folder Laravel untuk User deploy”
Terminal window
sudo chown -R deploy:www-data /var/www/your-laravel-project
sudo chmod -R ug+rw /var/www/your-laravel-project
sudo find /var/www/your-laravel-project -type d -exec chmod 775 {} \;

πŸ”’ 8. Izinkan deploy Restart Queue via supervisorctl (Tanpa Password)

Section titled β€œπŸ”’ 8. Izinkan deploy Restart Queue via supervisorctl (Tanpa Password)”
Terminal window
sudo visudo

Tambahkan:

Terminal window
deploy ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl restart queue-all

Secret NameValue
SSH_PRIVATE_KEYPrivate key dari github_deploy_key
DEPLOY_SERVER_USERdeploy
DEPLOY_SERVER_IPIP server kamu
DEPLOY_APP_PATH/var/www/your-laravel-project

πŸš€ 10. GitHub Actions Workflow: .github/workflows/deploy-prod.yml

Section titled β€œπŸš€ 10. GitHub Actions Workflow: .github/workflows/deploy-prod.yml”
name: Deploy Laravel to Production
on:
push:
branches:
- prod
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: πŸ“₯ Checkout Repo
uses: actions/checkout@v3
- name: πŸ” Setup SSH Key
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: πŸ“‘ Add known hosts
run: |
ssh-keyscan -H ${{ secrets.DEPLOY_SERVER_IP }} >> ~/.ssh/known_hosts
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
- name: πŸš€ Deploy to Server
run: |
ssh ${{ secrets.DEPLOY_SERVER_USER }}@${{ secrets.DEPLOY_SERVER_IP }} << 'EOF'
ssh-keyscan github.com >> ~/.ssh/known_hosts
cd ${{ secrets.DEPLOY_APP_PATH }}
git pull origin prod
composer install --no-dev --optimize-autoloader
pnpm install
pnpm build
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
sudo /usr/bin/supervisorctl restart queue-all
echo "βœ… Deployment complete!"
EOF

  • Jalankan:
Terminal window
ssh -T github-repo-x
  • Jalankan:
Terminal window
git pull origin prod
  • Push ke branch prod di GitHub β†’ βœ… GitHub Actions auto-deploy Laravel app ke server

ItemStatus
Laravel deployed otomatisβœ…
Tidak pakai Dockerβœ…
Multi repository supportβœ…
Aman dengan SSH key terpisahβœ…
Non-root user deployβœ…
Supervisor queue restartβœ