↓ Lewati ke konten utama
Bacularis, Dashboard Web untuk Bacula yang Bikin Backup Puluhan Server Gak Ribet
  1. Semua Artikel/

Bacularis, Dashboard Web untuk Bacula yang Bikin Backup Puluhan Server Gak Ribet

 Author
Penulis
Hasbi Mizan Azzami
DevOps Enthusiast
Daftar isi

Bacula adalah backup engine open source yang bekerja di level file, bukan level image disk. Masalahnya, konfigurasi Bacula murni sangat modular dan semuanya lewat command line atau config file terpisah. Begitu server yang harus dibackup lebih dari satu, mengelola Director, Storage Daemon, dan File Daemon satu per satu jadi pekerjaan tersendiri.

Bacularis menutup celah itu. Tools ini adalah web interface untuk Bacula yang menyatukan instalasi, konfigurasi, backup, dan restore ke banyak server sekaligus, semuanya dari satu dashboard.

Artikel ini mendokumentasikan cara memasang Bacularis di server master, memasang driver S3, menyiapkan Cloud Storage dan Pool, mendaftarkan agent lewat web deployment, membuat job yang langsung dibackup ke object storage, menjalankan restore lintas server, dan memasang plugin backup database MySQL.

Kenapa Bacularis?
#

Bacula sendiri sudah lama dikenal sebagai salah satu backup software open source paling fleksibel di Linux.1 Bacularis dibangun di atasnya sebagai web interface resmi, dilisensikan AGPLv3 sama seperti Bacula.2

Kelebihan yang langsung terasa:

  • Gratis dan open source.
  • Instalasi, backup, dan restore ke server lain bisa dilakukan dari dashboard, tanpa masuk command line ke tiap server.
  • Restore bisa diarahkan ke server mana pun dan ke path mana pun, tidak harus balik ke server asal.
  • File backup bisa disimpan ke object storage yang S3-compatible.
  • Restore bisa dilakukan untuk satu file atau satu folder saja, tidak harus full restore setiap kali.
  • Backup dan restore diambil saat server online, tanpa downtime.

Kekurangannya juga perlu disebut biar ekspektasinya pas:

  • Bacula bersifat file-level, bukan image-level. Community Edition tidak bisa membuat salinan disk 100% beserta bootloadernya. Fitur image dan plugin hypervisor hanya ada di Bacula Enterprise.
  • Learning curvenya cukup tinggi karena konfigurasinya sangat modular. Bacularis meringankan ini lewat wizard, tapi konsep Director, Storage Daemon, dan File Daemon tetap harus dipahami.

Bagaimana Backup dan Restore Bekerja
#

Sebelum masuk ke instalasi, ada gunanya memahami alur data di baliknya. Studi kasus di artikel ini memakai object storage sebagai tujuan akhir, jadi kedua diagram berikut menyertakan langkah unggah dan unduh ke bucket.

Alur Backup
#

Diagram alur backup Bacularis dari Admin Browser ke Director, File Daemon di Client VPS, Storage Daemon, hingga upload ke Object Storage

Alurnya tujuh langkah:

  1. Job dijalankan dari dashboard, baik secara on-demand maupun lewat schedule.
  2. Director membaca FileSet job tersebut dan mengirim perintah ke File Daemon di server yang dibackup.
  3. File Daemon memindai direktori dan menentukan levelnya, Full, Differential, atau Incremental.
  4. File dikirim dari File Daemon langsung ke Storage Daemon lewat port 9103, sudah dalam keadaan terkompresi.
  5. Storage Daemon menulis data ke Volume di dalam Pool yang ditunjuk job.
  6. Daftar file beserta metadatanya dicatat ke katalog PostgreSQL sebagai indeks.
  7. Volume dipecah menjadi beberapa part di cache lokal, lalu Storage Daemon mengunggah sendiri setiap part itu ke bucket.

Perlu diperhatikan bahwa Director di sini hanya mengirim perintah, bukan data. Aliran file sesungguhnya langsung dari File Daemon ke Storage Daemon, sehingga Director tidak menjadi bottleneck saat banyak server dibackup bersamaan.

Alur Restore
#

Diagram alur restore Bacularis dari Admin Browser ke Director, Object Storage, Storage Daemon, hingga tulis file di Target VPS

Alur restore juga tujuh langkah, tapi arahnya berbalik:

  1. Restore point dipilih dari daftar job di dashboard.
  2. Katalog menyusun daftar file dari job yang dipilih.
  3. Direktori dan server tujuan restore ditentukan.
  4. Director menyusun bootstrap file dan meminta Storage Daemon membaca Volume yang dibutuhkan.
  5. Storage Daemon mengunduh dari object storage hanya part yang benar-benar diperlukan, bukan seluruh Volume.
  6. Storage Daemon mengirim data ke File Daemon di server tujuan lewat port 9103.
  7. File Daemon menulis file ke path tujuan beserta permission dan timestamp aslinya.

Dua alur ini menjelaskan kenapa restore bisa diarahkan ke server mana pun. Director tidak peduli file itu awalnya dibackup dari server A, selama katalog punya indeksnya, restore bisa ditulis ke server B.

Spesifikasi Minimum
#

KomponenRAM MinimumCPU MinimumDisk Minimum
Server Bacularis (master)2 GB1 CPU100 MB
Server yang dibackup (agent)512 MB1 CPU-

Sistem operasi yang disarankan adalah Linux. Tabel ini adalah kebutuhan minimum untuk menjalankan Bacularis sendiri, bukan kebutuhan penyimpanan data backup, yang tentu bergantung pada volume data yang dibackup.

1. Instalasi Bacularis di Master
#

1.1 Jalankan Bacularis Standalone
#

Bacularis standalone menjalankan API, Web, Director, dan Storage Daemon dalam satu container.

docker run -d --name bacularis \
  -p 9097:9097 \
  -p 9101:9101 \
  -p 9103:9103 \
  bacularis/bacularis-standalone:latest

Port 9097 adalah web UI, 9101 adalah Director, dan 9103 adalah Storage Daemon.

1.2 Login
#

Buka http://ip-master:9097, isi user dan password, lalu tekan Log in.

Halaman login Bacularis

Dashboard muncul setelah login berhasil.

Dashboard Bacularis setelah login

1.3 Pasang Driver Cloud S3
#

Image bacularis/bacularis-standalone tidak menyertakan driver cloud pada Storage Daemon. Driver ini harus dicompile dari source resmi bacula.org dan dipasang manual ke container. Jalankan seluruh langkah berikut di server master. Ganti 15.0.3 bila versi Bacula pada container berbeda, cek dengan docker exec bacularis bacula-sd -?.

1.3.1 Siapkan Resource
#

mkdir -p /root/bacula-cloud-build && chmod 700 /root/bacula-cloud-build
cd /root/bacula-cloud-build

wget -q https://www.bacula.org/downloads/Bacula-15.0.3/bacula-15.0.3.tar.gz
wget -q https://www.bacula.org/downloads/libs3-20200523.tar.gz
wget -q -O path-mounted.patch https://raw.githubusercontent.com/alpinelinux/aports/master/main/bacula/bacula-7.4.0-path-mounted.patch
wget -q -O pthread-detach.patch https://raw.githubusercontent.com/alpinelinux/aports/master/main/bacula/bacula-11.0.6-pthread-double-detach-fix.patch
wget -q -O termios.patch https://raw.githubusercontent.com/alpinelinux/aports/master/main/bacula/termios.patch

tar xzf bacula-15.0.3.tar.gz
tar xzf libs3-20200523.tar.gz

1.3.2 Compile
#

Simpan script berikut sebagai /root/bacula-cloud-build/_build.sh.

#!/bin/sh
set -e
apk add --no-cache build-base linux-headers autoconf automake libtool \
  mariadb-connector-c-dev ncurses-dev openssl-dev libpq-dev sqlite-dev \
  zlib-dev lzo-dev acl-dev curl-dev libxml2-dev pkgconf bash perl m4

cd /src/bacula-15.0.3
for p in path-mounted.patch pthread-detach.patch termios.patch; do
  patch -p1 --forward < "/src/$p" || true
done

cd /src/libs3-20200523
sed -i 's/-Wall -Werror/-Wall/' GNUmakefile
make -j2
rm -f build/lib/libs3.a
ln -sf libs3.so.4 build/lib/libs3.so

cd /src/bacula-15.0.3
./configure \
  --build=x86_64-alpine-linux-musl --host=x86_64-alpine-linux-musl \
  --prefix=/usr --sysconfdir=/etc/bacula --localstatedir=/var \
  --mandir=/usr/share/man --docdir=/usr/share/doc/bacula --infodir=/usr/share/info \
  --with-pid-dir=/run/bacula --with-subsys-dir=/run/lock/subsys \
  --with-logdir=/var/log/bacula \
  --enable-largefile --enable-smartalloc --disable-nls \
  --with-openssl=/usr/include/openssl \
  --with-postgresql --with-mysql --with-sqlite3 \
  --with-scriptdir=/etc/bacula/scripts \
  --with-working-dir=/var/lib/bacula \
  --with-dir-user=bacula --with-dir-group=bacula \
  --with-archivedir=/var/lib/bacula/archive \
  --with-sd-user=bacula --with-sd-group=bacula \
  --with-fd-user=root --with-fd-group=root \
  --with-sbin-perm=0755 \
  --with-s3=/src/libs3-20200523/build --with-aws \
  --libdir=/usr/lib --with-plugindir=/usr/lib --sbindir=/usr/sbin

cd src/stored
make drivers s3-driver aws-driver generic-driver

Jalankan buildnya di dalam container Alpine sementara, supaya toolchain kompilasi tidak menumpuk di image Bacularis.

chmod 755 /root/bacula-cloud-build/_build.sh
docker run --rm -v /root/bacula-cloud-build:/src -w /src alpine:3.24 sh /src/_build.sh

1.3.3 Salin Hasil Build
#

LIBS=/root/bacula-cloud-build/bacula-15.0.3/src/stored/.libs
LIBS3=/root/bacula-cloud-build/libs3-20200523/build/lib

docker cp $LIBS/bacula-sd-cloud-driver-15.0.3.so bacularis:/usr/lib/
docker cp $LIBS/bacula-sd-cloud-s3-driver-15.0.3.so bacularis:/usr/lib/
docker cp $LIBS3/libs3.so.4 bacularis:/usr/lib/

docker exec bacularis sh -c '
  ln -sf libs3.so.4 /usr/lib/libs3.so &&
  chown root:root /usr/lib/bacula-sd-cloud-driver-15.0.3.so /usr/lib/bacula-sd-cloud-s3-driver-15.0.3.so /usr/lib/libs3.so.4 &&
  chmod 755 /usr/lib/bacula-sd-cloud-driver-15.0.3.so /usr/lib/bacula-sd-cloud-s3-driver-15.0.3.so /usr/lib/libs3.so.4
'

1.3.4 Restart Storage Daemon
#

docker exec bacularis /etc/bacula/scripts/bacula-ctl-sd restart
docker exec bacularis pgrep bacula-sd

Perintah terakhir harus menampilkan tepat satu PID. Kalau kosong, berarti Storage Daemon gagal start ulang, biasanya karena file .so yang baru disalin belum punya permission eksekusi yang benar.

Setelah Storage Daemon berjalan, hapus folder dan image sementara yang dipakai saat kompilasi.

rm -rf /root/bacula-cloud-build
docker rmi alpine:3.24

2. Cloud Storage dan Pool
#

Dengan driver S3 sudah terpasang, Storage Daemon siap menerima resource Cloud. Bagian ini terdiri dari tiga langkah. Pertama, membuat Cloud Storage sebagai tujuan unggahan. Kedua, mengarahkan alamatnya supaya bisa dijangkau agent. Ketiga, membuat Pool yang akan ditunjuk oleh job backup.

2.1 Buat Cloud Storage
#

Buka Storage, lalu tekan Add cloud storage. Isi endpoint, bucket, access key, dan secret key sesuai layanan object storage yang dipakai. Pilih S3 pada kolom Driver, bukan Amazon, karena driver Amazon membutuhkan executable aws eksternal yang tidak tersedia pada image ini.

Form cloud parameters dengan Driver S3, Protocol HTTP, dan Uri style Path

Periksa kembali parameter Cloud Storage pada tahap ringkasan.

Ringkasan wizard cloud storage sebelum disimpan

Tekan Create storage. Bacularis akan meminta restart Storage Daemon karena resource Cloud dan Device baru ditambahkan ke bacula-sd.conf.

2.2 Ubah Address Storage ke IP Master
#

Setelah Cloud Storage tersimpan, ubah Address pada Storage dari localhost menjadi IP master yang bisa dijangkau agent. Kalau dibiarkan localhost, File Daemon di mesin lain akan terhubung ke Storage Daemon miliknya sendiri, bukan ke Storage Daemon master.

Cloud Storage aktif dengan Address sudah diubah ke IP master

Simpan perubahan, lalu restart Storage Daemon ketika diminta.

2.3 Buat Pool untuk Cloud Storage
#

Buka Pools > Add pool, lalu isi form pool untuk Cloud Device. Isi Name dan Label Format agar Bacula bisa membuat nama Volume secara otomatis.

Form Pool untuk Cloud Device

Tekan Create, lalu pastikan Pool cloud muncul di daftar.

Pool untuk Cloud Device yang sudah tersimpan

3. Instalasi Agent Lewat Web UI
#

Sebelum lanjut, daftar terlebih dahulu ke repositori Bacularis dan masukkan kredensial yang diperoleh ke Deployment > Repo Auths. Tanpa ini, tahap instalasi client di bawah akan gagal mengunduh paket.

3.1 Buka Deployment
#

Buka Deployment > Hosts, lalu tekan Deploy API host.

Tombol Deploy API host pada menu Deployment Hosts

Form deployment terbuka.

Form deployment API host yang masih kosong

3.2 Isi IP Address atau Hostname
#

Isi IP agent yang bisa dijangkau master.

Kolom IP address agent pada form deployment

3.3 Pilih OS Profile
#

Pilih sistem operasi agent.

Pilihan OS profile pada form deployment

3.4 Pilih Authentication Method
#

Pilih Use username and password. SSH key juga bisa dipakai kalau sudah disiapkan.

Pilihan metode autentikasi SSH

3.5 Isi Admin Username
#

Isi user SSH pada agent, misalnya root.

Kolom admin username

3.6 Isi Password
#

Isi password SSH user tersebut.

Kolom password SSH

3.7 Aktifkan Use Sudo
#

Centang Use sudo kalau usernya bukan root atau perintah deployment perlu dijalankan dengan hak administrator.

Centang opsi Use sudo

3.8 Isi Save as Name
#

Isi nama pendek untuk agent, misalnya demo-agent.

Kolom nama penyimpanan agent

3.9 Jalankan Deployment
#

Tekan Test dulu kalau ingin menguji koneksi SSH. Setelah koneksinya benar, tekan Deploy.

Tombol Test dan Deploy pada form deployment

3.10 Pasang Komponen Client
#

Setelah deployment berhasil, agent muncul di tabel Hosts. Pada baris agent tersebut, tekan Install.

Tombol Install pada baris agent di tabel Hosts

Form komponen Bacula terbuka.

Form pemilihan komponen Bacula yang akan dipasang

Centang Client dan pertahankan Add new component to current Director, supaya resource client langsung ditambahkan ke Director master.

Centang komponen Client dengan opsi Add new component to current Director

Tekan Install.

Tombol Install untuk menjalankan instalasi komponen Client

Setelah selesai, buka Clients dan periksa apakah agent sudah terdaftar. Kalau belum, daftarkan manual lewat Bagian 4.

4. Daftarkan Agent
#

4.1 Tekan Add Client
#

Buka Clients, lalu tekan Add client.

Tombol Add client pada menu Clients

Form client kosong terbuka.

Form client yang masih kosong

4.2 Isi Name
#

Nama harus sama dengan nama File Daemon pada agent, misalnya demo-agent-fd.

Kolom nama client

4.3 Isi Address
#

Isi IP agent yang bisa dijangkau master.

Kolom address client

4.4 Isi Password
#

Isi password yang sama dengan Director Password pada konfigurasi File Daemon agent.

Kolom password client

Password Director tersebut ada di bacula-fd.conf pada agent.

cat /etc/bacula/bacula-fd.conf

Cari blok Director pertama pada file itu, yang bukan Monitor = yes. Blok itulah yang dipakai Bacularis untuk menghubungi File Daemon, dan Password di dalamnya yang harus disalin ke form.

4.5 Pilih Catalog
#

Catalog wajib dipilih. Kalau kosong, form menolak penyimpanan dengan pesan Field required.

Pilihan Catalog pada form client

4.6 Tekan Create
#

Simpan client.

Tombol Create untuk menyimpan client

Verifikasi lewat Clients > nama client > Status. Status yang benar menampilkan koneksi ke port 9102, versi File Daemon, dan plugin yang tersedia.

5. Buat Job Backup
#

Buka Jobs, lalu tekan New backup job.

Tombol New backup job pada menu Jobs

Konfigurasi job pada wizard ini terdiri dari enam langkah. Pertama, informasi dasar. Kedua, sumber backup. Ketiga, tujuan Cloud Storage. Keempat, opsi job. Kelima, jadwal. Keenam, ringkasan.

5.1 Langkah 1: Basic Information
#

Wizard dimulai dari informasi dasar.

Langkah 1 wizard job backup, Basic information

Isi nama job.

Kolom nama job pada langkah Basic information

Tekan Next.

Tombol Next pada langkah 1 wizard

5.2 Langkah 2: Backup Source
#

Wizard langkah 2 terbuka.

Langkah 2 wizard job backup, Backup source

Pilih client.

Pemilihan client pada langkah Backup source

Pilih FileSet yang berisi path backup.

Pemilihan FileSet pada langkah Backup source

5.3 Langkah 3: Destination
#

Pilih Cloud Storage dan Pool yang dibuat pada Bagian 2 sebagai tujuan job. Dengan pilihan ini, setiap backup akan langsung diunggah ke object storage tanpa membuat penyimpanan backup lokal terpisah.

Langkah Destination memilih Cloud Storage dan Pool cloud

5.4 Langkah 4: Job Options
#

Wizard langkah 4 terbuka.

Langkah 4 wizard job backup, Job options

Pilih Level, misalnya Incremental untuk job harian. Backup pertama tetap menjadi Full walaupun Incremental dipilih, selama belum ada baseline sebelumnya.

Pemilihan Level backup pada langkah Job options

Pilih messages.

Pemilihan messages pada langkah Job options

5.5 Langkah 5: Schedule
#

Pilih schedule kalau job ingin berjalan otomatis. Langkah ini boleh dilewati untuk job yang dijalankan manual.

Langkah 5 wizard job backup, Schedule

5.6 Langkah 6: Summary
#

Periksa seluruh konfigurasi, terutama Cloud Storage dan Pool yang menjadi tujuan backup.

Ringkasan wizard job backup ke Cloud Storage

Tekan Create job. Job yang langsung menggunakan Cloud Storage akan muncul di daftar.

Job backup ke Cloud Storage terdaftar di daftar Jobs

6. Jalankan Backup
#

Buka Jobs > Run job, pilih job yang baru dibuat, lalu tekan Run job.

Form Run job untuk backup ke Cloud Storage

Pantau hasilnya melalui Raw job log. Log akan menampilkan proses unggah setiap part ke object storage hingga job selesai.

Raw job log menampilkan status unggahan part ke object storage

Status T menandakan job selesai dengan sukses. Sampai di sini, satu server sudah bisa dibackup langsung ke object storage tanpa penyimpanan backup lokal terpisah. Untuk agent lain, ulangi Bagian 3 dan 4, lalu pilih Cloud Storage dan Pool yang sama pada job barunya.

7. Restore Lewat Wizard
#

Wizard restore terdiri dari lima langkah: Source, Backup, Files, Options, dan Run.

7.1 Pilih Source Client
#

Buka Restore, pilih client sumber backup dan metode browsing, lalu tekan Next.

Restore langkah 1, pemilihan source client

7.2 Pilih Restore Point
#

Daftar job backup milik client tersebut muncul di sini. Pilih titik waktu yang akan dipulihkan. Bacularis akan menggabungkan Full dengan Incremental yang diperlukan secara otomatis.

Restore langkah 2, pemilihan restore point

7.3 Pilih File atau Folder
#

Masukkan path, tekan OK, lalu tekan Add pada file atau folder yang ingin dipulihkan.

Kalau restore database, khususnya MySQL, jangan pilih file CLIENT.SQL. File itu bukan data yang perlu dipulihkan langsung.

Pemilihan folder yang akan direstore

Pastikan pilihan muncul di panel kanan, lalu tekan Next.

Folder restore yang sudah terpilih di panel kanan

7.4 Pilih Client dan Direktori Tujuan
#

Restore to client menentukan server yang menerima hasil restore. Pilih client asal atau client lain yang sudah terdaftar. Untuk restore yang lebih aman, pilih Restore to a given directory lalu isi path tujuan, supaya file asli di lokasi semula tidak tertimpa.

Pemilihan client dan direktori tujuan restore

Tentukan aturan replace dan relocation file, lalu tekan Next.

Pemilihan opsi file untuk restore

7.5 Jalankan Restore
#

Periksa ringkasan, terutama source client, jumlah file, restore client, dan path tujuan. Tekan Run restore.

Ringkasan restore sebelum dijalankan

7.6 Periksa Hasil Restore
#

Bacularis langsung membuka halaman job restore yang baru dibuat. Ringkasan job memuat status, jumlah file, ukuran, dan durasi.

Ringkasan job restore yang baru selesai

Tab Raw job log memuat laporan penutup dari Bacula. Baris Termination: Restore OK adalah tanda job selesai dengan benar.

Raw job log dengan baris Termination Restore OK

8. Backup Database MySQL
#

8.1 Buka Add-ons
#

Buka URL berikut.

http://ip-master:9097/web/add-ons/

Tekan Add plugin settings.

Halaman Add-ons pada Bacularis

Form plugin terbuka.

Form plugin settings yang masih kosong

8.2 Pilih Plugin MySQL
#

Isi Name sebagai penanda konfigurasi, pertahankan Enabled, lalu pilih [backup] MySQL database backup pada daftar Plugin.

Pemilihan plugin MySQL database backup

8.3 Isi Bagian General
#

Bagian ini menentukan cara plugin menghubungi database.

Bagian General pada konfigurasi plugin MySQL

Konfigurasi metode dump.

Konfigurasi metode dump database

Konfigurasi ini menghasilkan dump SQL terpisah untuk setiap database, sehingga satu database saja bisa dipilih saat restore. Kolom metode lain dibiarkan nonaktif. Setelah semua terisi, tekan Save.

Konfigurasi tersimpan muncul di tab Plugin settings dan bisa disunting kembali lewat Edit.

Konfigurasi plugin MySQL yang sudah tersimpan

8.4 Pasang Plugin ke FileSet
#

Plugin settings belum melakukan apa pun sampai dipasang ke FileSet. Buka Director > Configure director > FileSet, tekan Add Fileset, isi Name, lalu tekan Add > Add include block.

Di dalam blok Include, tekan Add lalu pilih Add plugin.

Menu Add plugin di dalam blok Include pada FileSet

Tiga pilihan muncul. Pilih Use existing Plugin configuration, lalu pilih nama konfigurasi yang dibuat pada tahap sebelumnya.

Pemilihan konfigurasi plugin yang sudah dibuat

Bacularis lalu menyusun sendiri directive Plugin dari konfigurasi tersebut. Sesuaikan hasilnya dengan kondisi server client yang ingin dibackup. Contoh hasilnya seperti ini.

\|/usr/share/bacularis/protected/vendor/bacularis/bacularis-common/Common/Bin/plugin command/list --plugin-name="MySQLBackup" --plugin-config="MySQL\x20Demo" --job-id="%i" --job-name="%n" --job-level="%l" --server-name="demo" --password="password123" --binary-path="/usr/bin" --dump-method --all-databases-list --add-drop-table

Directive Plugin hasil generate otomatis dari Bacularis

Tekan Save. FileSet baru muncul di daftar dan siap dipilih pada langkah 2 wizard job backup.

FileSet dengan plugin MySQL yang sudah tersimpan

Buat juga konfigurasi MySQL untuk Bacularis.

sudo nano /etc/mysql/conf.d/bacula.cnf
[client]
host = 127.0.0.1
port = 3306
protocol = TCP

Setelah FileSet ini dipilih pada langkah 2 wizard job, hasil dump MySQL akan ikut ditulis ke Cloud Storage dan Pool yang sama.