﻿# Кластер MongoDB

> [HTML Version](configure-mongodb.html)

В статье описана установка MongoDB 6.0 для ОС Ubuntu Linux 22.04. Смотрите поддерживаемые версии MongoDB для корректной работы системы в статье [«Системные требования ELMA365 On-Premises»](elma365-enterprise-on-premises.md#mongo). Также вы можете ознакомиться с руководством в [официальной документации MongoDB](https://www.mongodb.com/docs/manual/installation/).

В статье используется имя базы **elma365**, пользователь **elma365** и пароль **SecretPassword**. При настройке задайте эти данные согласно политике безопасности, принятой в вашей организации.

Установка состоит из семи этапов:

1. [Подготовка нод (серверов)](#preparation-node).

2. [Установка MongoDB](#installation-mongodb).

3. [Настройка MongoDB](#setting-mongodb).

4. [Настройка подключения к MongoDB](#setting-connection-to-mongodb).

5. [Инициализация реплики](#initialization-replica).

6. [Безопасность MongoDB](#safety-mongodb).

7. [Подключение к MongoDB](#connection-to-mongodb).

## Шаг 1. Подготовка нод (серверов)

````
Начало внимание

````
Минимальное количество серверов для организации кластера — три.

````
Конец внимание

1. ````
Создайте три ноды (сервера) с последовательно пронумерованными именами хостов:

- **mongodb-server1.your\_domain**;

- **mongodb-server2.your\_domain**;

- **mongodb-server3.your\_domain**.

2. Создайте необходимые сопоставления имён хостов в DNS. Если такой возможности нет, внесите нужные записи в** **\[OBJECT\].

## Шаг 2. Установка MongoDB

1. Чтобы установить MongoDB на каждой ноде, добавьте официальный репозиторий:

````
sudo apt-get install gnupg  
curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor  
echo "deb \[ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg \] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list  
sudo apt-get update

2. ````
Установите на каждой ноде MongoDB:

````
sudo apt install mongodb-org

3. ````
Запустите на каждой ноде MongoDB:

````
sudo systemctl enable --now mongod

## ````
Шаг 3. Настройка MongoDB

````
начало примечание

````
**Примечание**

Для пароля разрешается применять следующие символы:

- Заглавные латинские буквы: от A до Z;

- Строчные латинские буквы: от a до z;

- Цифры от 0 до 9;

- Символы:  -\_.

Зарезервированные (недопустимые) символы:

\! \* ' ( ) ; : @ \& = + \$ , / ? % # \[ \]

````
конец примечание

````
Следующие действия выполняются на узле** mongodb-server1.your\_domain**:

1. Зайдите в **mongosh** (Command Line Interface) и создайте базу данных:

````
mongosh

2. ````
Используйте базу ELMA365. Если база отсутствует, её необходимо создать:

````
use elma365

3. ````
Создайте отдельного пользователя **elma365** для работы с БД с паролем **SecretPassword**. Имя пользователя и пароль приведены для примера:

````
db.createUser(\{user:'elma365', pwd:'SecretPassword', roles:\[\{role:"readWrite", db:"elma365"\},\{"role":"root", "db":"admin"\}\]\})

4. ````
Убедитесь, что пользователь создан:

````
show users

5. ````
Создайте суперпользователя, чтобы включить аутентификацию:

````
use admin  
db.createUser(\{user:'superuser', pwd:'SecretPassword', roles: \["root"\]\})

6. ````
Убедитесь, что пользователь создан:

````
show users

7. ````
Завершите настройку:

````
exit

## ````
Шаг 4. Настройка подключения к MongoDB

1. Внесите изменения в файл конфигурации \[OBJECT\] на каждой ноде:

````
sudo nano /etc/mongod.conf

2. ````
Настройте значения переменных:

- **bindIp** — список адресов, с которых можно принимать соединения по порту 27017 (в данном случае это делает доступным сервис MongoDB со всех внешних адресов);

- **replSetName** — название реплики, по умолчанию **rs0**. 

````
. . .  
\# network interfaces  
net:  
  port: 27017  
  bindIp: 0.0.0.0  
. . .  
replication:  
  replSetName: "rs0"  
  enableMajorityReadConcern: true  
. . .

````
Настройка включения TLS в MongoDB

  
Чтобы включить поддержку TLS в MongoDB, выполните следующие действия:

1. Подготовьте fullchain-сертификат. Как это сделать, читайте в статье [«Создание fullchain-сертификата»](fullchain-sertificate.md).

2. Скопируйте содержимое закрытого ключа **your\_domain.key** в **mongodb.pem**:

````
cat your\_domain.key > mongodb.pem

3. ````
Скопируйте содержимое fullchain-сертификата в **mongodb.pem**:

````
cat fullchain\_your\_domain.pem >> mongodb.pem

4. ````
Добавьте блок конфигурации **net** на каждой ноде. Для этого в параметре **net.tls.certificateKeyFile** укажите путь до файла PEM, который содержит fullchain-сертификаты и связанные закрытые ключи. Все ноды имеют уникальные доменные имена, сертификаты должны быть выпущены для каждой ноды.

````
net:  
  tls:  
    mode: requireTLS  
    certificateKeyFile: /path/to/mongodb.pem

````
  
Подробнее о настройке TLS в MongoDB читайте в [официальной документации MongoDB](https://www.mongodb.com/docs/v5.0/tutorial/configure-ssl/).

3. Перезапустите MongoDB на каждой ноде, чтобы изменение вступило в силу:

````
sudo systemctl restart mongod

## ````
Шаг 5. Инициализация реплики

Следующие действия выполняются на узле** mongodb-server1.your\_domain**:

1. Откройте консоль **mongosh** для конфигурирования.

Для подключения к MongoDB выполните следующую команду:

````
sudo mongosh -u superuser admin

````
Для подключения к MongoDB с включённым TLS:

````
sudo mongosh -u superuser --tls --host mongodb-server1.your\_domain --tlsCAFile /etc/ssl/CA.pem

2. ````
Инициализируйте реплику:

````
rs.initiate(\{ \_id: "rs0", members: \[\{ \_id: 0, host: "mongodb-server1.your\_domain" \},\{ \_id: 1, host: "mongodb-server2.your\_domain" \},\{ \_id: 2, host: "mongodb-server3.your\_domain" \}\]\})

3. ````
Проверьте конфигурацию: 

````
rs.conf()

## ````
Шаг 6. Безопасность MongoDB

1. Создайте и укажите права для файла с общим ключом аутентификации. Данный ключ будут использовать все члены **Replica Set** для коммуникации друг с другом:

````
openssl rand -base64 756 > /var/lib/mongodb/keyfile  
chmod 400 /var/lib/mongodb/keyfile  
chown mongodb:mongodb /var/lib/mongodb/keyfile

2. ````
Скопируйте ключевой файл на каждую реплику.

````
начало внимание

````
Содержимое ключевого файла на всех узлах должно быть одинаковым с сохранением прав доступа.

````
конец внимание

3. ````
Включите безопасный доступ к серверу MongoDB, если он находится в открытой зоне. 

Для настройки необходимо отредактировать файл \[OBJECT\] на каждом из серверов. Строки должны выглядеть следующим образом:

````
. . .  
setParameter:  
  enableLocalhostAuthBypass: false  
security:  
  authorization: "enabled"  
  keyFile: /var/lib/mongodb/keyfile  
. . .

4. ````
Перезапустите MongoDB на каждой ноде:

````
sudo systemctl restart mongod

5. ````
Откройте консоль **mongosh**, используя пользователя для доступа к MongoDB.

Для подключения к MongoDB выполните команду:

````
sudo mongosh -u superuser

````
Для подключения к MongoDB с включённым TLS:

````
sudo mongosh -u superuser --tls --host mongodb-server1.your\_domain --tlsCAFile /etc/ssl/CA.pem

6. ````
Проверьте конфигурацию: 

````
rs.conf()

## ````
Шаг 7. Подключение к MongoDB

Строка для подключения к MongoDB:

````
mongodb://elma365:SecretPassword@mongodb-server1.your\_domain:27017,mongodb-server2.your\_domain:27017,mongodb-server3.your\_domain:27017/elma365?replicaSet=rs0\&readPreference=nearest\&maxStalenessSeconds=120

````
Строка для подключения к MongoDB c TLS:

````
mongodb://elma365:SecretPassword@mongodb-server1.your\_domain:27017,mongodb-server2.your\_domain:27017,mongodb-server3.your\_domain:27017/elma365?ssl=true\&replicaSet=rs0\&readPreference=nearest\&maxStalenessSeconds=120

## ````
Подготовка базы данных в MongoDB к восстановлению

Если вам потребовалось восстановить базу данных из резервной копии, сначала подготовьте БД к восстановлению. Подробнее об этом читайте в статье [«MongoDB»](mongodb.md#prepare-to-recovery).