14-mongodb — MongoDB
☐ Опциональный. Документная NoSQL-база из официального репозитория MongoDB. По умолчанию слушает localhost БЕЗ аутентификации — включите её до продакшена (см. раздел «Безопасность и продакшен»).
MongoDB — документная база данных: данные хранятся не в таблицах, а в JSON-подобных документах (коллекции вместо таблиц). Термины: replica set — набор из нескольких серверов MongoDB с одной копией данных, где один узел primary (принимает записи), остальные secondary, и при отказе primary новый выбирается автоматически; mongosh — интерактивная оболочка-клиент MongoDB; auth (authorization) — режим, при котором для работы с базой обязателен логин/пароль.
Зачем нужен
MongoDB удобна, когда структура данных гибкая или заранее не фиксирована: каталоги товаров с разными атрибутами, логи событий, документы с вложенностью, быстрый прототип без миграций схемы. Модуль подключает официальный репозиторий MongoDB нужной версии (по умолчанию 8.0) с проверкой GPG-подписи и ставит mongodb-org.
Когда включать и когда не нужен
- Включайте, если данные документо-ориентированы, схема часто меняется, нужен гибкий JSON без строгих связей.
- Не нужен, если данные реляционные (тогда PostgreSQL), если база живёт в Docker или если проекту хватает одного PostgreSQL с JSONB-полями.
- Не ставится на SUSE и Arch: MongoDB Inc. официальных пакетов для них не публикует — модуль честно завершится с ошибкой. Поддерживаются только семейства Debian и RHEL.
Зависимости и требования
- Отдельных модулей-зависимостей нет.
- Семейства ОС: Debian/Ubuntu и RHEL/Rocky/Alma/Fedora. Для остальных — установка невозможна.
- Права root; доступ в интернет к
repo.mongodb.orgиmongodb.org(репозиторий и GPG-ключ). - Достаточно RAM и места на диске (MongoDB любит память).
Что именно делает
Пошагово, функция module_install в modules/14-mongodb.sh:
- Определяет версию из
MONGO_VERSION(по умолчанию8.0) и кодовое имя дистрибутива. - Если MongoDB уже установлена (есть
mongod) — пропускает установку и просто проверяет службу. - Подключает официальный репозиторий:
- Debian/Ubuntu: импортирует GPG-ключ версии (
server-<версия>.asc→/etc/apt/keyrings/mongodb-server.gpg), записываетdeb-источник в/etc/apt/sources.list.d/mongodb-org.list, обновляет индекс и ставитmongodb-org. - RHEL: создаёт
/etc/yum.repos.d/mongodb-org.repoсgpgcheck=1и ключом версии, ставитmongodb-org.
- Debian/Ubuntu: импортирует GPG-ключ версии (
- Включает и запускает службу
mongod. - Ждёт готовности: до 6 попыток
mongosh … db.runCommand({ping:1}).okс паузами. Нет ответа — установка неуспешна. - Предупреждает в журнале: «MongoDB слушает localhost без аутентификации — включите её перед продакшеном».
Важно: на этом шаге пользователь и пароль не создаются — свежая MongoDB работает без аутентификации (см. ниже). Поэтому в /root/.mitdev-credentials после базовой установки записей MongoDB нет — они появляются только после инициализации replica set (mitdev mongo cluster-init) или ручного включения auth.
Файлы, службы и порты
| Путь / юнит / порт | Назначение | Права / примечание |
|---|---|---|
Служба mongod |
systemd-юнит MongoDB | mitdev mongo status |
Порт 27017/tcp |
приём подключений | по умолчанию только 127.0.0.1 |
/etc/mongod.conf |
конфигурация (bindIp, security, replication) |
правится при настройке auth/replica set |
/var/lib/mongodb/ |
данные | владелец mongodb |
/var/log/mongodb/mongod.log |
лог сервера | смотреть при сбое запуска |
/etc/apt/sources.list.d/mongodb-org.list + /etc/apt/keyrings/mongodb-server.gpg (Debian) |
репозиторий и GPG-ключ | создаются модулем |
/etc/yum.repos.d/mongodb-org.repo (RHEL) |
репозиторий | создаётся модулем |
Учётные данные
После базовой установки учётных данных нет — аутентификация выключена, MongoDB доступна локально без пароля. Это удобно для разработки, но опасно для продакшена.
Учётные данные появляются в /root/.mitdev-credentials (0600, только root) после того, как вы:
- инициализируете replica set —
sudo mitdev mongo cluster-initсоздаёт пользователяadmin(рольroot) и сохраняет пароль, включая при этом auth (через keyFile); либо - включите auth вручную (см. ниже) — тогда добавьте запись в файл сами.
Посмотреть (когда учётка уже есть):
sudo grep '^mongodb:' /root/.mitdev-credentials
Настройка
| Переменная | Значения | По умолчанию | Влияние | Когда менять |
|---|---|---|---|---|
MONGO_VERSION |
версия ветки, например 7.0, 8.0 |
8.0 |
какой репозиторий/пакет ставится | нужна конкретная поддерживаемая версия |
Как переопределить настройки
- Экспорт переменной перед установкой:
export MONGO_VERSION=7.0 sudo -E ./install.sh - Правка дефолта в
config/defaults.conf(MONGO_VERSION="8.0").
Как подключиться
Из приложения на этом же сервере (без auth, как сразу после установки):
mongodb://127.0.0.1:27017/<база>
После включения auth:
mongodb://<user>:<password>@127.0.0.1:27017/<база>?authSource=admin
Из командной строки (mongosh):
mongosh # без auth — сразу в оболочку
mongosh -u admin -p 'ПАРОЛЬ' --authenticationDatabase admin # с включённым auth
С другого сервера — БЕЗОПАСНО. По умолчанию 27017 доступен только локально. Не открывайте его наружу без auth. Правильный путь:
- Приватная сеть между серверами:
mitdev net create/join(см. MESH.md). sudo mitdev net bind mongodb private— MongoDB слушает приватный IP +127.0.0.1.- Обязательно включённая аутентификация (replica set через
mitdev mongo cluster-initвключает её автоматически).
Проверка, что всё работает
Проверка модуля (module_verify): служба mongod активна. Вручную:
mongosh --quiet --eval 'db.runCommand({ping:1}).ok'
Ожидаемо: 1.
mongod --version | head -1
Ожидаемо: строка вида db version v8.0.x.
mitdev mongo status
Ожидаемо: если replica set ещё не инициализирован — «replica set не инициализирован (mitdev mongo cluster-init)» (это норма для одиночного узла).
mitdev doctor --deep
В функциональных пробах: MongoDB — ping ok.
Типовые задачи
Записать и прочитать документ:
mongosh --quiet --eval 'db.getSiblingDB("app").items.insertOne({name:"test", qty:1})'
mongosh --quiet --eval 'db.getSiblingDB("app").items.find().pretty()'
(с включённым auth добавляйте -u admin -p 'ПАРОЛЬ' --authenticationDatabase admin).
Создать пользователя для конкретной базы (после включения auth):
mongosh -u admin -p 'ПАРОЛЬ' --authenticationDatabase admin --eval '
db.getSiblingDB("app").createUser({user:"appuser", pwd:"парольApp",
roles:[{role:"readWrite", db:"app"}]})'
Сменить пароль пользователя:
mongosh -u admin -p 'ПАРОЛЬ' --authenticationDatabase admin --eval '
db.getSiblingDB("admin").changeUserPassword("admin","новый-пароль")'
Список баз и коллекций:
mongosh --quiet --eval 'db.adminCommand({listDatabases:1}).databases.forEach(d=>print(d.name))'
Активные соединения / операции:
mongosh --quiet --eval 'db.currentOp().inprog.length'
mongosh --quiet --eval 'db.serverStatus().connections'
Резервная копия / восстановление (утилиты mongodump / mongorestore):
mongodump --out /root/mongodump-$(date +%F)
mongorestore --drop /root/mongodump-2026-07-10
Общий бэкап сервера (sudo mitdev backup) тоже делает mongodump, а mitdev restore — mongorestore.
Масштабирование и отказоустойчивость
Одиночный mongod — точка отказа. MongoDB решает это встроенным replica set (несколько узлов с копией данных, авто-выбор нового primary при отказе). mitdev настраивает его командами:
sudo mitdev mongo cluster-init [имя]— на первом сервере: генерирует общий keyfile, включаетreplicationи auth, делаетrs.initiate(), создаёт пользователяadmin(рольroot) и сохраняет пароль в/root/.mitdev-credentials.sudo mitdev mongo token— токен для остальных узлов (имя набора, IP primary, admin-пароль, keyfile).sudo mitdev mongo join <токен>— на новом узле: применяет keyfile и добавляет узел в набор с primary (rs.add).sudo mitdev mongo add-member <ip>/remove-member <ip>/promote(перевыборы черезrs.stepDown).
Между узлами — internal auth по общему keyfile; клиентская авторизация включается автоматически (наличие keyFile ⇒ authorization enabled). Требуется приватная сеть (mitdev net). Подробности — COMMANDS.md (раздел про replica set) и HA.md.
Частые ошибки
Симптом: установка падает с «MongoDB официально доступна только для семейств Debian и RHEL». Причина: ОС из семейства SUSE/Arch — официальных пакетов нет. Решение: используйте PostgreSQL, поставьте MongoDB вручную или смените дистрибутив.
Симптом: mongod не стартует после установки.
Причина: мало памяти, повреждённые данные или занятый порт.
Решение: смотрите лог — journalctl -u mongod -n 50 и /var/log/mongodb/mongod.log.
Симптом: после включения auth mongosh отвечает command requires authentication.
Причина: подключение без логина/пароля к базе с включённой авторизацией.
Решение: добавляйте -u admin -p 'ПАРОЛЬ' --authenticationDatabase admin.
Симптом: GPG/NO_PUBKEY при apt update после установки.
Причина: не импортировался ключ версии.
Решение: повторите установку модуля; проверьте наличие /etc/apt/keyrings/mongodb-server.gpg и доступ к mongodb.org.
Безопасность и продакшен
ГЛАВНОЕ ПРЕДУПРЕЖДЕНИЕ. Сразу после установки MongoDB работает без аутентификации и слушает 127.0.0.1. Это значит: любой процесс/пользователь на этом сервере имеет полный доступ ко всем данным без пароля. Для разработки приемлемо, для продакшена — недопустимо. Пока auth не включён, ни в коем случае не открывайте порт 27017 наружу.
Самый простой и правильный способ включить auth — инициализировать replica set (sudo mitdev mongo cluster-init): он создаёт admin-пользователя и включает авторизацию автоматически. Даже если узел один, это даёт защищённую конфигурацию.
Ручное включение auth пошагово (если replica set не нужен):
- Создайте администратора, пока auth ещё выключен:
mongosh --host 127.0.0.1 --eval ' db.getSiblingDB("admin").createUser({ user:"admin", pwd:"ПРИДУМАЙТЕ-НАДЁЖНЫЙ-ПАРОЛЬ", roles:[{role:"root", db:"admin"}]})' - Включите авторизацию в
/etc/mongod.conf— добавьте (или дополните) секцию:security: authorization: enabled - Перезапустите службу:
sudo systemctl restart mongod - Проверьте, что auth работает:
mongosh --quiet --eval 'db.adminCommand({listDatabases:1})' # должно отказать (требует auth) mongosh -u admin -p 'ПАРОЛЬ' --authenticationDatabase admin \ --quiet --eval 'db.adminCommand({listDatabases:1}).ok' # ожидаемо: 1 - Сохраните пароль в
/root/.mitdev-credentials(для единообразия):sudo bash -c 'printf "mongodb: user=admin\nmongodb: password=%s\n" "ПАРОЛЬ" >> /root/.mitdev-credentials'
После этого создайте отдельного пользователя приложения с ролью readWrite на его базе (см. «Типовые задачи») — приложение не должно ходить под root.
Откат и удаление
- Автоматический откат (
module_rollback) при сбое установки: отключает службу, удаляетmongodb-org, убирает файл репозитория и GPG-ключ. - Ручное удаление:
Безsudo mitdev remove mongodb # снести пакеты и репозиторий, ДАННЫЕ СОХРАНИТЬ sudo mitdev remove mongodb --purge # снести всё, включая /var/lib/mongodb и /var/log/mongodb--purgeданные (/var/lib/mongodb) сохраняются. С--purgeони удаляются безвозвратно.
См. также
- COMMANDS.md — команды
mitdev mongo …(replica set: cluster-init, token, join, promote) - HA.md — отказоустойчивость и replica set
- SECURITY.md — безопасность и учётные данные
- MESH.md — приватная сеть и
mitdev net bind