RS
RuangSyahrul
Tutorial
6 min read 1,135 words Updated April 28, 2026

CI/CD GitHub Actions ke Server Ubuntu: Deploy via SSH ke Production

Panduan CI/CD GitHub Actions deploy ke server Ubuntu via SSH: setup user deploy, SSH key + GitHub Secrets, deploy.sh, workflow deploy.yml, testing, dan troubleshooting.

CI/CD GitHub Actions ke Server Ubuntu: Deploy via SSH ke Production

CI/CD membantu proses deploy jadi konsisten karena update server bisa dijalankan otomatis dari workflow. Di artikel ini kita pakai metode SSH deploy: GitHub Actions login ke server Ubuntu, lalu menjalankan deploy script di folder aplikasi.

Target hasil: setiap ada push ke branch main, workflow akan test koneksi SSH, masuk ke server, pull kode terbaru, lalu menjalankan command deploy. Tidak perlu deploy manual dari laptop.

Alur yang Akan Dibuat

  1. Developer push kode ke branch main.
  2. GitHub Actions menjalankan workflow.
  3. Workflow login ke server Ubuntu menggunakan SSH key.
  4. Server menjalankan update repo dan command deploy.
  5. Aplikasi diperbarui tanpa deploy manual.

Persiapan

Kebutuhan Keterangan
Server Ubuntu 22.04/24.04 atau Debian-based server
Akses User sudo/root untuk setup awal
Repository Project sudah tersedia di GitHub
Git Server bisa pull repository dari GitHub
SSH Port SSH terbuka dari GitHub Actions runner ke server
Folder aplikasi Contoh: /var/www/myapp

1. Setup User Deploy di Server Ubuntu

Gunakan user khusus untuk deploy. Hindari deploy harian memakai root.

sudo adduser deploy
sudo usermod -aG www-data deploy
sudo mkdir -p /var/www/myapp
sudo chown -R deploy:www-data /var/www/myapp
sudo chmod -R 775 /var/www/myapp

Ganti /var/www/myapp sesuai lokasi aplikasi kamu.

2. Install Git di Server

sudo apt update
sudo apt install git -y

3. Clone Repository ke Server

Login sebagai user deploy, lalu clone repository ke folder aplikasi:

sudo su - deploy
cd /var/www/myapp
git clone https://github.com/USERNAME/NAMA-REPO.git .

Catatan: untuk private repository, gunakan deploy key atau token sesuai kebijakan repository. Untuk public repository, HTTPS biasa cukup.

4. Buat SSH Key untuk GitHub Actions

Buat SSH key dari komputer lokal. Key ini dipakai GitHub Actions untuk login ke server.

ssh-keygen -t ed25519 -C "github-actions-deploy" -f github-actions-deploy -N ""

File yang terbentuk:

  • github-actions-deploy = private key (simpan di GitHub Secrets)
  • github-actions-deploy.pub = public key (pasang di server)

Pasang public key ke server:

ssh-copy-id -i github-actions-deploy.pub deploy@IP_SERVER

Jika ssh-copy-id tidak tersedia, pasang manual:

cat github-actions-deploy.pub

# Di server:
sudo su - deploy
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

5. Test SSH dari Lokal

ssh -i github-actions-deploy deploy@IP_SERVER

Jika berhasil login tanpa password, SSH key sudah benar.

6. Tambahkan GitHub Secrets

Masuk ke repository GitHub, lalu buka:

Settings > Secrets and variables > Actions > New repository secret

Secret Name Isi
SSH_HOST IP atau domain server
SSH_PORT Port SSH, biasanya 22
SSH_USER deploy
SSH_PRIVATE_KEY Isi file private key github-actions-deploy
APP_DIR /var/www/myapp

Penting: jangan commit private key ke repository. Simpan private key hanya di GitHub Secrets.

7. Buat Script Deploy di Repository

Buat file deploy.sh di root repository agar command deploy mudah dibaca dan diubah.

#!/bin/bash
set -e

echo "Masuk ke folder aplikasi..."
cd "$APP_DIR"

echo "Ambil kode terbaru..."
git fetch origin main
git reset --hard origin/main

echo "Install dependency jika dibutuhkan..."
# Untuk Node.js:
# npm ci
# npm run build

# Untuk Laravel/PHP:
# composer install --no-dev --optimize-autoloader
# php artisan migrate --force
# php artisan config:cache
# php artisan route:cache
# php artisan view:cache

echo "Reload service jika diperlukan..."
# sudo systemctl reload nginx
# sudo systemctl reload php8.3-fpm

echo "Deploy selesai."

Beri permission execute, lalu push ke GitHub:

chmod +x deploy.sh
git add deploy.sh
git commit -m "Add deploy script"
git push origin main

8. Buat Workflow GitHub Actions

Buat file berikut di repository:

.github/workflows/deploy.yml

Isi workflow:

name: Deploy to Ubuntu Server

on:
  push:
    branches:
      - main
  workflow_dispatch:

concurrency:
  group: production-deploy
  cancel-in-progress: true

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup SSH key
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_HOST }}" >> ~/.ssh/known_hosts

      - name: Test SSH connection
        run: |
          ssh -i ~/.ssh/deploy_key -p "${{ secrets.SSH_PORT }}" \
            "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
            "echo 'SSH connection OK'"

      - name: Deploy application
        run: |
          ssh -i ~/.ssh/deploy_key -p "${{ secrets.SSH_PORT }}" \
            "${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
            "APP_DIR='${{ secrets.APP_DIR }}' bash -s" < deploy.sh

Kenapa ada workflow_dispatch?

  • Agar deploy bisa dites manual dari tab Actions tanpa membuat commit baru.

9. Cara Test CI/CD

  1. Push perubahan kecil ke branch main (misal update README.md).
  2. Buka tab Actions di repository GitHub.
  3. Klik workflow Deploy to Ubuntu Server.
  4. Pastikan step Test SSH connection berhasil.
  5. Pastikan step Deploy application selesai tanpa error.
  6. Cek folder aplikasi di server dan pastikan kode sudah berubah:
# Cek di server
cd /var/www/myapp
git log --oneline -1

Troubleshooting Cepat

Masalah Penyebab Umum Solusi Cepat
Permission denied (publickey) Public key belum terpasang atau private key salah Cek authorized_keys dan isi SSH_PRIVATE_KEY
Host key verification failed known_hosts belum berisi host server Pastikan ssh-keyscan berjalan di workflow
Could not resolve hostname SSH_HOST salah atau DNS gagal Gunakan IP server untuk testing
Port 22 timeout Firewall/security group memblokir SSH Buka port SSH atau gunakan self-hosted runner
git pull gagal Folder bukan repo atau permission salah Cek APP_DIR dan ownership folder
npm/composer not found Dependency belum terinstall di server Install Node.js/Composer sesuai stack aplikasi
Deploy sukses tapi web tidak berubah Build/cache/service belum direload Tambahkan build, cache clear, atau reload service

Rekomendasi Security

  • Gunakan user deploy, jangan root.
  • Batasi permission folder aplikasi.
  • Simpan SSH private key hanya di GitHub Secrets.
  • Gunakan environment production jika butuh approval sebelum deploy.
  • Gunakan branch main atau release branch khusus untuk production.
  • Aktifkan firewall dan hanya buka port yang dibutuhkan.
  • Untuk server private/internal, pertimbangkan self-hosted runner.

FAQ

Apakah server harus membuka SSH ke publik?

GitHub-hosted runner akan datang dari internet. Kalau server kamu private/internal, pertimbangkan self-hosted runner di jaringan yang sama dengan server, atau batasi akses SSH memakai firewall/allowlist sesuai kebutuhan.

Kenapa workflow perlu ssh-keyscan?

Ini untuk mengisi known_hosts agar koneksi SSH tidak gagal karena verifikasi host key. Jika host key berubah (misal reinstall server), kamu perlu update lagi.

Bolehkah pakai git pull вместо git reset --hard?

Bisa, tapi untuk deployment biasanya lebih aman pakai state yang persis sama dengan branch production (misal origin/main) agar tidak ada perubahan lokal yang mengganggu. Kalau kamu punya file runtime di server, pastikan tidak tersimpan di repo (gunakan .env, storage terpisah, dan permission yang benar).

Kesimpulan

Dengan GitHub Actions dan SSH, proses deploy ke server Ubuntu bisa dibuat lebih konsisten. Setiap push ke branch main dapat menjalankan workflow untuk login ke server, mengambil kode terbaru, menjalankan build/dependency install, lalu reload service jika diperlukan.

Untuk tahap awal, gunakan workflow ini sebagai versi sederhana yang mudah dites. Setelah stabil, kamu bisa menambahkan test otomatis, approval production, rollback, dan notifikasi deploy.

Referensi

Related Posts

Lihat semua

Discussion (0)

Leave a comment

No comments yet. Be the first to start the discussion!