Установка и настройка MongoDB на Ubuntu и Debian

Безопасная установка MongoDB 8 на Ubuntu/Debian: создание пользователей, аутентификация, настройка файрвола без блокировки SSH, бэкапы и мониторинг.

Установка и настройка MongoDB

Полное руководство по установке MongoDB 8.0 на Ubuntu и Debian с нуля. Настроим аутентификацию, создадим пользователей с правильными ролями, защитим порты файрволом (не заблокировав SSH) и настроим бэкапы.

Требования

  • ОС: Ubuntu 22.04 / 24.04 LTS или Debian 12 (Bookworm)
  • RAM: минимум 2 ГБ (рекомендуется 4+ ГБ)
  • Диск: SSD (MongoDB активно работает с диском)
  • Доступ: root или пользователь с sudo

Установка MongoDB 8.0

MongoDB нет в стандартных репозиториях Ubuntu/Debian. Подключаем официальный.

Ubuntu 22.04 / 24.04

# Импорт GPG-ключа
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor

# Добавление репозитория
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/8.0 multiverse" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list

# Установка
sudo apt update
sudo apt install -y mongodb-org

Debian 12

# Импорт GPG-ключа
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor

# Добавление репозитория
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/debian bookworm/mongodb-org/8.0 main" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list

# Установка
sudo apt update
sudo apt install -y mongodb-org

Запуск и автозагрузка

sudo systemctl start mongod
sudo systemctl enable mongod
sudo systemctl status mongod

Если статус active (running) — MongoDB запущена. Проверьте подключение:

mongosh --eval "db.runCommand({ ping: 1 })"

Создание администратора

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

Подключитесь к MongoDB

mongosh

Создайте администратора

use admin

db.createUser({
  user: "admin",
  pwd: passwordPrompt(),  // запросит пароль интерактивно
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" },
    { role: "dbAdminAnyDatabase", db: "admin" },
    { role: "clusterAdmin", db: "admin" }
  ]
})

Система попросит ввести пароль. Используйте сложный пароль (минимум 20 символов, буквы + цифры + спецсимволы).

Выйдите из mongosh:

exit

Создание пользователя приложения

Никогда не подключайте приложение под администратором. Создайте отдельного пользователя с минимальными правами.

Подключитесь как админ

mongosh -u admin -p --authenticationDatabase admin

Создайте базу и пользователя для приложения

use myapp

db.createUser({
  user: "myapp_user",
  pwd: passwordPrompt(),
  roles: [
    { role: "readWrite", db: "myapp" }
  ]
})

Этот пользователь сможет только читать и писать в базу myapp. Ничего больше.

Справочник ролей

РольПраваКогда использовать
readТолько чтениеАналитика, мониторинг
readWriteЧтение + записьПриложения
dbAdminУправление индексами, статистикаDevOps
userAdminУправление пользователями одной БДАдминистрирование
userAdminAnyDatabaseУправление пользователями всех БДСуперадмин
readWriteAnyDatabaseЧтение + запись во все БДСуперадмин
rootАбсолютно всёТолько для экстренных случаев

Включение аутентификации

Теперь включим обязательную аутентификацию в конфиге MongoDB.

sudo nano /etc/mongod.conf

Найдите секцию security (она закомментирована) и измените:

security:
  authorization: enabled

Перезапустите MongoDB:

sudo systemctl restart mongod

Проверьте — без пароля доступ закрыт:

# Это НЕ должно работать
mongosh --eval "show dbs"

# А это должно
mongosh -u admin -p --authenticationDatabase admin --eval "show dbs"

Настройка привязки к адресам

По умолчанию MongoDB слушает только 127.0.0.1 (localhost). Это безопасно. Менять нужно только если приложение работает на другом сервере.

Вариант 1: Только локальный доступ (рекомендуется)

net:
  port: 27017
  bindIp: 127.0.0.1

Приложение должно быть на том же сервере, что и MongoDB.

Вариант 2: Доступ из локальной сети

net:
  port: 27017
  bindIp: 127.0.0.1,10.0.0.5

Замените 10.0.0.5 на внутренний IP вашего сервера. Никогда не ставьте 0.0.0.0 без файрвола.

Вариант 3: Доступ извне (опасно, только с файрволом)

net:
  port: 27017
  bindIp: 0.0.0.0

Если выбрали этот вариант — настройка файрвола обязательна. Читайте следующий раздел.

После изменений:

sudo systemctl restart mongod

Настройка файрвола (UFW)

КРИТИЧЕСКИ ВАЖНО: Всегда сначала разрешайте SSH, и только потом включайте файрвол. Иначе вы потеряете доступ к серверу.

Шаг 1: Разрешите SSH (СДЕЛАЙТЕ ЭТО ПЕРВЫМ!)

sudo ufw allow 22/tcp comment 'SSH'

Если ваш SSH на нестандартном порту:

sudo ufw allow 2222/tcp comment 'SSH custom port'

Шаг 2: Проверьте правила ДО включения

sudo ufw show added

Убедитесь, что SSH-порт есть в списке. Если его нет — не включайте файрвол.

Шаг 3: Включите файрвол

sudo ufw enable

Система спросит подтверждение. Ваше текущее SSH-соединение не оборвётся, если порт был разрешён.

Шаг 4: Настройте правила для MongoDB

Если MongoDB только для локального доступа — ничего добавлять не нужно. Localhost-трафик не фильтруется UFW.

Если нужен доступ с конкретных IP:

# Разрешить доступ к MongoDB только с IP вашего приложения
sudo ufw allow from 10.0.0.10 to any port 27017 comment 'MongoDB from app server'

# Или с подсети
sudo ufw allow from 10.0.0.0/24 to any port 27017 comment 'MongoDB from local network'

Никогда НЕ делайте так:

# ОПАСНО — открывает MongoDB для всего интернета
sudo ufw allow 27017/tcp

Шаг 5: Проверьте итоговые правила

sudo ufw status verbose

Должно быть примерно так:

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere          # SSH
27017                      ALLOW       10.0.0.10         # MongoDB from app server
22/tcp (v6)                ALLOW       Anywhere (v6)     # SSH

Смена порта MongoDB (опционально)

Если хотите убрать MongoDB со стандартного порта 27017 (от автосканеров):

sudo nano /etc/mongod.conf
net:
  port: 27117
  bindIp: 127.0.0.1
sudo systemctl restart mongod

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

mongosh --port 27117 -u admin -p --authenticationDatabase admin

Не забудьте обновить порт в файрволе, если он был открыт:

sudo ufw delete allow from 10.0.0.10 to any port 27017
sudo ufw allow from 10.0.0.10 to any port 27117 comment 'MongoDB custom port'

Строка подключения для приложения

Локальное приложение (на том же сервере)

mongodb://myapp_user:ПАРОЛЬ@127.0.0.1:27017/myapp

Удалённое приложение

mongodb://myapp_user:ПАРОЛЬ@10.0.0.5:27017/myapp

С параметрами (рекомендуется)

mongodb://myapp_user:ПАРОЛЬ@127.0.0.1:27017/myapp?authSource=myapp&retryWrites=true&w=majority&maxPoolSize=50&connectTimeoutMS=10000
ПараметрЗначение
authSourceБД для аутентификации
retryWritesПовтор записей при сбое
w=majorityПодтверждение записи большинством нод
maxPoolSizeМакс. соединений в пуле
connectTimeoutMSТаймаут подключения

Пример для Node.js (Mongoose)

import mongoose from 'mongoose'

await mongoose.connect('mongodb://myapp_user:ПАРОЛЬ@127.0.0.1:27017/myapp', {
  authSource: 'myapp',
  retryWrites: true,
  w: 'majority',
  maxPoolSize: 50,
})

Бэкапы

Ручной бэкап

mongodump --uri="mongodb://admin:ПАРОЛЬ@127.0.0.1:27017" \
  --authenticationDatabase=admin \
  --gzip \
  --out=/backups/mongo/$(date +%Y-%m-%d)

Восстановление

mongorestore --uri="mongodb://admin:ПАРОЛЬ@127.0.0.1:27017" \
  --authenticationDatabase=admin \
  --gzip \
  /backups/mongo/2026-02-14

Автоматические бэкапы через cron

sudo nano /etc/cron.d/mongodb-backup
# Бэкап MongoDB каждый день в 3:00
0 3 * * * root mongodump --uri="mongodb://admin:ПАРОЛЬ@127.0.0.1:27017" --authenticationDatabase=admin --gzip --out=/backups/mongo/$(date +\%Y-\%m-\%d) && find /backups/mongo/ -type d -mtime +14 -exec rm -rf {} + 2>/dev/null

Это создаёт ежедневный бэкап и удаляет бэкапы старше 14 дней.

Бэкап конкретной базы

mongodump --uri="mongodb://admin:ПАРОЛЬ@127.0.0.1:27017/myapp" \
  --authenticationDatabase=admin \
  --gzip \
  --out=/backups/mongo/myapp-$(date +%Y-%m-%d)

Мониторинг

Статус сервера

mongosh -u admin -p --authenticationDatabase admin --eval "db.serverStatus()"

Активные соединения

mongosh -u admin -p --authenticationDatabase admin --eval "db.currentOp()"

Статистика базы

mongosh -u admin -p --authenticationDatabase admin --eval "
  use myapp
  db.stats()
"

Полезные команды мониторинга

# Статус службы
sudo systemctl status mongod

# Логи в реальном времени
sudo tail -f /var/log/mongodb/mongod.log

# Размер данных на диске
du -sh /var/lib/mongodb/

# Проверка порта
sudo ss -tlnp | grep mongod

Оптимизация производительности

WiredTiger Cache

MongoDB использует движок WiredTiger. По умолчанию он занимает ~50% RAM. Для сервера с 4 ГБ RAM:

sudo nano /etc/mongod.conf
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1.5

Формула расчёта кэша

cacheSizeGB = (RAM - 2 ГБ) × 0.5

Оставьте минимум 2 ГБ для ОС и других процессов.

RAM сервераcacheSizeGB
2 ГБ0.5
4 ГБ1.0
8 ГБ3.0
16 ГБ7.0

Индексы

Создавайте индексы для полей, по которым часто ищете:

// Подключитесь к базе
use myapp

// Составной индекс
db.users.createIndex({ email: 1 }, { unique: true })
db.sessions.createIndex({ userId: 1, createdAt: -1 })

// TTL-индекс (автоудаление документов)
db.sessions.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 })

// Посмотреть все индексы коллекции
db.users.getIndexes()

Частые ошибки

«Failed to start mongod.service»

# Проверить логи
sudo journalctl -u mongod --no-pager -n 50

# Частая причина — права на директорию
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown -R mongodb:mongodb /var/log/mongodb
sudo systemctl start mongod

«connection refused» при подключении

# MongoDB запущена?
sudo systemctl status mongod

# Слушает ли порт?
sudo ss -tlnp | grep 27017

# Проверьте bindIp в конфиге
grep bindIp /etc/mongod.conf

Потеря SSH-доступа после UFW

Если всё же заблокировали себя:

  1. Подключитесь через консоль панели хостера (VNC/IPMI)
  2. Выполните:
sudo ufw disable
sudo ufw allow 22/tcp
sudo ufw enable

«Authentication failed»

# Проверьте, что аутентификация включена
grep authorization /etc/mongod.conf

# Подключитесь с явным указанием authSource
mongosh -u myapp_user -p --authenticationDatabase myapp
Назад к статьям