Menyatukan storage dengan alur deployment modern: pipeline CI/CD untuk image Laravel, GitOps dengan Argo CD/Flux untuk manifest aplikasi dan database, job migrasi sebagai gerbang deploy, dan injeksi secret via External Secrets Operator.

Storage kita sudah andal, dimonitor, dan bisa di-maintenance (episode 17-22). Episode 23 menutup lingkaran dengan alur pengiriman: bagaimana aplikasi + database dikelola secara modern lewat CI/CD dan GitOps.
Mengapa penting? Storage yang hebat tidak berharga jika deployment aplikasi manual dan rawan salah. GitOps menjadikan seluruh konfigurasi — termausk volume, StorageClass, dan StatefulSet DB — sebagai kode yang di-version control, ter-review, dan otomatis disinkronkan ke cluster.
Alur pipeline (GitHub Actions/GitLab CI) yang umum:
# contoh pipeline (GitHub Actions) — hanya bagian inti
jobs:
deploy:
steps:
- run: docker build -t ghcr.io/org/laravel-app:${{ github.sha }} .
- run: docker push ghcr.io/org/laravel-app:${{ github.sha }}
- run: ./update-manifest.sh ${{ github.sha }}StatefulSet database (episode 6) tidak berubah setiap deploy. Image DB diganti hanya saat upgrade PostgreSQL versi/patch — dan itu pun melalui proses review yang hati-hati. Jangan ikut-ikut "redeploy semua" — database adalah komponen yang stabil.
Seluruh struktur environment ada di git:
gitops/
apps/
laravel/
deployment.yaml
service.yaml
configmap.yaml
stateful-db/
postgres-sts.yaml
postgres-svc.yaml
storage/
storageclass-longhorn-ha.yaml
pvc-postgres.yamlArgo CD/Flux memantau repo:
kubectl edit manual, GitOps mengembalikan.apps/, db/, storage/ dengan perannya masing-masing.allowVolumeExpansion di StorageClass dikelola di repo — jadi tidak mudah diubah.Urutan yang benar saat ada perubahan migrasi schema:
PR deploy →
1. Job `php artisan migrate --force` (terapkan schema)
2. Sukses → rollout Deployment Laravel
3. Gagal → abort (jangan lanjut)Di Argo CD, kalian bisa memakai PreSync hook untuk menjalankan migrasi dan menghentikan sync jika gagal:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: laravel
spec:
syncPolicy:
automated: {}
# Job migrate sebagai PreSync hook (merupakan resource di repo)Plikasi praktis: Job dijalankan sebelum rollout; jika exit code non-zero, sync gagal total. Ini mencegah aplikasi baru berjalan di schema lama (atau gagal total karena schema belum ada).
Jangan menaruh DB password & APP_KEY langsung di manifest. Integrasikan store rahasia:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: db-secret
spec:
secretStoreRef:
name: vault
kind: SecretStore
target:
name: db-secret # Secret di cluster yang dibuat otomatis
data:
- secretKey: username
remoteRef:
key: database/postgres
property: username
- secretKey: password
remoteRef:
key: database/postgres
property: passwordSetiap perubahan di vault otomatis mensinkronkan Secret — rotasi kredensial tanpa rollout.
Tip
Perlakukan StorageClass & manifest DB seperti kode aplikasi: tunduk pada PR review dan history git. Lindungi branch, beri approval untuk perubahan CRD storage — karena satu salah edit StorageClass bisa membuat semua PVC baru Pending.
Inti yang harus dibawa pulang:
migrate --force sebagai PreSync gate — gagal = stop deploy.Di episode 24 selanjutnya kita akan membahas backup automation & RTO/RPO drift — RecurringBackup CRD, integrasi Velero untuk resource + volume, mengukur RPO nyata, dan melakukan uji DR tahunan untuk membuktikan pemulihan. Sampai jumpa di episode 24!