Bir VPS’e MongoDB Nasıl Kurulur ve Yapılandırılır (Eksiksiz Kılavuz)
MongoDB, kayıtları BSON (Binary JSON) belgeleri olarak depolayan, yerel parçalama (sharding) aracılığıyla yatay ölçeklenebilirlik ile şema bağımsız veri modellemeyi mümkün kılan, belge odaklı bir NoSQL veritabanıdır. İlişkisel veritabanlarının aksine MongoDB, önceden tanımlanmış tablo şeması gerektirmez; bu da onu gelişen veri yapılarına, yüksek yazma verimine veya hiyerarşik veri ilişkilerine sahip uygulamalar için baskın tercih haline getirir.
Bu kılavuz, Linux VPS üzerinde üretime hazır bir MongoDB dağıtımını adım adım ele almaktadır — resmi depodan kurulum, kimlik doğrulama güçlendirme, ağ erişim kontrolü, TLS yapılandırması, performans ayarı ve yedekleme otomasyonu konularını kapsamaktadır. Her adım, güvenlik ve güvenilirliğin vazgeçilmez olduğu gerçek bir sunucu ortamında çalıştığınızı varsaymaktadır.
Ön Koşullar
Devam etmeden önce aşağıdakileri doğrulayın:
- Ubuntu 20.04 LTS veya Ubuntu 22.04 LTS çalıştıran bir VPS (komutlar her ikisi için de aynıdır)
- SSH aracılığıyla root veya
sudoayrıcalıklı kullanıcı erişimi - Minimum 2 GB RAM (üretim iş yükleri için 4 GB önerilir)
- Hızlı bir depolama biriminde en az 20 GB kullanılabilir disk alanı
- Güvenlik duvarı yönetimi için UFW veya iptables mevcut olmalı
- Linux komut satırına temel düzeyde aşinalık
> Mimari notu: MongoDB’nin WiredTiger depolama motoru, varsayılan olarak (RAM – 1 GB)’ın %50’si kadar dahili önbellek kullanır. 2 GB’lık bir VPS’de bu yaklaşık 512 MB önbellek sağlar. Okuma ağırlıklı iş yükleri için, önbellek baskısından kaynaklanan sürekli disk G/Ç’sini önlemek amacıyla en az 4 GB RAM sağlayın.
MongoDB ile Diğer NoSQL Veritabanlarının Karşılaştırması
| Özellik | MongoDB | Redis | Cassandra | CouchDB |
|---|---|---|---|---|
| Veri modeli | Belge (BSON) | Anahtar-değer | Geniş sütun | Belge (JSON) |
| Sorgu dili | MQL (zengin sorgular) | Komutlar | CQL | Mango / MapReduce |
| Yatay ölçekleme | Yerel parçalama | Küme modu | Yerel | Çok yöneticili |
| ACID işlemleri | Evet (v4.0+, çok belgeli) | Kısmi (Lua betikleri) | Hafif | Evet |
| En iyi kullanım durumu | Genel amaçlı uygulamalar, API’ler | Önbellekleme, oturumlar | Zaman serisi, IoT | Çevrimdışı öncelikli senkronizasyon |
| Disk kalıcılığı | Birincil depo | İsteğe bağlı (RDB/AOF) | Birincil depo | Birincil depo |
| Tam metin arama | Atlas Search / metin indeksi | Sınırlı | Hayır | Sınırlı |
Adım 1: Sistemi Güncelleyin
Her zaman tam olarak yamalanmış bir sistemle başlayın. Güncel olmayan paketler, uygulama yığınınızı kurmadan önce bile istismar edilebilecek bilinen CVE’leri barındırır.
sudo apt update && sudo apt upgrade -yÇekirdek veya libc güncellemelerini uyguladıktan sonra yeni çekirdeği etkinleştirmek için yeniden başlatın:
sudo rebootSunucu yeniden çevrimiçi olduktan sonra (genellikle 30–60 saniye) SSH aracılığıyla yeniden bağlanın.
Adım 2: MongoDB’yi Resmi Depodan Kurun
Ubuntu’nun varsayılan apt depoları, son güvenlik yamalarından ve motor iyileştirmelerinden yoksun, güncel olmayan, topluluk tarafından yeniden paketlenmiş bir MongoDB sürümü sunar. Her zaman MongoDB’nin resmi deposundan kurun.
MongoDB GPG Anahtarı ve Deposunu Ekleyin
apt-key komutu Ubuntu 22.04’te kullanımdan kaldırılmıştır. Hem 20.04 hem de 22.04’te çalışan önerilen anahtar halkası yöntemini kullanın:
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc |
sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpgResmi depo girişini ekleyin:
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> Sürüm notu: Uygulama uyumluluğu için belirli bir sürüm gerekiyorsa 7.0 yerine hedef sürümünüzü (örn. 6.0) yazın. MongoDB 7.0, 2024 itibarıyla mevcut Uzun Vadeli Destek sürümüdür.
MongoDB Paketlerini Kurun
sudo apt update
sudo apt install -y mongodb-orgBu işlem aşağıdaki bileşenleri kurar:
mongod— birincil veritabanı arka plan programımongos— parçalama yönlendiricisi (parçalanmış küme dağıtımlarında kullanılır)mongosh— modern MongoDB Shell (eskimongoikilisinin yerini alır)mongodb-database-tools—mongodump,mongorestore,mongoexportvemongoimportiçerir
Kurulu Sürümü Sabitleyin
Uygulama uyumluluğunu bozabilecek istenmeyen yükseltmeleri önleyin:
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-selectionsAdım 3: Sistem Düzeyinde Ön Koşulları Yapılandırın
MongoDB, arka plan programı başlamadan önce belirli çekirdek ve dosya sistemi parametreleri ayarlandığında en iyi performansı gösterir.
Açık Dosyalar için ulimit Ayarlayın
MongoDB yüksek bir dosya tanımlayıcı sınırı gerektirir. Bir systemd geçersiz kılma dosyası oluşturun:
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Şeffaf Büyük Sayfaları (THP) Devre Dışı Bırakın
THP, MongoDB’de önemli gecikme artışlarına neden olur. Kalıcı olarak devre dışı bırakın:
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-thpAyarın geçerli olduğunu doğrulayın:
cat /sys/kernel/mm/transparent_hugepage/enabledÇıktıda etkin değer olarak [never] görünmelidir.
Adım 4: MongoDB’yi Başlatın ve Etkinleştirin
sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl enable mongodArka plan programının çalıştığını doğrulayın:
sudo systemctl status mongodÇıktıda Active: active (running) ifadesini arayın. Servis başlamazsa günlüğü hemen inceleyin:
sudo tail -50 /var/log/mongodb/mongod.logYaygın başlatma hataları şunlardır:
- 27017 portu zaten kullanımda — başka bir işlem porta bağlı;
sudo ss -tlnp | grep 27017ile tespit edin - Veri dizini izinleri —
mongodkullanıcısı/var/lib/mongodbdizinine sahip olmalıdır;sudo chown -R mongodb:mongodb /var/lib/mongodbile düzeltin - THP hâlâ etkin — WiredTiger motoru bir uyarı kaydeder ve performans düşebilir
Adım 5: MongoDB’yi Güvenli Hale Getirin — Kimlik Doğrulama ve Yetkilendirme
Bu en kritik bölümdür. İnternete açık korumasız MongoDB örnekleri binlerce veri ihlaline neden olmuştur. Varsayılan kurulumda kimlik doğrulama yoktur; yani 27017 portuna erişebilen herkes her veritabanına tam okuma/yazma erişimine sahiptir.
Yönetici Kullanıcı Oluşturun
Yerel MongoDB shell’ine bağlanın (kimlik doğrulamayı etkinleştirmeden önce gerekli değildir):
mongoshShell içinde admin veritabanına geçin ve bir süper kullanıcı oluşturun:
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" }
]
})Düz metin dizesi yerine passwordPrompt() kullanmak, parolanın shell geçmişinde görünmesini engeller. İstendiğinde parolayı yazın, ardından çıkın:
exitmongod.conf Dosyasında Kimlik Doğrulamayı Etkinleştirin
MongoDB yapılandırma dosyasını açın:
sudo nano /etc/mongod.confsecurity bölümünü bulun (yorum satırı olacaktır) ve yetkilendirmeyi etkinleştirin:
security:
authorization: enabledKaydedin ve çıkın (Ctrl+X, ardından Y, ardından Enter), sonra arka plan programını yeniden başlatın:
sudo systemctl restart mongodKimlik Doğrulamanın Uygulandığını Doğrulayın
Kimlik doğrulamasız bağlantı deneyin — artık başarısız olmalıdır:
mongosh --eval "db.adminCommand({ listDatabases: 1 })"Bir Unauthorized hatası almalısınız. Şimdi doğru şekilde kimlik doğrulayın:
mongosh -u adminuser -p --authenticationDatabase adminUygulama Kapsamlı Kullanıcılar Oluşturun
Uygulama bağlantıları için asla admin süper kullanıcısını kullanmayın. Her uygulama veritabanı için en az ayrıcalıklı bir kullanıcı oluşturun:
use myappdb
db.createUser({
user: "appuser",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "myappdb" }
]
})Adım 6: Ağ Bağlamasını ve Güvenlik Duvarı Kurallarını Yapılandırın
bindIp Ayarını Kısıtlayın veya Genişletin
Varsayılan olarak mongod.conf yalnızca 127.0.0.1 adresine bağlanır. Uygulamanız aynı VPS üzerinde çalışıyorsa bu doğru ayardır. Uzaktan erişime ihtiyaç duyuyorsanız (örn. ayrı bir sunucudaki uygulama sunucusundan), /etc/mongod.conf dosyasını düzenleyin:
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.510.0.0.5 yerine uygulama sunucunuzun belirli özel IP adresini yazın. Bilinen IP’lere erişimi kısıtlayan bir güvenlik duvarı kuralı olmadan bindIp: 0.0.0.0 ayarını asla herkese açık bir arayüzde kullanmayın. Güvenlik duvarı olmadan tüm arayüzlere bağlanmak, MongoDB veri ifşası olaylarının başlıca nedenidir.
Değişikliklerden sonra yeniden başlatın:
sudo systemctl restart mongodUFW Güvenlik Duvarı Kurallarını Yapılandırın
Uzaktan erişim gerekiyorsa yalnızca belirli güvenilir IP’ye izin verin:
sudo ufw allow from 10.0.0.5 to any port 27017 proto tcp
sudo ufw enable
sudo ufw status verbose27017 portuna diğer tüm dış erişimi engelleyin:
sudo ufw deny 27017UFW kuralları sırayla işler — geniş deny kuralının üzerindeki belirli allow from kuralı, güvenilir IP için öncelik kazanır.
Adım 7: Şifreli Bağlantılar için TLS/SSL’yi Etkinleştirin
MongoDB trafiğinin bir ağı geçtiği her dağıtımda — özel bir LAN bile olsa — TLS şifrelemesi zorunludur. Aksi takdirde kimlik bilgileri ve veriler düz metin olarak iletilir.
Test için kendinden imzalı bir sertifika oluşturun (üretimde CA imzalı sertifika kullanın — alan adınız için bir SSL Sertifikası ile eşleştirmeyi düşünün):
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/etc/mongod.conf dosyasına TLS yapılandırması ekleyin:
net:
port: 27017
bindIp: 127.0.0.1
tls:
mode: requireTLS
certificateKeyFile: /etc/mongodb/ssl/mongodb.pemMongoDB’yi yeniden başlatın ve TLS ile bağlanın:
sudo systemctl restart mongod
mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem
--tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase admin--tlsAllowInvalidCertificates bayrağı yalnızca geliştirme ortamında kendinden imzalı sertifikalar için kabul edilebilir. CA imzalı sertifika kullanırken kaldırın.
Adım 8: mongod.conf Dosyasında Performans Ayarı
Özel kaynaklara sahip bir VPS üzerindeki üretim dağıtımı için WiredTiger önbelleği ve günlükleme ayarlarını yapılandırın. /etc/mongod.conf dosyasını açın ve aşağıdakileri ekleyin veya değiştirin:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1.5
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
replication:
oplogSizeMB: 1024Temel ayar parametrelerinin açıklaması:
cacheSizeGB— Bunu kullanılabilir RAM’in yaklaşık %50’si eksi 1 GB olarak ayarlayın. 4 GB’lık bir VPS’de1.5kullanın. 8 GB’lık bir VPS’de3.5kullanın.slowOpThresholdMs— Bu eşiği (milisaniye cinsinden) aşan sorgular profil oluşturucuya kaydedilir. Bu değeri düşürmek, indekslenmemiş sorguların erken tespit edilmesine yardımcı olur.oplogSizeMB— Daha sonra çoğaltma kümesi üyeleri eklemeyi planlıyorsanız geçerlidir. Oplog’u önceden boyutlandırmak, yüksek yazma iş yüklerinde çoğaltma gecikmesini önler.
Değişiklikleri uygulayın:
sudo systemctl restart mongodAdım 9: mongodump ile Yedekleme ve Geri Yükleme
Manuel Yedekleme
mongodump
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
--out /var/backups/mongodb/$(date +%Y-%m-%d)Manuel Geri Yükleme
mongorestore
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
/var/backups/mongodb/2024-06-15Cron ile Yedeklemeleri Otomatikleştirin
Özel bir yedekleme betiği oluşturun:
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.shHer gün saat 02:00’de çalışacak şekilde zamanlayın:
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mongodb-backup.sh >> /var/log/mongodb-backup.log 2>&1") | crontab -> Üretim değerlendirmesi: Yedeklemeleri sunucu dışında depolayın. Yedeklemeleri veritabanıyla aynı VPS’de tutmak, disk arızasına veya sunucu güvenliğinin ihlal edilmesine karşı hiçbir koruma sağlamaz. Yedeklemeleri uzak bir konuma çoğaltmak için rsync, rclone veya S3 uyumlu bir nesne deposu kullanın.
Adım 10: MongoDB Sağlığını İzleyin
Yerleşik İzleme Komutları
mongosh içinde sunucu istatistiklerini çalıştırın:
db.serverStatus()
db.stats()
db.currentOp()mongostat ve mongotop Kullanın
Shell’den gerçek zamanlı işlem sayılarını izleyin:
mongostat --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Koleksiyon başına okuma/yazma süresini izleyin:
mongotop --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"İzlenecek Temel Metrikler
| Metrik | Uyarı Eşiği | Ne Anlama Geldiği |
|---|---|---|
wiredTiger.cache.bytes currently in cache | cacheSizeGB‘ın %90’ından fazlası | Önbellek baskısı; RAM artırın veya veri kümesini küçültün |
connections.current | connections.available‘ın %80’inden fazlası | Bağlantı havuzu tükenmesi; uygulama havuzlamasını ayarlayın |
opcounters.getmore | Sürekli yüksek | İmleç verimsizliği; sorgu kalıplarını gözden geçirin |
repl.lag (çoğaltma kümeleri) | 10 saniyeden fazla | Çoğaltma gecikmesi; ağ ve disk G/Ç’sini kontrol edin |
locks.Global.acquireWaitCount | Herhangi bir sürekli değer | Kilit çekişmesi; uzun süren işlemleri gözden geçirin |
MongoDB için Doğru Barındırmayı Seçmek
MongoDB örneğinizin performansı ve güvenilirliği doğrudan temel altyapıya bağlıdır. Şu dağıtım katmanlarını göz önünde bulundurun:
- Geliştirme ve hazırlık: 2–4 GB RAM’e sahip standart bir VPS, üretim dışı iş yükleri, şema testi ve entegrasyon ortamları için yeterlidir.
- Üretim tek düğüm: 4–8 GB RAM, NVMe depolama ve özel bir CPU çekirdeğine sahip bir VPS, çoğu web uygulaması için orta düzey üretim trafiğini karşılar.
- Yüksek verimli üretim: Bir Dedicated Server, sanallaştırılmış ortamlarda var olan gürültülü komşu etkisini ortadan kaldırır. WiredTiger’ın G/Ç kalıpları, bare-metal NVMe dizilerinden önemli ölçüde yararlanır.
- ML/analitik iş yükleri: MongoDB’yi veri hatları, yoğun toplama analitiği veya vektör aramasıyla birlikte çalıştırıyorsanız, GPU Hosting aşağı akış işleme görevlerini hızlandırabilir.
Grafiksel bir yönetim arayüzü gerektiren dağıtımlar için cPanel’li VPS, saf CLI yönetimine daha az aşina olan ekipler için tanıdık bir ortam sunar; ancak gelişmiş yapılandırma için doğrudan mongod.conf düzenlemesi hâlâ gereklidir.
Dağıtım Karar Matrisi
Yayına geçmeden önce bu kontrol listesini kullanın:
- [ ] MongoDB resmi depodan kuruldu, sürüm sabitlendi
- [ ]
mongodservisi etkinleştirildi veactive (running)olduğu doğrulandı - [ ] Şeffaf Büyük Sayfalar devre dışı bırakıldı ve doğrulandı
- [ ] Dosya tanımlayıcıları için
ulimit64000 veya daha yüksek olarak ayarlandı - [ ]
mongod.confdosyasında kimlik doğrulama etkinleştirildi (authorization: enabled) - [ ] Admin kullanıcı
passwordPrompt()ile oluşturuldu — shell geçmişinde düz metin parola yok - [ ] Uygulamaya özgü kullanıcılar en az ayrıcalıklı rollerle oluşturuldu
- [ ]
bindIpyalnızca localhost veya belirli güvenilir IP’lerle kısıtlandı - [ ] UFW kuralları mevcut — 27017 portu genel internetten engellendi
- [ ] TLS geçerli bir sertifikayla etkinleştirildi
- [ ] WiredTiger önbelleği (RAM – 1 GB)’ın %50’si olarak boyutlandırıldı
- [ ] Yavaş sorgu profil oluşturma etkinleştirildi (
slowOpThresholdMs: 100) - [ ] Sunucu dışı çoğaltma ile otomatik günlük yedeklemeler
- [ ] Yedekleme geri yüklemesi test edildi — hiç geri yüklemediğiniz bir yedek, yedek değildir
SSS
MongoDB’nin varsayılan olarak dinlediği port nedir ve değiştirilmeli midir?
MongoDB varsayılan olarak TCP portu 27017‘i dinler. Bunu standart dışı bir porta değiştirmek küçük bir belirsizlik sağlar ancak kimlik doğrulama ve güvenlik duvarı kurallarının yerini tutmaz. Değiştirirseniz /etc/mongod.conf dosyasındaki net.port ayarını güncelleyin ve tüm UFW kurallarını ve bağlantı dizelerini buna göre düzenleyin.
MongoDB neden küçük bir veri kümesiyle bile bu kadar çok RAM kullanır?
WiredTiger, dahili önbelleğini max(50% of (RAM - 1 GB), 256 MB) formülüne göre önceden tahsis eder. Bu kasıtlıdır — çalışan verileri bellekte tutmak disk okumalarını ortadan kaldırır. Küçük bir VPS’de RAM tüketimi endişe verici ise /etc/mongod.conf dosyasında cacheSizeGB ayarını açıkça daha düşük bir değere ayarlayın.
MongoDB’yi paylaşımlı barındırmada çalıştırabilir miyim?
Hayır. MongoDB kalıcı bir arka plan programı (mongod), veri dizinine doğrudan dosya sistemi erişimi ve bir ağ portuna bağlanma yeteneği gerektirir. Bunların hiçbiri Paylaşımlı Web Barındırma‘da mevcut değildir. VPS, minimum uygulanabilir ortamdır.
Yedeklemeler için mongodump ile dosya sistemi anlık görüntüsü arasındaki fark nedir?
mongodump mantıksal bir yedekleme gerçekleştirir — belgeleri MongoDB sorgu arayüzü üzerinden okur ve BSON dosyaları olarak dışa aktarır. Taşınabilirdir ve sürümler arasında çalışır; ancak daha yavaştır ve --oplog olmadan canlı, yüksek yazma işlemli bir örnekte belirli bir noktadaki tutarlılığı garanti edemez. Dosya sistemi anlık görüntüsü (LVM, ZFS veya bulut blok depolama anlık görüntüsü), ham veri dosyalarını tutarlı bir noktada yakalar ve büyük veri kümeleri için önemli ölçüde daha hızlıdır; ancak depolama motorunun tutarlı bir durumda olmasını gerektirir.
Hangi MongoDB sürümünün kurulu olduğunu nasıl kontrol edebilirim?
Terminalden aşağıdaki komutu çalıştırın:
mongod --versionYa da mongosh içinden:
db.version()