MongoDB, son on yılda modern uygulama geliştiricilerinin en sık başvurduğu veritabanlarından biri haline geldi. Verileri satır ve sütunlardan oluşan katı tablolar yerine, JSON'a çok benzeyen esnek belgeler (document) halinde saklaması, onu özellikle sık değişen veri şemalarıyla çalışan projeler için cazip kılıyor. Bir e-ticaret ürününün bugün üç özelliği varken yarın on özelliği olabiliyorsa, MongoDB size tablonuzu baştan tasarlamak zorunda bırakmadan bu esnekliği sunuyor.
Bu rehberde bir Ubuntu Server üzerine MongoDB'yi resmi depodan nasıl kuracağınızı, mongod servisini nasıl yöneteceğinizi, modern shell aracı mongosh ile veritabanına nasıl bağlanacağınızı adım adım göreceğiz. Ardından çoğu kurulum rehberinin atladığı ama üretim ortamında kritik olan konulara geçeceğiz: yönetici kullanıcı oluşturmak, kimlik doğrulamayı (authorization) açmak, bindIp ayarıyla sunucuyu dış dünyaya kapatmak ve temel koleksiyon işlemlerini yapmak. Amacımız, kurulumu tamamladığınızda hem çalışan hem de güvenli bir MongoDB sunucusuna sahip olmanız.
MongoDB ve İlişkisel Veritabanları Arasındaki Fark#
MongoDB'yi anlamanın en kolay yolu, onu tanıdığınız ilişkisel veritabanlarıyla karşılaştırmaktır. MySQL veya PostgreSQL gibi sistemlerde veriler tablolarda tutulur; her tablonun sabit sütunları vardır ve her satır bu sütunları doldurmak zorundadır. MongoDB'de ise tablo yerine koleksiyon (collection), satır yerine belge (document) kavramı vardır. Bir belge, alan-değer çiftlerinden oluşan JSON benzeri bir yapıdır ve aynı koleksiyondaki iki belge tamamen farklı alanlara sahip olabilir.
Aşağıdaki tablo, iki dünya arasındaki terim karşılıklarını özetliyor:
| İlişkisel Veritabanı | MongoDB | Açıklama |
|---|---|---|
| Veritabanı | Veritabanı | Kavram aynı |
| Tablo | Koleksiyon | Belgelerin gruplandığı yapı |
| Satır | Belge (document) | JSON benzeri veri birimi |
| Sütun | Alan (field) | Belge içindeki anahtar |
| JOIN | Gömülü belge / $lookup | İlişki kurma yöntemi |
| Birincil anahtar | _id alanı | Her belgede otomatik oluşur |
Bu esnekliğin bedeli de vardır. MongoDB, karmaşık çok tablolu ilişkiler ve katı tutarlılık gerektiren finansal işlemler gibi senaryolarda ilişkisel veritabanları kadar rahat değildir. İlişkisel veritabanı yönetiminin nasıl işlediğini merak ediyorsanız MySQL veritabanı yönetimi rehberimize göz atabilirsiniz. Genel kural şudur: net ve değişmeyen bir şemanız, güçlü ilişkileriniz varsa ilişkisel veritabanı; sık değişen, iç içe geçmiş ve şeması esnek verileriniz varsa MongoDB genellikle daha iyi bir tercihtir.
Kuruluma Hazırlık ve Sistem Gereksinimleri#
MongoDB'yi kurmadan önce sisteminizin güncel olduğundan emin olun. Bu rehber Ubuntu 22.04 LTS ve Ubuntu 24.04 LTS üzerinde test edilmiştir; komutlar her iki sürümde de çalışır. Kurulum için sudo yetkisine sahip bir kullanıcıyla oturum açmış olmalısınız.
Öncelikle paket listelerini güncelleyip gerekli yardımcı araçları kuralım:
sudo apt update
sudo apt upgrade -y
sudo apt install -y gnupg curl ca-certificates
MongoDB, belleği yoğun kullanan bir veritabanıdır. Küçük denemeler için 1 GB RAM yeterli olsa da, üretim için en az 2 GB RAM önerilir; veri kümesi büyüdükçe bu ihtiyaç artar. Yeterli belleğe sahip değilseniz sistemin OOM (Out of Memory) hatalarıyla mongod sürecini sonlandırdığını görebilirsiniz. Bellek konusunda esnek, ölçeklenebilir bir altyapı arıyorsanız VDS sunucu çözümleri, kaynakları ihtiyaç arttıkça yükseltebildiğiniz için MongoDB gibi bellek odaklı servisler için idealdir.
Bir başka önemli nokta: MongoDB'yi Ubuntu'nun kendi apt deposundaki paketten kurmayın. Dağıtımın deposundaki sürüm çoğu zaman eskidir ve güvenlik güncellemelerini geç alır. Doğru yöntem, MongoDB'nin resmi deposunu sisteme eklemektir; bir sonraki bölümde tam olarak bunu yapacağız.
MongoDB'yi Resmi Depodan Kurma#
MongoDB'nin resmi deposunu eklemek için önce projenin GPG imza anahtarını indirip sisteme tanıtıyoruz. Bu adım, indirdiğiniz paketlerin gerçekten MongoDB tarafından imzalandığını doğrular ve araya girme saldırılarına karşı koruma sağlar. Aşağıdaki komut MongoDB 8.0 sürümü içindir:
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
Şimdi deponun adresini sisteme ekleyelim. Ubuntu 24.04 (Noble) için noble, Ubuntu 22.04 (Jammy) için jammy ifadesini kullanın. Aşağıdaki örnek 24.04 içindir:
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
Depo eklendikten sonra paket listelerini yenileyip MongoDB'yi kuruyoruz. mongodb-org meta paketi; veritabanı sunucusunu (mongod), shell aracını, yedekleme araçlarını ve yönetim komutlarını bir arada getirir:
sudo apt update
sudo apt install -y mongodb-org
Kurulum bittiğinde mongod --version komutunu çalıştırarak sürümü doğrulayın. Beklenmedik bir güncelleme sırasında sürümünüzün istemeden değişmesini önlemek isterseniz, paketi mevcut sürümde sabitleyebilirsiniz:
echo "mongodb-org hold" | sudo dpkg --set-selections
Bu, kritik üretim sunucularında planlanmamış sürüm atlamalarını engellemek için iyi bir alışkanlıktır. Yükseltmeyi bilinçli olarak yapmak istediğinizde bu sabitlemeyi kaldırabilirsiniz.
mongod Servisini Başlatma ve Yönetme#
MongoDB kurulduğunda sistemde mongod adında bir systemd servisi tanımlanır ama otomatik olarak başlatılmaz. Servisi başlatıp sunucu her açıldığında otomatik çalışacak şekilde etkinleştirelim:
sudo systemctl start mongod
sudo systemctl enable mongod
Servisin gerçekten çalışıp çalışmadığını kontrol etmek için durumuna bakın:
sudo systemctl status mongod
Çıktıda yeşil renkte active (running) ifadesini görmeniz gerekir. Eğer servis başlamıyorsa, çoğu zaman sorun yetersiz bellek ya da bozuk bir veri dizinidir. Sorunu teşhis etmek için MongoDB'nin günlük dosyasını incelemek en hızlı yoldur:
sudo tail -n 40 /var/log/mongodb/mongod.log
Servis yönetiminde sık kullanacağınız komutları bilmekte fayda var. Aşağıdaki tablo, mongod servisiyle günlük işleri özetliyor:
| Komut | İşlevi |
|---|---|
sudo systemctl start mongod | Servisi başlatır |
sudo systemctl stop mongod | Servisi durdurur |
sudo systemctl restart mongod | Servisi yeniden başlatır |
sudo systemctl status mongod | Anlık durumu gösterir |
sudo systemctl enable mongod | Açılışta otomatik başlatmayı açar |
sudo systemctl disable mongod | Otomatik başlatmayı kapatır |
systemd ile servis yönetimi konusunda daha derinlemesine bilgi almak isterseniz, konuya özel rehberlerimiz süreç yönetiminin inceliklerini ele alıyor. Kısaca özetlemek gerekirse: bir yapılandırma değişikliği yaptığınızda servisi mutlaka restart ile yeniden başlatmanız, değişikliğin devreye girmesi için gereklidir.
mongosh ile Veritabanına Bağlanma#
MongoDB ile etkileşim kurmanın birincil yolu, modern komut satırı aracı mongosh (MongoDB Shell) ile bağlanmaktır. mongodb-org paketiyle birlikte kurulan bu araç, JavaScript tabanlı bir kabuk sunar; yani komutları JavaScript benzeri bir sözdizimiyle yazarsınız. Bağlanmak için terminale şunu yazmanız yeterli:
mongosh
Kimlik doğrulama henüz açık olmadığı için bu komut sizi doğrudan test veritabanına düşürür. Kabuğa girdiğinizde temel komutları deneyebilirsiniz. Mevcut veritabanlarını listelemek, aktif veritabanını görmek ve bir veritabanına geçmek için şu komutları kullanırsınız:
show dbs
db
use magazam
Burada önemli bir ayrıntı var: MongoDB'de bir veritabanına geçmek için önceden oluşturmanız gerekmez. use magazam komutu, magazam yoksa onu bellekte hazırlar; ancak veritabanı diske ilk belgeyi eklediğinizde fiziksel olarak yaratılır. Aynısı koleksiyonlar için de geçerlidir. Bu "kullandıkça oluştur" mantığı, MongoDB'nin esnek doğasının bir yansımasıdır.
Kabuktan çıkmak için exit yazabilir veya Ctrl + D kısayolunu kullanabilirsiniz. Şimdi asıl önemli konuya, güvenliğe geçelim; çünkü şu ana kadarki kurulum çalışır durumda olsa da tamamen korumasızdır.
Yönetici Kullanıcı Oluşturma ve Kimlik Doğrulamayı Açma#
MongoDB, varsayılan kurulumda kimlik doğrulama olmadan çalışır. Yani mongod sürecine erişebilen herkes, hiçbir parola sormadan tüm veritabanlarını okuyup yazabilir. Bu, yerel bir geliştirme makinesinde sorun olmayabilir; ancak üretim sunucusunda kabul edilemez bir güvenlik açığıdır. Kimlik doğrulamayı açmadan önce mutlaka bir yönetici kullanıcı oluşturmalısınız, aksi halde kendinizi de dışarıda bırakırsınız.
Önce mongosh ile bağlanıp yönetim veritabanına geçin ve bir yönetici hesabı oluşturun. Aşağıdaki komutta root rolü, tüm veritabanları üzerinde tam yetki verir:
use admin
db.createUser({
user: "yonetici",
pwd: passwordPrompt(),
roles: [ { role: "root", db: "admin" } ]
})
passwordPrompt() fonksiyonunu kullanmak, parolayı komut satırında düz metin olarak bırakmadığınız için terminal geçmişi açısından daha güvenlidir. Enter'a bastığınızda MongoDB parolayı gizli biçimde soracaktır. Güçlü, tahmin edilmesi zor bir parola seçin; parola güvenliği konusunu ciddiye almak, veritabanınızı korumanın ilk adımıdır.
Kullanıcıyı oluşturduktan sonra kabuktan çıkın ve kimlik doğrulamayı açmak için MongoDB yapılandırma dosyasını düzenleyin:
sudo nano /etc/mongod.conf
Dosyada #security: satırını bulun (başında # yorum işareti olabilir) ve aşağıdaki gibi düzenleyin. Girintilere dikkat edin; YAML biçiminde girinti anlamlıdır:
security:
authorization: enabled
Değişikliği kaydedip servisi yeniden başlatın:
sudo systemctl restart mongod
Artık kimlik doğrulama zorunludur. Bundan sonra bağlanırken kullanıcı adı, parola ve kimlik doğrulama veritabanını belirtmeniz gerekir:
mongosh --port 27017 --authenticationDatabase "admin" -u "yonetici" -p
Bu komut sizi parola sorusuyla karşılar; doğru parolayı girdiğinizde artık yetkili bir oturum açmış olursunuz. Bu adımı tamamladıysanız, MongoDB sunucunuzun en kritik güvenlik önlemini almış oldunuz.
bindIp ile Uzaktan Bağlantı Güvenliği#
Kimlik doğrulamayı açmak büyük bir adımdır ama tek başına yeterli değildir. İkinci kritik ayar, MongoDB'nin hangi ağ arayüzlerini dinleyeceğini belirleyen bindIp seçeneğidir. Varsayılan olarak MongoDB yalnızca 127.0.0.1 (localhost) adresini dinler; yani sadece aynı sunucudaki uygulamalar bağlanabilir. Bu güvenli bir varsayılandır ve çoğu senaryoda dokunmanıza gerek yoktur.
Ancak veritabanına başka bir sunucudan (örneğin ayrı bir uygulama sunucusundan) erişmeniz gerekiyorsa, bindIp değerini genişletmeniz gerekir. Burada yapılan en tehlikeli hata, bindIp değerini 0.0.0.0 yapıp veritabanını tüm internete açmaktır. Bu, MongoDB'yi otomatik tarama botlarının ilk hedefi haline getirir ve kimlik doğrulama açık olsa bile brute force saldırılarına davetiye çıkarır.
Doğru yaklaşım, yalnızca güvendiğiniz özel ağ IP adreslerini belirtmektir. Diyelim ki uygulama sunucunuzun özel ağ adresi 10.0.0.5 ve MongoDB sunucusunun özel adresi 10.0.0.10. Yapılandırma dosyasında net bölümünü şöyle düzenlersiniz:
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.10
Burada 127.0.0.1 yerel erişimi, 10.0.0.10 ise sunucunun özel ağ arayüzünü temsil eder. Değişiklikten sonra sudo systemctl restart mongod ile servisi yeniden başlatın. Ek bir güvenlik katmanı olarak sunucu güvenlik duvarını da yapılandırmalısınız. UFW kullanıyorsanız, MongoDB portunu yalnızca güvendiğiniz IP'ye açın:
sudo ufw allow from 10.0.0.5 to any port 27017
Bu kural, sadece 10.0.0.5 adresindeki uygulama sunucusunun 27017 portuna bağlanmasına izin verir; diğer tüm bağlantı denemeleri güvenlik duvarında engellenir. Kimlik doğrulama, bindIp sınırlaması ve güvenlik duvarı kuralı; bu üçü bir araya geldiğinde MongoDB sunucunuz katmanlı bir savunmayla korunmuş olur. Sunucu güvenliğini bütünsel olarak ele almak istiyorsanız yönetilen sunucu hizmetleri ile bu tür sıkılaştırmaları uzman ekiplere devredebilirsiniz.
Temel Koleksiyon ve Belge İşlemleri#
Sunucunuz artık kurulu ve güvenli; şimdi verilerle çalışmanın temellerini görelim. MongoDB'de veri eklemek, okumak, güncellemek ve silmek için db.koleksiyon.metod() biçiminde komutlar kullanırsınız. Örnek olarak magazam veritabanında bir urunler koleksiyonu üzerinde çalışalım. Önce bir belge ekleyelim:
use magazam
db.urunler.insertOne({
ad: "Kablosuz Kulaklik",
fiyat: 1299,
stok: 45,
etiketler: ["elektronik", "ses"]
})
Bu komut çalıştığında MongoDB, belgeye otomatik olarak benzersiz bir _id alanı ekler; bu, ilişkisel veritabanındaki birincil anahtarın karşılığıdır. Dikkat edin: etiketler alanı bir dizi tutuyor. İlişkisel bir tabloda bunun için ayrı bir tablo ve JOIN gerekirken, MongoDB bu iç içe yapıyı doğal olarak destekler. Birden fazla belgeyi tek seferde eklemek için insertMany() metodunu kullanabilirsiniz.
Verileri okumak için find() metodunu kullanırsınız. Tüm ürünleri listelemek ya da belirli bir koşula uyanları filtrelemek şöyle olur:
db.urunler.find()
db.urunler.find({ fiyat: { $lt: 1500 } })
db.urunler.findOne({ ad: "Kablosuz Kulaklik" })
İkinci satırdaki $lt operatörü "küçüktür" anlamına gelir ve fiyatı 1500'ün altında olan ürünleri getirir. MongoDB'nin $gt, $gte, $in gibi zengin bir operatör kümesi vardır. Güncelleme ve silme işlemleri de benzer mantıkla çalışır:
db.urunler.updateOne(
{ ad: "Kablosuz Kulaklik" },
{ $set: { stok: 40 } }
)
db.urunler.deleteOne({ ad: "Kablosuz Kulaklik" })
Performans açısından unutmamanız gereken bir nokta var: sık sorgulanan alanlar için indeks oluşturmalısınız. Tıpkı ilişkisel veritabanlarında olduğu gibi, indekssiz bir MongoDB koleksiyonunda her sorgu tüm belgeleri baştan sona tarar (collection scan) ve veri büyüdükçe yavaşlar. Örneğin ad alanına göre sık arama yapıyorsanız şu indeksi eklersiniz:
db.urunler.createIndex({ ad: 1 })
Yüksek okuma trafiğiniz varsa, MongoDB'nin önüne bir önbellek katmanı koymak da performansı ciddi biçimde artırır. Bu noktada bellek içi bir depo olan Redis devreye girer; MongoDB ile Redis'in birlikte nasıl bir mimari oluşturduğunu Redis nedir rehberimizde bulabilirsiniz.
Yedekleme ve Bakımın Önemi#
Kurulumu tamamlayıp veriyle çalışmaya başladıktan sonra sıklıkla ihmal edilen ama en kritik konu yedeklemedir. MongoDB, mongodump adında yerleşik bir yedekleme aracı sunar. Kimlik doğrulama açıkken bir veritabanının tam yedeğini almak için şu komutu kullanırsınız:
mongodump --authenticationDatabase "admin" -u "yonetici" -p \
--db magazam --out /var/yedek/mongo/$(date +%F)
Bu komut, magazam veritabanını tarih damgalı bir klasöre yedekler. Yedeği geri yüklemek içinse mongorestore aracını kullanırsınız. Ciddi bir üretim ortamında bu komutu bir cron görevine bağlayarak otomatik ve düzenli hale getirmeli, yedekleri mutlaka sunucudan farklı bir konumda saklamalısınız. Aynı diskte tutulan bir yedek, disk arızasında veriyle birlikte kaybolur.
Otomatik ve uzak konumda saklanan yedeklemeler için yedekleme çözümleri hizmetimiz, veri kaybı riskini en aza indirir. Yedeklemenin yanı sıra düzenli olarak mongod.log dosyasını izlemek, disk kullanımını kontrol etmek ve MongoDB güncellemelerini takip etmek de sağlıklı bir kurulumun parçasıdır. Veritabanı, bir uygulamanın kalbidir; onu kurmak kadar bakımını sürdürmek de önemlidir.
Sıkça Sorulan Sorular#
MongoDB kurulumu için Ubuntu'nun kendi apt deposunu kullanabilir miyim?#
Kullanmanızı önermiyoruz. Ubuntu'nun varsayılan deposundaki MongoDB paketi genellikle eski bir sürümdür ve güncel güvenlik yamalarını geç alır. En doğru yöntem, bu rehberde anlattığımız gibi MongoDB'nin resmi deposunu GPG anahtarıyla birlikte sisteme ekleyip mongodb-org paketini kurmaktır. Böylece hem güncel sürümü hem de düzenli güvenlik güncellemelerini almış olursunuz.
Kimlik doğrulamayı açmadan MongoDB kullanmak güvenli mi?#
Yalnızca dış dünyaya tamamen kapalı, yerel bir geliştirme makinesinde kabul edilebilir. Üretim sunucusunda kimlik doğrulamayı kapalı bırakmak ciddi bir güvenlik açığıdır, çünkü sürece erişebilen herkes tüm verilerinizi okuyup değiştirebilir. Mutlaka bir yönetici kullanıcı oluşturup authorization: enabled ayarını açmalı ve ek olarak bindIp ile güvenlik duvarı kurallarını yapılandırmalısınız.
mongo ile mongosh arasındaki fark nedir?#
Eski mongo kabuğu MongoDB 5.0 sürümünden itibaren kullanımdan kaldırılmıştır ve yerini modern mongosh aracına bırakmıştır. mongosh, daha iyi otomatik tamamlama, sözdizimi vurgulama ve gelişmiş bir JavaScript ortamı sunar. Güncel MongoDB sürümlerinde mongo komutu artık gelmez, dolayısıyla bağlanmak için doğrudan mongosh komutunu kullanmalısınız.
bindIp değerini 0.0.0.0 yapmak neden tehlikeli?#
bindIp değerini 0.0.0.0 yapmak, MongoDB'yi tüm ağ arayüzlerinden, yani internetteki herkese açık hale getirir. Bu, veritabanınızı sürekli açık port arayan otomatik saldırı botlarının doğrudan hedefi yapar. Kimlik doğrulama açık olsa bile bu, gereksiz bir saldırı yüzeyidir. Bunun yerine yalnızca 127.0.0.1 ve gerektiğinde belirli özel ağ IP adreslerini listelemeli, portu güvenlik duvarıyla da sınırlamalısınız.
MongoDB mi yoksa MySQL mi kullanmalıyım?#
Cevap tamamen projenizin veri yapısına bağlıdır. Net, değişmeyen bir şemanız, güçlü tablolar arası ilişkileriniz ve katı tutarlılık gerektiren işlemleriniz varsa MySQL gibi ilişkisel bir veritabanı daha uygundur. Buna karşılık esnek, sık değişen, iç içe geçmiş belgelerle çalışıyorsanız ve hızlı ölçeklenme önceliğinizse MongoDB genellikle daha rahat bir seçimdir. İki teknolojiyi aynı projede farklı görevler için birlikte kullanmak da yaygın ve geçerli bir mimaridir.
MongoDB ne kadar RAM ihtiyacı duyar?#
MongoDB bellek yoğun bir veritabanıdır ve sık erişilen veriyi RAM'de tutmaya çalışır. Küçük denemeler ve öğrenme amaçlı kurulumlar için 1 GB RAM yeterli olabilir; ancak gerçek bir üretim yükü için en az 2 GB önerilir ve veri kümeniz büyüdükçe bu ihtiyaç doğrusal olarak artar. Bellek yetersizse işletim sistemi mongod sürecini sonlandırabilir, bu yüzden kaynaklarını kolayca yükseltebileceğiniz bir sunucu altyapısı seçmek önemlidir.
Kapanış#
MongoDB'yi bir Ubuntu sunucusuna kurmak, resmi depoyu eklemekten ibaret basit bir işlem gibi görünse de, işi gerçekten doğru yapmak kurulumun ötesine geçmeyi gerektirir. Bu rehberde depo ekleme, mongod servis yönetimi ve mongosh ile bağlanmayı gösterdikten sonra asıl kritik konulara odaklandık: yönetici kullanıcı oluşturmak, kimlik doğrulamayı açmak, bindIp ve güvenlik duvarıyla sunucuyu dış dünyaya kapatmak ve düzenli yedekleme almak. Bu adımları uyguladığınızda elinizde yalnızca çalışan değil, aynı zamanda üretime hazır ve güvenli bir MongoDB sunucusu olur.
Kendi MongoDB sunucunuzu çalıştırmak için tam kök erişimi ve esnek kaynaklar arıyorsanız, Clou.TR'nin sanal sunucu ve VDS çözümleri ihtiyaçlarınıza göre ölçeklenir. Veritabanı yönetiminin yükünü uzmanlara bırakmak isterseniz sunucu yönetim hizmetlerimiz kurulumdan güvenlik sıkılaştırmasına kadar tüm süreci sizin adınıza üstlenir. Sorularınız için destek ekibimiz her zaman yanınızda.