Blue-Green vs Canary Deployment dengan Budget Terbatas (Tanpa Kubernetes)

Foto oleh Albert Stoynov

Foto oleh Albert Stoynov
Kebanyakan artikel tentang strategi deployment mengasumsikan Anda punya Kubernetes, Istio, dan tim platform. Kebanyakan tim yang saya tangani punya dua atau tiga developer, beberapa VPS, nginx, dan Docker. Kabar baik yang jarang disampaikan: blue-green dan canary deployment adalah pola routing, bukan fitur Kubernetes. Semua yang Anda butuhkan untuk menjalankan keduanya dengan aman sudah ada di nginx dan Docker Compose yang Anda operasikan sekarang.
Saya sudah merilis kedua pola ini untuk klien SMB Indonesia dan di box Docker Swarm saya sendiri. Di artikel ini saya akan mendefinisikan tiap strategi dengan presisi, menunjukkan implementasi minimal yang bekerja di satu VPS, membandingkan keduanya pada kriteria yang benar-benar penting di skala kecil — biaya, kecepatan rollback, dan kebutuhan observability — dan memberi Anda aturan keputusan yang muat di selembar sticky note.
Blue-green
Jalankan dua environment identik. Blue melayani semua traffic sementara Anda deploy dan smoke-test green secara privat. Cutover adalah satu perubahan router yang mengirim 100 persen traffic ke green; rollback adalah memindahkannya kembali. Martin Fowler mendokumentasikan pola ini jauh sebelum container orchestrator ada.
Canary
Deploy versi baru di samping yang lama, arahkan irisan kecil user nyata ke sana, pantau error rate dan latency, lalu lebarkan irisannya bertahap sampai versi lama terkuras. Rollback adalah mengarahkan irisan itu kembali ke versi stabil. Risiko dikurangi lewat kontrol paparan, bukan lewat saklar instan.
Perhatikan kesamaan kedua definisi: dua versi berjalan bersamaan dan sebuah router yang memutuskan siapa melihat apa. Router itu tidak harus service mesh. Dengan budget terbatas, ia adalah nginx dengan blok upstream — dan persis itulah implementasi yang akan kita bangun.
Blue-green minimal saya adalah dua proyek Docker Compose, app-blue di port 3001 dan app-green di port 3002, di belakang satu upstream nginx. Script deploy-nya cukup pendek untuk dibaca utuh:
# Two compose projects, one nginx upstream
# /etc/nginx/conf.d/app-upstream.conf
upstream app_backend {
server 127.0.0.1:3001; # blue (live)
# server 127.0.0.1:3002; # green (idle)
}
# deploy.sh — the whole "platform"
docker compose -p app-green up -d --build # start new version on :3002
./smoke-test.sh http://127.0.0.1:3002 # verify before any user sees it
sed -i 's/3001/3002/' /etc/nginx/conf.d/app-upstream.conf
nginx -t && nginx -s reload # atomic cutover
docker compose -p app-blue stop # keep it around for rollbackTiga properti membuat ini sepadan dengan RAM ekstra yang sederhana untuk menjalankan dua instance aplikasi sebentar:
Canary release terdengar seperti butuh traffic splitting milik Istio, padahal nginx sudah membawa weighted load balancing selama dua dekade. Layout dua-instance yang sama berubah jadi canary dengan satu directive:
# Weighted canary with plain nginx — no service mesh
upstream app_backend {
server 127.0.0.1:3001 weight=9; # stable: 90% of traffic
server 127.0.0.1:3002 weight=1; # canary: 10% of traffic
}
# promote by shifting weights: 9/1 -> 5/5 -> 0/1
# rollback = comment out the canary line and reloadPromosi berarti mengedit weight dan reload: biasanya saya pakai 10 persen selama sejam, 50 persen beberapa jam, lalu 100. Jebakan yang jarang disebut: weighted canary hanya sebagus kemampuan Anda membandingkan dua versi. Kalau Anda tidak bisa membedakan error canary dari error stabil, Anda bukan sedang canary — Anda sedang berjudi pelan-pelan. Saya melabeli metrik dan log berdasarkan port upstream di Prometheus dan Loki sehingga perbandingannya jadi satu panel Grafana: error rate dan latency p95, stabil versus canary, berdampingan.
Sticky session adalah bug canary klasik tim kecil: dengan weight round-robin polos, user yang sama bisa memantul antar versi di setiap request. Kalau aplikasi Anda menyimpan state sesi di server atau hash frontend berbeda per versi, tambahkan ip_hash atau sticky cookie supaya tiap user konsisten melihat satu versi selama rollout.
Kedua pola mengalahkan deploy-sambil-berdoa. Bedanya ada di apa yang mereka minta dari Anda dan dari monitoring Anda:
| Kriteria | Blue-green | Canary |
|---|---|---|
| Infrastruktur ekstra | Environment kedua hanya saat deploy; blue bisa dihentikan setelah masa soak. | Kedua versi berjalan sepanjang jendela rollout, berjam-jam sampai berhari-hari. |
| Kecepatan rollback | Hitungan detik — satu edit upstream dan reload. | Hitungan detik untuk irisan canary; user terdampak terbatas pada irisan sejak awal. |
| Radius ledakan deploy buruk | Semua orang, seketika, sampai Anda memindahkan kembali. | Hanya persentase canary — 10 persen user pada weight 10 persen. |
| Monitoring yang dibutuhkan | Smoke test dan uptime check dasar sudah cukup. | Metrik error dan latency per versi, atau seluruh latihan ini cuma teater. |
| Paling cocok untuk | Mayoritas rilis tim kecil; perubahan yang terikat skema; tim tanpa metrik per versi. | Perubahan berisiko di service ramai: penulisan ulang query, upgrade runtime, alur pembayaran. |
Kedua strategi menempatkan dua versi aplikasi pada satu database, jadi skemanya harus mendukung keduanya sekaligus. Saran Fowler lahir sebelum Kubernetes dan tetap mengalahkan semua tool: pisahkan perubahan skema dari deploy kode dengan expand-and-contract. Urutannya mekanis:
Pro tip: latih rollback-nya, bukan cuma deploy-nya. Sekali per kuartal saya memindahkan production kembali ke versi sebelumnya selama lima menit di jendela sepi. Latihan pertama menemukan port hardcoded di sebuah health check yang akan mengubah rollback bersih menjadi outage 20 menit saat insiden sungguhan.
Keamanan deployment adalah properti dari routing dan disiplin Anda, bukan label harga orchestrator Anda. VPS 4 dolar yang menjalankan nginx di depan dua proyek Compose memberi jaminan fundamental yang sama dengan yang dibeli perusahaan lewat service mesh: cutover tanpa downtime, rollback instan, dan paparan terkontrol.
Mulailah dengan script blue-green di atas — itu kerja satu sore termasuk smoke test-nya. Tambahkan weighted canary di hari Anda merilis sesuatu yang sungguh menakutkan. Dan apa pun pilihan Anda, lakukan tarian expand-and-contract di database, karena di sanalah strategi deployment benar-benar gagal.
Sumber dan bacaan lanjutan