Introduction
Pada tutorial ini kita akan melakukan setup multiple haproxy server menggunakan keepalived dan Git untuk maintenance konfigurasi dan versioning konfigurasi.
Untuk topology seperti dibawah ini

Preparation
Untuk persiapan haproxy yaitu
- 2 Nodes (1 master, 1 slave)
- IP Address untuk keepalived (sebagai ip utama untuk koneksi dari client ke haproxy)
- Repo git (github atau gitlab)
Installation
Instalasi Keepalived
Untuk instalasi keepalived bisa dilihat pada link berikut,
https://cygnenoir.net/install-keepalived-on-ubuntu-24-04/
Instalasi Haproxy
Untuk instalasi haproxy kita akan menggunakan haproxy versi 3.2 (LTS), dan dilakukan di ALL NODES
Install dependencies
sudo apt install software-properties-common git -y
add repository haproxy yang berasal dari vbernat
sudo add-apt-repository ppa:vbernat/haproxy-3.2 -y
Install haproxy
sudo apt install haproxy -y
Check version haproxy
sudo haproxy -v

Setup Git (haproxy_1)
Kita sudah menyediakan repository kosong pada git, kita akan menggunakan Private Access Token (PAT) untuk koneksi ke private repository.
Init git
sudo cd /etc/haproxy/
sudo git init --initial-branch=main
sudo git remote add origin <URL REPOSITORY>
sudo git add .
sudo git commit -m "Initial commit"
sudo git push --set-upstream origin main
Nanti kita ditanyakan username dan password, masukan saja PAT yang sudah dibuat.
Sekarang kita setup untuk store access token ke server. Kita akan membuat README.md
sudo git config credential.helper store
sudo echo "Test haproxy_1" > README.md
sudo git add .
sudo git commit -m "Add Readme.md"
sudo git push
Nanti kita diminta memasukan username dan password, setelah masukan username dan password, kita bisa cek akses ada di /root/.git-credentials
Setup GIT (haproxy_2)
Karena kita sudah init git pada haproxy_1, sekarang kita hapus folder /etc/haproxy (karena kita akan menggunakan folder config yang berasal dari git)
sudo rm -rf /etc/haproxy/
sudo git clone <URL REPO> /etc/haproxy/
Sekarang kita setup untuk store access token ke server
sudo cd /etc/haproxy/
sudo git config credential.helper store
sudo echo "Test haproxy_2" >> README.md
sudo git add .
sudo git commit -m "Add Readme.md"
sudo git push
GIT pada kedua server sudah dikonfigurasi, tahap selanjutnya automation.
Create Auto PULL Every minute (ALL Nodes)
Sekarang kita akan membuat auto pull git setiap menit, jadi kita akan menggunakan script bash untuk auto pull dan kemudian untuk auto pull kita akan menggunakan systemd (Recomended). Kita akan konfigurasi pada kedua haproxy tersebut
Script BASH
Membuat script bash pada /usr/local/bin/haproxy-update.sh
#!/bin/bash
set -e
cd /etc/haproxy || exit 1
# Fetch latest changes
git fetch origin
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse @{u})
if [ "$LOCAL" != "$REMOTE" ]; then
echo "$(date) - Updating HAProxy config..."
git pull origin main
# Validate config before reload
if haproxy -c -f /etc/haproxy/haproxy.cfg; then
systemctl reload haproxy
echo "$(date) - Reloaded HAProxy successfully."
else
echo "$(date) - ERROR: Config validation failed!"
fi
else
echo "$(date) - Config already up-to-date."
fi
Setelah itu berikan mod execution
sudo chmod +x /usr/local/bin/haproxy-update.sh
Timer using systemd
Buat service untuk haproxy-update
sudo nano /etc/systemd/system/haproxy-update.service
[Unit]
Description=Update HAProxy config from Git
[Service]
Type=oneshot
ExecStart=/usr/local/bin/haproxy-update.sh
Environment="HOME=/root"
WorkingDirectory=/etc/haproxy
Buat service untuk haproxy-timer
sudo nano /etc/systemd/system/haproxy-update.timer
Description=Periodic HAProxy config update
[Timer]
OnBootSec=1min
OnUnitActiveSec=1min
Persistent=true
[Install]
WantedBy=timers.target
Reload daemon dan enable service
sudo systemctl daemon-reload
sudo systemctl enable --now haproxy-update.timer
Untuk logs bisa kita check
sudo journalctl -u haproxy-update.service -f
Create Script PUSH every update config (ALL NODE)
Kita buat script push ini jika kita ingin ada perubahan config pada haproxy dan otomatis push ke git repo.
Buat script
sudo nano /usr/local/bin/haproxy-push
#!/bin/bash
set -e
cd /etc/haproxy || exit 1
# Fetch latest changes
git fetch origin
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse @{u})
COMMIT_MSG="Auto-sync from $(hostname) on $(date '+%Y-%m-%d %H:%M:%S')"
###if [ "$LOCAL" != "$REMOTE" ]; then
if ! git diff --quiet || ! git diff --cached --quiet; then
echo "Local changes detected committing to Git..."
echo "$(date) - Updating HAProxy config..."
git add -A
git commit -m "$COMMIT_MSG"
git push origin main
# Validate config before reload
if haproxy -c -f /etc/haproxy/haproxy.cfg; then
systemctl reload haproxy
echo "$(date) - Reloaded HAProxy successfully."
else
echo "$(date) - ERROR: Config validation failed!"
fi
else
echo "$(date) - Config already up-to-date."
fi
Tambahkan mod execution
sudo chmod +x /usr/local/bin/haproxy-push