Установка и настройка 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
Если всё же заблокировали себя:
- Подключитесь через консоль панели хостера (VNC/IPMI)
- Выполните:
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