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.

Когда включать и когда не нужен

Зависимости и требования

Что именно делает

Пошагово, функция module_install в modules/14-mongodb.sh:

  1. Определяет версию из MONGO_VERSION (по умолчанию 8.0) и кодовое имя дистрибутива.
  2. Если MongoDB уже установлена (есть mongod) — пропускает установку и просто проверяет службу.
  3. Подключает официальный репозиторий:
    • 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.
  4. Включает и запускает службу mongod.
  5. Ждёт готовности: до 6 попыток mongosh … db.runCommand({ping:1}).ok с паузами. Нет ответа — установка неуспешна.
  6. Предупреждает в журнале: «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) после того, как вы:

Посмотреть (когда учётка уже есть):

sudo grep '^mongodb:' /root/.mitdev-credentials

Настройка

Переменная Значения По умолчанию Влияние Когда менять
MONGO_VERSION версия ветки, например 7.0, 8.0 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. Правильный путь:

  1. Приватная сеть между серверами: mitdev net create / join (см. MESH.md).
  2. sudo mitdev net bind mongodb private — MongoDB слушает приватный IP + 127.0.0.1.
  3. Обязательно включённая аутентификация (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 restoremongorestore.

Масштабирование и отказоустойчивость

Одиночный mongod — точка отказа. MongoDB решает это встроенным replica set (несколько узлов с копией данных, авто-выбор нового primary при отказе). mitdev настраивает его командами:

Между узлами — 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 не нужен):

  1. Создайте администратора, пока auth ещё выключен:
    mongosh --host 127.0.0.1 --eval '
      db.getSiblingDB("admin").createUser({
        user:"admin", pwd:"ПРИДУМАЙТЕ-НАДЁЖНЫЙ-ПАРОЛЬ",
        roles:[{role:"root", db:"admin"}]})'
    
  2. Включите авторизацию в /etc/mongod.conf — добавьте (или дополните) секцию:
    security:
      authorization: enabled
    
  3. Перезапустите службу:
    sudo systemctl restart mongod
    
  4. Проверьте, что auth работает:
    mongosh --quiet --eval 'db.adminCommand({listDatabases:1})'          # должно отказать (требует auth)
    mongosh -u admin -p 'ПАРОЛЬ' --authenticationDatabase admin \
      --quiet --eval 'db.adminCommand({listDatabases:1}).ok'            # ожидаемо: 1
    
  5. Сохраните пароль в /root/.mitdev-credentials (для единообразия):
    sudo bash -c 'printf "mongodb: user=admin\nmongodb: password=%s\n" "ПАРОЛЬ" >> /root/.mitdev-credentials'
    

После этого создайте отдельного пользователя приложения с ролью readWrite на его базе (см. «Типовые задачи») — приложение не должно ходить под root.

Откат и удаление

См. также