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: ''
isRequired: true
isModifiable: false
valueList:
- devclustername
- k8s-3-sandbox-nubes-ru
- k8s-4-sandbox-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": ""}'
clusterConfiguration: '{"cpu": 1000, "memory": 1024, "replicas": 1, "disk": 5}'
accessConfiguration: '{"masterIpSpace": "", "masterAccessList": "[]"}'
backupConfiguration: '{"s3Uid": "", "retain": 7, "schedule": "0 0 * * *"}'
mongoConfiguration: '{"tls": false}'