Установка и подключение к MongoDB

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: MongoDB, Ubuntu.

В данной инструкции мы рассмотрим процесс установки MongoDB на Linux Ubuntu (Debian). Также будут приведены примеры настройки подключения по сети, защита соединения с помощью шифрования и аутентификации.

Установка

На странице MongoDB Community Downloads находим нужную версию программного продукта. Например, 7.0.5 (последнюю на момент обновления инструкции).

С версии 5.0 для работы mongo требуется, как минимум, процессоры с кодовыми названиями:

  • Intel — Sandy Bridge (второе поколение Core i3, i5, i7) или Tiger Lake (поздние Celeron и Pentium). Выпускаются с 2009 года.
  • AMD — Bulldozer (линейка FX и Opteron). Выпускаются с 2011 года.

При попытке запустить MongoDB на компьютерах, процессоры которых не соответствуют данным требованиям мы получим ошибку trap invalid opcode или illegal instruction (core dumped).

Если мы столкнулись с данной проблемой у нас есть варианты:

  • На виртуальной машине играем с настройками типа процессора (например, для Proxmox помогает тип host).
  • Устанавливаем Mongo версии 4.4.
  • Меняем процессор.

И так, в нашем случае будет установка MongoDB 7.0.5. Откидываем последнюю цифру версии и получаем мажорную версию. Для удобства нашей работы создаем переменную:

MONGO_VER=7.0

* где 7.0, версия 7.0.5 без последней .5.

Также создадим переменную с указанием кодового названия нашей операционной системы:

OS_NAME=jammy

jammy — название релиза Ubuntu. В данном примере, версия 22.04. На данный момент возможны варианты:

  • jammy: 22.04.
  • focal: 20.04.
  • bionic: 18.04.

Посмотреть кодовое название и версию для вашей системы можно командой:

cat /etc/os-release | egrep "UBUNTU_CODENAME|VERSION_ID"

С помощью этих переменных создаем файл для настройки репозитория Ubuntu:

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/${MONGO_VER} multiverse" > /etc/apt/sources.list.d/mongodb-${MONGO_VER}-org.list

Импортируем ключ репозитория для проверки пакетов от подделки:

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 160D26BB1785BA38

Обновляем список пакетов:

apt update

В моем примере был импортирован GPG-ключ для репозитория mongo 7. Если вы устанавливаете другую версию, система может выдать ошибку на подобие:

W: GPG error: https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A26B1AE64C3C388

Обратите внимание на выделенную часть ошибки. Это хэш, который нужен для импорта ключа. Просто копируем его и вводим новую команду:

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 6A26B1AE64C3C388

И снова обновляем информацию о репозиториях:

apt update

Устанавливаем MongoDB:

apt install mongodb-org

Стартуем сервис и разрешаем его автозапуск:

systemctl start mongod

systemctl enable mongod

Проверяем состояние:

systemctl status mongod

Для подключения к СУБД вводим команду:

mongosh

В mongodb версии 4 команда будет:

mongo

Можно для проверки ввести команду, которая покажет созданные базы данных:

> show databases;

После первой установки мы должны увидеть следующее:

admin   40.00 KiB
config  12.00 KiB
local   40.00 KiB

В качестве примера работы мы можем попробовать создать новую базу данных и коллекцию. Объекты в MongoDB создаются автоматически при первом к ним обращении.

Для создания базы просто обращается к ней:

> use newDB

* в данном примере будут создана база newDB.

Для создания коллекции, выполняем команду на вставку данных:

> db.newCollection.insertOne( { x: 1 } )

Выходим из оболочки SQL:

> exit

Установка завершена.

Доступ по сети

По умолчанию к установленной базе можно подключиться только с локального компьютера. Рассмотрим процесс настройки сетевого доступа. Мы будем работать на сервере и клиенте.

Настройка сервера

Для начала, откроем порт в брандмауэре:

iptables -I INPUT -p tcp --dport 27017 -j ACCEPT

* по умолчанию, MongoDB работает на TCP-порту 27017.

В системах на базе Ubuntu и Debian брандмауэр работает по принципу разрешения. Если мы не меняли данной настройки, то нам не обязательно создавать разрешающее правило для Mongo.

Открываем конфигурационный файл СУБД:

vi /etc/mongod.conf

Находим директиву net и в ней опцию bindIp — добавляем IP-адрес, на котором наш сервер должен принимать запросы для MongoDB:

net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.15

* в нашем примере мы добавили к 127.0.0.1 адрес 192.168.1.15 — это сетевой адрес нашего сервера, на котором он должен принимать запросы.

Перезапускаем сервис mongod:

systemctl restart mongod

Посмотреть, на каких адресах слушает монго можно командой:

ss -tunlp | grep 27017

Настройка клиента и проверка подключения

Чтобы проверить подключение, на другом компьютере должен быть установлен клиент для подключения к Mongo. Процесс его установки схож с установкой сервера. Рассмотрим пример для Ubuntu.

Задаем переменные, такие же, как делали это для сервера:

MONGO_VER=7.0

OS_NAME=jammy

Добавляем репозиторий и ключ:

echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/${MONGO_VER} multiverse" > /etc/apt/sources.list.d/mongodb-${MONGO_VER}-org.list

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 160D26BB1785BA38

Обновляем список пакетов:

apt update

Устанавливаем клиентскую часть: 

apt install mongodb-org-shell

Теперь можно подключиться к нашему серверу: 

mongosh "mongodb://192.168.1.15:27017"

* в данном примере мы подключаемся к серверу MongoDB 192.168.1.15.

В mongo версии 4 команда будет такой:

mongo "mongodb://192.168.1.15:27017"

Также мы можем использовать MongoDB Compass — это приложение под Windows, Linux и macOS для работы с базой Mongo в графическом интерфейсе. Скачать его можно на странице официального сайта.

Аутентификация

По умолчанию, мы можем подключиться к СУБД без авторизации. Если нам необходимо повысить безопасность работы с базой, можно требовать ввода логина и пароля.

Заходим в командную оболочку Mongo:

mongosh

Подключаемся к базе admin:

> use admin

Создаем пользователя, под которым будем авторизовываться:

> db.createUser({user:"root", pwd:passwordPrompt(), roles:[{role:"userAdminAnyDatabase", db:"admin"}, "readWriteAnyDatabase"]})

* в данном примере мы создадим пользователя с правами доступа на все базы. Логин root, пароль будет запрошен после ввода.

Придумываем и вводим пароль

Enter password: 

После создания пользователя мы должны увидеть, примерно, следующую картину:

Successfully added user: {
        "user" : "root",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                },
                "readWriteAnyDatabase"
        ]
}

Выходим из командной оболочки:

> exit

Открываем конфигурационный файл:

vi /etc/mongod.conf

Находим директиву security и задаем параметр authorization:

security:
  authorization: enabled

* если данная директива закомментирована, снимаем комментарий.

Перезапускаем сервис mongod:

systemctl restart mongod

Теперь пробуем подключиться к mongo. Мы можем авторизоваться несколькими способами.

а) Авторизация при подключении:

mongosh --authenticationDatabase "admin" -u "root" -p

* в данном примере мы подключимся к базе под пользователем root. Пароль будет запрошен системой после ввода команды.

б) Авторизация после подключения:

> use admin

> db.auth("root", passwordPrompt())

SSL

Теперь усилим безопасность, зашифровав передачу данных. Для этого нам понадобиться сертификат. В нашем примере, мы будем использовать самоподписанный сертификат, но в продуктивной среде, лучше его купить или запросить у Let's Encrypt.

Создаем каталог, в котором разместим наши сертификаты:

mkdir -p /etc/ssl/mongodb

Сгенерируем самоподписанный сертификат:

openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mongodb/cert.pem -keyout /etc/ssl/mongodb/cert.pem -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=mongo.dmosk.local/CN=mongo"

Выставим в качестве владельца на файлы сертификата пользователя mongodb:

chown mongodb:mongodb /etc/ssl/mongodb/cert.pem

Открываем конфигурационный файл СУБД:

vi /etc/mongod.conf

В директиву net дописываем опции TLS:

net:
  ...
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/ssl/mongodb/cert.pem

* в данном примере мы указали необходимость шифрования данных при передаче, а также путь до сгенерированного нами сертификата.

Перезапускаем сервис mongod:

systemctl restart mongod

Для подключения к базе с использованием шифрования используем команду:

mongosh --tls --tlsAllowInvalidCertificates

* в данном примере мы указываем при подключении использовать шифрование с использованием TLS. Опция tlsAllowInvalidCertificates говорит, что клиент должен принять неправильный сертификат (так как у нас он самоподписанный).

Так как у нас еще настроена аутентификация, для подключения введем такую команду:

mongosh --tls --tlsAllowInvalidCertificates --authenticationDatabase "admin" -u "root" -p

Для подключения к нашему серверу по сети, полная команда будет такой:

mongosh "mongodb://192.168.1.15:27017" --tls --tlsAllowInvalidCertificates --authenticationDatabase "admin" -u "root" -p

Примеры подключения из языков программирования

Рассмотрим небольшие примеры для подключения к MongoDB из языков программирования PHP и Python.

PHP

Для возможности работы PHP с Mongo необходимо установить соответствующее расширение. Выполняем пошагово следующие действия:

apt install php-pear php-dev

pecl channel-update pecl.php.net

pecl install mongodb

Для каждого возможного варианта использования PHP необходимо создать отдельный конфигурационной файл. В данном примере, под php 7.4 для cli, php-fpm, apache.

В системах на базе RPM (например, CentOS или Red Hat), нет разделения php на версии. Таким образом, нам нужно будет создать только один файл (как правило, в каталоге /etc/php.d).

а) CLI

vi /etc/php/7.4/cli/conf.d/20-mongodb.ini

extension=mongodb.so

б) PHP-FPM

vi /etc/php/7.4/fpm/conf.d/20-mongodb.ini

extension=mongodb.so

Для применения настройки в php7.4-fpm перезапускаем его:

systemctl restart php7.4-fpm

в) APACHE

vi /etc/php/7.4/apache/conf.d/20-mongodb.ini

extension=mongodb.so

Для применения настройки в apache перезапускаем его:

systemctl restart apache2

Проверяем, что в php появился новый модуль:

php -m | grep mongodb

Мы должны увидеть:

mongodb

Создаем каталог для нашего скрипта:

mkdir /scripts

Создаем сам скрипт:

vi /scripts/test_mongo.php

  1. <?php
  2.   
  3. $options['tls'] = true;
  4. $options['tlsAllowInvalidCertificates'] = true;
  5. $connection = new MongoDB\Driver\Manager("mongodb://root:test123@localhost", $options);
  6.  
  7. $command = new MongoDB\Driver\Command(['ping' => 1]);
  8. $cursor = $connection->executeCommand('admin', $command);
  9. $result = $cursor->toArray();
  10.  
  11. print_r($result);
  12.  
  13. ?>

* в данном примере мы подключаемся к локальному серверу MongoDB, авторизовываемся под пользователем root с паролем test123. Также мы применяем шифрование для нашего подключения. В качестве примера мы выполняем запрос ping — для проверки подключения.

Запускаем скрипт на выполнение:

php /scripts/test_mongo.php

Мы должны получить такой вывод:

Array
(
    [0] => stdClass Object
        (
            [ok] => 1
        )
)

Python

Устанавливаем дополнительный компонент pymongo:

pip3 install pymongo

Создаем каталог для размещения нашего скрипта:

mkdir /scripts

Создаем сам скрипт:

vi /scripts/test_mongo.py

  1. #!/usr/bin/env python3
  2. # -*- encoding: utf-8 -*-
  3.  
  4. from pymongo import MongoClient
  5.  
  6. connection = MongoClient('mongodb://root:test123@localhost:27017/?tls=true&tlsAllowInvalidCertificates=true')
  7.  
  8. result = connection.admin.command('ping')
  9.  
  10. print(result)

* в данном примере мы подключаемся к локальному серверу MongoDB, авторизовываемся под пользователем root с паролем test123. Также мы применяем шифрование для нашего подключения. В качестве примера мы выполняем запрос ping — для проверки подключения.

Разрешаем запуск нашего файла на выполнение:

chmod +x /scripts/test_mongo.py

Запускаем наш скрипт:

/scripts/test_mongo.py

Получаем такой вывод:

{'ok': 1.0}

Удаление MongoDB с компьютера Ubuntu

Если необходимо удалить MongoDB с компьютера Ubuntu, выполняем пошагово следующие действия.

Останавливаем сервис:

systemctl stop mongod

Запрещаем его автозапуск:

systemctl disable mongod

Удаляем СУБД с компьютера:

apt remove mongodb-org*

При необходимости удалить данные, вводим:

rm -rf /var/lib/mongodb

rm -rf /var/log/mongodb

Docker

В данной инструкции мы не будем рассматривать процесс работы с MongoDB в докер, а просто опишем несколько простых команд для его запуска в контейнере.

Для начала, необходимо установить сам Docker. После можно скачать образ mongodb:

docker pull mongo

Для простого запуска используем команду:

docker run --name mongo-server -d mongo

* в данном примере мы поднимем контейнер из образа mongo с именем mongo-server.

Чтобы подключиться к консоли монго в докере, вводим команду:

docker exec -it mongo-server mongo

Читайте также

1, Установка и настройка MongoDB на CentOS.

2, Прямые запросы из PostgreSQL к MongoDB,

# Ubuntu # Базы данных # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет