Cara Menginstal dan Mengonfigurasi MongoDB di VPS (Panduan Lengkap)
MongoDB adalah database NoSQL berorientasi dokumen yang menyimpan catatan sebagai dokumen BSON (Binary JSON), memungkinkan pemodelan data bebas skema dengan skalabilitas horizontal melalui sharding native. Tidak seperti database relasional, MongoDB tidak memerlukan skema tabel yang telah ditentukan sebelumnya, menjadikannya pilihan utama untuk aplikasi dengan struktur data yang terus berkembang, throughput penulisan tinggi, atau hubungan data hierarkis.
Panduan ini memandu Anda melalui deployment MongoDB tingkat produksi pada Linux VPS — mencakup instalasi dari repositori resmi, penguatan autentikasi, kontrol akses jaringan, konfigurasi TLS, penyetelan performa, dan otomatisasi backup. Setiap langkah mengasumsikan Anda beroperasi di lingkungan server nyata di mana keamanan dan keandalan tidak dapat dikompromikan.
Prasyarat
Sebelum melanjutkan, konfirmasi hal-hal berikut:
- Sebuah VPS yang menjalankan Ubuntu 20.04 LTS atau Ubuntu 22.04 LTS (perintah identik untuk keduanya)
- Akses pengguna root atau berprioritas
sudomelalui SSH - Minimal 2 GB RAM (4 GB direkomendasikan untuk beban kerja produksi)
- Setidaknya 20 GB ruang disk yang tersedia pada volume penyimpanan cepat
- UFW atau iptables tersedia untuk manajemen firewall
- Keakraban dasar dengan baris perintah Linux
> Catatan arsitektur: Mesin penyimpanan WiredTiger MongoDB menggunakan cache internal default sebesar 50% dari (RAM – 1 GB). Pada VPS 2 GB, ini menghasilkan sekitar 512 MB cache. Untuk beban kerja yang banyak membaca, sediakan setidaknya 4 GB RAM untuk menghindari I/O disk yang terus-menerus akibat tekanan cache.
MongoDB vs. Database NoSQL Lainnya: Perbandingan Singkat
| Fitur | MongoDB | Redis | Cassandra | CouchDB |
|---|---|---|---|---|
| Model data | Dokumen (BSON) | Key-value | Wide-column | Dokumen (JSON) |
| Bahasa kueri | MQL (kueri kaya) | Perintah | CQL | Mango / MapReduce |
| Penskalaan horizontal | Sharding native | Mode cluster | Native | Multi-master |
| Transaksi ACID | Ya (v4.0+, multi-doc) | Parsial (skrip Lua) | Ringan | Ya |
| Kasus penggunaan terbaik | Aplikasi umum, API | Caching, sesi | Time-series, IoT | Sinkronisasi offline-first |
| Persistensi disk | Penyimpanan utama | Opsional (RDB/AOF) | Penyimpanan utama | Penyimpanan utama |
| Pencarian teks lengkap | Atlas Search / indeks teks | Terbatas | Tidak | Terbatas |
Langkah 1: Perbarui Sistem
Selalu mulai dengan sistem yang telah sepenuhnya diperbarui. Paket yang kedaluwarsa memperkenalkan CVE yang diketahui dan dapat dieksploitasi bahkan sebelum Anda menginstal tumpukan aplikasi Anda.
sudo apt update && sudo apt upgrade -ySetelah menerapkan pembaruan kernel atau libc, reboot untuk mengaktifkan kernel baru:
sudo rebootSambungkan kembali melalui SSH setelah server kembali online (biasanya 30–60 detik).
Langkah 2: Instal MongoDB dari Repositori Resmi
Repositori apt default Ubuntu menyertakan versi MongoDB yang sudah usang dan dikemas ulang oleh komunitas, yang tidak memiliki patch keamanan terbaru dan peningkatan mesin. Selalu instal dari repositori resmi MongoDB.
Tambahkan Kunci GPG dan Repositori MongoDB
Perintah apt-key sudah tidak digunakan lagi di Ubuntu 22.04. Gunakan metode keyring yang direkomendasikan, yang berfungsi pada 20.04 dan 22.04:
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc |
sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpgTambahkan entri repositori resmi:
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ]
https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" |
sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list> Catatan versi: Ganti 7.0 dengan rilis target Anda (misalnya, 6.0) jika Anda memerlukan versi tertentu untuk kompatibilitas aplikasi. MongoDB 7.0 adalah rilis Dukungan Jangka Panjang saat ini per 2024.
Instal Paket MongoDB
sudo apt update
sudo apt install -y mongodb-orgIni menginstal komponen-komponen berikut:
mongod — daemon database utama
mongos — router sharding (digunakan dalam deployment cluster yang di-shard)
mongosh — MongoDB Shell modern (menggantikan biner mongo lama)
mongodb-database-tools — mencakup mongodump, mongorestore, mongoexport, dan mongoimportSematkan Versi yang Terinstal
Cegah peningkatan yang tidak disengaja yang dapat merusak kompatibilitas aplikasi:
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-database hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongosh hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selectionsLangkah 3: Konfigurasi Prasyarat Tingkat Sistem
MongoDB bekerja paling baik ketika parameter kernel dan filesystem tertentu disetel sebelum daemon dimulai.
Atur ulimit untuk File yang Dibuka
MongoDB memerlukan batas deskriptor file yang tinggi. Buat override systemd:
sudo mkdir -p /etc/systemd/system/mongod.service.d
sudo tee /etc/systemd/system/mongod.service.d/limits.conf > /dev/null <<EOF
[Service]
LimitFNOFILE=64000
LimitNPROC=64000
EOFNonaktifkan Transparent Huge Pages (THP)
THP menyebabkan lonjakan latensi yang signifikan di MongoDB. Nonaktifkan secara persisten:
sudo tee /etc/systemd/system/disable-thp.service > /dev/null <<EOF
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
[Install]
WantedBy=basic.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now disable-thpVerifikasi pengaturan telah berlaku:
cat /sys/kernel/mm/transparent_hugepage/enabledOutput harus menampilkan [never] sebagai nilai aktif.
Langkah 4: Mulai dan Aktifkan MongoDB
sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl enable mongodKonfirmasi daemon sedang berjalan:
sudo systemctl status mongodCari Active: active (running) dalam output. Jika layanan gagal dimulai, periksa log segera:
sudo tail -50 /var/log/mongodb/mongod.logKegagalan startup yang umum meliputi:
- Port 27017 sudah digunakan — proses lain terikat ke port tersebut; identifikasi dengan
sudo ss -tlnp | grep 27017 - Izin direktori data — pengguna
mongodharus memiliki/var/lib/mongodb; perbaiki dengansudo chown -R mongodb:mongodb /var/lib/mongodb - THP masih aktif — mesin WiredTiger mencatat peringatan dan dapat menurunkan performa
Langkah 5: Amankan MongoDB — Autentikasi dan Otorisasi
Ini adalah bagian paling kritis. Instans MongoDB yang tidak terlindungi dan terekspos ke internet telah bertanggung jawab atas ribuan pelanggaran data. Instalasi default tidak memiliki autentikasi, artinya siapa pun yang dapat menjangkau port 27017 memiliki akses baca/tulis penuh ke setiap database.
Buat Pengguna Administratif
Hubungkan ke shell MongoDB lokal (tidak diperlukan autentikasi sebelum mengaktifkannya):
mongoshDi dalam shell, beralih ke database admin dan buat superuser:
use admin
db.createUser({
user: "adminuser",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" }
]
})Menggunakan passwordPrompt() alih-alih string teks biasa mencegah kata sandi muncul dalam riwayat shell. Ketik kata sandi saat diminta, lalu keluar:
exitAktifkan Autentikasi di mongod.conf
Buka file konfigurasi MongoDB:
sudo nano /etc/mongod.confTemukan bagian security (akan dikomentari) dan aktifkan otorisasi:
security:
authorization: enabledSimpan dan keluar (Ctrl+X, lalu Y, lalu Enter), kemudian restart daemon:
sudo systemctl restart mongodVerifikasi Autentikasi Diterapkan
Coba koneksi tanpa autentikasi — seharusnya sekarang gagal:
mongosh --eval "db.adminCommand({ listDatabases: 1 })"Anda seharusnya menerima kesalahan Unauthorized. Sekarang autentikasi dengan benar:
mongosh -u adminuser -p --authenticationDatabase adminBuat Pengguna Berbasis Cakupan Aplikasi
Jangan pernah menggunakan superuser admin untuk koneksi aplikasi. Buat pengguna dengan hak istimewa minimal untuk setiap database aplikasi:
use myappdb
db.createUser({
user: "appuser",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "myappdb" }
]
})Langkah 6: Konfigurasi Pengikatan Jaringan dan Aturan Firewall
Batasi atau Perluas bindIp
Secara default, mongod.conf hanya terikat ke 127.0.0.1. Ini adalah pengaturan yang benar jika aplikasi Anda berjalan di VPS yang sama. Jika Anda memerlukan akses jarak jauh (misalnya, dari server aplikasi di host terpisah), edit /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.5Ganti 10.0.0.5 dengan IP privat spesifik server aplikasi Anda. Jangan pernah mengatur bindIp: 0.0.0.0 pada antarmuka yang menghadap publik tanpa aturan firewall yang membatasi akses ke IP yang diketahui. Pengikatan ke semua antarmuka tanpa firewall adalah penyebab utama insiden eksposur data MongoDB.
Restart setelah perubahan:
sudo systemctl restart mongodKonfigurasi Aturan Firewall UFW
Jika akses jarak jauh diperlukan, izinkan hanya IP tepercaya tertentu:
sudo ufw allow from 10.0.0.5 to any port 27017 proto tcp
sudo ufw enable
sudo ufw status verboseBlokir semua akses eksternal lainnya ke port 27017:
sudo ufw deny 27017UFW memproses aturan secara berurutan — aturan allow from spesifik di atas aturan deny yang luas mengambil prioritas untuk IP tepercaya.
Langkah 7: Aktifkan TLS/SSL untuk Koneksi Terenkripsi
Untuk deployment apa pun di mana lalu lintas MongoDB melintasi jaringan — bahkan LAN privat — enkripsi TLS adalah wajib. Tanpanya, kredensial dan data ditransmisikan dalam teks biasa.
Buat sertifikat self-signed untuk pengujian (gunakan sertifikat yang ditandatangani CA dalam produksi — pertimbangkan untuk memasangkannya dengan Sertifikat SSL untuk domain Anda):
sudo mkdir -p /etc/mongodb/ssl
sudo openssl req -newkey rsa:4096 -nodes -keyout /etc/mongodb/ssl/mongodb.key
-x509 -days 365 -out /etc/mongodb/ssl/mongodb.crt
-subj "/CN=your-vps-hostname"
sudo cat /etc/mongodb/ssl/mongodb.crt /etc/mongodb/ssl/mongodb.key |
sudo tee /etc/mongodb/ssl/mongodb.pem > /dev/null
sudo chown -R mongodb:mongodb /etc/mongodb/ssl
sudo chmod 600 /etc/mongodb/ssl/mongodb.pemTambahkan konfigurasi TLS ke /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1
tls:
mode: requireTLS
certificateKeyFile: /etc/mongodb/ssl/mongodb.pemRestart MongoDB dan hubungkan dengan TLS:
sudo systemctl restart mongod
mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem
--tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase adminFlag --tlsAllowInvalidCertificates hanya dapat diterima untuk sertifikat self-signed dalam pengembangan. Hapus saat menggunakan sertifikat yang ditandatangani CA.
Langkah 8: Penyetelan Performa di mongod.conf
Untuk deployment produksi pada VPS dengan sumber daya khusus, setel cache WiredTiger dan pengaturan journaling. Buka /etc/mongod.conf dan tambahkan atau modifikasi hal berikut:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1.5
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
replication:
oplogSizeMB: 1024Parameter penyetelan utama yang dijelaskan:
cacheSizeGB— Atur ini ke sekitar 50% dari RAM yang tersedia dikurangi 1 GB. Pada VPS 4 GB, gunakan1.5. Pada VPS 8 GB, gunakan3.5.slowOpThresholdMs— Kueri yang melebihi ambang batas ini (dalam milidetik) dicatat ke profiler. Menurunkan nilai ini membantu mengidentifikasi kueri yang tidak terindeks lebih awal.oplogSizeMB— Relevan jika Anda berencana menambahkan anggota replica set nanti. Pra-ukuran oplog menghindari lag replikasi pada beban kerja penulisan tinggi.
Terapkan perubahan:
sudo systemctl restart mongodLangkah 9: Backup dan Restore dengan mongodump
Backup Manual
mongodump
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
--out /var/backups/mongodb/$(date +%Y-%m-%d)Restore Manual
mongorestore
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
/var/backups/mongodb/2024-06-15Otomatiskan Backup dengan Cron
Buat skrip backup khusus:
sudo tee /usr/local/bin/mongodb-backup.sh > /dev/null <<'EOF'
#!/bin/bash
BACKUP_DIR="/var/backups/mongodb"
TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)
MONGO_URI="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
RETENTION_DAYS=7
mkdir -p "${BACKUP_DIR}/${TIMESTAMP}"
mongodump --uri="${MONGO_URI}" --out="${BACKUP_DIR}/${TIMESTAMP}"
find "${BACKUP_DIR}" -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} ;
EOF
sudo chmod +x /usr/local/bin/mongodb-backup.shJadwalkan untuk berjalan setiap hari pukul 02.00:
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mongodb-backup.sh >> /var/log/mongodb-backup.log 2>&1") | crontab -> Pertimbangan produksi: Simpan backup di luar server. Menyimpan backup di VPS yang sama dengan database tidak memberikan perlindungan terhadap kegagalan disk atau kompromi server. Gunakan rsync, rclone, atau penyimpanan objek yang kompatibel dengan S3 untuk mereplikasi backup ke lokasi jarak jauh.
Langkah 10: Pantau Kesehatan MongoDB
Perintah Pemantauan Bawaan
Di dalam mongosh, jalankan statistik server:
db.serverStatus()
db.stats()
db.currentOp()Gunakan mongostat dan mongotop
Dari shell, pantau jumlah operasi secara real-time:
mongostat --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Pantau waktu baca/tulis per koleksi:
mongotop --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Metrik Utama yang Perlu Dipantau
| Metrik | Ambang Batas Peringatan | Apa yang Ditunjukkan |
|---|---|---|
wiredTiger.cache.bytes currently in cache | > 90% dari cacheSizeGB | Tekanan cache; tingkatkan RAM atau kurangi dataset |
connections.current | > 80% dari connections.available | Kelelahan connection pool; setel pooling aplikasi |
opcounters.getmore | Konsisten tinggi | Inefisiensi cursor; tinjau pola kueri |
repl.lag (replica sets) | > 10 detik | Lag replikasi; periksa jaringan dan I/O disk |
locks.Global.acquireWaitCount | Nilai berkelanjutan apa pun | Pertentangan kunci; tinjau operasi yang berjalan lama |
Memilih Hosting yang Tepat untuk MongoDB
Performa dan keandalan instans MongoDB Anda terkait langsung dengan infrastruktur yang mendasarinya. Pertimbangkan tingkatan deployment berikut:
- Pengembangan dan staging: VPS standar dengan 2–4 GB RAM sudah cukup untuk beban kerja non-produksi, pengujian skema, dan lingkungan integrasi.
- Produksi node tunggal: VPS dengan 4–8 GB RAM, penyimpanan NVMe, dan core CPU khusus menangani lalu lintas produksi moderat untuk sebagian besar aplikasi web.
- Produksi throughput tinggi: Server Dedicated menghilangkan efek noisy-neighbor yang melekat pada lingkungan virtual. Pola I/O WiredTiger mendapat manfaat signifikan dari array NVMe bare-metal.
- Beban kerja ML/analitik: Jika Anda menjalankan MongoDB bersama pipeline data, analitik berat agregasi, atau pencarian vektor, GPU Hosting dapat mempercepat tugas pemrosesan hilir.
Untuk deployment yang memerlukan antarmuka manajemen grafis, VPS dengan cPanel menyediakan lingkungan yang familiar bagi tim yang kurang nyaman dengan administrasi CLI murni, meskipun pengeditan mongod.conf langsung tetap diperlukan untuk konfigurasi lanjutan.
Matriks Keputusan Deployment
Gunakan daftar periksa ini sebelum mulai beroperasi:
- [ ] MongoDB diinstal dari repositori resmi, versi disematkan
- [ ] Layanan
mongoddiaktifkan dan dikonfirmasiactive (running) - [ ] Transparent Huge Pages dinonaktifkan dan diverifikasi
- [ ]
ulimituntuk deskriptor file diatur ke 64000 atau lebih tinggi - [ ] Autentikasi diaktifkan di
mongod.conf(authorization: enabled) - [ ] Pengguna admin dibuat dengan
passwordPrompt()— tidak ada kata sandi teks biasa dalam riwayat shell - [ ] Pengguna khusus aplikasi dibuat dengan peran hak istimewa minimal
- [ ]
bindIpdibatasi hanya ke localhost atau IP tepercaya tertentu - [ ] Aturan UFW tersedia — port 27017 diblokir dari internet publik
- [ ] TLS diaktifkan dengan sertifikat yang valid
- [ ] Cache WiredTiger diukur ke 50% dari (RAM – 1 GB)
- [ ] Profiling kueri lambat diaktifkan (
slowOpThresholdMs: 100) - [ ] Backup harian otomatis dengan replikasi di luar server
- [ ] Restore backup telah diuji — backup yang belum pernah Anda restore bukanlah backup
FAQ
Apa port default yang didengarkan MongoDB, dan apakah perlu diubah?
MongoDB mendengarkan pada port TCP 27017 secara default. Mengubahnya ke port non-standar menambah sedikit ketidakjelasan tetapi bukan pengganti untuk autentikasi dan aturan firewall. Jika Anda mengubahnya, perbarui net.port di /etc/mongod.conf dan sesuaikan semua aturan UFW dan string koneksi yang sesuai.
Mengapa MongoDB menggunakan begitu banyak RAM bahkan dengan dataset kecil?
WiredTiger mengalokasikan cache internalnya terlebih dahulu berdasarkan rumus max(50% of (RAM - 1 GB), 256 MB). Ini disengaja — menyimpan data yang sedang digunakan dalam memori menghilangkan pembacaan disk. Jika konsumsi RAM menjadi perhatian pada VPS kecil, atur secara eksplisit cacheSizeGB di /etc/mongod.conf ke nilai yang lebih rendah.
Bisakah saya menjalankan MongoDB pada shared hosting?
Tidak. MongoDB memerlukan daemon latar belakang yang persisten (mongod), akses filesystem langsung ke direktori datanya, dan kemampuan untuk terikat ke port jaringan. Tidak satu pun dari ini tersedia pada Shared Web Hosting. VPS adalah lingkungan minimum yang layak.
Apa perbedaan antara mongodump dan snapshot filesystem untuk backup?
mongodump melakukan backup logis — ia membaca dokumen melalui antarmuka kueri MongoDB dan mengekspornya sebagai file BSON. Ini portabel dan berfungsi lintas versi tetapi lebih lambat dan tidak dapat menjamin konsistensi point-in-time pada instans yang aktif dengan penulisan tinggi tanpa --oplog. Snapshot filesystem (LVM, ZFS, atau snapshot penyimpanan blok cloud) menangkap file data mentah pada titik waktu yang konsisten dan jauh lebih cepat untuk dataset besar, tetapi memerlukan mesin penyimpanan dalam keadaan konsisten.
Bagaimana cara memeriksa versi MongoDB yang terinstal?
Jalankan perintah berikut dari terminal:
mongod --versionAtau dari dalam mongosh:
db.version()