Saat ini dalam pengujian: kode GitHub akan dibuka setelah selesai.

Penerapan Server Ticketing

Lingkungan
Shell
Mode
bash
Contoh koneksi klien
rust
Uji cepat dengan nc
bash

Environment Variable

Konfigurasi server dilakukan sepenuhnya lewat environment variable. Key tidak peduli huruf besar/kecil, nilai kosong dianggap tidak diset, dan nilai bertipe flag hanya bernilai true untuk 1/true/yes/on. Image Docker berbasis scratch, jadi konfigurasi disuntikkan murni lewat environment variable tanpa file konfigurasi.

Environment variableDefaultDeskripsi
PORT5225Port listen di mode single. Diabaikan di mode cluster, di mana port dari CLUSTER_SELF dipakai sebagai gantinya
SOCKET_BIND0.0.0.0Alamat listen
CLIENT_TOKENS(tidak ada)Daftar token auth klien dipisah koma. Jika tidak diset, token kosong diizinkan
CLUSTER_SELF(tidak ada)Alamat yang diiklankan node ini, host:port. Kehadirannya mengaktifkan mode cluster
CLUSTER_PEERS(tidak ada)Daftar alamat yang diiklankan semua node, dipisah koma. Persis 3 atau 5, urutan sama di setiap node, harus menyertakan self
CLUSTER_TOKENS(tidak ada)Daftar token auth antar-peer dipisah koma
TLS_CERT / TLS_KEY(tidak ada)Path file PEM sertifikat/private key — set keduanya bersamaan untuk mengaktifkan TLS
TLS_CA(tidak ada)CA untuk memverifikasi sertifikat peer — kembali ke system trust store jika tidak diset
TLS_SKIP_VERIFYfalseLewati verifikasi sertifikat peer — khusus test
DOCKERfalseMengunci port listen internal ke 5225/6225 di mode cluster — diset default di image resmi
DEBUGTergantung build1/true mengaktifkan logging debug

Untuk aturan lengkap (penurunan port, alamat yang diiklankan, rotasi token tanpa downtime, dll.) lihat Konfigurasi (Env Var).

Single vs. Cluster

  • Single (1 node): tanpa CLUSTER_*, node berjalan mandiri. Paling cepat, tapi ada blip singkat saat restart, dan status ada di in-memory sehingga hilang saat restart (lease adalah jaring pengamannya).
  • Cluster (non-stop): 3 atau 5 node. Node berbagi satu status lock lewat konsensus Raft — hanya leader yang menangani request, dan setiap perubahan status hanya difinalisasi setelah commit mayoritas. Jika leader mati, yang baru terpilih dalam 0,5-1 detik, dan selama mayoritas tetap hidup, status lock dan layanan terus berjalan. Lihat Cara Kerja dan Protokol (Cluster) untuk penjelasan lengkap.
  • Setiap node cluster listen di port klien ditambah port Raft (port klien + 1000) — buka kedua port di firewall kamu.

Deployment cluster Kubernetes memakai StatefulSet + headless Service. Beri setiap pod nama DNS yang stabil (ticketing-0.ticketing…, ticketing-1.ticketing…), masukkan nama-nama itu ke CLUSTER_PEERS, dan auto-inject CLUSTER_SELF tiap pod lewat downward API (metadata.name).

Restart Non-Stop (Rolling)

Ada satu aturan inti — mayoritas harus selalu tetap hidup (paling banyak 1 dari 3 mati sekaligus).

  1. Restart follower dulu, satu per satu. Setelah node yang di-restart mengejar lewat replikasi atau snapshot, lanjut ke node berikutnya.
  2. Terakhir, matikan leader — yang baru terpilih dalam 0,5-1 detik, dan klien beralih secara transparan.
  3. Menyalakan kembali node yang mati membuatnya bergabung sebagai follower.

Lihat Prosedur Rolling Restart untuk langkah-langkah detailnya.

Referensi