Skip to main content

Hướng Dẫn Cài Đặt & Cấu Hình MongoDB Trên Ubuntu Server – Từ A Đến Z

Posted on:  at 
Tutorials
Picture

1. Chuẩn bị hệ thống

1.1 Kiểm tra thông tin hệ thống

# Kiểm tra phiên bản Ubuntu
lsb_release -a

# Kiểm tra architecture
uname -m

# Kiểm tra dung lượng disk
df -h

# Kiểm tra RAM
free -h

1.2 Cập nhật hệ thống

# Cập nhật package list
sudo apt update

# Nâng cấp hệ thống
sudo apt upgrade -y

# Cài đặt các công cụ cần thiết
sudo apt install -y wget curl gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release

1.3 Tạo user cho MongoDB (tùy chọn)

# Tạo user mongodb (nếu chưa có)
sudo useradd -r -s /bin/false mongodb

# Tạo thư mục cho MongoDB
sudo mkdir -p /var/lib/mongodb
sudo mkdir -p /var/log/mongodb

# Phân quyền thư mục
sudo chown mongodb:mongodb /var/lib/mongodb
sudo chown mongodb:mongodb /var/log/mongodb

2. Cài đặt MongoDB

2.1 Phương pháp 1: Cài đặt từ MongoDB Official Repository (Khuyến nghị)

Thêm MongoDB GPG key

# Import public key
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

# Kiểm tra key đã import
gpg --show-keys /usr/share/keyrings/mongodb-server-7.0.gpg

Thêm MongoDB repository

# Cho Ubuntu 22.04 (Jammy)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# Cho Ubuntu 20.04 (Focal)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# Cập nhật package list
sudo apt update

Cài đặt MongoDB

# Cài đặt MongoDB Community Edition
sudo apt install -y mongodb-org

# Cài đặt phiên bản cụ thể (nếu cần)
sudo apt install -y mongodb-org=7.0.4 mongodb-org-database=7.0.4 mongodb-org-server=7.0.4 mongodb-org-mongos=7.0.4 mongodb-org-tools=7.0.4

# Giữ phiên bản hiện tại (không auto-update)
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-database hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections

2.2 Phương pháp 2: Cài đặt từ Ubuntu Repository

# Cài đặt MongoDB từ Ubuntu repository (phiên bản cũ hơn)
sudo apt install -y mongodb

# Kiểm tra phiên bản
mongod --version

2.3 Kiểm tra cài đặt

# Kiểm tra các file đã được cài đặt
dpkg -l | grep mongodb

# Kiểm tra vị trí các file
which mongod
which mongo
which mongosh

# Kiểm tra phiên bản
mongod --version

3. Cấu hình MongoDB

3.1 File cấu hình chính

# Backup file cấu hình gốc
sudo cp /etc/mongod.conf /etc/mongod.conf.backup

# Chỉnh sửa file cấu hình
sudo nano /etc/mongod.conf

3.2 Cấu hình cơ bản

# /etc/mongod.conf

# Lưu trữ dữ liệu
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

# Log
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
  logRotate: reopen

# Network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1  # Chỉ local access ban đầu
  # bindIp: 0.0.0.0  # Cho phép remote access (cẩn thận!)

# Process management
processManagement:
  timeZoneInfo: /usr/share/zoneinfo
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid

# Security (sẽ enable sau khi tạo admin user)
#security:
#  authorization: enabled

# Operation Profiling
#operationProfiling:
#  slowOpThresholdMs: 100
#  mode: slowOp

# Replication (cho replica set)
#replication:
#  replSetName: "rs0"

3.3 Khởi động MongoDB service

# Enable MongoDB để tự khởi động khi boot
sudo systemctl enable mongod

# Khởi động MongoDB
sudo systemctl start mongod

# Kiểm tra status
sudo systemctl status mongod

# Kiểm tra log
sudo tail -f /var/log/mongodb/mongod.log

3.4 Kiểm tra kết nối

# Kết nối MongoDB shell (MongoDB < 6.0)
mongo

# Hoặc với MongoDB Shell mới (MongoDB >= 6.0)
mongosh

# Kiểm tra databases
show dbs

# Kiểm tra current database
db

# Exit
exit

4. Thiết lập Authentication

4.1 Tạo Admin User đầu tiên

# Kết nối MongoDB shell
mongosh

# Chuyển sang admin database
use admin

# Tạo root user
db.createUser({
  user: "admin",
  pwd: "SecureAdminPassword123!",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    { role: "readWriteAnyDatabase", db: "admin" },
    { role: "dbAdminAnyDatabase", db: "admin" },
    { role: "clusterAdmin", db: "admin" }
  ]
})

# Hoặc tạo user với tất cả quyền
db.createUser({
  user: "root",
  pwd: "SuperSecureRootPassword456!",
  roles: ["root"]
})

# Kiểm tra user đã tạo
db.getUsers()

# Exit
exit

4.2 Enable Authentication

# Chỉnh sửa file cấu hình
sudo nano /etc/mongod.conf

# Thêm/uncomment phần security
security:
  authorization: enabled

# Restart MongoDB
sudo systemctl restart mongod

# Kiểm tra status
sudo systemctl status mongod

4.3 Test Authentication

# Kết nối với authentication
mongosh -u admin -p --authenticationDatabase admin

# Hoặc kết nối và authenticate sau
mongosh
use admin
db.auth("admin", "SecureAdminPassword123!")

# Test quyền
show dbs
use admin
show users

5. Tạo và quản lý User

5.1 Tạo Database User

# Kết nối với admin user
mongosh -u admin -p --authenticationDatabase admin

# Tạo database và user cho ứng dụng
use myapp
db.createUser({
  user: "appuser",
  pwd: "AppUserPassword789!",
  roles: [
    { role: "readWrite", db: "myapp" }
  ]
})

# Tạo user chỉ đọc
db.createUser({
  user: "readonly",
  pwd: "ReadOnlyPassword101!",
  roles: [
    { role: "read", db: "myapp" }
  ]
})

# Tạo user với multiple databases
use admin
db.createUser({
  user: "multidbuser",
  pwd: "MultiDbPassword202!",
  roles: [
    { role: "readWrite", db: "myapp" },
    { role: "read", db: "logs" },
    { role: "dbAdmin", db: "analytics" }
  ]
})

5.2 Custom Roles

# Tạo custom role
use myapp
db.createRole({
  role: "dataAnalyst",
  privileges: [
    {
      resource: { db: "myapp", collection: "" },
      actions: ["find", "listCollections", "listIndexes"]
    },
    {
      resource: { db: "myapp", collection: "reports" },
      actions: ["find", "insert", "update"]
    }
  ],
  roles: []
})

# Tạo user với custom role
db.createUser({
  user: "analyst",
  pwd: "AnalystPassword303!",
  roles: ["dataAnalyst"]
})

5.3 Quản lý User

# Xem thông tin user
db.getUser("appuser")

# Thay đổi password
db.changeUserPassword("appuser", "NewAppPassword404!")

# Thêm role cho user
db.grantRolesToUser("appuser", [{ role: "dbAdmin", db: "myapp" }])

# Xóa role khỏi user
db.revokeRolesFromUser("appuser", [{ role: "dbAdmin", db: "myapp" }])

# Cập nhật user roles
db.updateUser("appuser", {
  roles: [
    { role: "readWrite", db: "myapp" },
    { role: "read", db: "logs" }
  ]
})

# Xóa user
db.dropUser("olduser")

# Liệt kê tất cả users
db.getUsers()

6. Cấu hình Firewall

6.1 UFW Firewall

# Kiểm tra UFW status
sudo ufw status

# Enable UFW (nếu chưa)
sudo ufw enable

# Cho phép MongoDB port từ localhost
sudo ufw allow from 127.0.0.1 to any port 27017

# Cho phép từ specific IP
sudo ufw allow from 192.168.1.100 to any port 27017

# Cho phép từ subnet
sudo ufw allow from 192.168.1.0/24 to any port 27017

# Xem rules
sudo ufw status numbered

# Xóa rule (ví dụ rule số 2)
sudo ufw delete 2

6.2 IPTables (nếu không dùng UFW)

# Cho phép local connections
sudo iptables -A INPUT -i lo -j ACCEPT

# Cho phép từ specific IP
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 27017 -j ACCEPT

# Block tất cả connections khác đến MongoDB
sudo iptables -A INPUT -p tcp --dport 27017 -j DROP

# Lưu rules
sudo iptables-save > /etc/iptables/rules.v4

6.3 Cấu hình Remote Access

# Chỉnh sửa MongoDB config để cho phép remote connections
sudo nano /etc/mongod.conf

# Thay đổi bindIp
net:
  port: 27017
  bindIp: 0.0.0.0  # CẢNH BÁO: Chỉ làm khi đã có firewall và authentication

# Restart MongoDB
sudo systemctl restart mongod

# Test kết nối từ remote
mongosh "mongodb://appuser:AppUserPassword789!@your-server-ip:27017/myapp"

7. Kiểm tra và Testing

7.1 Kiểm tra Service

# Status của MongoDB service
sudo systemctl status mongod

# Kiểm tra port
sudo netstat -tlnp | grep 27017
# hoặc
sudo ss -tlnp | grep 27017

# Kiểm tra processes
ps aux | grep mongod

# Kiểm tra log files
sudo tail -f /var/log/mongodb/mongod.log

# Kiểm tra disk usage
du -sh /var/lib/mongodb/

7.2 Test Connection và Authentication

# Local connection test
mongosh --eval "db.adminCommand('ismaster')"

# Authentication test
mongosh -u admin -p --authenticationDatabase admin --eval "db.adminCommand('listCollections')"

# Application user test
mongosh -u appuser -p --authenticationDatabase myapp --eval "use myapp; db.test.insertOne({name: 'test'}); db.test.find()"

# Remote connection test
mongosh "mongodb://appuser:password@server-ip:27017/myapp" --eval "db.stats()"

7.3 Performance Test

# Tạo test data
mongosh -u appuser -p --authenticationDatabase myapp

use myapp
for(var i = 0; i < 10000; i++) {
  db.testcollection.insertOne({
    index: i,
    name: "User " + i,
    email: "user" + i + "@example.com",
    createdAt: new Date()
  })
}

# Test query performance
db.testcollection.find({index: {$gte: 5000}}).explain("executionStats")

# Create index
db.testcollection.createIndex({index: 1})

# Test again
db.testcollection.find({index: {$gte: 5000}}).explain("executionStats")

8. Backup và Restore

8.1 Tạo Backup User

mongosh -u admin -p --authenticationDatabase admin

use admin
db.createUser({
  user: "backup",
  pwd: "BackupPassword505!",
  roles: [
    { role: "backup", db: "admin" },
    { role: "clusterMonitor", db: "admin" }
  ]
})

8.2 Backup Commands

# Backup toàn bộ databases
mongodump -u backup -p BackupPassword505! --authenticationDatabase admin --out /backup/mongodb/$(date +%Y%m%d)

# Backup specific database
mongodump -u appuser -p AppUserPassword789! --authenticationDatabase myapp --db myapp --out /backup/mongodb/myapp_$(date +%Y%m%d)

# Backup với compression
mongodump -u backup -p --authenticationDatabase admin --gzip --archive=/backup/mongodb/full_backup_$(date +%Y%m%d).gz

# Backup to remote location
mongodump -u backup -p --authenticationDatabase admin --host localhost:27017 --gzip --archive | ssh user@backup-server "cat > /remote/backup/mongodb_$(date +%Y%m%d).gz"

8.3 Restore Commands

# Restore toàn bộ
mongorestore -u admin -p --authenticationDatabase admin /backup/mongodb/20241201

# Restore specific database
mongorestore -u admin -p --authenticationDatabase admin --db myapp /backup/mongodb/myapp_20241201/myapp

# Restore từ compressed archive
mongorestore -u admin -p --authenticationDatabase admin --gzip --archive=/backup/mongodb/full_backup_20241201.gz

# Restore với drop existing collections
mongorestore -u admin -p --authenticationDatabase admin --drop --db myapp /backup/mongodb/myapp_20241201/myapp

8.4 Automated Backup Script

# Tạo backup script
sudo nano /usr/local/bin/mongodb-backup.sh

#!/bin/bash
# MongoDB Backup Script

BACKUP_DIR="/backup/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
DB_USER="backup"
DB_PASS="BackupPassword505!"
LOG_FILE="/var/log/mongodb-backup.log"

# Tạo thư mục backup
mkdir -p $BACKUP_DIR

# Backup
echo "$(date): Starting MongoDB backup" >> $LOG_FILE
mongodump -u $DB_USER -p $DB_PASS --authenticationDatabase admin --gzip --archive=$BACKUP_DIR/mongodb_backup_$DATE.gz

if [ $? -eq 0 ]; then
    echo "$(date): Backup completed successfully" >> $LOG_FILE
    
    # Xóa backup cũ hơn 7 ngày
    find $BACKUP_DIR -name "mongodb_backup_*.gz" -mtime +7 -delete
    echo "$(date): Old backups cleaned up" >> $LOG_FILE
else
    echo "$(date): Backup failed" >> $LOG_FILE
fi

# Phân quyền và tạo cron job
sudo chmod +x /usr/local/bin/mongodb-backup.sh

# Tạo cron job (backup hàng ngày lúc 2:00 AM)
sudo crontab -e
0 2 * * * /usr/local/bin/mongodb-backup.sh

9. Troubleshooting

9.1 Các lỗi thường gặp

MongoDB không khởi động được

# Kiểm tra log
sudo tail -n 50 /var/log/mongodb/mongod.log

# Kiểm tra quyền thư mục
ls -la /var/lib/mongodb/
ls -la /var/log/mongodb/

# Sửa quyền nếu cần
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown -R mongodb:mongodb /var/log/mongodb

# Kiểm tra config file syntax
mongod --config /etc/mongod.conf --configtest

Lỗi Authentication

# Kiểm tra user credentials
mongosh
use admin
db.getUsers()

# Reset password nếu cần (tắt auth trước)
sudo nano /etc/mongod.conf
# Comment out: #authorization: enabled
sudo systemctl restart mongod

mongosh
use admin
db.changeUserPassword("admin", "NewPassword")
exit

# Enable auth lại
sudo nano /etc/mongod.conf
# Uncomment: authorization: enabled
sudo systemctl restart mongod

Lỗi kết nối từ xa

# Kiểm tra bindIp
grep bindIp /etc/mongod.conf

# Kiểm tra firewall
sudo ufw status
sudo iptables -L

# Kiểm tra port
sudo netstat -tlnp | grep 27017

# Test connectivity
telnet your-server-ip 27017

9.2 Performance Issues

# Kiểm tra slow queries
mongosh -u admin -p --authenticationDatabase admin
db.setProfilingLevel(2, { slowms: 100 })

# Xem profiling data
db.system.profile.find().limit(5).sort({ ts: -1 }).pretty()

# Kiểm tra current operations
db.currentOp()

# Kill long running operation
db.killOp(operation_id)

# Kiểm tra server status
db.serverStatus()

# Kiểm tra database stats
db.stats()

9.3 Disk Space Issues

# Kiểm tra disk usage
df -h
du -sh /var/lib/mongodb/

# Compact database (offline)
sudo systemctl stop mongod
mongod --dbpath /var/lib/mongodb --repair
sudo systemctl start mongod

# Hoặc compact online (cho specific collection)
mongosh -u admin -p --authenticationDatabase admin
use myapp
db.runCommand({ compact: "mycollection" })

10. Security Hardening

10.1 SSL/TLS Configuration

# Tạo self-signed certificate (cho testing)
sudo mkdir /etc/ssl/mongodb
sudo openssl req -newkey rsa:2048 -new -x509 -days 3650 -nodes -out /etc/ssl/mongodb/mongodb-cert.crt -keyout /etc/ssl/mongodb/mongodb-cert.key

# Combine cert và key
sudo cat /etc/ssl/mongodb/mongodb-cert.key /etc/ssl/mongodb/mongodb-cert.crt > /etc/ssl/mongodb/mongodb.pem

# Set permissions
sudo chmod 400 /etc/ssl/mongodb/mongodb.pem
sudo chown mongodb:mongodb /etc/ssl/mongodb/mongodb.pem

# Cấu hình trong mongod.conf
net:
  port: 27017
  bindIp: 0.0.0.0
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongodb/mongodb.pem

# Restart MongoDB
sudo systemctl restart mongod

# Test SSL connection
mongosh --ssl --host localhost:27017

10.2 Audit Logging

# Enable audit trong mongod.conf
auditLog:
  destination: file
  format: JSON
  path: /var/log/mongodb/audit.json

# Restart và test
sudo systemctl restart mongod
mongosh -u admin -p --authenticationDatabase admin

# Kiểm tra audit log
sudo tail -f /var/log/mongodb/audit.json

11. Monitoring và Maintenance

11.1 Log Rotation

# Cấu hình logrotate
sudo nano /etc/logrotate.d/mongodb

/var/log/mongodb/*.log {
    daily
    missingok
    rotate 52
    compress
    notifempty
    create 644 mongodb mongodb
    postrotate
        /bin/kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

11.2 Health Check Script

# Tạo health check script
sudo nano /usr/local/bin/mongodb-health.sh

#!/bin/bash
HEALTH_LOG="/var/log/mongodb-health.log"

# Check if MongoDB is running
if ! pgrep mongod > /dev/null; then
    echo "$(date): MongoDB is not running" >> $HEALTH_LOG
    sudo systemctl start mongod
fi

# Check if MongoDB is responding
if ! mongosh --quiet --eval "db.adminCommand('ismaster')" > /dev/null 2>&1; then
    echo "$(date): MongoDB is not responding" >> $HEALTH_LOG
    sudo systemctl restart mongod
fi

# Check disk space
DISK_USAGE=$(df /var/lib/mongodb | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 90 ]; then
    echo "$(date): Disk usage is high: ${DISK_USAGE}%" >> $HEALTH_LOG
fi

sudo chmod +x /usr/local/bin/mongodb-health.sh

# Thêm vào cron (check mỗi 5 phút)
*/5 * * * * /usr/local/bin/mongodb-health.sh

Kết luận

Việc cài đặt và cấu hình MongoDB trên Ubuntu Server đòi hỏi sự cẩn thận trong từng bước, đặc biệt là phần bảo mật. Hãy nhớ:

  1. Luôn enable authentication trước khi cho phép remote access
  2. Sử dụng strong passwords cho tất cả user accounts
  3. Cấu hình firewall properly để hạn chế access
  4. Thực hiện backup định kỳ và test restore process
  5. Monitor logs và system performance thường xuyên
  6. Cập nhật MongoDB để có latest security patches

Checklist cuối cùng:

  • [ ] MongoDB đã được cài đặt và chạy stable
  • [ ] Authentication đã được enable
  • [ ] Admin user đã được tạo với strong password
  • [ ] Application users đã được tạo với appropriate roles
  • [ ] Firewall đã được cấu hình
  • [ ] Backup strategy đã được thiết lập
  • [ ] Monitoring và alerting đã được cấu hình
  • [ ] SSL/TLS đã được enable (nếu cần)
  • [ ] Audit logging đã được enable (nếu cần)

Với hướng dẫn này, bạn đã có một MongoDB instance được cấu hình bảo mật và sẵn sàng cho production use.