Настройка удаленного входа на MongoDB-сервер

в 8:28, , рубрики: mongodb, python, метки: ,

Ситуация, когда приложение и сервер баз данных находятся на одной и той же машине — очень редкая. Но по умолчанию в MongoDB авторизация отключена и вы не сможете соединить из вне. Мне не удалось найти краткую и понятную инструкцию, как это можно быстро исправить. Что и стало поводом для этого поста.

Исходные данные:

  • Ubuntu Server 12.04 LTS;
  • MongoDB 2.2.3, запущенная как сервис;
  • python-скрипт, использующий pymongo, которым надо «достучаться» до удаленного mongo-сервера.

Вы уже установили MongoDB? Отлично! Если нет, рекомендую проследовать к вот этот инструкции.

Для начала необходимо проверить, где находится config-файл для mongod, который сейчас запущен. Запускаем терминал и проверяем:

user@ubuntu:/$ ps -ef | grep mongo
mongodb  65042     1  0 Feb25 ?        00:07:11 /usr/bin/mongod --config /etc/mongodb.conf
user     65343 64749  0 02:40 pts/0    00:00:00 grep --color=auto mongo

Как видно, в моем случаи он находится в /etc/mongodb.conf. Если запустить:

user@ubuntu:/$ netstat -a

Можно заметить, что mongod готов принять соединения только от localhost:

tcp        0      0 localhost:27017                 *:*                     LISTEN 

Пора отредактировать config-файл в соответствии с нашими требованиями. Открываем его и делаем ровно 2 изменения:

  1. Раскомментируем строку auth = true, которая включает авторизацию по умолчанию;
  2. Закомментируем строку bind_ip = 127.0.0.1, чтобы соединяться можно было с любого хоста.

Готово! Теперь осталось перезагрузить mongod:

user@ubuntu:/$ sudo service mongodb stop
mongodb stop/waiting
user@ubuntu:/$ sudo service mongodb start
mongodb start/running, process 65404

Осталось добавить пользователя в БД:

user@ubuntu:/$ mongo
MongoDB shell version: 2.2.3
connecting to: test
> use mytest
switched to db mytest
> db.testcollection.insert({"message":"Hello, remote user!"})
> db.addUser('myuser', 'superpassword')
{ "n" : 0, "connectionId" : 2, "err" : null, "ok" : 1 }
{
	"user" : "myuser",
	"readOnly" : false,
	"pwd" : "ecb2c08916b34e477c33c10cec2ae416",
	"_id" : ObjectId("512c6d9dcc5d103a896944ae")
}
> db.testcollection.find()
{ "_id" : ObjectId("512c6d85cc5d103a896944ad"), "message" : "Hello, remote user!" }

Перейдем к другому компьютеру в данной сети для чистоты эксперимента. В вашем случаи, конечно, ip и порт могут отличаться. Выполним там следующий python-скрипт:

from pymongo import MongoClient

mongoserver_uri = "mongodb://myuser:superpassword@10.2.0.182:27017/mytest"
conection = MongoClient(host=mongoserver_uri)
db = conection['mytest']
collection = db['testcollection']
print collection.find_one()

После запуска скрипта получаем результат:

{u'message': u'Hello, remote user!', u'_id': ObjectId('512c6d85cc5d103a896944ad')}

Надеюсь это короткое руководство позволит вам сэкономить время и нервы.

Автор: xSkyFoXx

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js