Skip to main content

MongoDB

mongo
Zuerst User mit Admin-Rechten anlegen und für „Admin“ DB berechtigen, xxxx muss ausgefüllt werden

db.createUser(
    {
      user: "superadmin",
      pwd: "adminpasswort",
      roles: [ { role: "root", db: "admin" } ]
    }
)
Eigene Datenbank und neuen Benutzer anlegen (vorher authentifizieren mit admin-Benutze)

bash: # mongo
rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.auth("superadmin","adminpasswort")
z.B.

db.createUser({ user: "lernintranet", pwd: "hnfd76fdde", roles: [ { role: "readWrite", db: "lernintranetdb-test" }]})
Danach speichern

db.users.save( {username:"lernintranet"} )
Datenbank anzeigen

show dbs
In der mongodb.config muss folgendes hinzugefügt werden:

security:
  authorization: enabled
Verbindung testen

mongosh --username lernintranet --password --authenticationDatabase lernintranetdb-int --host 127.0.0.1 --port 27017
  
MongoDB shell version v3.6.17
Enter password: 
connecting to: mongodb://127.0.0.1:27017/?authSource=lernintranetdb-int&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("d4aa8989-0c2f-4330-a786-df061513") }
MongoDB server version: 3.6.17
Dump

mongodump --db intranet --username superadmin --password "PASSWORTKEEPASS" --authenticationDatabase admin --gzip --out /tmp/`date +"%Y-%m-%d"


Dump in Docker

docker exec -i mongodb /usr/bin/mongorestore --username superadmin --password  "geheim" --gzip --authenticationDatabase admin  /data/dumps/mongodump-20220405


Hochverfügbarkeit mittels Replicaset realisieren


Quelle: https://docs.mongodb.com/manual/tutorial/deploy-replica-set/

Zuerst eine ganz normale einzelne MongoDB Instanz installieren/starten

Dann Keyfile erzeugen, damit die Replicaset Nodes sich untereinander authentifizieren können Verzeichnisse und Keyfile erstellen

$ mkdir -p /pfad/zur/mongodb/keyfile

$ cd $MONGODB_HOME/keyfile
$ openssl rand -base64 741 > mongodb-keyfile
$ chmod 600 mongodb-keyfile

MongoDB Instanz mit Keyfile ausrüsten

security:
 authorization: enabled
 keyFile: /pfad/zur/mongodb/keyfile/mongodb-keyfile


In der mongodb.config nun das Replicaset aktivieren

replication:
   replSetName: rs0
Replicaset initialisieren

rs.initiate({_id:"rs0",members:[{_id:0,host:"intranetdbt01.foo.network:27017"}]})
Replicaset Status abfragen

rs.status()
!! Zweite und dritte MongoDB Node starten (inkl. security authorization und keyfile Einstellung) !!

Zweite und dritte Node in Replicaset aufnehmen von der ersten Node (PRIMARY) aus

rs.add("intranetdbt01.foo.network:27018")
rs.add("intranetdbt01.foo.network:27019")

Verbindung testen

$ mongo --host rs0/intranetdbt01.foo.network:27017,intranetdbt01.foo.network:27018,intranetdbt01.foo.network:27019

Berechtigungen setzen

Wenn ein Benutzer auf mehrere Datenbankschemas Zugriff bekommen soll

per mongosh (mongo-shell) anmelden

use admin;
db.auth('superadmin','geheim');

db.grantRolesToUser( "mein-user", [ { role: "readWrite", db: "bla_service" },{ role: "readWrite", db: "blabla_server" },{ role: "readWrite", db: "email_service" } ]);

Wenn mehrere Benutzer unterscheidliche Berechtigg. auf Datenbankschemen bekommen soll

per mongosh (mongo-shell) anmelden

db.grantRolesToUser( "BENUTZERNAME", [ { role: "BERECHTIGUNG", db: "DATENBANKNAME" }]);

use admin;
db.auth('superadmin','geheim');
 
db.grantRolesToUser( "bla_service", [ { role: "readWrite", db: "bla_service" }]);
db.grantRolesToUser( "blabla_service", [ { role: "readWrite", db: "blabla_service" }]);
db.grantRolesToUser( "email_service", [ { role: "readWrite", db: "email_service" }]);

 

Dump aller Datenbanken

mongodump --username superadmin --password "PASSWORTKEEPASS" --authenticationDatabase admin --gzip --archive=/Pfad/zum/Ausgabeordner/backup.gz

Backup-Skript für Docker

#!/bin/bash

USER="superadmin"
PASSWORD="geheim"
OUTPUT="/srv/z_backups/mongodb"
DATABASE="cloud-prod-mongodb"
CONTAINER="mongodb"
DATE=$(date +%Y-%m-%d)
MAILTO="[email protected]"

# CREATE BACKUP DIR
if [ ! -d "$OUTPUT" ]; then
   mkdir -p "$OUTPUT"
fi

rm -rf "$OUTPUT/$DATABASE*"

docker exec "$CONTAINER" mongodump --username "$USER" --password "$PASSWORD" --authenticationDatabase admin --gzip --archive="/data/dumps/$DATABASE.gz"

if [ "$?" -eq "0" ]; then
   echo "DB Backup erfolgreich"
else
   echo "DB Backup $DATABASE - $DATE fehlgeschlagen" | \
   mail -s "$hostname - DB Backup $DATABASE fehlgeschlagen" -- "$MAILTO"
fi

 

Wiederherstellung

Im folgenden Befehl wieder die komplette DB vorher gelöscht (drop) und das Archiv wieder eingespielt.

Im docker-compose.yml sollte der Pfad "Input" auf einen Pfad der sich auf dem Host befindet verknüpft sein. Ansonsten kann mongorestore nicht auf die Dump-Datei zugreifen

docker exec -i "$CONTAINER" mongorestore --username "$USER" --password "$PASSWORD" --authenticationDatabase admin --gzip --archive="$DATABASE.gz" --drop
#!/bin/bash

USER="superadmin"
PASSWORD="geheim"
INPUT="/data/dumps/"
DATABASE="cloud-prod-mongodb"
CONTAINER="mongodb"
docker exec -i "$CONTAINER" mongorestore --username "$USER" --password "$PASSWORD" --authenticationDatabase admin --gzip --archive="$INPUT/$DATABASE.gz" --drop