Paket 2 · Praktik LanjutanModul C — Production Deployment

Automated Deployment

Mengotomasi deployment dari pipeline ke server: SSH, Compose, migrasi, health check, dan rollback yang terkontrol.

Deployment otomatis mengurangi kesalahan manual dan mempercepat rilis. Kuncinya adalah langkah yang idempotent, artefak yang jelas, dan rollback yang teruji.

Prinsip deployment otomatis

  • Satu perintah atau pipeline untuk deploy.
  • Artefak immutable (image/tag).
  • Konfigurasi dipisahkan dari kode.
  • Health check setelah deploy.
  • Rollback tersedia.
  • Semua langkah tercatat.

Pola deployment

PolaCaraCocok untuk
SSH + ComposePipeline SSH ke server lalu docker compose up -dServer tunggal
Pull-based agentServer menarik image/konfigurasiJaringan tertutup
OrchestratorKubernetes/Argo CDSkala besar
Platform PaaSDeploy via APITim kecil

Contoh deploy via SSH

#!/usr/bin/env bash
set -euo pipefail

APP_DIR=/srv/app
IMAGE_TAG="${1:?IMAGE_TAG wajib}"

cd "$APP_DIR"
export IMAGE_TAG

docker compose pull
docker compose up -d --remove-orphans

for i in $(seq 1 30); do
  if curl -fsS http://127.0.0.1:3000/health >/dev/null; then
    echo "Health check OK"
    exit 0
  fi
  sleep 2
done

echo "Health check gagal, rollback"
export IMAGE_TAG="${PREVIOUS_TAG:?}"
docker compose up -d
exit 1

Simpan PREVIOUS_TAG sebelum deploy agar rollback otomatis mungkin.

Deploy dengan Docker Compose

services:
  app:
    image: ghcr.io/org/app:${IMAGE_TAG}
    restart: unless-stopped
    env_file: .env
    ports:
      - "127.0.0.1:3000:3000"
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:3000/health"]
      interval: 10s
      timeout: 3s
      retries: 5

Pipeline hanya perlu mengubah IMAGE_TAG.

Migrasi database

Migrasi adalah bagian paling berisiko. Aturan aman:

  1. Backup sebelum migrasi.
  2. Migrasi backward compatible.
  3. Jalankan migrasi sebelum aplikasi baru aktif.
  4. Jangan hapus kolom langsung; lakukan bertahap.
  5. Uji migrasi di staging dengan data mirip produksi.
npm run migrate

Migrasi yang tidak kompatibel menyebabkan downtime

Jika kode lama masih berjalan saat kolom dihapus, aplikasi bisa error. Gunakan pola expand-contract: tambah dulu, migrasikan data, baru hapus setelah semua instance baru.

Konfigurasi dan rahasia

  • Simpan .env di server dengan permission 600.
  • Gunakan secret CI untuk kredensial deploy.
  • Jangan menaruh secret di image atau repository.
  • Bedakan konfigurasi staging dan production.

Health check

JenisContoh
LivenessProses masih hidup
ReadinessSiap menerima trafik
Deep checkDatabase/cache terhubung

Endpoint sederhana:

app.get('/health', (req, res) => {
  res.status(200).json({ status: 'ok' });
});

Rollback

export IMAGE_TAG=git-<sha-sebelumnya>
docker compose pull
docker compose up -d
curl -f http://127.0.0.1:3000/health

Rollback database lebih rumit. Karena itu, migrasi harus kompatibel dan backup harus tersedia.

Notifikasi

Kirim hasil deploy ke Slack/Telegram:

curl -X POST "$WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -d "{\"text\":\"Deploy $IMAGE_TAG selesai\"}"

Sertakan status, versi, dan tautan pipeline.

Praktik: pipeline deploy minimal

  1. CI membangun dan push image bertag SHA.
  2. Pipeline memanggil skrip deploy di server.
  3. Skrip menyimpan tag aktif sebelumnya.
  4. Pull image baru dan jalankan Compose.
  5. Tunggu health check.
  6. Jika gagal, rollback ke tag sebelumnya.
  7. Kirim notifikasi dan catat log.

Ringkasan

  • Deployment otomatis harus idempotent dan memakai artefak immutable.
  • Health check menentukan berhasil/gagal.
  • Migrasi database harus backward compatible.
  • Rollback harus disiapkan sebelum dibutuhkan.

Selanjutnya

Pilih cara rilis di Deployment Strategy.

On this page