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 ​