Разработка системы обновления ПО холдинга часть 3. Развертывание MongoDB и сборка драйвера для PHP из исходников.

Первым делом необходимо создать подключение к репозиторию MongoDB в ОС. можно, конечно, просто найти и скачать пакет — но это менее удобный путь. Менее удобный, потому как пакеты в Unix-подобных системах зачастую тянут за собой стек зависимостей и, если из подключенного репозитория их можно установить (В стандартных могут не быть, да и во всяких epel тоже. А могут быть несовместимые.), то пакет просто ругнется на отсутствующие зависимости и отправит нас их искать по интернету. В общем, это было лирическое отступление.

В своих проектах я стараюсь использовать новые ОС корпоративного уровня, как то больше в душу лег CentOS. Подключение репозитория выглядит так:
Создаем файл

с содержимым:

Не сложно догадаться что сходив по ссылке: https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.4/x86_64/RPMS/
можно вытянуть нужные пакеты. А чтобы выключить репозиторий, нужно поменять enabled на 0.
Вот и все, репозиторий подключен. Устанавливаем MongoDB и зависимости

Запускаем сервер баз данных

и добавляем его в автозагрузку

. Исключительно меня порадовало то, что не понадобилось писать сервис|unit для обслуживания процесса MongoDB через systemd.
Т.к. mongodb у нас для тестов в основном и вообще не торчит в интернет, то с безопасностью ее разбираться пока не будем. Разрешим соединения с любого ip-адреса, для чего закомментируем в

строчку

, где # — комментарий собственно.
Перезапустим сервер баз данных

.
В консоли или через ssh подключимся к mongodb командой

.
Выберем административную базу

.
Добавим пользователя с полными правами

.
Выйдем из mongodb

и на всякий случай перезапустим сервер

.
Проверим подключение с пользователем и паролем

.
Если все нормально, можно подключаться GUI-клиентом для удобства.

Краткий мануал по работе с пользователями:
создать пользователя с правами чтение-запись

db.createUser( { user: "username", pwd: "passwd", roles: [ { role: "readWrite", db: "database" } ] } )

удалить пользователя

db.dropUser("username")

поменять пароль пользователю

db.changeUserPassword("username", "passwd")

дать права владельца на базу database пользователю

db.grantRolesToUser( "user", [ { role: "dbOwner", db: "database" } ] )

по аналогии убрать права пользователю

db.revokeRolesFromUser( "user", [ { role: "dbOwner", db: "database" } ] )

посмотреть права пользователя в текущей базе (смена базы командой use database)

db.getUser("username")

посмотреть всех пользователей текущей базы

db.getUsers()

*для бэкапа базы данных нужна соответствующая роль

db.grantRolesToUser( "root", [ { role: "backup", db: "admin" } ] )

Краткий мануал по командам:
создать коллекцию(базу)

db.createCollection('testDb');

добавить объект в коллекцию

db.testDb.insert({first: 'c', last: '3',});

получить содержимое коллекции

 db.testDb.find();

получить содержимое коллекции, удовлетворяющее фильтру

db.testDb.find({first: 'a'});

отобрать первые два объекта коллекции, удовлетворяющих фильтру

db.testDb.find({first: 'a'}).limit(2);

отобрать объекты коллекции, удовлетворяющие фильтру, пропустив первые два

db.testDb.find({first: 'a'}).skip(2);

Не забываем, что mongodb это по сути javascript, соответственно можно комбинировать и вычислять прямо в запросе.
пример сложного запроса с выбором

и (

или

)

db.testDb.find({first: 'a', $or: [{last: '1'}, {last: '3'}]});

изменение объекта в коллекции

db.testDb.update({first: 'a', last: '2'}, {$set: {last: '3'}});

удаление объекта

db.testDb.remove({first: 'a'});

объект в базе по сути представляет из себя аналог json, соответственно в его полях могут храниться массивы, функции и т.д.

Сборка драйвера для php (MongoDB), сервер с ubuntu 14.04 на борту:
клонируем проект с github

если не установлен git, то предварительно устанавливаем его

заходим в папку со скаченным проектом

обновляем модули

собираем драйвер из проекта

если что-то потребовало, устанавливаем через apt-get, у меня, например, затребовало пакет php56-devel

Собирать из исходников пришлось на боевом сервере, все никак руки не дойдут его перенести. А вот на CentOS 7.4 (версия php 7.0 для разнообразия) все проще:

.

Добавляем в php.ini наш модуль: