Cara Menjalankan MinIO di VPS Ubuntu 24.04
Bangun MinIO satu node di Ubuntu 24.04 dengan source terverifikasi, systemd, mc, presigned URL, dan target backup restic untuk API S3 milik Anda.
Apa yang Anda dapatkan dari object storage self-hosted dengan MinIO
MinIO adalah object storage self-hosted yang menggunakan API Amazon S3. Arahkan restic atau S3 SDK ke server Anda sendiri, ubah satu pengaturan endpoint, dan untuk aktivitas harian seperti membaca, menulis, membuat daftar objek, serta tautan presigned, hanya itu yang diperlukan. Namun, kompatibel tidak berarti identik. Sebagai contoh, MinIO tidak mengimplementasikan ACL objek Amazon, dan pengembangnya menyatakan tidak berniat untuk melakukannya, sehingga aplikasi yang bergantung pada perilaku ACL memerlukan lebih dari sekadar endpoint baru. Panduan ini membangun single node pada Ubuntu 24.04: binary yang dikompilasi dari source terverifikasi, dedicated system user, unit systemd yang menjaga kredensial root agar tidak berada di dalam file unit, serta bucket tempat restic melakukan backup.
S3 (simple storage service) adalah HTTP API, bukan sistem file. Anda melakukan PUT objek ke dalam bucket di bawah sebuah key dan Anda melakukan GET untuk mengambilnya kembali. Pada bucket standar, tidak ada penulisan parsial dan tidak ada penggantian nama. Directory bucket S3 Express One Zone milik Amazon adalah pengecualian, dengan panggilan append dan rename tersendiri, namun itu hanyalah satu kelas penyimpanan dan tidak ada bagian dalam panduan ini yang mengandalkannya. Alat backup menyukai model standar ini karena sebuah objek bisa dipastikan sampai secara utuh atau tidak sampai sama sekali.
Satu node menyimpan satu salinan data Anda. Itulah kompromi yang Anda buat. Anda mendapatkan endpoint S3 yang Anda kendalikan dengan harga sebuah VPS, dan Anda juga mewarisi setiap tugas yang sebelumnya dilakukan oleh penyedia cloud, mulai dari mengganti disk yang rusak hingga melakukan patching perangkat lunak server. Bagian di dekat akhir menjelaskan dengan lugas kapan kompromi tersebut menjadi pilihan yang tepat.
Status MinIO community edition pada Oktober 2026
Baca bagian ini sebelum menggunakannya sebagai dasar, karena statusnya baru-baru ini berubah. Pada Mei 2025, MinIO menghapus fitur administrasi dari konsol web pada community edition. Yang tersisa di browser adalah object browser. Karena itu, bucket dan access key dikelola dengan client command line mc.
Kemudian pada 2025, MinIO berhenti menerbitkan binary community yang telah dikompilasi sebelumnya. README proyek menyatakan bahwa community edition didistribusikan hanya sebagai source code. Sejak April 2026, repository minio/minio telah diarsipkan dengan pemberitahuan THIS REPOSITORY IS NO LONGER MAINTAINED. Server download lama juga tidak lagi menyediakan file community. Berdasarkan pemeriksaan pada 20 Oktober 2026, setiap path dl.min.io yang sebelumnya digunakan panduan ini untuk mengunduh binary server, binary client, dan file checksum memberikan respons 410 Gone. Ini merupakan penghapusan yang disengaja, bukan gangguan layanan. Satu-satunya binary mc yang masih tersedia di server tersebut adalah AIStor Client pada /aistor/mc/release/, yang termasuk lini komersial. Halaman download di min.io sekarang mencantumkan AIStor Server, AIStor Client, AIStor SDK, dan beberapa add-on AIStor, serta tier AIStor gratis yang menurut keterangannya ditujukan bagi developer, peneliti, dan organisasi kecil yang menjalankan deployment standalone. Tidak ada build community.
Source code masih tersedia dan lebih baru daripada binary terakhir. Rilis community terakhir adalah RELEASE.2025-10-15T17-29-55Z, yang diterbitkan pada 16 Oktober 2025 sebagai security release. Rilis ini memperbaiki privilege escalation melalui session policy bypass pada service account dan STS. Catatan rilis menyarankan semua pengguna segera melakukan upgrade. Binary prakompilasi terakhir adalah build September 2025, sehingga tidak pernah menerima perbaikan tersebut. Panduan ini mengompilasi rilis Oktober. Karena repository telah diarsipkan, perbaikan ini juga merupakan perbaikan terakhir yang akan diterima community edition.
Fakta tersebut menentukan bagian lain dalam panduan ini. Karena itu, MinIO di sini listen pada 127.0.0.1 dan hanya terhubung ke Internet melalui proxy yang Anda kendalikan.
Instal binary MinIO dan verifikasi hasil unduhan
MinIO ditulis dalam Go, dan README vendor membangunnya dengan satu perintah go install yang memerlukan Go 1.24 atau yang lebih baru. Instal Go dari tarball resmi terlebih dahulu. Pada 20 Oktober 2026, rilis stabil terbaru di go.dev/dl adalah go1.27.3, yang dirilis pada 19 Oktober 2026 dengan perbaikan keamanan pada paket crypto/x509. Hash di bawah adalah hash yang dipublikasikan pada halaman tersebut untuk arsip linux-amd64. Jika memilih Go yang lebih baru, ambil hash-nya dari halaman yang sama. Flag -f membuat curl gagal jika terjadi error HTTP, alih-alih menyimpan halaman error dengan nama yang Anda minta. Tanpa flag ini, Anda dapat mengekstrak halaman 404 lalu bingung karena file tersebut bukan arsip.
cd /tmp
GOVER=go1.27.3
curl -fsSL "https://go.dev/dl/$GOVER.linux-amd64.tar.gz" -o go.tar.gzBandingkan kedua hash tersebut. Bandingkan hanya hash-nya.
published=65efbc80fdc1fa2cd2631cad5b481777a68e8725f34e89f50fc6ac714e379b40
downloaded=$(sha256sum go.tar.gz | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"Pahami dengan jelas apa yang dibuktikan oleh pemeriksaan ini. Kecocokan hash membuktikan bahwa unduhan selesai dan tidak rusak atau diubah selama transmisi. Pemeriksaan ini tidak membuktikan bahwa vendor dapat dipercaya. Itu adalah masalah yang berbeda, dan tidak ada perintah sha256sum yang dapat menyelesaikannya.
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go.tar.gz
export PATH=$PATH:/usr/local/go/bin
go versionSekarang build rilis komunitas final sebagai pengguna biasa. go install memeriksa setiap modul yang diunduhnya, termasuk source code MinIO sendiri, terhadap database checksum publik Go di sum.golang.org. Karena itu, modul yang telah dirusak atau diganti akan menghentikan proses build dengan error keamanan, bukan menghasilkan binary.
go install github.com/minio/minio@RELEASE.2025-10-15T17-29-55Z
sudo install -o root -g root -m 755 ~/go/bin/minio /usr/local/bin/minio
minio --version
go version -m /usr/local/bin/minio | head -n 3minio --version mencetak DEVELOPMENT.GOGET sebagai pengganti nama rilis, karena go install tidak menerapkan build flag yang digunakan vendor untuk memberi cap pada binary mereka sendiri. go version -m membaca informasi modul yang disematkan Go pada setiap binary, dan baris mod github.com/minio/minio menyebutkan commit yang Anda build. Nilai Permission denied di sini berarti mode-nya salah, sedangkan command not found berarti /usr/local/bin tidak ada di PATH Anda. Jika VPS kekurangan memori saat kompilasi, jalankan go install yang sama pada mesin Linux lain dengan arsitektur yang sama, lalu salin binary tersebut.
Buat pengguna sistem dan direktori data
MinIO menerima unggahan dari jaringan, sehingga tidak boleh dijalankan sebagai root. Berikan MinIO akun tanpa direktori home dan tanpa shell login.
sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minio-r membuat akun sistem dengan UID di bawah 1000, sehingga akun tersebut tidak berada dalam rentang yang digunakan untuk pengguna biasa. -M melewati pembuatan direktori home karena akun yang tidak pernah login tidak memerlukan direktori tersebut. Periksa hasilnya dengan id minio-user dan stat -c '%U %a' /var/lib/minio, yang seharusnya menampilkan minio-user 750.
Direktori data harus dapat ditulisi oleh pengguna tersebut, bukan hanya dibaca. Saat pertama kali dijalankan, MinIO membuat direktori .minio.sys di dalam volume untuk menyimpan konfigurasinya sendiri. Karena itu, direktori yang dimiliki root membuat MinIO berhenti saat startup dengan pesan yang diakhiri permission denied. Aturan yang sama berlaku untuk setiap service yang Anda jalankan dengan cara ini. Pengguna service dengan hak akses minimum pada VPS membahasnya secara lebih lengkap.
Masukkan kredensial root ke file environment
Kredensial root dapat membuka setiap bucket, sehingga kredensial tersebut tidak boleh disimpan dalam unit file yang dapat dibaca semua pengguna. Buat file dengan mode yang benar terlebih dahulu, lalu tulis isinya. Dengan demikian, password tidak pernah berada dalam file yang dapat dibaca, bahkan untuk sesaat.
sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/miniotee mengosongkan file yang sudah ada, bukan membuatnya ulang. Karena itu, mode tetap 600 dan pemilik tetap root. Hal ini memang disengaja. systemd membaca EnvironmentFile sebagai root sebelum menurunkan hak akses ke User=. Dengan demikian, akun service tidak perlu membaca kredensialnya sendiri. Setelah service berjalan, buktikan dengan sudo -u minio-user cat /etc/default/minio. Perintah tersebut harus menampilkan Permission denied.
Ada dua perilaku MinIO yang perlu diketahui sebelum Anda menjalankannya. Jika tidak ada MINIO_ROOT_USER dan MINIO_ROOT_PASSWORD di environment-nya, MinIO tidak menolak untuk berjalan. MinIO berjalan menggunakan kredensial default yang didokumentasikan, yaitu minioadmin:minioadmin. Kredensial tersebut adalah pasangan pertama yang dicoba oleh scanner, meskipun MinIO terlihat sepenuhnya sehat saat menggunakannya. Password dengan panjang kurang dari 8 karakter akan ditolak. MinIO keluar saat startup dan menampilkan error bahwa kredensial tidak valid, karena access key memerlukan sedikitnya 3 karakter dan secret key sedikitnya 8 karakter.
MINIO_VOLUMES adalah path data, sedangkan MINIO_OPTS berisi flag. Binding ke 127.0.0.1 berarti tidak ada pihak di luar VPS ini yang dapat mengakses API S3 untuk saat ini. Ini adalah default yang tepat. Anda dapat membukanya nanti secara sengaja melalui proxy yang memiliki sertifikat.
Tulis unit systemd
Buat /etc/systemd/system/minio.service:
[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
Wants=network-online.target
After=network-online.target
[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true
[Install]
WantedBy=multi-user.targetTidak ada awalan - pada EnvironmentFile, dan ini merupakan keputusan, bukan kesalahan pengetikan. Dengan tanda hubung tersebut, systemd mengabaikan file yang tidak ada dan tetap menjalankan MinIO. Akibatnya, file yang terhapus atau path yang salah ketik dapat secara diam-diam membuat server berjalan dengan minioadmin:minioadmin. Tanpa tanda hubung, file yang tidak ada membuat unit gagal sebelum MinIO dijalankan, dan journalctl -u minio menampilkan Failed to load environment files: No such file or directory. Unit yang menolak untuk start jauh lebih mudah diketahui daripada server yang diam-diam menerima kata sandi default.
$MINIO_VOLUMES dan $MINIO_OPTS sengaja tidak diberi tanda kutip karena systemd memisahkan variabel tanpa tanda kutip berdasarkan spasi menjadi argumen terpisah. Dengan cara ini, empat kata dalam MINIO_OPTS menjadi empat argumen untuk minio server. LimitNOFILE=65536 menaikkan batas file descriptor karena setiap koneksi terbuka dan setiap file data terbuka menggunakan satu descriptor, sedangkan nilai default 1024 akan habis saat beban meningkat.
sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/liveis-active seharusnya menampilkan active, dan endpoint health seharusnya menjawab 200. journalctl -u minio -n 20 --no-pager menampilkan alamat API tempat server menerima koneksi. Jika unit terus melakukan restart, systemd akan berhenti mencoba dan mencatat Start request repeated too quickly. Artinya, MinIO keluar pada setiap percobaan. Penyebabnya tercetak pada baris sebelum pesan tersebut, jadi baca log ke arah atas.
Untuk isolasi yang lebih baik, tambahkan ProtectSystem=full dan ProtectHome=true ke bagian [Service]. Keduanya memerlukan mount namespace dari kernel host. Pada virtualisasi container yang menggunakan kernel host bersama, seperti OpenVZ atau LXC, keduanya dapat gagal, lalu unit melaporkan status=226/NAMESPACE. Hapus kedua baris tersebut agar unit dapat start. Unit ini sendiri merupakan unit biasa, dan service dan timer systemd pada VPS membahas direktif lainnya.
Pasang mc dan buktikan alur pulang-pergi
MinIO client adalah mc. Jangan memasangnya dengan apt install mc. Paket tersebut adalah Midnight Commander, yaitu file manager yang tidak terkait dengan MinIO.
dl.min.io masih menyediakan biner mc, tetapi bukan biner komunitas. Jalur komunitas lama, https://dl.min.io/client/mc/release/linux-amd64/mc, merespons dengan 410 Gone. Yang kini ditawarkan MinIO di sana adalah AIStor Client pada https://dl.min.io/aistor/mc/release/linux-amd64/mc. Referensi AIStor CLI mengarah ke client tersebut dan menjelaskan bahwa fungsinya eksklusif untuk deployment AIStor Server berlisensi. Referensi itu tidak menyebut penggunaan client tersebut terhadap server komunitas. Karena itu, panduan ini tetap menggunakan client komunitas. Repository minio/mc telah diarsipkan sejak July 2026. Jadi, build rilis terakhirnya, RELEASE.2025-08-13T08-35-41Z, dengan toolchain Go yang sama. Database checksum juga mencakup download ini.
go install github.com/minio/mc@RELEASE.2025-08-13T08-35-41Z
sudo install -o root -g root -m 755 ~/go/bin/mc /usr/local/bin/mcDaftarkan server sebagai alias, lalu pindahkan sebuah object melalui server tersebut.
MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txtmc ls seharusnya menampilkan hello.txt beserta ukurannya, dan mc cat seharusnya mencetak hello object storage. Alur pulang-pergi ini adalah bukti bahwa server benar-benar berfungsi karena proses tersebut membuat signed S3 requests yang sama seperti yang akan dibuat oleh client lain. mc admin info local menampilkan status server jika Anda memerlukan pemeriksaan tambahan.
Jalankan satu pemeriksaan lagi sekarang, selagi server masih kosong.
mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadminPerintah ini harus gagal. Jika perintah ini berhasil, environment file tidak pernah diteruskan ke process dan server Anda berjalan dengan default credentials. Perbaiki hal tersebut sebelum ada proses lain yang mengakses mesin ini.
mc menyimpan alias di ~/.mc/config.json dalam plain text. Jadi, credentials tersebut tersimpan di home directory pengguna yang menjalankan perintah. Menjalankan mc di bawah sudo akan menempatkan root credentials di /root/.mc/config.json. Simpan root alias pada satu akun administrator dan berikan key tersendiri kepada setiap aplikasi.
Membagikan satu objek dengan presigned URL
Presigned URL adalah tautan HTTPS biasa yang dilengkapi dengan tanda tangan dan masa kedaluwarsa. Siapa pun yang memiliki tautan tersebut dapat mengambil objek terkait tanpa memerlukan akun atau klien.
mc share download --expire 12h local/backups/hello.txtOutput tersebut memuat X-Amz-Signature dan X-Amz-Expires di dalam query string. Ada dua hal yang sering mengejutkan pengguna. Tautan dibangun dari endpoint dalam alias yang Anda gunakan, sehingga alias pada 127.0.0.1 akan menghasilkan tautan yang hanya dapat dibuka oleh mesin tersebut: buatlah alias kedua pada hostname publik Anda untuk tautan yang ingin Anda kirimkan. Selain itu, tidak ada tombol pencabutan (revoke) per tautan. Tanda tangan tetap valid hingga masa berlakunya habis atau kunci yang menandatanganinya dihapus atau diubah. Untuk tautan yang ditandatangani dengan kredensial root, hal ini berarti melakukan rotasi kredensial, sehingga durasi kedaluwarsa yang singkat adalah kontrol yang praktis. Tujuh hari adalah durasi maksimum yang diizinkan oleh format tanda tangan S3.
Beri restic key dan bucket khusus
Kredensial root dapat membaca dan menghapus setiap bucket, sehingga backup job tidak boleh menggunakannya. Buat bucket, policy yang cakupannya dibatasi ke bucket tersebut, dan user yang tidak memperoleh akses lain.
mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetBucketLocation"],
"Resource": ["arn:aws:s3:::restic"]
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": ["arn:aws:s3:::restic/*"]
}
]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backupMinIO menyediakan policy bawaan readwrite yang akan menghemat satu perintah, tetapi policy tersebut memberikan akses penuh ke setiap bucket di server. Policy di atas sengaja menyebut bucket dua kali: pertama sebagai arn:aws:s3:::restic agar bucket dapat dicantumkan, dan kedua sebagai arn:aws:s3:::restic/* untuk objek di dalamnya. Dalam S3, bucket dan objeknya merupakan resource terpisah. Karena itu, policy yang hanya menyebut salah satunya akan gagal dengan cara yang terlihat seperti client yang rusak.
Uji pembatasan tersebut sebelum mengandalkannya.
mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backupsPerintah ls pertama berhasil dan perintah kedua gagal dengan Access Denied. Policy yang belum diuji hanyalah perkiraan.
Sekarang arahkan restic ke bucket tersebut. restic membaca kredensial S3 dari environment variable AWS standar, sehingga tidak ada file kredensial khusus restic yang digunakan.
sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshotsrestic init meminta password repository. Password tersebut mengenkripsi repository, sehingga MinIO hanya menyimpan ciphertext. Jika password hilang, backup juga tidak dapat dipulihkan. Proses yang dijalankan oleh timer systemd tidak memiliki terminal untuk menerima input, sehingga atur RESTIC_PASSWORD_FILE ke file mode 600 untuk backup terjadwal.
Ada satu aturan penempatan yang lebih penting daripada perintah apa pun di atas. Repository restic pada VPS yang sama dengan data yang dilindunginya hanya melindungi Anda dari rm yang buruk, bukan dari kegagalan lainnya. Node MinIO harus berada di mesin yang berbeda, idealnya di region yang berbeda. backup restic pada VPS membahas penjadwalan dan retensi berdasarkan konfigurasi ini.
Terminasi TLS dengan nginx
MinIO berjalan pada localhost, sehingga nginx menjadi permukaan publik. Terbitkan sertifikat terlebih dahulu, seperti yang dijelaskan dalam Sertifikat Let's Encrypt dengan certbot dan nginx, lalu gunakan server block berikut.
server {
listen 443 ssl;
server_name s3.example.com;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://127.0.0.1:9000;
}
}Beberapa baris tersebut sangat penting. client_max_body_size 0 menghapus batas ukuran body default sebesar 1 MB. Tanpa pengaturan ini, upload yang lebih besar akan ditolak dengan 413 Request Entity Too Large sebelum MinIO menerima request tersebut. proxy_request_buffering off meneruskan upload secara langsung, karena konfigurasi default menyimpan seluruh request ke file sementara terlebih dahulu. Akibatnya, object berukuran besar membutuhkan ruang disk dua kali lipat. proxy_set_header Host $http_host adalah bagian yang paling sulit terlihat: tanda tangan S3 mencakup header Host. Proxy yang menulis ulang header tersebut membuat setiap request gagal dengan SignatureDoesNotMatch, meskipun access log menunjukkan request normal telah diterima.
Beri tahu MinIO nama publiknya agar link yang dihasilkannya mengarah ke proxy, bukan ke localhost.
echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minioKonfigurasi firewall tetap sederhana. Izinkan SSH dan HTTPS. Jangan buat rule untuk port 9000 dan 9001. Alamat yang terikat ke 127.0.0.1 tidak dapat dijangkau dari mesin lain, apa pun konfigurasi firewall. Dasar-dasar firewall ufw pada VPS berisi perintahnya.
Kapan single-node MinIO sudah memadai dan kapan Anda memerlukan S3 sungguhan
Single node di sini berarti satu drive. Jadi, tidak ada parity dan tidak ada salinan kedua di dalam deployment. Durability setiap objek bergantung pada durability satu disk VPS. Dokumentasi MinIO sendiri, yang sejak dokumentasi komunitas yang di-host dihapus pada Oktober 2025 hanya tersedia sebagai source di repository minio/docs, menjelaskan bahwa deployment standalone ditujukan untuk pengembangan dan evaluasi tahap awal serta menyatakan bahwa MinIO tidak merekomendasikannya untuk production. Object locking dapat diaktifkan untuk sebuah bucket, tetapi pada satu VPS fitur ini hanya mencegah penghapusan melalui S3 API. Siapa pun yang memiliki akses root ke mesin tersebut tetap dapat menghapus file di disk. Jadi, jangan menjanjikan kebijakan retensi immutable pada setup ini.
Setup ini cocok sebagai target restic pada VPS kedua di region lain, serta sebagai endpoint S3 untuk pekerjaan development dan artefak CI. Dalam skenario tersebut, kehilangan sebuah bucket hanya mengharuskan Anda melakukan rebuild. Tidak ada dampak lain. Setup ini juga cukup layak untuk upload pengguna pada aplikasi kecil, selama Anda memiliki recovery plan dan benar-benar telah menguji proses restore.
Pilih managed S3 ketika kontrak atau regulator mengharuskan object lock atau durability multi-region. Pilih managed S3 juga jika Anda tidak ingin menjadi orang yang menerima page pada pukul 03:00 karena disk penuh. Kode yang tidak lagi dikembangkan adalah alasan lain yang perlu dipertimbangkan. Per 20 Oktober 2026, community edition telah diarsipkan dan tidak lagi dipelihara. Rilis terakhirnya, RELEASE.2025-10-15T17-29-55Z, adalah versi yang dikompilasi oleh panduan ini. Tidak ada perbaikan untuk masalah yang muncul setelah versi tersebut. Jadi, menjalankannya berarti menerima kondisi itu, atau berpindah ke lini komersial AIStor dari MinIO maupun ke object store self-hosted lain, yang dibandingkan dalam alternatif MinIO self-hosted.
Ada satu batasan yang perlu ditegaskan karena sering ditanyakan. Object storage bukan database. Dalam bucket standar, setiap write menggantikan seluruh objek. Bahkan append call yang ditambahkan Amazon untuk S3 Express One Zone hanya menambahkan data ke bagian akhir objek. Karena itu, file SQL aktif pada bucket S3 akan lambat dan tidak aman. Simpan database pada disk lokal dan lakukan backup ke bucket. menjalankan SQLite di production pada VPS menjelaskan pemisahan tersebut.
Mode kegagalan dan pesan yang akan Anda lihat
Unit gagal tepat setelah systemctl enable --now. Baca journalctl -u minio -n 30 --no-pager. Failed to load environment files: No such file or directory berarti /etc/default/minio tidak ditemukan atau path-nya salah ketik di dalam unit. Pesan yang diakhiri dengan permission denied berarti direktori data tidak dapat ditulis oleh akun service, jadi periksa apakah stat -c '%U' /var/lib/minio/data mencetak minio-user.
minioadmin:minioadmin masih login. File environment tidak pernah mencapai proses tersebut. Pastikan unit berisi EnvironmentFile=/etc/default/minio, jalankan sudo systemctl daemon-reload, lalu restart service. MinIO membaca kredensial root-nya sekali saat startup, jadi mengedit file tersebut tanpa restart tidak akan mengubah apa pun.
Address already in use saat startup. Proses lain menggunakan port 9000. Temukan proses tersebut dengan sudo ss -ltnp | grep :9000 sebelum Anda mengubah port MinIO.
Upload di atas 1 MB gagal melalui proxy. nginx menjawab 413 Request Entity Too Large dan MinIO tidak pernah menerima request tersebut. Atur client_max_body_size 0 di dalam blok server.
SignatureDoesNotMatch. Entah secret key salah, atau ada sesuatu di antara client dan MinIO yang menulis ulang header Host, yang dicakup oleh signature.
RequestTimeTooSkewed. Jam pada client atau server tidak tepat. Setiap request S3 yang ditandatangani membawa timestamp, dan MinIO, seperti Amazon S3, menolak request dengan header-signed jika timestamp-nya berselisih lebih dari 15 menit dari jam internalnya. Link presigned diperiksa berdasarkan waktu kedaluwarsanya. Periksa timedatectl dan pastikan sinkronisasi waktu aktif.
Access Denied pada bucket yang Anda tahu ada. Key tersebut dibatasi untuk bucket yang berbeda. Cetak apa yang sebenarnya diizinkan oleh policy dengan mc admin policy info local restic-rw dan bandingkan nama bucket pada baris resource.
FAQ
Apakah MinIO single-node cukup untuk backup produksi?
MinIO cukup sebagai target restic yang berjalan pada mesin terpisah dari data yang dilindunginya. Namun, MinIO tidak cukup sebagai satu-satunya salinan. Deployment dengan satu drive tidak memiliki parity, sehingga tidak ada salinan kedua di dalam MinIO. Jika disk VPS tersebut kehilangan data, objek juga hilang. Simpan target kedua di lokasi lain, lalu lakukan pemulihan dari kedua target setidaknya sekali untuk memastikan prosesnya berjalan.
Mengapa sha256sum -c gagal pada file checksum MinIO?
Anda hanya akan menemukan file tersebut pada salinan yang disimpan sebelumnya, karena dl.min.io mengembalikan 410 Gone untuk setiap binary komunitas dan file checksum saat diperiksa pada 20 October 2026. Label setelah hash di dalam file tersebut menunjukkan release, misalnya minio.RELEASE.2025-09-07T16-13-09Z, sedangkan file yang diunduh biasanya bernama minio. sha256sum -c mencari file dengan nama yang tertulis di dalam file checksum, tetapi tidak menemukannya, lalu melaporkan No such file or directory dan WARNING: 1 listed file could not be read. Hasil download tidak bermasalah. Bandingkan string hash secara langsung dan abaikan label tersebut karena tidak memiliki makna keamanan.
Ke mana perginya konsol web admin MinIO?
MinIO menghapus fitur administrasi dari konsol community edition pada May 2025 dan menyisakan object browser pada antarmuka web. Bucket dan user sekarang dikelola dengan client mc menggunakan perintah seperti mc admin user add dan mc admin policy attach. Itulah cara yang dimaksudkan untuk community edition, bukan workaround. Karena itu, panduan ini melakukan semuanya dari command line.
Bagaimana cara mengarahkan restic ke MinIO sebagai backend S3?
Atur AWS_ACCESS_KEY_ID dan AWS_SECRET_ACCESS_KEY ke access key MinIO dan secret-nya, lalu gunakan string repository dalam bentuk s3:https://s3.example.com/restic, dengan elemen path terakhir sebagai nama bucket. Buat bucket terlebih dahulu menggunakan mc mb, karena key yang dibatasi pada satu bucket tidak memiliki izin untuk membuat bucket. restic mengenkripsi semua data dengan password repository-nya sendiri sebelum upload. Dengan demikian, MinIO hanya menyimpan ciphertext dan tidak pernah melihat file Anda.
Apakah MinIO harus dijalankan di belakang nginx?
Anda memerlukan TLS (transport layer security) jika client tidak berada pada mesin yang sama. Tanpa TLS, setiap objek dikirim melalui jaringan dalam bentuk teks biasa, termasuk access key ID dan request signature. Secret key itu sendiri tidak pernah meninggalkan client, karena penandatanganan S3 hanya menggunakannya secara lokal untuk menghitung signature tersebut. Namun, pihak mana pun di jalur jaringan tetap dapat membaca data dan mengulangi request yang ditangkap selama timestamp-nya masih valid. Proxy pada port 443 dengan sertifikat dari certbot merupakan cara paling sederhana untuk menggunakan TLS. Cara ini juga memisahkan proses pembaruan sertifikat dari MinIO. MinIO juga dapat melakukan terminasi TLS sendiri jika Anda mengarahkan --certs-dir ke direktori yang berisi public.crt dan private.key. Namun, service account harus memiliki akses baca ke private key yang diperbarui. Hal ini menambah pekerjaan untuk hasil yang sama.