name: mongodb service_id: 92 service_display_name: MongoDB service_short_name: mongodb service_man: '# Инструкция по развертыванию MongoDB через платформу

## 1. Общая информация

MongoDB — документоориентированная распределённая база данных, обеспечивающая высокую доступность, горизонтальное масштабирование и гибкую модель хранения.

### Доступные операции с кластером

* **create** — создание базы
* **delete** — удаление базы данных
* **suspend** — остановка базы данных
* **resume** — запуск базы данных
* **modify** — изменение базы данных
* **create_backup** — создание бэкапа вручную
* **delete_backup** — удаление бэкапов
* **rollback** — восстановление кластера из бэкапа

### Доступные операции с пользователями

* **create_user** — создание пользователя
* **modify_user** — модификация пользователя
* **delete_user** — удаление пользователя

---

## 2. Параметры создания базы данных

Эти параметры необходимо указать при создании базы данных.

### Платформа для развертывания

Среда, в которой будет развёрнут кластер. Выбирается из предложенного списка.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных в гигабайтах.
Пример: `20`

### Расписание резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

### Включить TLS

Булевый параметр. Определяет режим работы TLS кластера.

- `true` — TLS включён (`tls.mode: allowTLS`). Сертификаты сохраняются в Vault.
- `false` — TLS выключен (`tls.mode: disabled`).

По умолчанию: `false`.

---

## 3. Параметры модификации базы данных

Все параметры, которые вы указываете при модификации, являются необязательными — система автоматически подставит ранее сохранённые значения, и при необходимости вы можете изменить их на нужные.

### Количество узлов

Количество реплик в кластере MongoDB.
Оптимально выбирать нечётное значение, так как это обеспечивает корректный процесс выбора ведущего узла и сохраняет работоспособность базы данных даже при отказе одной из нод.

> **Примечание:** уменьшение количества узлов после создания кластера не рекомендуется.

### Квота памяти пода (MB)

Объём памяти для одного пода в мегабайтах.
Пример: `2048`

### Квота CPU пода (mCPU)

CPU-квота для пода в миликорах (1000 mCPU = 1 vCPU).
Пример: `1000`

### Размер диска для базы данных (GB)

Объём диска для хранения данных указывается в гигабайтах. Его можно увеличить при необходимости, однако уменьшить уже выделенный размер невозможно.
Пример: `20`

### Расписание резервного копирования

Cron-выражение (5 полей), по которому автоматически создаются резервные копии.
Пример: `0 0 * * *` (каждый день в 00:00)

### Хранить последних бэкапов

Сколько последних успешных резервных копий хранить — более старые удаляются автоматически.
Пример: `7`

> **Примечание:** ротация применяется только к бэкапам, созданным по расписанию. Бэкапы,
> созданные вручную операцией `create_backup`, в неё не входят и не удаляются автоматически —
> их нужно убирать вручную через `delete_backup`.

### Имя ipSpace для публикации внешнего IP

Имя ipSpace, через который будет выделен внешний IP для доступа к master-узлу.
Укажите `no-needed`, если внешний адрес не требуется.
Пример: `internet-no-antiddos-v1`

### Список разрешённых IP-адресов

Список IP-адресов или подсетей, с которых разрешён доступ к кластеру.
Если оставить пустым — доступ открыт для всех источников.
Пример: `["10.0.0.0/24", "192.168.1.10/32"]`

---

## 4. Параметры удаления базы данных

### Удалить бакет S3 с бэкапами

Булевый параметр.

- `true` — вместе с кластером также будут удалены все резервные копии и бакет S3.
- `false` — бакет S3 и хранящиеся в нём бэкапы сохраняются после удаления кластера.

По умолчанию: `false`.

---

## 5. Параметры создания бэкапа

### Имя бэкапа

Имя резервной копии, которое будет присвоено объекту бэкапа в кластере.
Должно соответствовать требованиям Kubernetes к именам объектов (строчные буквы, цифры, дефисы).
Пример: `manual-20260904`

> **Примечание:** такой бэкап не участвует в автоматической ротации по параметру
> "Хранить последних бэкапов" (она применяется только к бэкапам по расписанию) и не удаляется
> сам — при необходимости убрать его нужно вручную операцией `delete_backup`.

---

## 6. Параметры восстановления из бэкапа

### Имя бэкапа

Имя существующей резервной копии кластера, из которой будет выполнено восстановление. Указывается один из бэкапов в состоянии `ready` (созданных автоматически по расписанию или вручную через операцию create_backup).

---

## 7. Параметры удаления бэкапов

### Имена бэкапов

Список имён резервных копий для удаления.
Пример: `["manual-20260904", "cron-mongok8s-...-20260903020000"]`

---

## 8. Параметры создания пользователя

### Имя пользователя

Указывается имя пользователя (любой регистр).
Пример: `readApp`

> **Примечание:** имя пользователя должно быть уникальным в рамках кластера. Если пользователь
> с таким именем уже существует, операция завершится ошибкой — используйте `modify_user` для
> изменения прав или `delete_user` + `create_user` для пересоздания.

### Имя базы данных

Название базы, в которой будет создан пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read** — доступ только на чтение
* **readWrite** — чтение и изменение данных
* **dbOwner** — полный контроль над базой данных
* **dbAdmin** — администрирование базы данных (индексы, статистика, схема) без доступа к чтению/записи данных

---

## 9. Параметры модификации пользователя

### Имя пользователя

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

### Имя базы данных

База данных, к которой относится пользователь.
Если база отсутствует, она будет создана автоматически.
Пример: `Apps_9392`

### Имя роли

* **read**
* **readWrite**
* **dbOwner**
* **dbAdmin**

---

## 10. Параметры удаления пользователя

### Имя пользователя

Выберите пользователя из списка для удаления.

---

## 11. Выходные параметры

После успешного развертывания базы данных платформа возвращает ключевые параметры.

### internalConnect

Внутренний эндпоинт для подключения к кластеру из сервисов, работающих в той же сети.
Используется для внутренних интеграций и системных сервисов.

### externalConnect

Внешний FQDN для подключения к кластеру извне.
Порт подключения — **27017**.

> **Важно:** оба эндпоинта — это Kubernetes Service на весь replset, а не адрес конкретно
> primary-узла. Kubernetes не отслеживает, кто из узлов сейчас primary, поэтому новое
> подключение без параметра `replicaSet` может попасть на secondary и упасть с ошибкой записи
> `not writable primary`. Обязательно указывайте `replicaSet=rs0` в строке подключения (см.
> примеры ниже) — тогда драйвер сам обнаружит топологию кластера и всегда направит запись на
> актуальный primary, независимо от количества реплик и от того, происходили ли выборы.

---

## 12. Пример подключения

Перед подключением необходимо установить **mongosh**.

### 12.1 Подключение без TLS

Для внутреннего подключения из той же сети:

```
mongosh "mongodb://:@:27017/?authSource=admin&replicaSet=rs0"
```

### 12.2 Подключение через внешний endpoint с TLS

Кластер требует клиентский TLS-сертификат (mutual TLS). Сертификаты сохраняются в Vault при создании кластера в блоке `cer` в полях `ca`, `cer`, `key` в кодировке base64.

Подготовка файлов:

```bash
# Декодировать сертификаты из Vault
echo "" | base64 -d > ca.crt
echo " tls.crt
echo "" | base64 -d > tls.key

# Собрать клиентский PEM
cat tls.key tls.crt > client.pem
```

Подключение:

```
mongosh "mongodb://:@:27017/?tls=true&tlsCAFile=ca.crt&tlsCertificateKeyFile=client.pem&authSource=admin&replicaSet=rs0"
```

Где:

* `` — имя пользователя
* `` — пароль
* `` — internalConnect (для подключения без TLS)
* `` — externalConnect (для внешнего подключения с TLS)
* `` — имя базы данных

## 13. Дополнительная информация

Режим TLS задаётся параметром `mongoConfiguration.tls` только при создании кластера.
После создания изменение TLS через модификацию не поддерживается.

- При `true` кластер разворачивается с включённым TLS (`tls.mode: allowTLS`). Сервер принимает как обычные, так и TLS-соединения.
- При `false` TLS выключен (`tls.mode: disabled`).

Для внешнего подключения (`externalConnect`) используется сертификат, выпущенный через cert-manager, с SAN, покрывающим внешний DNS-адрес кластера — поэтому `tlsAllowInvalidHostnames` не требуется, хост проверяется как обычно.

Внутренние подключения TLS-сертификат не используют вообще: режим `allowTLS` допускает как TLS, так и обычные соединения, но для внутреннего трафика применяется обычное (не TLS) подключение — см. пример 12.1.

### Почему обязателен `replicaSet=rs0` в строке подключения

Percona-оператор не проставляет на поды никакого динамического лейбла роли (primary/secondary) —
у всех подов replset''а полностью одинаковые лейблы, различается только имя/индекс пода.
`master`-сервис — это обычный Kubernetes Service с фиксированным селектором на весь replset, он
не знает и не может знать, какой под сейчас primary: k8s просто раздаёт новые TCP-подключения
по кругу между всеми узлами. Без `replicaSet=rs0` в URI подключение может закрепиться на
secondary, и любая попытка записи будет падать с `not writable primary` — независимо от того,
происходили выборы недавно или нет. Указание `replicaSet=rs0` включает у драйвера обнаружение
топологии реплики, и он сам направляет запись на актуальный primary при любом количестве узлов
и после любых переизбраний.
' lifecycle: suspendOnDestroyDefault: true adoptExistingOnCreateDefault: false operations: - svcOperationId: 37 operation: create kind: instance action: create - svcOperationId: 411 operation: create_backup kind: subresource action: create - svcOperationId: 198 operation: create_user kind: subresource action: create - svcOperationId: 190 operation: delete kind: instance action: delete - svcOperationId: 414 operation: delete_backup kind: subresource action: delete - svcOperationId: 199 operation: delete_user kind: subresource action: delete - svcOperationId: 201 operation: modify kind: instance action: modify - svcOperationId: 200 operation: modify_user kind: subresource action: modify - svcOperationId: 409 operation: reconcile kind: action action: reconcile - svcOperationId: 196 operation: resume kind: instance action: resume - svcOperationId: 413 operation: rollback kind: action action: rollback - svcOperationId: 194 operation: suspend kind: instance action: suspend stateOut: backups: {} users: {} cfsParams: - svcOperationCfsParamId: 1089 svcOperationCfsParam: startupConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: false dataDescriptor: resourceRealm: dataType: string defaultValue: k8s-4-ext-nubes-ru isRequired: true isModifiable: false valueList: - k8s-4-ext-nubes-ru - svcOperationCfsParamId: 1090 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: cpu: dataType: integer > 0 defaultValue: '1000' isRequired: true isModifiable: false memory: dataType: integer > 0 defaultValue: '1024' isRequired: true isModifiable: false replicas: dataType: integer > 0 defaultValue: '1' isRequired: true isModifiable: false valueList: - '1' - '3' - '5' - '7' disk: dataType: integer > 0 defaultValue: '5' isRequired: true isModifiable: false - svcOperationCfsParamId: 1091 svcOperationCfsParam: accessConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false masterAccessList: dataType: json defaultValue: '[]' isRequired: true isModifiable: false - svcOperationCfsParamId: 1102 svcOperationCfsParam: backupConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: s3Uid: dataType: uuid defaultValue: '' isRequired: true isModifiable: false retain: dataType: integer > 0 defaultValue: '7' isRequired: true isModifiable: false schedule: dataType: string defaultValue: 0 0 * * * isRequired: true isModifiable: false - svcOperationCfsParamId: 1116 svcOperationCfsParam: mongoConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: false dataDescriptor: tls: dataType: boolean defaultValue: '' isRequired: true isModifiable: false valueList: - 'true' - 'false' - svcOperationCfsParamId: 1109 svcOperationCfsParam: backupName dataType: string isRequired: true defaultValue: '' isModifiable: false - svcOperationCfsParamId: 635 svcOperationCfsParam: username dataType: string isRequired: true defaultValue: '' isModifiable: false - svcOperationCfsParamId: 636 svcOperationCfsParam: dbName dataType: string isRequired: true defaultValue: '' isModifiable: false - svcOperationCfsParamId: 643 svcOperationCfsParam: role dataType: string isRequired: true defaultValue: '' isModifiable: false valueList: - read - readWrite - dbAdmin - dbOwner - svcOperationCfsParamId: 1103 svcOperationCfsParam: deleteS3Bucket dataType: boolean isRequired: true defaultValue: 'true' isModifiable: true valueList: - 'false' - 'true' - svcOperationCfsParamId: 1111 svcOperationCfsParam: backupName dataType: array isRequired: true defaultValue: '' isModifiable: true - svcOperationCfsParamId: 644 svcOperationCfsParam: username dataType: array isRequired: true defaultValue: '' isModifiable: true - svcOperationCfsParamId: 1092 svcOperationCfsParam: clusterConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: cpu: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false memory: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false replicas: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false valueList: - '1' - '3' - '5' - '7' disk: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 1093 svcOperationCfsParam: accessConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: masterIpSpace: dataType: string defaultValue: '' isRequired: true isModifiable: false masterAccessList: dataType: json defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 1104 svcOperationCfsParam: backupConfiguration dataType: map-fixed isRequired: true defaultValue: '' isModifiable: true dataDescriptor: retain: dataType: integer > 0 defaultValue: '' isRequired: true isModifiable: false schedule: dataType: string defaultValue: '' isRequired: true isModifiable: false - svcOperationCfsParamId: 640 svcOperationCfsParam: username dataType: string isRequired: true defaultValue: '' isModifiable: true - svcOperationCfsParamId: 641 svcOperationCfsParam: dbName dataType: string isRequired: true defaultValue: '' isModifiable: true - svcOperationCfsParamId: 642 svcOperationCfsParam: role dataType: string isRequired: true defaultValue: '' isModifiable: true valueList: - read - readWrite - dbAdmin - dbOwner - svcOperationCfsParamId: 1108 svcOperationCfsParam: backupName dataType: string isRequired: true defaultValue: '' isModifiable: true cfsParamsByOp: 37: - 1089 - 1090 - 1091 - 1102 - 1116 411: - 1109 198: - 635 - 636 - 643 190: - 1103 414: - 1111 199: - 644 201: - 1092 - 1093 - 1104 200: - 640 - 641 - 642 409: [] 196: [] 413: - 1108 194: [] stateParams: startupConfiguration: '{"resourceRealm": "k8s-4-ext-nubes-ru"}' clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}' accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}' backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}' mongoConfiguration: '{"tls": false}'