Visi raksti
MongoDB Community setup guide — server configuration and security
  • MongoDB
  • Ubuntu
  • Database
  • Security
  • Next.js

MongoDB 8.0 uzstādīšanas rokasgrāmata

Visaptveroša rokasgrāmata MongoDB 8.0 instalēšanai, konfigurēšanai un drošināšanai Ubuntu 24.04 – ar autentifikāciju, tīkla saistīšanu, TLS/SSL, automatizētiem dublējumiem un Next.js integrāciju.

3 min lasīšana

Šī rokasgrāmata vada cauri MongoDB 8.0 instalēšanai Ubuntu 24.04.2, tās drošināšanai ar autentifikāciju un TLS/SSL, automatizētu dublējumu iestatīšanai un savienošanai ar Next.js lietotni.

Instalēšana

1. MongoDB GPG atslēgas importēšana

Importē parakstīšanas atslēgu pakotnes integritātes pārbaudei:

sudo apt-get install gnupg curl
curl -fsSL https://pgp.mongodb.com/server-8.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
   --dearmor

2. MongoDB repozitorija pievienošana

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | \
   sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list

3. MongoDB instalēšana

Atjaunini pakotņu datubāzi un instalē:

sudo apt-get update
sudo apt-get install -y mongodb-org

Tiek instalēts MongoDB serveris, mongosh un standarta rīki.

4. Pakalpojuma startēšana un aktivizēšana

sudo systemctl start mongod
sudo systemctl enable mongod

Pārbaudi, vai pakalpojums darbojas:

sudo systemctl status mongod

Izvadē vajadzētu redzēt statusu active (running).

5. Noklusējuma konfigurācijas pārskatīšana

MongoDB konfigurācija atrodas /etc/mongod.conf:

sudo nano /etc/mongod.conf

Svarīgākie noklusējuma iestatījumi:

# Tīkla iestatījumi
net:
  port: 27017         # Noklusējuma ports
  bindIp: 127.0.0.1  # Noklusējumā pieļauj tikai lokālos savienojumus

# Krātuve
storage:
  dbPath: /var/lib/mongodb

# Procesa pārvaldība
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

Pēc katras konfigurācijas izmaiņas restartē MongoDB:

sudo systemctl restart mongod

Drošība

1. Administratora lietotāja izveide

Pieslēdzies MongoDB apvalkam:

mongosh

Izveido saknes administratora lietotāju:

use admin
db.createUser(
  {
    user: "adminUser",
    pwd: "secure_password_here",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
exit

2. Autentifikācijas iespējošana

Rediģē /etc/mongod.conf un pievieno drošības sadaļu:

security:
  authorization: enabled

Restartē MongoDB:

sudo systemctl restart mongod

3. Tīkla saistīšanas konfigurēšana

Noklusējumā MongoDB klausās tikai uz lokālā resursdatora. Ja lietotne atrodas uz tā paša servera, atstāj šo iestatījumu nemainītu. Lai atļautu savienojumus no konkrētiem attālinātiem resursdatoriem:

net:
  port: 27017
  bindIp: 127.0.0.1              # Tikai lokālais (noklusējums)
  # bindIp: 127.0.0.1,192.168.1.100  # Atļaut konkrētu IP
  # bindIp: 0.0.0.0              # Atļaut visus IP (nav ieteicams)

Drošības brīdinājums: Attāliem savienojumiem vienmēr jābūt apvienotiem ar ugunsmūra noteikumiem, TLS/SSL un spēcīgu autentifikāciju.

4. TLS/SSL iestatīšana

Ģenerē pašparakstītu sertifikātu (testēšanai; ražošanā izmanto CA parakstītu sertifikātu):

# Izveido sertifikātu mapi
sudo mkdir -p /etc/ssl/mongodb
cd /etc/ssl/mongodb

# Ģenerē pašparakstītu sertifikātu
sudo openssl req -newkey rsa:4096 -x509 -sha256 -days 365 -nodes \
  -out mongodb-cert.pem \
  -keyout mongodb-key.pem

# Iestata atbilstošas atļaujas
sudo chmod 600 mongodb-key.pem mongodb-cert.pem
sudo chown mongodb:mongodb mongodb-key.pem mongodb-cert.pem

Atjaunini /etc/mongod.conf, lai pieprasītu SSL:

net:
  port: 27017
  bindIp: 127.0.0.1
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongodb/mongodb-cert.pem
    PEMKeyPassword: "tava_parole_ja_ir"

5. Automatizētu dublējumu iestatīšana

Izveido dublējumu mapi un skriptu:

sudo mkdir -p /var/backups/mongodb
sudo nano /usr/local/bin/mongodb-backup.sh

Dublējuma skripta saturs:

#!/bin/bash
BACKUP_DIR="/var/backups/mongodb/$(date +%Y-%m-%d_%H-%M-%S)"
LOG_FILE="/var/log/mongodb/backup_$(date +%Y-%m-%d).log"

mkdir -p $BACKUP_DIR

echo "Dublējums sākts $(date)" >> $LOG_FILE

mongodump --port 27017 \
  --authenticationDatabase "admin" \
  --username "adminUser" \
  --password "secure_password_here" \
  --out $BACKUP_DIR \
  --gzip

echo "Dublējums pabeigts $(date)" >> $LOG_FILE

# Noņem dublējumus vecākus par 14 dienām
find /var/backups/mongodb -type d -mtime +14 -exec rm -rf {} \; 2>/dev/null || true

Padari skriptu izpildāmu un ieplāno to ar cron:

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

# Rediģē crontab – pievieno ikdienas palaišanu plkst. 2:00
sudo crontab -e
# Pievieno: 0 2 * * * /usr/local/bin/mongodb-backup.sh

Atjaunot no dublējuma:

# Apskata pieejamos dublējumus
ls -la /var/backups/mongodb/

# Atjauno no konkrēta dublējuma
mongorestore --port 27017 \
  --authenticationDatabase "admin" \
  --username "adminUser" \
  --password "secure_password_here" \
  --gzip \
  /var/backups/mongodb/2025-03-25_02-00-00/

Drošības labākā prakse

  • Izmanto spēcīgas, unikālas paroles visiem MongoDB lietotājiem.
  • Ievēro minimālo privilēģiju principu – piešķir lietotājiem tikai tās atļaujas, kuras tiem patiešām nepieciešamas.
  • Regulāri atjaunini MongoDB, lai piemērotu drošības ielāpus.
  • Ievies IP baltās sarakstu, lai ierobežotu piekļuvi uzticamiem avotiem.
  • Izmanto TLS/SSL visiem savienojumiem ražošanas vidēs.
  • Regulāri pārbaudi dublējumu atjaunošanas procesu, ne tikai dublējumu izveidi.
  • Uzrauga žurnālus aizdomīgas darbības gadījumā un iestata automatizētus brīdinājumus.

MongoDB integrācija ar Next.js

Savienojuma utilīta

Izveido savienojuma vienīgpeldēķni lib/mongodb.ts, lai izvairītos no jauna savienojuma atvēršanas ar katru pieprasījumu:

// lib/mongodb.ts
import { MongoClient } from 'mongodb'

if (!process.env.MONGODB_URI) {
  throw new Error('Please add your MongoDB URI to .env.local')
}

const uri = process.env.MONGODB_URI
const options = {}

let client: MongoClient
let clientPromise: Promise<MongoClient>

if (process.env.NODE_ENV === 'development') {
  // Izstrādē saglabā savienojumu pāri HMR pārlādēm
  const globalWithMongo = global as typeof globalThis & {
    _mongoClientPromise?: Promise<MongoClient>
  }
  if (!globalWithMongo._mongoClientPromise) {
    client = new MongoClient(uri, options)
    globalWithMongo._mongoClientPromise = client.connect()
  }
  clientPromise = globalWithMongo._mongoClientPromise
} else {
  client = new MongoClient(uri, options)
  clientPromise = client.connect()
}

export default clientPromise

Vides mainīgie

Pievieno savienojuma virkni .env.local:

MONGODB_URI=mongodb://adminUser:secure_password@127.0.0.1:27017/mydb?authSource=admin

Savienojuma izmantošana API maršrutos

// app/api/users/route.ts
import { NextResponse } from 'next/server'
import clientPromise from '@/lib/mongodb'

export async function GET() {
  try {
    const client = await clientPromise
    const db = client.db("mydb")

    const users = await db.collection("users").find({}).limit(10).toArray()

    return NextResponse.json({ users })
  } catch (e) {
    console.error(e)
    return NextResponse.json({ error: 'Failed to fetch users' }, { status: 500 })
  }
}

Bieži uzdotie jautājumi

Vai MongoDB un Next.js var darboties uz viena servera?

Jā, mazām un vidējām lietotnēm tas ir pieņemami. Lielākām slodzēm apsver to atdalīšanu – dedikēti datubāzes serveri nodrošina labāku mērogojamību, neatkarīgu resursu regulēšanu un skaidrākas drošības robežas.

Kā uzraudzīt MongoDB veiktspēju?

Izmanto iebūvētos rīkus (db.stats(), db.serverStatus()), vai trešo pušu risinājumus, piemēram, Prometheus ar MongoDB eksportētāju, MongoDB Atlas uzraudzību vai komerciālus rīkus kā Datadog.

Vai vajadzētu izmantot MongoDB Atlas, nevis pašhostu?

Atlas piedāvā automātiskus dublējumus, mērogošanu un pārvaldītus drošības atjauninājumus par mazāku kontroli un pastāvīgiem abonēšanas maksājumiem. Pašhostings dod pilnu kontroli, taču prasa lielāku operacionālo darbu. Lielākajai daļai ražošanas lietotņu Atlas ir pragmatiska izvēle, ja vien izmaksas vai datu atrašanās vietas prasības neliek dot priekšroku pašhostingam.

Kā dublēt un atjaunot datubāzi?

Izmanto mongodump dublējumu izveidei un mongorestore atjaunošanai, kā parādīts dublējumu sadaļā. Vienmēr pārbaudi, ka atjaunošanas process darbojas, pirms tev tas patiešām nepieciešams.