Ich nutze jetzt schon sehr lange Redis, vor allen Dingen wegen meinen Foren. NodeBB unterstützt Redis und MongoDB. Ich hatte damals bei der Installation Redis ausgewählt und bin damit bis heute auch sehr zufrieden. Benutze Redis auch als Cache für meine Nextcloud Installation. Auch Redis Replication wird gerne benutzt usw. Also ein zufriedener Redis Nutzer
Redis ändert das Lizenz Modell
Jetzt hat sich da ja was verändert, der einen dazu bringt mal Dinge zu überdenken oder auch einfach mal Neues auszuprobieren. Da ich für meine kleinen Python Projekte auch Redis einsetze, habe ich mir mal gedacht, testen wir doch mal MongoDB. Ja, mir ist das Lizenzmodell bekannt!
Da man das auch gut mit NodeBB einsetzen kann, ist es ja auch mal an der Zeit sich das anzuschauen
Eines meiner kleinen Python Projekte ist Portfolio, ein Tool um Aktien und seine Kurse zu verwalten. Also nichts besonderes. Ich speichere damit meine Aktienbestände und kann die aktuellen Kurswerte von einer Webseite abholen. Das alles speichere ich dann in der Redis DB.
Zuerst wollte ich das modular aufbauen, also mit Redis & MongoDB. Das war aber mit meinen Kenntnissen eine Nummer zu groß, so dass ich schnell entschied das nicht so zu machen. Ich habe das Projekt dann kopiert und Redis komplett entfernt und alles auf MongoDB umgebaut.
Da ich ja erst vor kurzem den Redis Server von einem Docker Dienst zu einer VM migriert hatte (Artikel), bot es sich an, den MongoDB Dienst auch dort laufen zu lassen.
Ok, nun mal an was Praktisches.
Installation
apt install mongodb-org
Danach kurz die ufw konfiguriert
ufw allow mongod
ufw allow 27017
Mein erster Startversuch war kläglich gescheitert, weil irgendein CPU Protokoll nicht vorhanden war. Der Dienst läuft auf einem Proxmox. Erst nachdem ich den Type auf host eingestellt hatte lief es.
Konfiguration
MongoDB nutzt einen SystemD Dienst
root@redis-stack:~# systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-04-01 08:56:43 CEST; 1h 54min ago
Docs: https://docs.mongodb.org/manual
Main PID: 20919 (mongod)
Memory: 224.4M
CPU: 26.040s
CGroup: /system.slice/mongod.service
└─20919 /usr/bin/mongod --config /etc/mongod.conf
Hier sieht man, welche Konfigurations Datei geladen wird.
/etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
bindIp: 192.168.3.9
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
#security:
security.authorization: enabled
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
Die IP ist von der VM auf meinem Proxmox. Ich hatte erst ohne User & Passwort alles in Python auf die MongoDB umgestellt, dazu kommt ein separater Beitrag. Heute Morgen dann beim Kaffee, das Thema Security Ihr wisst ja, Foren sind heute nicht mehr so in, ChatGPT hilft einem doch dabei, oder?
Ich sollte das hier machen
- Login DB
- DB auswählen
- User anlegen
Login DB
Da ich ja die MongoDB nur auf die IP 192.168.3.9 lauschen lasse, kann ich mich auf dem Rechner lokal nicht anmelden. Also muss man das so machen.
mongosh --host 192.168.3.9
Danach sieht man ein CLI
root@redis-stack:~# mongosh --host 192.168.3.9
Current Mongosh Log ID: 660a5d31a731e65bddc00e7d
Connecting to: mongodb://<credentials>@192.168.3.9:27017/?directConnection=true&appName=mongosh+2.2.1
Using MongoDB: 7.0.7
Using Mongosh: 2.2.1
mongosh 2.2.2 is available for download: https://www.mongodb.com/try/download/shell
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
test>
Hier kann man jetzt die administrativen Befehle absetzen.
DB auswählen
Einfach
use admin
Innerhalb der MongoDB gibt es mehrere vorkonfigurierten Datenbanken. Eine davon heißt admin
Der Screenshot ist von dem Programm MongoDB Compass, ein UI um die Datenbank zu verwalten usw.
admin, config und local sind voreingestellte Datenbanken, die bei der Installation automatisch angelegt werden.
User anlegen
Nun gab mir ChatGPT folgendes um den User anzulegen.
db.createUser({
user: "<name>",
pwd: "<password>",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
Danach in der Konfiguration das hier ergänzt
#security:
security.authorization: enabled
Dann den Dienst neu starten
systemctl restart mongod
Irgendwie klappte da aber gar nichts, erstes Problem sind Sonderzeichen im Passwort. DIe kann man auf Python Seite encoden und zwar so.
from urllib.parse import quote_plus
encoded_password = quote_plus(MONGO_PASSWORD)
Danach hatte ich irgendwann Zugang zur MongoDB, aber meine Datenbank war leer. Hilfe, alle meine Daten weg. Das wäre eine kleine Katastrophe. Ruhe bewahren
Nachdenken. Ok loggen wir uns mit dem User & Passwort mal ein.
root@redis-stack:~# mongosh -u <user> -p <password> --host 192.168.3.9
Es kam folgendes
Current Mongosh Log ID: 660a5dab42ca150895c00e7d
Connecting to: mongodb://<credentials>@192.168.3.9:27017/?directConnection=true&authSource=admin&appName=mongosh+2.2.1
Using MongoDB: 7.0.7
Using Mongosh: 2.2.1
mongosh 2.2.2 is available for download: https://www.mongodb.com/try/download/shell
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
test> use meineDatenbank
switched to db meineDatenbank
meineDatenbank> show collections
MongoServerError[Unauthorized]: not authorized on meineDatenbank to execute command { listCollections: 1, filter: {}, cursor: {}, nameOnly: true, authorizedCollections: false, lsid: { id: UUID("e5a6716a-207c-4478-80de-xxxxxxxxxxxx") }, $db: "meineDatenbank" }
Ich hatte also die DB ausgewählt
use meineDatenbank #dämlicher Name
und dann wollte ich mir Collections anzeigen lassen, weil vorher in meinem Python Projekt alles leer war.
show collections
Und dann kam der Fehler MongoServerError[Unauthorized] Ok, da stimmte was nicht mit den Zugriffsrechten nicht. ChatGPT meinte dann ganz trocken, ja wenn Du das möchtest musst Du auch die Rolle angeben. Jo, Fu.....
Also die Rechte angepasst.
admin> db.updateUser("frank", {
... roles: [
... { role: "userAdminAnyDatabase", db: "admin" },
... { role: "readWrite", db: "meineDatenbank" }
... ]
... })
{ ok: 1 }
Jetzt konnte ich auch die Datenbank lesen & schreiben
Und hier noch der Befehl um ein Passwort zu ändern.
db.updateUser("<USER>", {
pwd: "<PASSWORD>"
})
Backup & Restore (ki-generiert)
Aktuell noch ungetestet, da ich aber finde das gehört hier irgendwie mit dazu habe ich das hier schon mal abgelegt.
To backup all databases
mongodump --uri="mongodb://username:password@localhost:27017" --out=/path/to/backup
To backup a specific database
mongodump --uri="mongodb://username:password@localhost:27017/databaseName" --out=/path/to/backup
To restore all databases from a backup directory:
mongorestore --uri="mongodb://username:password@localhost:27017" /path/to/backup
To restore a specific database:
mongorestore --uri="mongodb://username:password@localhost:27017" --nsInclude=databaseName.* /path/to/backup/databaseName
Und wieder was gelernt...