Posted in

Installation Multiple Haproxy Server using Keepalived and Git

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

Leave a Reply

Your email address will not be published. Required fields are marked *