Dokumentasi / Tahan satu VM mati

Aplikasi + database tetap jalan walau satu VM mati

Banyak aplikasi berjalan di satu VM: web dan PostgreSQL bersebelahan. Praktis, tetapi bila VM itu mati, pelanggan ikut berhenti. Panduan ini memindahkan aplikasi seperti itu ke dua VM yang saling menggantikan, tanpa mengubah kode aplikasi.

Hasil uji

Uji 30 September 2026 dengan aplikasi kasir (POS) sederhana yang menulis satu transaksi per detik ke PostgreSQL 18, mode tanpa kehilangan data. VM utama berisi web dan database utama, lalu dimatikan paksa (cabut listrik) saat transaksi berjalan:

KejadianHasil
VM A dimatikan paksaVM B melayani transaksi lagi setelah ±21 detik (database pindah ke B dan pengunjung diarahkan ke B, otomatis).
Transaksi yang sudah tersimpan0 hilang. Nomor urut total transaksi bersambung tanpa lompatan.
VM A dinyalakan lagiA bergabung sendiri sebagai cadangan database, pengunjung kembali ke A. Satu permintaan sempat lambat, tidak ada data hilang.

Selama ±21 detik itu kasir melihat galat dan perlu mengulang transaksi. Transaksi yang sudah dinyatakan berhasil tidak pernah hilang.

Susunan: 2 VM + 1 saksi kecil

VMIsiUkuran
AAplikasi web + PostgreSQL (utama)Seperti VM sekarang
BSalinan aplikasi web + PostgreSQL (cadangan yang selalu tersalin)Sama dengan A
C (saksi)Tanpa data. Hanya ikut memilih siapa utama, agar tidak pernah ada dua utama.Kecil (1 vCPU, 1 GB)

Langkah

1. Sambungkan VM ke Saka

Siapkan VM A dan B (dan C bila tidak memakai VM lama), lalu pasang agent Saka di tiap VM, termasuk VM lama. Lihat Mulai. Setiap VM butuh IP publik dan port UDP 51871 terbuka antar VM (Saka membukanya sendiri bila firewall dikelola Saka).

2. Buat klaster PostgreSQL

  1. Buka Database, tekan + Buat klaster database, pilih PostgreSQL.
  2. Server data: A dan B. Saksi: C.
  3. Mode: Tanpa kehilangan data (sinkron). Wajib untuk transaksi uang.
  4. Versi: samakan atau lebih baru dari PostgreSQL yang dipakai sekarang (bawaan 18).

Klaster biasanya siap dalam 1 sampai 5 menit; Anda dikabari lewat Telegram.

3. Pindahkan database lama

  1. Hentikan aplikasi lama agar tidak ada transaksi baru selama penyalinan (mis. saat toko tutup).
  2. Di halaman klaster, kartu Pindahkan database lama ke klaster: pilih VM lama, tempel alamat database lama seperti di konfigurasi aplikasinya, mis. postgresql://kasir:[email protected]:5432/kasir, lalu tekan Salin ke klaster.
  3. Saka menyalin semuanya (tabel, indeks, view, urutan nomor, ekstensi) dalam satu transaksi, lalu membandingkan jumlah baris setiap tabel. Hasil uji: 200.500 baris dalam 3 detik, jumlah sama persis.

4. Pasang aplikasi di A

  1. Buka Situs, Buat situs, Aplikasi dari Git, pilih server A. Repo dengan Dockerfile dipakai apa adanya; lihat Aplikasi dari Git.
  2. Di halaman klaster, kartu Sambungkan server aplikasi: pasang proxy di A. Proxy ini selalu menuju database utama, di VM mana pun ia berada.
  3. Isi variabel aplikasi DATABASE_URL dengan alamat proxy untuk kontainer, mis. postgresql://postgres:[email protected]:15432/kasir?sslmode=require (port tampil di kartu; tekan Tampilkan sandi untuk sandinya).
  4. Deploy, lalu buka aplikasinya dan pastikan data lama tampil.

Aplikasi harus menyambung ulang ke database bila koneksinya putus (hampir semua framework melakukannya: Rails, Laravel, Django, Prisma, node-postgres dengan pool). Tanpa itu aplikasi terus galat setelah database pindah sampai dimulai ulang.

5. Tambah lokasi kedua di B

  1. Di halaman aplikasi, kartu Dua lokasi, tekan Tambah lokasi kedua dan pilih B. B membangun commit yang sama dengan variabel yang sama; proxy database di B dipasang otomatis dengan port yang sama.
  2. Ubah DNS domain aplikasi menjadi CNAME ke alamat load balancer yang tampil di kartu (mis. lbxxxx.lb.saka.work). Domain tanpa awalan (mis. toko.com) butuh penyedia DNS yang mendukung CNAME flattening, mis. Cloudflare; atau pakai app.toko.com.
  3. HTTPS dibuat di kedua VM. Setiap deploy, rollback, dan perubahan variabel di A ikut diterapkan di B.

6. Uji sendiri (disarankan)

Di luar jam ramai, matikan VM A dari panel penyedia cloud. Dalam ±30 detik aplikasi terbuka lagi dari B dengan data lengkap. Nyalakan A kembali; A bergabung sendiri. Anda dikabari lewat Telegram di setiap langkah.

Yang perlu diketahui

Rincian teknis: Database terkelola dan Situs di dua lokasi.