Установка и подключение к MongoDB
Используемые термины: MongoDB, Ubuntu.
В данной инструкции мы рассмотрим процесс установки MongoDB на Linux Ubuntu (Debian). Также будут приведены примеры настройки подключения по сети, защита соединения с помощью шифрования и аутентификации.
Установка и запуск
Подключение по сети
Требования ввода логина и пароля
Включение шифрования
Работа с Mongo в скриптах
На PHP
На Python
Удаление СУБД из системы
Запуск в Docker
Дополнительные материалы
Установка
На странице 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
- <?php
- $options['tls'] = true;
- $options['tlsAllowInvalidCertificates'] = true;
- $connection = new MongoDB\Driver\Manager("mongodb://root:test123@localhost", $options);
- $command = new MongoDB\Driver\Command(['ping' => 1]);
- $cursor = $connection->executeCommand('admin', $command);
- $result = $cursor->toArray();
- print_r($result);
- ?>
* в данном примере мы подключаемся к локальному серверу 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
- #!/usr/bin/env python3
- # -*- encoding: utf-8 -*-
- from pymongo import MongoClient
- connection = MongoClient('mongodb://root:test123@localhost:27017/?tls=true&tlsAllowInvalidCertificates=true')
- result = connection.admin.command('ping')
- 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