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

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ớ:
- Luôn enable authentication trước khi cho phép remote access
- Sử dụng strong passwords cho tất cả user accounts
- Cấu hình firewall properly để hạn chế access
- Thực hiện backup định kỳ và test restore process
- Monitor logs và system performance thường xuyên
- 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.