Disaster Recovery Cluster (DRC) WordPress dengan MariaDB Galera dan Load Balancer Caddy

Artikel ini membahas langkah-langkah membangun Disaster Recovery Cluster (DRC) untuk WordPress menggunakan MariaDB Galera Cluster dan Caddy sebagai reverse proxy serta HAProxy untuk load balancing database. Solusi ini menjamin ketersediaan tinggi (high availability) dan replikasi otomatis antar server. Meskipun studi kasus yang digunakan adalah WordPress, konfigurasi ini juga dapat diterapkan untuk Laravel, CodeIgniter, Next.js, Express.js, dan berbagai framework backend lainnya yang menggunakan MySQL/MariaDB sebagai database utama. 🧩✨😎
🖥️ Spesifikasi Server
- DRC-1 (Primary MariaDB + WordPress)
- IP:
103.168.146.70
- Hostname:
drc1.syslab.my.id
- Peran: Node Galera utama + container WordPress
- IP:
- DRC-2 (Secondary MariaDB + WordPress)
- IP:
103.168.146.71
- Hostname:
drc2.syslab.my.id
- Peran: Node Galera replikasi + container WordPress
- IP:
- CADDY-WEB-SERVER (Load Balancer Caddy + HAProxy)
- IP:
103.168.146.72
- Hostname:
caddy.syslab.my.id
- Peran: Load balancer Caddy untuk HTTP/HTTPS, dan HAProxy untuk koneksi database port 3306
- IP:
Domain: www.syslab.my.id
dan syslab.my.id
📦 Struktur Direktori
Contoh di setiap server ~/wordpress-drc/
:
wordpress-drc/
├── db
├── data
├── docker-compose.yml
└── wordpress
🔧 Langkah-langkah Lengkap Deployment
🔹 1. Siapkan Docker & Folder di Setiap Server
sudo apt update && sudo apt install docker.io docker-compose -y
mkdir -p ~/wordpress-drc/{db,data,wordpress}
cd ~/wordpress-drc
🔹 2. Konfigurasi DRC-1 (103.168.146.70)
📄 File: docker-compose.yml
services:
mariadb:
image: bitnami/mariadb-galera:latest
container_name: mariadb
restart: always
environment:
- MARIADB_ROOT_PASSWORD=PasswordKamu
- MARIADB_DATABASE=wordpress
- MARIADB_GALERA_CLUSTER_NAME=wp_cluster
- MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://103.168.146.70,103.168.146.71
- MARIADB_GALERA_NODE_NAME=drc1
- MARIADB_GALERA_NODE_ADDRESS=103.168.146.70
- MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes
volumes:
- ./db:/bitnami/mariadb
network_mode: host
wordpress:
image: masdika/wordpress:latest
container_name: wp
restart: always
environment:
- WORDPRESS_DB_HOST=103.168.146.72
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=PasswordKamu
volumes:
- ./wordpress:/bitnami/wordpress
network_mode: host
🔹 3. Konfigurasi DRC-2 (103.168.146.71)
📄 File: docker-compose.yml
services:
mariadb:
image: bitnami/mariadb-galera:latest
container_name: mariadb
restart: always
environment:
- MARIADB_ROOT_PASSWORD=PasswordKamu
- MARIADB_DATABASE=wordpress
- MARIADB_GALERA_CLUSTER_NAME=wp_cluster
- MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://103.168.146.70,103.168.146.71
- MARIADB_GALERA_NODE_NAME=drc2
- MARIADB_GALERA_NODE_ADDRESS=103.168.146.71
- MARIADB_GALERA_CLUSTER_BOOTSTRAP=no
volumes:
- ./db:/bitnami/mariadb
network_mode: host
wordpress:
image: masdika/wordpress:latest
container_name: wp
restart: always
environment:
- WORDPRESS_DB_HOST=103.168.146.72
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=PasswordKamu
volumes:
- ./wordpress:/bitnami/wordpress
network_mode: host
🔹 4. Konfigurasi Load Balancer CADDY + HAProxy (103.168.146.72)
📄 File: Caddyfile
syslab.my.id, www.syslab.my.id {
reverse_proxy 103.168.146.70:80 103.168.146.71:80 {
lb_policy random
health_interval 10s
health_timeout 5s
health_body "<title>WordPress</title>"
}
}
📄 File: haproxy.cfg
global
log stdout format raw local0
defaults
log global
mode tcp
option tcplog
timeout connect 5s
timeout client 50s
timeout server 50s
frontend mysql_front
bind *:3306
default_backend mysql_back
backend mysql_back
mode tcp
option tcp-check
balance roundrobin
server drc1 103.168.146.70:3306 check
server drc2 103.168.146.71:3306 check backup
🐳 File: docker-compose.yml
services:
caddy:
image: caddy:latest
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
haproxy:
image: haproxy:latest
container_name: haproxy
restart: always
ports:
- "3306:3306"
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
🔹 5. Jalankan Semua Layanan 🚀
# DRC-1 dan DRC-2
cd ~/wordpress-drc
sudo docker compose up -d
# Caddy Server
cd ~/caddy-docker
sudo docker compose up -d
✅ Verifikasi Cluster
- Masuk ke salah satu node DB:
docker exec -it mariadb mysql -uroot -p
SHOW STATUS LIKE 'wsrep_cluster_size';

Output 2
artinya dua node terkoneksi dengan baik.
- Akses WordPress:
Kunjungihttps://www.syslab.my.id
dan pastikan WordPress bisa diakses. 🌐

📌 Catatan Tambahan
- Gunakan
network_mode: host
untuk akses langsung ke port antar node. - Jika salah satu node down, setelah up otomatis akan bergabung kembali jika volume tidak corrupt. 🔁
- Pastikan
MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes
hanya di satu node saja (biasanya DRC-1). - HAProxy akan mem-forward semua koneksi MySQL melalui IP CADDY-WEB-SERVER (3306), lalu diarahkan ke node aktif.
- Untuk WordPress,
WORDPRESS_DB_HOST
bisa diarahkan ke IP Caddy (103.168.146.72) agar koneksi selalu lewat load balancer.
➕ Menambahkan Server Baru ke Cluster
Jika Anda ingin menambahkan node DRC baru (misalnya DRC-3):
- Pastikan volume bersih dan IP statis tersedia
- Gunakan image dan struktur direktori yang sama seperti node lainnya
- Modifikasi environment pada
docker-compose.yml
seperti berikut:
- MARIADB_GALERA_NODE_NAME=drc3
- MARIADB_GALERA_NODE_ADDRESS=103.168.146.73
- MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://103.168.146.70,103.168.146.71,103.168.146.73
- MARIADB_GALERA_CLUSTER_BOOTSTRAP=no
- Jalankan dengan
docker compose up -d
, node akan join otomatis jika konfigurasi benar dan tidak ada kesalahan pada volume/data. 🧠
Dengan setup ini, WordPress Anda akan selalu aktif meskipun salah satu server down. Solusi DRC ini cukup sederhana dan efisien, cocok untuk production skala kecil-menengah dengan budget minim. 🚀✨
Butuh diagram arsitektur atau backup strategy tambahan? Tinggal komen ya! 😊
Test
test apa bro ?