15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai
23.10.2024

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 sudo melalui 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

FiturMongoDBRedisCassandraCouchDB
Model dataDokumen (BSON)Key-valueWide-columnDokumen (JSON)
Bahasa kueriMQL (kueri kaya)PerintahCQLMango / MapReduce
Penskalaan horizontalSharding nativeMode clusterNativeMulti-master
Transaksi ACIDYa (v4.0+, multi-doc)Parsial (skrip Lua)RinganYa
Kasus penggunaan terbaikAplikasi umum, APICaching, sesiTime-series, IoTSinkronisasi offline-first
Persistensi diskPenyimpanan utamaOpsional (RDB/AOF)Penyimpanan utamaPenyimpanan utama
Pencarian teks lengkapAtlas Search / indeks teksTerbatasTidakTerbatas

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 -y

Setelah menerapkan pembaruan kernel atau libc, reboot untuk mengaktifkan kernel baru:

sudo reboot

Sambungkan 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.gpg

Tambahkan 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-org

Ini 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 mongoimport

    Sematkan 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-selections

    Langkah 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
    EOF

    Nonaktifkan 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-thp

    Verifikasi pengaturan telah berlaku:

    cat /sys/kernel/mm/transparent_hugepage/enabled

    Output harus menampilkan [never] sebagai nilai aktif.

    Langkah 4: Mulai dan Aktifkan MongoDB

    sudo systemctl daemon-reload
    sudo systemctl start mongod
    sudo systemctl enable mongod

    Konfirmasi daemon sedang berjalan:

    sudo systemctl status mongod

    Cari Active: active (running) dalam output. Jika layanan gagal dimulai, periksa log segera:

    sudo tail -50 /var/log/mongodb/mongod.log

    Kegagalan 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 mongod harus memiliki /var/lib/mongodb; perbaiki dengan sudo 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):

    mongosh

    Di 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:

    exit

    Aktifkan Autentikasi di mongod.conf

    Buka file konfigurasi MongoDB:

    sudo nano /etc/mongod.conf

    Temukan bagian security (akan dikomentari) dan aktifkan otorisasi:

    security:
      authorization: enabled

    Simpan dan keluar (Ctrl+X, lalu Y, lalu Enter), kemudian restart daemon:

    sudo systemctl restart mongod

    Verifikasi 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 admin

    Buat 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.5

    Ganti 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 mongod

    Konfigurasi 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 verbose

    Blokir semua akses eksternal lainnya ke port 27017:

    sudo ufw deny 27017

    UFW 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.pem

    Tambahkan konfigurasi TLS ke /etc/mongod.conf:

    net:
      port: 27017
      bindIp: 127.0.0.1
      tls:
        mode: requireTLS
        certificateKeyFile: /etc/mongodb/ssl/mongodb.pem

    Restart MongoDB dan hubungkan dengan TLS:

    sudo systemctl restart mongod
    mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem 
      --tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase admin

    Flag --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: 1024

    Parameter penyetelan utama yang dijelaskan:

    • cacheSizeGB — Atur ini ke sekitar 50% dari RAM yang tersedia dikurangi 1 GB. Pada VPS 4 GB, gunakan 1.5. Pada VPS 8 GB, gunakan 3.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 mongod

    Langkah 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-15

    Otomatiskan 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.sh

    Jadwalkan 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

    MetrikAmbang Batas PeringatanApa yang Ditunjukkan
    wiredTiger.cache.bytes currently in cache> 90% dari cacheSizeGBTekanan cache; tingkatkan RAM atau kurangi dataset
    connections.current> 80% dari connections.availableKelelahan connection pool; setel pooling aplikasi
    opcounters.getmoreKonsisten tinggiInefisiensi cursor; tinjau pola kueri
    repl.lag (replica sets)> 10 detikLag replikasi; periksa jaringan dan I/O disk
    locks.Global.acquireWaitCountNilai berkelanjutan apa punPertentangan 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 mongod diaktifkan dan dikonfirmasi active (running)
    • [ ] Transparent Huge Pages dinonaktifkan dan diverifikasi
    • [ ] ulimit untuk 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
    • [ ] bindIp dibatasi 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 --version

    Atau dari dalam mongosh:

    db.version()
    15%

    Hemat 15% di Semua Layanan Hosting

    Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

    Gunakan kode:

    Skills
    Memulai