— sekitar 8 menit membaca

Self hosting S3 di FreeBSD dengan Garage

Memasang garage sebagai peladen S3 di FreeBSD

Bulan Oktober kemarin ane akhirnya migrasi dari Racknerd ke GreenCloudVPS dengan menyewa VPS Storage Plan seharga USD 25 per tahun dengan spesifikasi

  • 1 vCPU AMD EPYC Rome,
  • 2 GB RAM,
  • 20 GB NVME (untuk OS) dan
  • 500 GB HDD.

Namanya VPS Storage maka tentu saja VPS ini dioptimalisasi untuk keperluan penyimpanan data bukan untuk komputasi, namun ane hendak mencoba memakainya untuk menjalankan beberapa service ringan seperti Gotosocial, Ente Photos, Snac, Caddy, Garage S3, Vaultwarden dengan OS tentu saja FreeBSD 14.3-RELEASE.

Rencananya adalah membuat storage NVME 20GB sebagai host OS dan nantinya semua service akan dimasukkan ke dalam jail masing - masing biar mudah maintenance dan lebih terorganisir, tentunya dengan service sebanyak itu minimal akan dibuat jail sekitar 5 - 6 unit. Hal ini akan membuat spasi storage di NVME akan penuh dan tidak memenuhi syarat yang layak untuk menjalankan OS, misal dalam 1 jail berukuran sekitar 1,5 GB (masih polos) saja akan membutuhkan setidaknya 8GB storage belum lagi nanti kalo sudah ada isinya bisa membengkak sekitar 2 - 3 kali lipat atau minimal membutuhkan storage sebesar 22-25 GB. Untuk itu nantinya ane akan menaruh folder jail di storage kedua yang berkapasitas jauh lebih besar yaitu 500GB.

Long story short, ane sudah membuat beberapa jail tersebut dan sekarang saatnya untuk memasang Garage yang nantinya akan menjadi peladen untuk S3 storage yang akan dipergunakan sebagai penyimpanan untuk Gotosocial dan Ente Photos. Meskipun banyak pilihan aplikasi open source untuk storage server S3 ini namun ane pilih Garage karena paling ringan pemakaian RAM, mudah pemasangannya, dan mendukung AWS. Jadi ane akan memasang Garage dan Garage WebUI (untuk admin UInya).

Ane sudah persiapkan jail dengan nama PondokBambu dan IP 10.0.0.2/24, akses internet di dalam jail sudah berjalan baik dan ane juga sudah atur agar jail bisa pakai/akses ke raw_sockets dan sudah bootstrap pkg.

Install Garage #

Setelah masuk ke dalam PondokBambu kemudian update paket dari repositori. Untuk memasang Garage sangat mudah karena sudah ada binary tersedia di repositori FreeBSD, masalahnya adalah di repositori masih pakai versi yang lama yaitu 1.20_2. Dengan versi ini nantinya akan bermasalah jika hendak memakai Garage WebUI karena tidak kompatibel. Ketika cek ke Freshport ternyata sudah tersedia versi terkini yaitu 2.1.0_1 per tanggal 11 Nopember 2025 kemarin.

# bastille console PondokBambu
[PondokBambu]
root@PondokBambu:~ # pkg bootstrap -y && pkg update
...
...
root@PondokBambu:~ # pkg search garage
garage-1.20_2                   Open-source distributed storage service

Oleh karena itu ane akan pakai versi terbaru ini saja, tidak perlu build dari Ports melainkan dicoba untuk berpindah repo dari Quaterly ke Latest.

root@PondokBambu:~ # mkdir -p /usr/local/etc/pkg/repos
root@PondokBambu:~ # echo "FreeBSD { url = \"pkg+http://pkg.freebsd.org/\${ABI}/latest\"; }" > /usr/local/etc/pkg/repos/FreeBSD.conf
root@PondokBambu:~ # pkg update -f
root@PondokBambu:~ # pkg search garage
garage-2.1.0                   Open-source distributed storage service
root@PondokBambu:~ # pkg install -y garage
root@PondokBambu:~ # garage --version
garage cargo:2.1.0 [features: k2v, lmdb, sqlite, metrics, bundled-libs] 

Setelah terpasang dengan baik, buat file garage.toml yang berisi konfigurasi Garage dan ditaruh di folder /usr/local/etc/, isinya kira - kira sebagai berikut:

metadata_dir = "/tmp/meta"
data_dir = "/tmp/data"
db_engine = "sqlite"

replication_factor = 1

rpc_bind_addr = "0.0.0.0:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "25f8994b12625d9cf2d985fe9de126758a59db15de673c4470696156e3261d3f"

[s3_api]
s3_region = "garage"
api_bind_addr = "0.0.0.0:3900"


[s3_web]
bind_addr = "0.0.0.0:3902"
root_domain = ".web.garage.localhost"
index = "index.html"

[k2v_api]
api_bind_addr = "0.0.0.0:3904"

[admin]
api_bind_addr = "0.0.0.0:3903"
admin_token = "yijEPXXjouuDFgrHopNXG89ZL6h8ztdqOw2AjUKne44="
metrics_token = "yijEPXXjouuDFgrHopNXG89ZL6h8ztdqOw2AjUKne44="

Karena ane cuma aktifkan IPv4 maka ane sesuaikan IP di bind_addr dengan IP localhost. Untuk rpc_secret adalah kode acak yang dibuat dengan perintah openssl rand -hex 32 sedangkan admin_token dan metrics_token dengan openssl rand -base64 32, sehingga perlu memasang paket openssl namun jika tidak maka bisa pakai layanan online OpenSSL toolkit untuk membuat token.

Konfigurasi sudah siap, maka tinggal menjalankan layanan garage saja.

root@PondokBambu:~ # sysrc garage_enable=YES
garage_enable -> YES
root@PondokBambu:~ # service garage start
Starting garage.
root@PondokBambu:~ # service garage status
ID        Hostname  Address         Tags  Zone  Capacity  DataAvail
0cb2c960c garage    127.0.0.1:3901  []    dc1   100.0 GB  125 GB (88.6%)

Mempersiapkan Cluster #

Garage membutuhkan disk untuk menyimpan data (tentu saja ya kan?), maka perlu menyiapkan disk/partisi untuk menjadi node cluster. Ane sudah menyiapkan spasi yang nantinya akan dipakai sebagai cluster. Anggap saja partisi jail tersebut memiliki spasi bebas sebesar 100GB dan akan dipergunakan sebagai cluster dengan alokasi sebesar 50GB1.

root@PondokBambu:~ # garage layout assign -z dc1 -c 50G 0cb2c960c
root@PondokBambu:~ # garage layout apply --version 1

Membuat Bucket #

Setelah cluster tersedia maka ane bisa membuat bucket untuk menampung files. Diasumsikan ane mau bikin bucket dengan nama ente-bucket untuk menampung files dari Ente Photos nantinya. Bucket ini nantinya akan bisa diakses dengan kunci bernama ente-bucket-key.

root@PondokBambu:~ # garage bucket create ente-bucket
==== BUCKET INFORMATION ====
Bucket:          cfc5f8763f3a01a1277b0d5ed73661d75ea7d9ad7987558f1a3b4e4c39d80699
Created:         2025-11-13 10:27:41.892 +07:00

Size:            0 B (0 B)
Objects:         0

Website access:  false

Global alias:    ente-bucket

==== KEYS FOR THIS BUCKET ====
Permissions  Access key    Local aliases

root@PondokBambu:~ # garage bucket list
ID                Created     Global aliases  Local aliases
cfc5f8763f3a01a1  2025-11-13  ente-bucket

Untuk bisa akses maka dibutuhkan kunci, ane akan membuat kunci untuk membuka bucket ini.

root@PondokBambu:~ # garage key create ente-bucket-key
==== ACCESS KEY INFORMATION ====
Key ID:              GKeb9de68995f550e000133ac2
Key name:            ente-bucket-key
Secret key:          a120b7effaedc7865e4ec59598fda63eb49d4b24ea5f6270e493074848d35f1f
Created:             2025-11-13 10:33:23.128 +07:00
Validity:            valid
Expiration:          never

Can create buckets:  false

==== BUCKETS FOR THIS KEY ====
Permissions  ID  Global aliases  Local aliases
root@PondokBambu:~ # garage key list
ID                          Created     Name                 Expiration
GKeb9de68995f550e000133ac2  2025-11-13  ente-bucket-key      never

Sekarang ane punya bucket dan kuncinya tapi belum bisa akses karena belum permisi, jadi ane mau sambungin dulu bucket dan kuncinya.

root@PondokBambu:~ # garage bucket allow \
  --read \
  --write \
  --owner \
  ente-bucket \
  --key ente-bucket-key

Alhamdulillah sampai disini pengaturan Garage sudah selesai semua, sekarang tinggal coba untuk unggah files ke bucket ente-bucket. Untuk ini ane akan pakai awscli2 sebuah tools untuk operasi S3 dari Amazon AWS kemudian membuat file ~/.awsrc sebagai lokasi untuk menaruh env.

root@PondokBambu:~ # python3 -m pip install awscli
root@PondokBambu:~ # aws --version
aws-cli/1.42.29 Python/3.11.13 FreeBSD/14.3-RELEASE botocore/1.40.25
root@PondokBambu:~ # vi ~/.awsrc
export AWS_ACCESS_KEY_ID=GKeb9de68995f550e000133ac2
export AWS_SECRET_ACCESS_KEY=a120b7effaedc7865e4ec59598fda63eb49d4b24ea5f6270e493074848d35f1f
export AWS_DEFAULT_REGION='us-east-1'
export AWS_ENDPOINT_URL='http://localhost:3900'

kemudian load dulu dengan perintah # . .awsrc untuk membaca environtment. Contoh perintah yang bisa dicoba untuk memastikan akses sudah bisa berjalan lancar adalah

root@PondokBambu:~ # aws s3 ls s3://ente-bucket

Cara lain tanpa rubah file .awsrc bisa dengan menjalankan perintah seperti ini langsung di shell terminal.


# aws configure set aws_access_key_id GKeb9de68995f550e000133ac2
# aws configure set aws_secret_access_key a120b7effaedc7865e4ec59598fda63eb49d4b24ea5f6270e493074848d35f1f
# aws configure set s3.endpoint_url http://localhost:3900
    

Jika ada rencana untuk membuat share link/presign, konfigurasi ini sangat bermanfaat.


# aws configure set default.s3.addressing_style path
# aws configure set default.s3.signature_version s3v4
    

Perintah yang lain bisa dibaca di dokumentasi resmi awscli.

Garage WebUI #

Garage WebUI adalah sebuah aplikasi web SPA yang dibuat untuk menjadi frontend dari Garage S3, dibangun dengan Go dan Vite (React). Sayangnya versi binari untuk FreeBSD tidak tersedia sehingga perlu melakukan build sendiri. Lets go!

Langkah pertama adalah melakukan clone dari repositori Garage WebUI dari Github ke lokal dan kemudian melakukan build. Urutan buildnya adalah:

  1. Build frontend dalam hal ini Vite,
  2. Build backend dengan Go.
root@PondokBambu:~ # pkg install -y node24 git go125
root@PondokBambu:~ # npm install -g pnpm
root@PondokBambu:~ # git clone https://github.com/khairul169/garage-webui.git
...
root@PondokBambu:~ # cd garage-webui
root@PondokBambu:garage-webui # vi package.json

Untuk membangun frontend ini ada hal yang perlu diperhatikan yaitu mengatur modul rollup yang bermasalah di FreeBSD. Di file package.json rubah atau tambahkan baris - baris berikut

"pnpm": {
	"overrides": {
		"rollup": "^4.24.0"
	}
}

ini akan menimpa modul rollup agar tidak diskip saat pnpm install nantinya. Setelah pnpm mengunduh modul yang dibutuhkan kemudian build dan hasilnya adalah files html dan js berada di folder dist\

root@PondokBambu:garage-webui # pnpm install
...
root@PondokBambu:garage-webui # pnpm run build
...
root@PondokBambu:garage-webui # ls dist/
...
index.html
...

karena aplikasi ini bertipe SPA maka frontend akan di-embed ke dalam aplikasi itu sendiri, jadi salin folder dist ke dalam folder backend. Kemudian build backend dengan Go.

root@PondokBambu:backend # go mod tidy
root@PondokBambu:backend # go build -tags prod -ldflags="-s -w" -o garage-webui
root@PondokBambu:backend # ls | grep garage-webui
-rwxr-xr-x 1 user group 13M Nov 14 10:00 garage-webui

Proses go mod tidy akan mengunduh semua library yang dibutuhkan, sedangkan build tags prod untuk membuat garage webui mengira ini untuk productioons3. Setelah selesai semua proses build akan muncul file dengan nama garage-webui, file ini adalah binari yang bisa dipakai untuk menjalankan garage webui.

root@PondokBambu:backend # cp garage-webui /home/poes/.local/bin
root@PondokBambu:bin # chmod +x garage-webui
root@PondokBambu:bin # ./garage-webui -c /usr/local/etc/garage.toml

Perintah ./garage-webui -c /usr/local/etc/garage.toml akan menjalankan garage webui di Port 3909 dan memakai konfigurasi garage.toml, tapi ini belum 100% berjalan baik karena belum ada token yang dipakai. Oleh karena itu ane bikin environtment untuk menyimpan token dan opsi lainnya. Karena ane malas pakai .env files dan sering bermasalah, maka keterangan/info itu ane inject saja ke .shrc karena file ini pasti akan selalu diload pertama kali shell berjalan. Sisipkan env di dalam file .shrc

root@PondokBambu:bin # vim ~/.shrc
...
export CONFIG_PATH='/usr/local/etc/garage.toml'
export API_BASE_URL='http://127.0.0.1:3903'
export S3_ENDPOINT_URL='http://127.0.0.1:3900'
export API_ADMIN_KEY='yijEPXXjouuDFgrHopNXG89ZL6h8ztdqOw2AjUKne44='
export AUTH_USER_PASS='admin:$apr1$gJB3Mbhd$Xb9e9E283S7BQ.YcVPygZ0'
export PORT=3909
...

untuk isi dari API_ADMIN_KEY merujuk ke isi admin_token di file garage.toml dan harus sama karena kalo tak sama tidak akan bisa tersambung. Kemudian untuk isian AUTH_USER_PASS adalah kode enkripsi yang dibuat dengan apache/htpasswd. Untuk memakai htpasswd bisa dengan memasang paket apache24 atau pakai online generator seperti htpasswd.org. Format di atas adalah username:passwordterenkripsi, maka di situs htpasswd.org masukkan user dan password kemudian salin isi di Apache MD5. User dan password ini nantinya yang akan dipakai untuk login ke dalam garage webui.

Maka load ulang file .shrc dan jalankan garage-webui lagi.

root@PondokBambu:bin # . ~/.shrc
root@PondokBambu:bin # ./garage-webui &

periksa apakah sudah berjalan baik di alamat URL http://127.0.0.1:3909, jika sudah maka tinggal rubah Caddyfile untuk serving sebagai reverse_proxy tentu siapkan domain/subdomain agar bisa diakses darimana saja.

garage webui dashboard garage webui cluster garage webui bucket list

Penutup #

Ane cukup puas dengan performa GreenCloudVPS dan Garage sebagai peladen S3, yang paling seru adalah proses build di FreeBSD yang menurut ane bisa menambah pengalaman dan ilmu karena rata - rata aplikasi self host lebih memilih untuk menyediakan dockerfile untuk mempermudah pemasangan dengan Docker.

Namun kalo tidak ingin bersusah payah, kalian bisa pakai Docker atau jika pakai FreeBSD bisa menyalin hasil build yang sudah ane buat (khusus untuk Garage WebUI) disini.

 $ curl -o garage-webui https://egois.org/files/freebsd/garage-webui
 $ chmod +x garage-webui
 $ ./garage-webui


Artikel terkait #freebsd

Blocklistd: cara ampuh menghalau penyusup di FreeBSD

pasangkan dengan SSH Guard maka ane punya pertahanan berlapis.

Self host Ente Photos di FreeBSD

Ini adalah catatan ane dalam memasang Ente di FreeBSD, tidak mudah dan menjengkelkan. Silakan pakai Linux saja karena mudah dan cocok untuk pemula

Backup data dengan Restic dan Rclone

Sedia backup sebelum hujan badai datang

Self hosting S3 di FreeBSD dengan Garage

Memasang garage sebagai peladen S3 di FreeBSD

Jika lupa password root FreeBSD

Cara ini sering dipakai untuk merubah password root jika kelupaan


dari Fediverse

Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan meng-reply di toot ini

Belum ada komentar dari fediverse

kembali ke atas