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#

Alurnya tujuh langkah:
- Job dijalankan dari dashboard, baik secara on-demand maupun lewat schedule.
- Director membaca FileSet job tersebut dan mengirim perintah ke File Daemon di server yang dibackup.
- File Daemon memindai direktori dan menentukan levelnya, Full, Differential, atau Incremental.
- File dikirim dari File Daemon langsung ke Storage Daemon lewat port 9103, sudah dalam keadaan terkompresi.
- Storage Daemon menulis data ke Volume di dalam Pool yang ditunjuk job.
- Daftar file beserta metadatanya dicatat ke katalog PostgreSQL sebagai indeks.
- 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#

Alur restore juga tujuh langkah, tapi arahnya berbalik:
- Restore point dipilih dari daftar job di dashboard.
- Katalog menyusun daftar file dari job yang dipilih.
- Direktori dan server tujuan restore ditentukan.
- Director menyusun bootstrap file dan meminta Storage Daemon membaca Volume yang dibutuhkan.
- Storage Daemon mengunduh dari object storage hanya part yang benar-benar diperlukan, bukan seluruh Volume.
- Storage Daemon mengirim data ke File Daemon di server tujuan lewat port 9103.
- 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#
| Komponen | RAM Minimum | CPU Minimum | Disk Minimum |
|---|---|---|---|
| Server Bacularis (master) | 2 GB | 1 CPU | 100 MB |
| Server yang dibackup (agent) | 512 MB | 1 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:latestPort 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.

Dashboard muncul setelah login berhasil.

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.gz1.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-driverJalankan 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.sh1.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-sdPerintah 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.242. 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.

Periksa kembali parameter Cloud Storage pada tahap ringkasan.

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.

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.

Tekan Create, lalu pastikan Pool cloud muncul di daftar.

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.

Form deployment terbuka.

3.2 Isi IP Address atau Hostname#
Isi IP agent yang bisa dijangkau master.

3.3 Pilih OS Profile#
Pilih sistem operasi agent.

3.4 Pilih Authentication Method#
Pilih Use username and password. SSH key juga bisa dipakai kalau sudah disiapkan.

3.5 Isi Admin Username#
Isi user SSH pada agent, misalnya root.

3.6 Isi Password#
Isi password SSH user tersebut.

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

3.8 Isi Save as Name#
Isi nama pendek untuk agent, misalnya demo-agent.

3.9 Jalankan Deployment#
Tekan Test dulu kalau ingin menguji koneksi SSH. Setelah koneksinya benar, tekan Deploy.

3.10 Pasang Komponen Client#
Setelah deployment berhasil, agent muncul di tabel Hosts. Pada baris agent tersebut, tekan Install.

Form komponen Bacula terbuka.

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

Tekan Install.

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.

Form client kosong terbuka.

4.2 Isi Name#
Nama harus sama dengan nama File Daemon pada agent, misalnya demo-agent-fd.

4.3 Isi Address#
Isi IP agent yang bisa dijangkau master.

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

Password Director tersebut ada di bacula-fd.conf pada agent.
cat /etc/bacula/bacula-fd.confCari 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.

4.6 Tekan Create#
Simpan 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.

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.

Isi nama job.

Tekan Next.

5.2 Langkah 2: Backup Source#
Wizard langkah 2 terbuka.

Pilih client.

Pilih FileSet yang berisi path backup.

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.

5.4 Langkah 4: Job Options#
Wizard langkah 4 terbuka.

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

Pilih messages.

5.5 Langkah 5: Schedule#
Pilih schedule kalau job ingin berjalan otomatis. Langkah ini boleh dilewati untuk job yang dijalankan manual.

5.6 Langkah 6: Summary#
Periksa seluruh konfigurasi, terutama Cloud Storage dan Pool yang menjadi tujuan backup.

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

6. Jalankan Backup#
Buka Jobs > Run job, pilih job yang baru dibuat, lalu tekan Run job.

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

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.

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.

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.

Pastikan pilihan muncul di panel kanan, lalu tekan Next.

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.

Tentukan aturan replace dan relocation file, lalu tekan Next.

7.5 Jalankan Restore#
Periksa ringkasan, terutama source client, jumlah file, restore client, dan path tujuan. Tekan Run restore.

7.6 Periksa Hasil Restore#
Bacularis langsung membuka halaman job restore yang baru dibuat. Ringkasan job memuat status, jumlah file, ukuran, dan durasi.

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

8. Backup Database MySQL#
8.1 Buka Add-ons#
Buka URL berikut.
http://ip-master:9097/web/add-ons/Tekan Add plugin settings.

Form plugin terbuka.

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

8.3 Isi Bagian General#
Bagian ini menentukan cara plugin menghubungi database.

Konfigurasi metode dump.

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.

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.

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

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
Tekan Save. FileSet baru muncul di daftar dan siap dipilih pada langkah 2 wizard job backup.

Buat juga konfigurasi MySQL untuk Bacularis.
sudo nano /etc/mysql/conf.d/bacula.cnf[client]
host = 127.0.0.1
port = 3306
protocol = TCPSetelah FileSet ini dipilih pada langkah 2 wizard job, hasil dump MySQL akan ikut ditulis ke Cloud Storage dan Pool yang sama.


