Takip et

MongoDB Nedir ve Neden Ubuntu’da Tercih Edilir?

MongoDB Kurulumu Ubuntu’da: Adım Adım Rehber

Ubuntu işletim sisteminde MongoDB’yi sorunsuz bir şekilde nasıl kuracağınızı merak mı ediyorsunuz? Bu kapsamlı rehber, adım adım kurulumdan ileri düzey yapılandırmaya kadar tüm süreci detaylıca açıklıyor. Modern uygulamalarınız için güçlü bir veri tabanı altyapısı kurmaya hazır olun.

Günümüzün hızla değişen dijital dünyasında, veriler her zamankinden daha önemli hale geldi. Geleneksel ilişkisel veri tabanlarının (SQL) belirli senaryolarda yetersiz kaldığı durumlarda, NoSQL veri tabanları esneklikleri ve ölçeklenebilirlikleri ile öne çıkıyor. İşte tam da bu noktada, doküman tabanlı bir NoSQL veri tabanı olan MongoDB devreye giriyor. Özellikle büyük veri setleri, esnek şema gerektiren uygulamalar ve yüksek performans beklentileri olan projelerde MongoDB, geliştiricilerin vazgeçilmezi haline gelmiştir. Bu rehberimizde, dünyanın en popüler açık kaynak işletim sistemlerinden biri olan Ubuntu üzerinde MongoDB kurulumunun tüm detaylarını ele alacağız. Başlangıç seviyesindeki kullanıcılardan deneyimli geliştiricilere kadar herkesin faydalanabileceği, uygulamalı ve adım adım bir kurulum süreci sunacağız. Hazırsanız, bu güçlü veri tabanını sistemimize entegre etmeye başlayalım.

MongoDB Nedir ve Neden Ubuntu’da Tercih Edilir?

MongoDB, modern web uygulamalarının ve büyük ölçekli veri depolama ihtiyaçlarının karşılanması için tasarlanmış, açık kaynaklı, doküman tabanlı bir NoSQL veri tabanıdır. “NoSQL” terimi, “Not Only SQL” (Sadece SQL değil) anlamına gelir ve geleneksel ilişkisel veri tabanlarından farklı bir veri modeline sahip veri tabanlarını ifade eder. MongoDB’de veriler, JSON benzeri BSON (Binary JSON) formatında depolanır ve bu da geliştiricilere inanılmaz bir esneklik sunar. Bir tablo ve satırlar yerine, MongoDB koleksiyonlar ve belgeler (documents) kullanır. Her belge, farklı alanlara sahip olabilir, bu da şema esnekliği sağlar ve veri modelleme sürecini basitleştirir. Örneğin, bir e-ticaret uygulamasında farklı ürün türlerinin (kitap, elektronik, giyim) tamamen farklı özelliklere sahip olması durumunda, her ürün tipini tek bir koleksiyonda depolayabilir ve her belgeye özgü alanlar ekleyebilirsiniz. Bu durum, geleneksel SQL veri tabanlarında karmaşık bir denormalizasyon veya çok sayıda tablo gerektirebilirken, MongoDB ile çok daha doğal ve verimli bir şekilde yönetilir.

MongoDB’nin sunduğu temel avantajlar arasında yüksek performans, yüksek erişilebilirlik (replika setleri sayesinde) ve yatay ölçeklenebilirlik (sharding ile) yer alır. Bu özellikler, özellikle sürekli büyüyen ve değişen veri ihtiyaçları olan uygulamalar için kritik öneme sahiptir. Geliştiriciler, esnek şema yapısı sayesinde hızlı prototipleme yapabilir ve uygulama gereksinimleri değiştikçe veri modellerini kolayca adapte edebilirler. Bu da geliştirme süreçlerini hızlandırır ve pazar koşullarına daha çabuk yanıt verilmesini sağlar.

Peki, neden özellikle Ubuntu üzerinde MongoDB kurulumunu tercih etmeliyiz? Ubuntu, sunucu ortamlarında en çok tercih edilen Linux dağıtımlarından biridir. Kararlılığı, geniş topluluk desteği, düzenli güvenlik güncellemeleri ve zengin paket depoları sayesinde, hem geliştiriciler hem de sistem yöneticileri için ideal bir platform sunar. Çoğu bulut sağlayıcısı, varsayılan olarak Ubuntu tabanlı sunucuları önermektedir. Bu da, geliştirme ortamından üretim ortamına geçişte tutarlılık ve kolaylık sağlar. Ayrıca, MongoDB’nin resmi olarak Ubuntu için optimize edilmiş paketleri bulunması, kurulum ve bakım süreçlerini oldukça basitleştirir. Güçlü komut satırı araçları ve kapsamlı dokümantasyon desteği ile Ubuntu, MongoDB’nin tüm yeteneklerini en verimli şekilde kullanmak için sağlam bir zemin hazırlar. Bu kombinasyon, özellikle web uygulamaları, mobil arka uçlar, IoT çözümleri ve büyük veri analizi gibi çeşitli projelerde güvenilir ve yüksek performanslı bir veri tabanı altyapısı oluşturmak isteyenler için biçilmiş kaftandır. Bu nedenle, Ubuntu’da MongoDB kurulumu, modern uygulama geliştirme yolculuğunuzda atacağınız sağlam bir adımdır.

Ubuntu Sisteminizi MongoDB Kurulumuna Hazırlamak Nasıl Yapılır?

MongoDB kurulumuna başlamadan önce, Ubuntu sisteminizin en güncel durumda olduğundan ve gerekli ön koşulların karşılandığından emin olmamız gerekiyor. Bu adım, herhangi bir yazılım kurulumunda karşılaşılabilecek potansiyel sorunları minimize etmek ve sisteminizin güvenliğini sağlamak açısından hayati öneme sahiptir. İlk olarak, sisteminizdeki mevcut paket listelerini güncellemek ve kurulu paketleri en son sürümlerine yükseltmekle işe başlayacağız. Bu işlem, hem güvenlik açıklarını kapatır hem de yeni yazılımların doğru bağımlılıklarla kurulmasını sağlar.

Terminali açın (genellikle Ctrl + Alt + T kısayolu ile) ve aşağıdaki komutları sırasıyla çalıştırın:

sudo apt update
sudo apt upgrade -y

İlk komut olan sudo apt update, Ubuntu’nun paket yöneticisi olan APT’nin (Advanced Package Tool) yerel paket indeksini günceller. Bu, sisteminizin hangi paketlerin hangi sürümlerinin mevcut olduğu hakkında bilgi sahibi olmasını sağlar. İkinci komut olan sudo apt upgrade -y ise, mevcut kurulu tüm paketleri en son sürümlerine yükseltir. -y parametresi, yükseltme sırasında sorulan tüm “Evet/Hayır” sorularına otomatik olarak “Evet” yanıtı verilmesini sağlar, böylece işlemin kesintisiz devam etmesini garanti eder. Bu işlem, internet bağlantınızın hızına ve sisteminizdeki güncelleme bekleyen paketlerin sayısına bağlı olarak biraz zaman alabilir.

Sistem güncellemeleri tamamlandıktan sonra, MongoDB’nin resmi deposunu eklerken ve paketlerini indirirken ihtiyaç duyacağımız bazı temel araçları kurmamız gerekecek. Özellikle, GPG anahtarlarını indirmek için curl ve bu anahtarları işlemek için gnupg paketleri kritik öneme sahiptir. Bu araçlar, yazılım kaynaklarının güvenilirliğini doğrulamak için kullanılır ve kötü niyetli yazılımların sisteminize sızmasını engellemeye yardımcı olur.

sudo apt install curl gnupg -y

curl, komut satırından URL’ler aracılığıyla veri transferi yapmanızı sağlayan güçlü bir araçtır. MongoDB’nin GPG anahtarını indirmek için bu aracı kullanacağız. gnupg ise GNU Privacy Guard’ın kısaltmasıdır ve şifreleme ile dijital imza işlemleri için kullanılan bir yazılımdır. MongoDB paketlerinin orijinalliğini doğrulamak için bu paketin işlevselliğine ihtiyacımız olacak. Bu iki paket, Ubuntu’da birçok yazılım kurulumunda standart olarak kullanılan ve güvenliği artıran temel bileşenlerdir.

Uzman İpucu: Sistem güncellemelerini düzenli olarak yapmak, sadece yeni yazılım kurulumları öncesinde değil, genel sistem güvenliği ve performansı için de kritik öneme sahiptir. Güvenlik yamalarını ve hata düzeltmelerini kaçırmamak adına bu adımı asla atlamayın. Ayrıca, sunucu ortamlarında, kritik güncellemeler sonrası sistemi yeniden başlatmak (sudo reboot) bazen gerekli olabilir.

Bu hazırlık adımlarını tamamladığınızda, Ubuntu sisteminiz MongoDB kurulumu için tamamen hazır hale gelmiş olacaktır. Artık MongoDB’nin resmi depolarını sisteminize ekleme ve GPG anahtarını doğrulama adımlarına geçebiliriz. Bu, veri tabanınızın güvenli ve doğru bir şekilde kurulmasının temelini oluşturacaktır.

MongoDB Repository ve GPG Anahtarını Sisteminize Nasıl Eklenir?

Sistem hazırlıklarını tamamladığımıza göre, şimdi MongoDB’nin resmi paket deposunu Ubuntu sistemimize eklememiz gerekiyor. Bu adım, MongoDB paketlerini doğrudan geliştiricilerinden almamızı sağlayarak hem güncel sürümlere erişimi garanti eder hem de yazılımın güvenilirliğini temin eder. Paket deposunu eklemeden önce, indirilecek paketlerin gerçekten MongoDB tarafından yayınlandığını doğrulamak için bir GPG (GNU Privacy Guard) anahtarı eklemeliyiz. Bu anahtar, indirilen paketlerin bütünlüğünü ve orijinalliğini kontrol etmek için bir dijital imza görevi görür ve potansiyel güvenlik risklerini önler.

MongoDB GPG Anahtarını İçe Aktarma

İlk olarak, MongoDB’nin genel GPG anahtarını sisteminize indirmeli ve APT’nin anahtarlık dizinine eklemelisiniz. Bu anahtar, MongoDB’nin paketlerini imzalamak için kullandığı özel bir şifreleme anahtarıdır. Aşağıdaki komut, anahtarı indirir, şifresini çözer (dearmor) ve güvenli bir şekilde /etc/apt/keyrings/ dizinine kaydeder. Bu dizin, Ubuntu 22.04 ve üzeri sürümlerde anahtarların depolanması için önerilen yeni ve daha güvenli bir konumdur.

curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo gpg --dearmor -o /etc/apt/keyrings/mongodb-archive-keyring.gpg

Bu komutun detaylarına bakacak olursak:

  • curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc: MongoDB’nin resmi web sitesinden 6.0 sürümüne ait GPG anahtarını indirir. -f hata durumunda sessiz kalmayı, -s ilerleme çubuğunu gizlemeyi ve -L yönlendirmeleri takip etmeyi sağlar.
  • |: Pipe operatörü, curl çıktısını bir sonraki komuta girdi olarak yönlendirir.
  • sudo gpg --dearmor -o /etc/apt/keyrings/mongodb-archive-keyring.gpg: İndirilen anahtarı (ASCII zırhlı formatta) ikili bir formata dönüştürür (dearmor) ve belirtilen yola kaydeder. sudo, bu işlemi gerçekleştirmek için yönetici yetkilerine ihtiyaç duyulduğunu gösterir.
Uzman İpucu: GPG anahtarlarını içe aktarırken daima resmi kaynakları kullanmaya özen gösterin. Yanlış veya sahte bir anahtar, sisteminize kötü amaçlı yazılım yüklenmesine yol açabilir. Komutlardaki URL’nin resmi MongoDB alan adına ait olduğundan emin olun.

MongoDB Depo Kaynağını Ekleme

GPG anahtarı sisteme eklendikten sonra, APT’ye MongoDB paketlerini nereden bulacağını söyleyen depo kaynağını eklemeliyiz. Bu, sisteminizin MongoDB paketlerini internetten çekebileceği adresi tanımlar. Aşağıdaki komut, yeni bir dosya oluşturarak bu depo bilgisini /etc/apt/sources.list.d/ dizinine kaydeder. Bu dizin, sisteminize eklenen üçüncü taraf depolar için standart bir konumdur.

echo "deb [ arch=amd64,arm64 signed-by=/etc/apt/keyrings/mongodb-archive-keyring.gpg ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

Bu komutun bileşenlerini inceleyelim:

  • echo "...": Tırnak içindeki metni standart çıktıya yazar.
  • deb [ arch=amd64,arm64 signed-by=/etc/apt/keyrings/mongodb-archive-keyring.gpg ]: Bu kısım, APT’ye deponun türünü (deb), desteklediği mimarileri (amd64 ve arm64) ve paketlerin hangi GPG anahtarı ile imzalandığını (signed-by) belirtir.
  • https://repo.mongodb.org/apt/ubuntu: MongoDB’nin resmi depo URL’sidir.
  • $(lsb_release -cs): Bu komut, Ubuntu sürümünüzün kod adını (örneğin, “jammy” for Ubuntu 22.04 LTS) dinamik olarak alır. Bu, komutun farklı Ubuntu sürümlerinde de çalışmasını sağlar.
  • /mongodb-org/6.0 multiverse: Deponun belirli MongoDB sürümünü (6.0) ve kategori (multiverse) bilgisini belirtir.
  • | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list: echo komutunun çıktısını tee komutuna yönlendirir. tee, hem çıktıyı ekrana yazar hem de belirtilen dosyaya (mongodb-org-6.0.list) kaydeder. sudo, bu işlemi yönetici yetkileriyle yapmayı sağlar.

Bu adımları tamamladığınızda, Ubuntu sisteminiz MongoDB paketlerini resmi depodan güvenli bir şekilde indirebilecek konuma gelmiş olacaktır. Artık son bir paket güncellemesi yaparak, yeni eklenen depoyu APT’nin tanımasını sağlayabilir ve ardından MongoDB kurulumuna geçebiliriz. Bu, sisteminizin yazılım kaynaklarını güncel tutmak ve yeni eklenen depoları tanımak için standart bir uygulamadır.

sudo apt update

Bu komut, yeni eklenen MongoDB deposunu APT’nin paket listesine dahil eder. Artık MongoDB paketleri, diğer Ubuntu paketleri gibi apt komutuyla yönetilebilir hale gelmiştir. Bir sonraki adımda, MongoDB’yi sisteminize kurmaya başlayacağız.

Ubuntu’da MongoDB Kurulumunu Adım Adım Tamamlama

Önceki adımlarda Ubuntu sistemimizi hazırladık ve MongoDB’nin resmi deposunu güvenli bir şekilde ekledik. Şimdi ise, bu güçlü NoSQL veri tabanını sistemimize kurmanın zamanı geldi. Bu aşama, MongoDB’nin temel bileşenlerini indirip kurmayı ve ardından veri tabanı servisinin sorunsuz bir şekilde başlatıldığından emin olmayı içerir. Kurulum süreci, APT paket yöneticisi sayesinde oldukça basittir ve birkaç komutla tamamlanabilir.

MongoDB Paketlerini Kurma

MongoDB’nin tüm temel bileşenlerini içeren mongodb-org meta paketini kurmak için aşağıdaki komutu kullanacağız. Bu meta paket, mongod (veri tabanı sunucusu), mongosh (kabuk), mongodump/mongorestore (yedekleme/geri yükleme araçları) ve diğer yardımcı programları tek bir işlemde kurar.

sudo apt install -y mongodb-org

Bu komut, MongoDB’nin en son kararlı sürümünü (önceki adımda eklediğimiz 6.0 deposundan) sisteminize kuracaktır. Kurulum süresi, internet bağlantınızın hızına ve sunucunuzun performansına bağlı olarak değişebilir. Kurulum tamamlandığında, MongoDB çekirdek servisleri ve araçları sisteminizde yerini almış olacaktır.

MongoDB Servisini Başlatma ve Etkinleştirme

Kurulum tamamlandıktan sonra, MongoDB veri tabanı servisini (mongod) başlatmamız ve sistem açılışında otomatik olarak başlamasını sağlamamız gerekir. Bu işlemleri systemctl komutu ile kolayca yapabiliriz.

İlk olarak, MongoDB servisini başlatalım:

sudo systemctl start mongod

Bu komut, mongod arka plan servisini başlatır. Servisin doğru bir şekilde çalıştığından emin olmak için durumunu kontrol edebiliriz:

sudo systemctl status mongod

Bu komutun çıktısında, servisin active (running) durumunda olduğunu görmelisiniz. Eğer bir hata mesajı veya inactive durumu görüyorsanız, önceki adımları dikkatlice kontrol etmeniz gerekebilir. Genellikle bir hata durumunda, log dosyalarını (varsayılan olarak /var/log/mongodb/mongod.log) kontrol etmek sorunun kaynağını anlamanıza yardımcı olur.

Şimdi, sistem her yeniden başlatıldığında MongoDB servisinin otomatik olarak başlamasını sağlayalım. Bu, sunucu yeniden başlatmaları sonrasında veri tabanınızın manuel müdahaleye gerek kalmadan çalışır duruma gelmesi için önemlidir.

sudo systemctl enable mongod

Bu komut, mongod servisi için bir sembolik bağlantı oluşturur ve sistemin başlangıç dizinine ekler, böylece sistemin her açılışında servis otomatik olarak başlatılır. Artık MongoDB veri tabanı sunucunuz çalışır durumda ve kullanıma hazır.

Güvenlik Duvarı Yapılandırması (UFW)

Sunucu güvenliği, herhangi bir veri tabanı kurulumunda göz ardı edilmemesi gereken kritik bir konudur. Ubuntu’da varsayılan olarak gelen UFW (Uncomplicated Firewall) güvenlik duvarını kullanarak, MongoDB’ye sadece belirli IP adreslerinden veya uygulama sunucularınızdan erişim izni vermek en iyi uygulamadır. MongoDB’nin varsayılan portu 27017‘dir.

Eğer UFW aktif değilse, önce etkinleştirmelisiniz:

sudo ufw enable

Daha sonra, MongoDB’nin varsayılan portu olan 27017‘ye TCP bağlantılarına izin verin. Eğer MongoDB’ye sadece yerel makineden (sunucunun kendisi) erişecekseniz, bu adımı atlayabilir veya sadece 127.0.0.1 IP adresinden erişime izin verebilirsiniz. Ancak dışarıdan erişim gerekiyorsa (örneğin bir uygulama sunucusu), bu portu açmanız gerekir.

sudo ufw allow 27017/tcp

Eğer sadece belirli bir IP adresinden erişime izin vermek isterseniz, komutu şu şekilde değiştirebilirsiniz:

sudo ufw allow from <uygulama_sunucusu_IP_adresi> to any port 27017

Güvenlik duvarı kurallarınızı kontrol etmek için:

sudo ufw status
Uzman İpucu: Üretim ortamlarında, MongoDB’ye dışarıdan doğrudan erişim vermek yerine, bir VPN tüneli veya SSH tüneli üzerinden bağlantı kurmak çok daha güvenlidir. Ayrıca, MongoDB yapılandırma dosyasında (/etc/mongod.conf) bindIp ayarını kullanarak veri tabanının sadece belirli IP adreslerinden gelen bağlantıları kabul etmesini sağlayabilirsiniz. Bu, güvenlik katmanını önemli ölçüde artırır.

Bu adımlarla birlikte, Ubuntu üzerinde MongoDB kurulumunu başarıyla tamamlamış ve temel güvenlik ayarlarını yapmış bulunmaktasınız. Artık MongoDB veri tabanınız çalışır durumda ve ilk veri tabanı işlemlerinizi gerçekleştirmeye hazırsınız.

MongoDB Kurulum Sonrası Temel Yapılandırma ve İlk Adımlar

MongoDB’yi Ubuntu sisteminize başarıyla kurup başlattıktan sonra, sıra geldi bu güçlü veri tabanıyla etkileşime geçmeye ve ilk adımlarınızı atmaya. Bu bölüm, MongoDB kabuğu (mongosh) aracılığıyla veri tabanına bağlanmayı, temel veri tabanı ve koleksiyon işlemlerini gerçekleştirmeyi ve kurulumunuzun doğru çalıştığını doğrulamayı kapsar. Bu adımlar, MongoDB dünyasına sağlam bir giriş yapmanızı sağlayacak ve gelecekteki projeleriniz için temel oluşturacaktır.

MongoDB Kabuğuna Bağlanma (mongosh)

MongoDB ile etkileşim kurmanın en yaygın yollarından biri, interaktif JavaScript kabuğu olan mongosh‘u kullanmaktır. Bu kabuk, veri tabanı sorguları çalıştırmanıza, veri eklemenize, güncellemenize ve silmenize, ayrıca yönetimsel görevleri yerine getirmenize olanak tanır. Terminalinizden aşağıdaki komutu çalıştırarak mongosh‘a bağlanabilirsiniz:

mongosh

Eğer her şey yolundaysa, MongoDB kabuğu başlayacak ve komut istemi > olarak değişecektir. Bu, veri tabanına başarıyla bağlandığınız anlamına gelir. Karşınızda veri tabanının versiyonu ve bağlantı bilgileri gibi bazı başlangıç mesajları görebilirsiniz.

Mevcut Veri Tabanlarını Görüntüleme

MongoDB kabuğuna bağlandıktan sonra, sistemde mevcut olan veri tabanlarını görmek için aşağıdaki komutu kullanabilirsiniz:

show dbs

Bu komut, varsayılan olarak gelen admin, config ve local gibi veri tabanlarını listeleyecektir. Bunlar MongoDB’nin dahili işleyişi için kullanılan sistem veri tabanlarıdır. Kendi veri tabanlarınız henüz oluşturulmadığı için bu listede görünmeyecektir.

Yeni Bir Veri Tabanı Oluşturma ve Kullanma

MongoDB’de bir veri tabanı oluşturmak oldukça basittir; aslında, onu kullanmaya başladığınızda otomatik olarak oluşturulur. Yani, belirli bir veri tabanına geçiş yapmak için use komutunu kullanmanız yeterlidir. Eğer belirtilen veri tabanı mevcut değilse, MongoDB onu sizin için oluşturur.

use myappdb

Bu komutu çalıştırdığınızda, kabuk size switched to db myappdb mesajını gösterecektir. Artık myappdb adlı veri tabanı bağlamında çalışıyorsunuz. Bu veri tabanı, içine ilk veriyi eklediğinizde fiziksel olarak oluşturulacaktır.

Koleksiyon Oluşturma ve Belge Ekleme

MongoDB’de veriler koleksiyonlarda (SQL’deki tablolara benzer) ve belgeler (SQL’deki satırlara benzer) halinde depolanır. Bir koleksiyon oluşturmak ve içine ilk belgenizi (dokümanınızı) eklemek için aşağıdaki komutu kullanabilirsiniz:

db.users.insertOne({
  name: "Ali Can",
  email: "ali.can@example.com",
  age: 30,
  isActive: true,
  roles: ["admin", "user"]
})

Bu komut, users adında bir koleksiyon oluşturur (eğer mevcut değilse) ve içine tek bir belge ekler. Belge, bir JavaScript nesnesi (JSON formatında) olarak tanımlanır ve çeşitli veri türlerini (string, number, boolean, array) içerebilir. MongoDB’nin şema esnekliği sayesinde, bu belgeye dilediğiniz kadar alan ekleyebilir veya çıkarabilirsiniz.

Belgenin başarıyla eklendiğini doğrulamak için, acknowledged: true ve eklenen belgenin _id değeri gibi bir çıktı görmelisiniz.

Koleksiyondaki Belgeleri Sorgulama

Eklediğiniz belgeyi görüntülemek için find() metodunu kullanabilirsiniz:

db.users.find()

Bu komut, users koleksiyonundaki tüm belgeleri listeleyecektir. Eğer sadece belirli kriterlere uyan belgeleri aramak isterseniz, find() metoduna bir sorgu belgesi geçirebilirsiniz:

db.users.find({ age: { $gte: 25 } }) // Yaşı 25 ve üzeri olan kullanıcıları bul

Bu temel işlemler, MongoDB ile çalışmaya başlamak için sağlam bir temel oluşturur. Artık kendi veri tabanlarınızı oluşturabilir, koleksiyonlar tanımlayabilir ve içine veri ekleyip sorgulayabilirsiniz. Bu esneklik, modern uygulama geliştirme ihtiyaçları için MongoDB’yi vazgeçilmez kılar.

Uzman İpucu: MongoDB’de veri modellemesi yaparken, uygulamanızın sorgu desenlerini göz önünde bulundurmak önemlidir. Genellikle, ilişkili verileri tek bir belgede birleştirmek (embedding) performansı artırabilir, ancak çok büyük belgelerden kaçınmak gerekir. Belirli durumlarda, referanslama (referencing) da uygun bir seçenek olabilir.

Bu başlangıç adımları, MongoDB’nin gücünü ve esnekliğini anlamanıza yardımcı olacaktır. Kurulumunuzun doğru çalıştığını ve temel veri tabanı işlemlerini gerçekleştirebildiğinizi doğruladığınızda, daha karmaşık veri modelleri ve uygulama entegrasyonlarına geçmeye hazır olacaksınız.

Gerçek Dünya Senaryosu: E-ticaret Platformunda MongoDB Kullanımı

MongoDB’nin teorik faydalarını ve kurulumunu ele aldık. Şimdi, bu bilgileri gerçek bir dünya senaryosu üzerinden pekiştirelim: Dinamik ve hızla büyüyen bir e-ticaret platformu. Bu vaka analizi, MongoDB’nin esnekliğinin, ölçeklenebilirliğinin ve performansının modern bir e-ticaret uygulamasının karmaşık veri ihtiyaçlarını nasıl karşıladığını gözler önüne serecektir.

Vaka: “TrendPazar” E-ticaret Platformu

TrendPazar, giyimden elektroniğe, ev eşyalarından kişisel bakım ürünlerine kadar geniş bir yelpazede ürün sunan, hızla büyüyen bir çevrimiçi e-ticaret platformudur. Platformun karşılaştığı temel zorluklar şunlardır:

  1. Dinamik Ürün Katalogları: Farklı ürün kategorileri (örneğin, bir tişört ile bir akıllı telefon) tamamen farklı özellik setlerine sahiptir. Tişörtlerin beden, renk, kumaş türü gibi özellikleri varken, akıllı telefonların işlemci, RAM, depolama, kamera özellikleri gibi detayları bulunur. Geleneksel SQL veri tabanlarında bu durumu yönetmek, çok sayıda tablo, karmaşık bir şema ve boş (NULL) alanlarla dolu sütunlar anlamına gelebilir.
  2. Kullanıcı Profilleri ve Davranışları: Kullanıcıların alışveriş geçmişleri, favori ürünleri, görüntüledikleri ürünler, sepet içerikleri ve kişisel bilgileri gibi çeşitli verilerin depolanması gerekmektedir. Bu veriler zamanla değişebilir ve yeni davranışsal özellikler eklenebilir.
  3. Yüksek Trafik ve Ölçeklenebilirlik: Özel indirim dönemlerinde veya kampanya zamanlarında platforma gelen kullanıcı trafiği aniden artabilir. Veri tabanının bu yükü sorunsuz bir şekilde kaldırabilmesi ve yatayda ölçeklenebilmesi kritik öneme sahiptir.
  4. Performans: Kullanıcıların hızlı ürün arama, filtreleme ve sayfa yükleme deneyimi yaşaması, satışları doğrudan etkileyen bir faktördür. Veri tabanının hızlı yanıt süreleri sunması gerekmektedir.

MongoDB ile TrendPazar Çözümü

TrendPazar ekibi, yukarıdaki zorlukları aşmak için MongoDB’yi tercih etti. İşte MongoDB’nin bu platforma sağladığı avantajlar:

1. Esnek Ürün Kataloğu Yönetimi

MongoDB’nin doküman tabanlı yapısı ve şema esnekliği, TrendPazar’ın dinamik ürün katalogları sorununa mükemmel bir çözüm sundu. Her ürün, kendi benzersiz özellik setini içeren ayrı bir belge olarak products koleksiyonunda depolandı. Örneğin:

// Tişört Belgesi
{
  _id: ObjectId("..."),
  name: "Pamuklu V Yaka Tişört",
  category: "Giyim",
  brand: "FashionCo",
  price: 99.90,
  stock: 150,
  attributes: {
    material: "Pamuk",
    neckType: "V Yaka",
    color: ["Siyah", "Beyaz", "Gri"],
    size: ["S", "M", "L", "XL"]
  },
  reviews: [
    { userId: ObjectId("..."), rating: 5, comment: "Çok rahat!" },
    { userId: ObjectId("..."), rating: 4, comment: "Bedenler biraz dar." }
  ]
}

// Akıllı Telefon Belgesi
{
  _id: ObjectId("..."),
  name: "MegaPhone X",
  category: "Elektronik",
  brand: "TechGiant",
  price: 8999.00,
  stock: 50,
  attributes: {
    processor: "SnapDragon 8 Gen 2",
    ram: "8GB",
    storage: "128GB",
    camera: { front: "12MP", rear: "50MP" },
    screen: { type: "AMOLED", size: "6.7 inch" }
  },
  warranty: "2 Yıl",
  features: ["5G Destekli", "Su Geçirmez"]
}

Bu yaklaşım, ürün özelliklerini tek bir belge içinde tutarak sorgu performansını artırdı ve yeni ürün türleri eklendiğinde veri tabanı şemasını değiştirmeye gerek kalmadı. Geliştiriciler, yeni bir ürün kategorisi için sadece yeni alanlar ekleyerek hızlıca adapte olabildiler.

2. Zengin Kullanıcı Profilleri ve Davranış Verileri

Kullanıcı verileri de users koleksiyonunda esnek belgeler olarak depolandı. Bu sayede, her kullanıcının alışveriş geçmişi, favori ürünleri ve hatta kişiselleştirilmiş öneriler için davranışsal verileri tek bir belgede saklanabildi. Örneğin:

{
  _id: ObjectId("..."),
  username: "ayse.yilmaz",
  email: "ayse.yilmaz@example.com",
  address: { street: "Ana Cad. 10", city: "İstanbul", zip: "34000" },
  orders: [
    { orderId: ObjectId("..."), date: ISODate("2023-01-15"), total: 150.00 },
    { orderId: ObjectId("..."), date: ISODate("2023-03-22"), total: 75.50 }
  ],
  wishlist: [ObjectId("product123"), ObjectId("product456")],
  preferences: {
    categories: ["Giyim", "Kitap"],
    brands: ["FashionCo"]
  },
  lastActivity: ISODate("2023-10-26T10:30:00Z")
}

Bu yapı, kullanıcıya özel içerik ve öneriler sunmayı kolaylaştırdı, çünkü tüm ilgili veriler tek bir sorgu ile getirilebiliyordu. Ayrıca, yeni bir kullanıcı özelliği eklendiğinde (örneğin, “sadakat puanları”), sadece mevcut belgelere yeni bir alan eklemek yeterli oldu.

3. Yüksek Erişilebilirlik ve Ölçeklenebilirlik

TrendPazar, yüksek trafik dönemlerinde dahi platformun kesintisiz çalışmasını sağlamak için MongoDB’nin replika setleri özelliğini kullandı. Birincil (primary) veri tabanının arızalanması durumunda, bir ikincil (secondary) veri tabanı otomatik olarak birincil rolünü üstlenerek veri tabanının sürekli erişilebilirliğini sağladı. Ayrıca, veri miktarının artmasıyla birlikte, sharding (parçalama) mimarisi uygulandı. Bu sayede, veri tabanı birden fazla sunucuya yatay olarak dağıtılarak sorgu yükü paylaştırıldı ve performans artırıldı.

4. Performans Optimizasyonu

MongoDB’nin güçlü indeksleme yetenekleri, TrendPazar’ın ürün arama ve filtreleme işlemlerini inanılmaz derecede hızlandırdı. Örneğin, ürün adı, kategori veya fiyat aralığına göre yapılan sorgular için uygun indeksler oluşturuldu. Bu, kullanıcıların milisaniyeler içinde sonuç almasını sağlayarak alışveriş deneyimini önemli ölçüde iyileştirdi.

// Ürün adına göre hızlı arama için indeks oluşturma
db.products.createIndex({ name: "text" })

// Kategori ve fiyata göre filtreleme için birleşik indeks
db.products.createIndex({ category: 1, price: 1 })

Sonuç olarak, TrendPazar platformu MongoDB sayesinde esnek, ölçeklenebilir ve yüksek performanslı bir veri tabanı altyapısına sahip oldu. Bu vaka analizi, MongoDB’nin sadece kurulumunun kolay olmadığını, aynı zamanda modern ve dinamik iş ihtiyaçlarını karşılamak için ne kadar güçlü bir araç olduğunu açıkça göstermektedir. Geliştiriciler, veri modelleme esnekliği ve güçlü özellik setleri sayesinde iş mantığına daha fazla odaklanabilirken, operasyonel ekip de veri tabanının yüksek erişilebilirliğini ve ölçeklenebilirliğini güvence altına almıştır.

MongoDB Güvenliğini ve Performansını İleri Düzeyde Optimize Etme

MongoDB’yi Ubuntu’ya kurmak harika bir başlangıçtır, ancak bir üretim ortamında kullanmayı planlıyorsanız, güvenlik ve performans optimizasyonları kritik öneme sahiptir. Bu bölümde, veri tabanınızın güvenliğini artırmak için kimlik doğrulama ve yetkilendirme ayarlarını, performansı iyileştirmek için indekslemeyi ve veri yedekleme stratejilerini ele alacağız. Bu ileri düzey ipuçları, veri tabanınızın hem güvenli hem de verimli çalışmasını sağlayacaktır.

1. Güvenliği Artırma: Kimlik Doğrulama ve Yetkilendirme

Varsayılan olarak, MongoDB kimlik doğrulaması olmadan çalışır, yani herhangi bir kullanıcı veri tabanına bağlanıp tüm verilere erişebilir. Bu, geliştirme ortamları için uygun olsa da, üretim ortamları için büyük bir güvenlik riskidir. Kimlik doğrulamayı etkinleştirmek ve kullanıcılar oluşturmak, veri tabanınıza erişimi kısıtlamanın ilk adımıdır.

a. MongoDB Yapılandırma Dosyasını Düzenleme

MongoDB’nin yapılandırma dosyası /etc/mongod.conf adresinde bulunur. Bu dosyayı düzenleyerek kimlik doğrulamayı etkinleştirebilirsiniz. Bir metin düzenleyici ile dosyayı açın:

sudo nano /etc/mongod.conf

Dosya içinde security bölümünü bulun (veya ekleyin) ve authorization ayarını enabled olarak değiştirin:

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1  # Sadece yerel erişime izin verir
  # bindIp: 0.0.0.0  # Tüm IP'lerden erişime izin verir (DİKKAT: Güvenlik riski)

security:
  authorization: enabled # Bu satırı ekleyin veya etkinleştirin

Ayrıca, bindIp ayarını da dikkatlice yapılandırmalısınız. Eğer veri tabanınıza sadece uygulama sunucunuzdan erişilecekse, 127.0.0.1 ve uygulama sunucunuzun IP adresini virgülle ayırarak belirtebilirsiniz (örneğin: bindIp: 127.0.0.1, 192.168.1.100). 0.0.0.0 olarak ayarlamak, tüm IP adreslerinden bağlantılara izin verir ve güvenlik duvarı kurallarınız yoksa çok risklidir.

Değişiklikleri kaydedip çıktıktan sonra MongoDB servisini yeniden başlatın:

sudo systemctl restart mongod

b. Yönetici Kullanıcı Oluşturma

Kimlik doğrulama etkinleştirildiğinde, veri tabanına bağlanmak için bir kullanıcıya ihtiyacınız olacaktır. İlk olarak, yönetici ayrıcalıklarına sahip bir kullanıcı oluşturalım. Bu kullanıcı, diğer kullanıcıları oluşturma ve yönetme yetkisine sahip olacaktır.

Kimlik doğrulama etkinleştirildikten sonra, henüz bir kullanıcı oluşturmadığınız için mongosh‘a bağlanmakta sorun yaşayabilirsiniz. Geçici olarak kimlik doğrulamayı devre dışı bırakıp kullanıcı oluşturabilir veya aşağıdaki gibi bağlanabilirsiniz:

mongosh --port 27017

Ardından admin veri tabanına geçin ve yönetici kullanıcıyı oluşturun:

use admin
db.createUser(
  {
    user: "adminUser",
    pwd: passwordPrompt(), // Parolayı güvenli bir şekilde girmenizi sağlar
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

passwordPrompt() komutu, parolayı terminalde görünmez bir şekilde girmenizi sağlar. Yönetici kullanıcınızı oluşturduktan sonra, mongosh‘tan çıkın ve yeni kullanıcı ile tekrar bağlanmayı deneyin:

mongosh --port 27017 -u "adminUser" -p

Bu sefer parola sorulacaktır. Başarılı bir şekilde bağlandığınızda, diğer veri tabanları için kullanıcılar oluşturabilirsiniz.

use myappdb
db.createUser(
  {
    user: "appUser",
    pwd: passwordPrompt(),
    roles: [ { role: "readWrite", db: "myappdb" } ]
  }
)

2. Performans İyileştirme: İndeksleme

İndeksler, MongoDB’de sorgu performansını dramatik bir şekilde artırabilir. Sıkça sorgulanan veya sıralama yapılan alanlar için indeksler oluşturmak, veri tabanının ilgili verileri daha hızlı bulmasını sağlar. Örneğin, users koleksiyonundaki email alanına göre sıkça arama yapıyorsanız, bu alan için bir indeks oluşturmalısınız:

use myappdb
db.users.createIndex({ email: 1 }, { unique: true }) // 1 artan sıralama, unique:true e-postaların benzersiz olmasını sağlar

Birden fazla alanda sorgulama yapıyorsanız, bileşik indeksler (compound indexes) kullanabilirsiniz. Örneğin, category ve price alanlarına göre ürünleri filtrelemek için:

db.products.createIndex({ category: 1, price: -1 }) // Kategori artan, fiyat azalan
Uzman İpucu: İndeksler performansı artırsa da, çok fazla indeks oluşturmak yazma işlemlerinin performansını düşürebilir ve disk alanı tüketimini artırabilir. Sadece sıkça sorgulanan ve filtrelenen alanlar için indeks oluşturmaya özen gösterin. explain() metodunu kullanarak sorgularınızın indeksleri nasıl kullandığını analiz edebilirsiniz.

3. Veri Yedekleme ve Geri Yükleme

Veri kaybını önlemek için düzenli yedeklemeler almak hayati öneme sahiptir. MongoDB, veri tabanlarını yedeklemek ve geri yüklemek için mongodump ve mongorestore yardımcı programlarını sunar.

a. Yedekleme (mongodump)

Tüm veri tabanlarını yedeklemek için:

mongodump --out /var/backups/mongodb_$(date +%F)

Belirli bir veri tabanını yedeklemek için:

mongodump --db myappdb --out /var/backups/mongodb_myappdb_$(date +%F)

--out parametresi, yedekleme dosyalarının kaydedileceği dizini belirtir. $(date +%F), yedekleme dosyasına otomatik olarak güncel tarihi ekler.

b. Geri Yükleme (mongorestore)

Yedeklediğiniz verileri geri yüklemek için mongorestore kullanabilirsiniz:

mongorestore /var/backups/mongodb_2023-10-26

Belirli bir veri tabanını geri yüklemek için:

mongorestore --db myappdb --drop /var/backups/mongodb_myappdb_2023-10-26/myappdb

--drop parametresi, geri yüklemeden önce mevcut veri tabanını siler. Bu dikkatli kullanılması gereken bir parametredir.

Uzman İpucu: Yedekleme işlemlerini otomatik hale getirmek için cron işleri kullanın. Ayrıca, yedekleri farklı bir sunucuya veya bulut depolama alanına kopyalayarak felaket kurtarma senaryolarına karşı hazırlıklı olun.

Bu ileri düzey güvenlik ve performans optimizasyonları, MongoDB kurulumunuzun sadece çalışır durumda olmasını değil, aynı zamanda üretim ortamlarında güvenli ve verimli bir şekilde hizmet vermesini sağlayacaktır. Her zaman en iyi güvenlik uygulamalarını takip edin ve performansınızı düzenli olarak izleyerek gerekli ayarlamaları yapın.

Sonuç: Ubuntu’da MongoDB Kurulumu ve Gelecek Adımlar

Bu kapsamlı rehber boyunca, Ubuntu işletim sistemi üzerinde MongoDB kurulumunun her adımını detaylı bir şekilde inceledik. Modern web uygulamalarının ve büyük veri projelerinin vazgeçilmezi olan bu güçlü NoSQL veri tabanını sıfırdan kurmayı, temel yapılandırmalarını yapmayı ve hatta gerçek dünya senaryoları üzerinden kullanımını anlamayı başardık. Sisteminizi hazırlamaktan, GPG anahtarını ve depo kaynaklarını eklemeye, MongoDB paketlerini kurmaktan, servisi başlatmaya ve temel veri tabanı işlemlerini gerçekleştirmeye kadar her aşamayı adım adım ele aldık. Ayrıca, bir e-ticaret platformu örneğiyle MongoDB’nin esnek şema yapısının ve ölçeklenebilirlik yeteneklerinin iş dünyasındaki pratik faydalarını somutlaştırdık.

Kurulum sonrası güvenlik önlemlerini, kimlik doğrulama ve yetkilendirme ayarlarını, performansı artırmak için indeksleme stratejilerini ve veri kaybını önlemek için yedekleme mekanizmalarını da ayrıntılı olarak ele aldık. Bu ileri düzey optimizasyonlar, veri tabanınızın sadece çalışır durumda olmasını değil, aynı zamanda üretim ortamlarında güvenli, kararlı ve yüksek performanslı bir şekilde hizmet vermesini sağlamak için elzemdir. MongoDB’nin sunduğu esneklik ve ölçeklenebilirlik, geliştiricilere ve işletmelere hızla değişen pazar koşullarına adapte olma ve inovasyonu hızlandırma imkanı tanır.

Artık Ubuntu sunucunuzda çalışan güvenli ve optimize edilmiş bir MongoDB kurulumuna sahipsiniz. Bu, veri tabanı tabanlı projeleriniz için sağlam bir temel oluşturuyor. Gelecek adımlarınız, MongoDB’nin zengin sorgulama dilini (MongoDB Query Language – MQL) daha derinlemesine öğrenmek, replika setleri ve sharding gibi yüksek erişilebilirlik ve ölçeklenebilirlik özelliklerini keşfetmek, ayrıca uygulamanızı veri tabanınıza entegre etmek için tercih ettiğiniz programlama dilinin (Node.js, Python, Java vb.) MongoDB sürücülerini kullanmak olabilir. Unutmayın, veri tabanı yönetimi sürekli bir öğrenme ve optimizasyon sürecidir. Düzenli bakım, izleme ve güvenlik güncellemeleri, veri tabanınızın uzun ömürlü ve verimli olmasını sağlayacaktır. Bu rehberin, MongoDB yolculuğunuzda size rehberlik etmesini umuyoruz.

Sıkça Sorulan Sorular (SSS)

1. MongoDB’yi Ubuntu’dan tamamen kaldırmak için ne yapmalıyım?

MongoDB’yi tamamen kaldırmak için aşağıdaki adımları izleyebilirsiniz:

  1. MongoDB servisini durdurun: sudo systemctl stop mongod
  2. Servisin sistem başlangıcında otomatik başlamasını devre dışı bırakın: sudo systemctl disable mongod
  3. MongoDB paketlerini kaldırın: sudo apt purge mongodb-org* -y
  4. Kalan veri dizinlerini ve log dosyalarını silin (bu işlem verilerinizi kalıcı olarak silecektir, dikkatli olun): sudo rm -r /var/log/mongodb ve sudo rm -r /var/lib/mongodb
  5. MongoDB depo dosyasını kaldırın: sudo rm /etc/apt/sources.list.d/mongodb-org-6.0.list
  6. Sistem paket listesini güncelleyin: sudo apt update

2. Farklı bir MongoDB sürümünü nasıl kurabilirim?

Farklı bir sürüm kurmak için, depo kaynağını eklerken kullandığınız komutta sürüm numarasını (örneğin 6.0 yerine 5.0 veya 4.4) değiştirmeniz gerekir. Örneğin, 5.0 sürümü için depo ekleme komutu şöyle olurdu:

echo "deb [ arch=amd64,arm64 signed-by=/etc/apt/keyrings/mongodb-archive-keyring.gpg ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list

Daha sonra sudo apt update ve sudo apt install -y mongodb-org komutlarını çalıştırarak yeni sürümü kurabilirsiniz. Mevcut bir sürümün üzerine farklı bir sürüm kurmadan önce mevcut kurulumu kaldırmanız veya dikkatli bir yükseltme (upgrade) prosedürü uygulamanız önerilir.

3. MongoDB’ye dışarıdan erişime izin vermek güvenli midir?

MongoDB’ye dışarıdan erişime izin vermek, doğru güvenlik önlemleri alınmadığında büyük bir risk teşkil eder. Üretim ortamlarında doğrudan dışarıdan erişim yerine aşağıdaki yöntemler önerilir:

  • Kimlik Doğrulama ve Yetkilendirme: Her zaman kimlik doğrulamayı (security.authorization: enabled) etkinleştirin ve rol tabanlı erişim kontrolü ile kullanıcılar oluşturun.
  • Güvenlik Duvarı (UFW): Sadece belirli IP adreslerinden (uygulama sunucunuzun IP’si gibi) MongoDB portuna (27017) erişime izin verin.
  • Ağ Yapılandırması: MongoDB’yi sadece yerel ağ içinde veya bir VPN arkasında çalıştırın.
  • SSH Tünelleme: Güvenli bağlantılar için SSH tünelleri kullanın.

/etc/mongod.conf dosyasındaki bindIp ayarını dikkatlice yapılandırarak sadece izin verilen IP’lerden bağlantı kabul etmesini sağlayın.

4. MongoDB veritabanım çalışmıyor, ne yapmalıyım?

MongoDB servisi çalışmıyorsa, aşağıdaki adımları izleyerek sorunu teşhis edebilirsiniz:

  1. Servisin durumunu kontrol edin: sudo systemctl status mongod. Hata mesajlarını dikkatlice okuyun.
  2. MongoDB log dosyalarını inceleyin: sudo tail -f /var/log/mongodb/mongod.log. Bu dosya, servisin neden başlamadığını veya neden durduğunu gösteren önemli bilgiler içerir.
  3. Yapılandırma dosyasını (/etc/mongod.conf) kontrol edin. Özellikle bindIp ve port ayarlarının doğru olduğundan emin olun.
  4. Disk alanınızın yeterli olup olmadığını kontrol edin: df -h. MongoDB’nin çalışması için yeterli disk alanına ihtiyacı vardır.
  5. Gerekirse servisi yeniden başlatmayı deneyin: sudo systemctl restart mongod.

5. Replika seti nedir ve neden kullanmalıyım?

Bir replika seti, aynı veri kümesinin birden fazla kopyasını barındıran bir MongoDB sunucuları grubudur. Bu set, yüksek erişilebilirlik (high availability) ve veri yedekliliği sağlar. Bir replika setinde birincil (primary) düğüm ve bir veya daha fazla ikincil (secondary) düğüm bulunur. Birincil düğüm tüm yazma işlemlerini alır ve verileri ikincil düğümlere senkronize eder. Eğer birincil düğüm arızalanırsa, ikincil düğümlerden biri otomatik olarak yeni bir birincil olarak seçilir, böylece veri tabanının kesintisiz çalışması sağlanır.

Replika setlerini kullanmanız için başlıca nedenler:

  • Yüksek Erişilebilirlik: Donanım arızaları veya planlı bakım çalışmaları sırasında dahi veri tabanınızın erişilebilir kalmasını sağlar.
  • Veri Yedekliliği: Verilerinizin birden fazla kopyasını tutarak veri kaybı riskini azaltır.
  • Okuma Ölçeklenebilirliği: İkincil düğümlerden okuma işlemleri yaparak (uygulama gereksinimlerine bağlı olarak) okuma yükünü dağıtabilirsiniz.
  • Felaket Kurtarma: Birincil veri merkezinin tamamen çökmesi durumunda, farklı bir coğrafi konumdaki ikincil düğümlerden veri kurtarma imkanı sunar.
Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version