Uzun aradan sonra yeniden güncel teknolojiyi ucundan yakalayabilmek için bir arayış içine girdim. Bence oldukça öksüz bıraktığım Python ile çalışmalarıma geri dönüş için bir şeyler yapmam gerekiyordu. Geçtiğimiz günlerde PyCharm’ın son sürümünü kurup, yeniden kurcalamaya başladım. Arada Django ile tanıştım. Bu framework’ten haberimin olmaması benim büyük ayıbım. Kendime bir proje uydurdum ve hem ilgili dokümanları hem de örnekleri inceleyerek işe giriştim. Basit bir şekilde ve çok fazla bir şey bilmeden de fourSquare API’sinden bilgiler alıp, bunu kullandığım bilgisayardaki mongoDB’ye yazan bir uygulama geliştirdim. Bunun gerçek dünyadaki uygulamasını da geliştirmeye ve test etmeye karar verdim.
Bu siteyi de kurduğum sistem (SoftSysHosting), “shared hosting” için Python/Django uygulamalarını sunamıyormuş. Oluşturacağım projeyi host edebilmek için arayışa girdim ve görece olarak ucuz olan DigitalOcean’dan bir yer almaya karar verdim. Buradan aldığım sunucuya Ubuntu 12.04/Django kurdum (‘one-click install’ sağolsun). Sunucu paketi üzerinde kullanıma hazır olarak Django, Nginx ve PostGres geliyordu. Daha sonra ise benim Python denemelerim için gerekli pyMongo, mongoengine ve foursquare kütüphanelerini de güncelledim. Buraya kadar herşey iyi gitti. Ufak tefek sorunlar da yaşasam da, bunlar çoğunlukla uzun zamandır uzak kaldığım Linux komut satırına ve komutlarına tam hakim olamadığımdan kaynaklandı. Ancak en çekindiğim paket kurulumları ile ilgili neredeyse hiç sorun yaşamadım. Sistem güncellemeleri de dahil sorunsuz ilerledim.
MongoDB’nin 3.0 sürümünün çıktığına dair bir eposta vardı bir zamandır. Bu sürümü denemeye karar verdim ve sunucuya bunu kurdum. Sonuçta daha önceden az da olsa deneyimim olan bir şeydi mongoDB ve Django öğrenme sürecimde sadece destek olacaktı. Güvenlik ile ilgili tanımlamalar için çalışmaya başladığımda yanıldığımı anladım. Dünyaya açık bir sunucu olduğu için gerekli güvenlik ayarlarını da tamamladım ve başarılı şekilde mongo shell ile bağlantı sağladım. MongoDB güvenlik ayarları için kabaca şu adımları izledim:
- “admin” veritabanında aşağıdaki komut ile yeni bir kullanıcı oluşturdum (kullanıcı adı ve şifre sadece göstermelik).
use admin db.createUser( { user: "mngUser", pwd: "password", roles: [ { role: "root", db: "admin" } ] } )
- system.users tablosunda kullanıcılar oluştu.
- mongod.conf dosyasında “auth” seçeneğini aktif hale getirdim ve ilgili IP ile port’ları değiştirdim. Dışarıdan erişim yapılmaması için de httpinterface’i kapattım.
bind_ip=123.456.789.101 ... port=12345 ... auth=true ... httpinterface=false ...
- Firewall kurallarını ilgili portları kullandıracak şekilde tanımladım.
- Mongo Shell ile bağlantıda aşağıdaki şekilde komut kullanmaya başladım:
mongo --host 123.456.789.101 --port 12345 -u mngUser -p password --authenticationDatabase admin
MongoDB yönetimi için şu aralar LitixSoft’un Mongo Management Studio ürününü kullanıyordum. MMS ile authentication olmadığı zaman yeni sunucuya IP ve port ile kolaylıkla bağlanabiliyordum. Ancak mongod.conf dosyasında auth=true değişikliği yaptıktan sonra bağlantı sorunları yaşamaya başladım. Uzaktan erişimi mongo shell ile sağlayabiliyordum ancak denediğimde RoboMongo ile de hata aldım.

Kullanıcı adı ve şifreyi defalarca kontrol ettim, Mongo üstündeki kullanıcıyı sildim, tekrar yarattım ancak çabalarım bir işe yaramadı. Mongo üstündeki auth özelliğini kaldırınca bağlantı sağlanabiliyor ancak eğer illa ki kullanıcı/şifre istersem bunu gerçekleştiremiyordum. Bilgisayarımdaki mongoDB için de aynı şeyleri denedim orada bir sorun olmuyordu. Kullanıcı adı ve şifre ile RoboMongo bağlantı sağlayabiliyordu. İki sistem arasındaki farklar işletim sistemleri (OSX ve Ubuntu), firewall ayarları (birisi localhost üstünden bağlanıyor) ve mongoDB sürüm farklılıkları (Ubuntu’daki 3.0, local’deki 2.6) idi. İki sistem arasındaki işletim sistemi ve firewall ayarları farklılıklarını ilk etapta göz ardı ettim. Sonuçta sunuculara erişim problemim olmuyordu. Sunuculara eriştikten sonra kullanıcı doğrulamada sorun oluyordu. Bağlantı yapmaya çalışan kullanıcıları daha detaylı incelediğimde (system.users collection’ı içinde) şunu gördüm:


Araştırdığım zaman ise Mongo 3.0 sürümünü güncellemiyor ve yeni kurulum yapıyorsanız, user credentials olarak yeni SCRAM-SHA-1 kullandığını ancak 2.6 sürümünden bir güncelleme yapıyorsanız MONGODB-CR’ının tutulduğunu okudum. Eğer kullandığınız uzaktan yönetim konsolları (RoboMongo, MMS gibi) henüz 3.0 için güncelleme yapmadıysalar, maalesef yeni kurulmuş veritabanı sunucularına bağlanamıyormuş. Bunu aşmak için ise şöyle bir şey yaptım (NOT: Buradaki adımları sadece test amaçlı kullandığınız sistemde yapın. Canlı sistemlerde ne yapacağını ya da neye yol açacağını hiç bilmiyorum. Sonuçta mongoDB’nin sistemi tarafından kullanılan bir collection’da değişiklik yapıyorsunuz).
- Öncelikle mongod.conf dosyasında auth=false yapın ve mongo servisini tekrar başlatın.
- Mongo’ya shell ile erişin.
- “admin” veritabanına geçin.
- system.version collection’ı içindeki “authSchema” id’li kaydın, “currentVersion” değerini “3” yapın. Normalde 3.0 sürümü kurulumundaki değer 5’tir.
use admin var s = db.system.version.findOne({"_id" : "authSchema"}) s.currentVersion = 3 db.system.version.save(s)
Bu adımdan sonra kontrol ederseniz şunu görmelisiniz:
- Yeni bir kullanıcı yaratın.
- Bu yeni yaratılan kullanıcının “credentials” değeri olarak MONGODB-CR kullandığından emin olun.
- Tekrar mongod.conf dosyasındaki auth değişkenini true yapın.
- Mongo servisini yeniden başlatın.
- 5. adımda yaratılan kullanıcı ile RoboMongo’dan ya da MMS’ten bağlanın.
İlerleyen günlerde Robomongo ya da MMS bir güncelleme çıkartana kadar bu şekilde ilerleyeceğim. Daha sonra da burada yapılanları geri alacağım (currentVersion olarak tekrar “5” yapacağım). Umarım bir ara da Django ve Python ile düzgünce uğraşabilir ve orada başıma gelen dertleri yazabilirim.