Skip to content

MongoDB - Erste Erfahrungen

Linux
  • 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.

    a418cb7b-9589-482d-8d5f-0eac176eaca8-image.png

    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

    8377bde4-699c-421b-9992-9c2785934e5d-image.png

    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...

  • So frisch von der MongoDB Front und wieder viel gelernt, weil beim Üben macht man Fehler 🙂

    Oben war ja mongodump & mongorestore von der KI empfohlen. Hier das wie ich es gemacht habe.

    mongodump

    frank@redis-stack:~$ mongodump -u frank -p '<password>' --host 192.168.3.9 --authenticationDatabase admin -d portfolio -o mongodump/
    2024-04-06T09:29:25.174+0200    writing portfolio.stockList to mongodump/portfolio/stockList.bson
    2024-04-06T09:29:25.175+0200    writing portfolio.users to mongodump/portfolio/users.bson
    2024-04-06T09:29:25.175+0200    done dumping portfolio.stockList (8 documents)
    2024-04-06T09:29:25.176+0200    writing portfolio.total_sum to mongodump/portfolio/total_sum.bson
    2024-04-06T09:29:25.177+0200    done dumping portfolio.total_sum (1 document)
    2024-04-06T09:29:25.177+0200    writing portfolio.old_total_sum to mongodump/portfolio/old_total_sum.bson
    2024-04-06T09:29:25.177+0200    writing portfolio.stocks to mongodump/portfolio/stocks.bson
    2024-04-06T09:29:25.177+0200    done dumping portfolio.users (4 documents)
    2024-04-06T09:29:25.178+0200    writing portfolio.settings to mongodump/portfolio/settings.bson
    2024-04-06T09:29:25.178+0200    done dumping portfolio.settings (1 document)
    2024-04-06T09:29:25.179+0200    done dumping portfolio.old_total_sum (1 document)
    2024-04-06T09:29:25.179+0200    done dumping portfolio.stocks (34 documents)
    

    mongorestore

    mongorestore -u frank -p '<password>' --host 192.168.3.9 --authenticationDatabase admin -d portfolio mongodump/meineDatenbank/
    

    Hier wird die Datensicherung mongodump/meineDatenbank/ in die neue Datenbank portfolio transferiert.

    Grund für das Ganze? Mich hatte der Datenbank Name meineDatenbank gestört.

    Benutzerrechte

    Jetzt der Teil wo man schnell was falsch machen kann 🙂 Ich hatte also die neue Datenbank, konnte sie aber nicht lesen. Fehlten halt die Rechte. Ich hatte dann so was hier gemacht.

    db.updateUser("frank", { roles: [ { role: "readWrite", db: "meineDatenbank" }, { role: "readWrite", db: "portfolio" }]})
    

    Ging auch prima, kam ein ok zurück. Nun das Problem, ich hatte beim Einrichten, den User frank als admin benutzt. Durch den oben abgesetzten Befehl (frank ist ja admin), wurden die neuen Rechte gesetzt und die Rechte als Admin entzogen!! Das war jetzt nicht wirklich das was ich gebrauchen konnte. LOL

    Ich hatte jetzt keine Kontrolle mehr über die DB. Das war aber nicht so wirklich kompliziert, das wieder zu ändern. Die Authentication temporär abstellen. Also /etc/mongod.conf editieren und

    #security:
    security.authorization: enabled
    

    eben mal auskommentieren. Den Daemon neustarten und anmelden an der DB.

    mongosh --host 192.168.3.9
    

    Danach neuen User anlegen

    db.createUser({
      user: "<name>",
      pwd: "<password>",
      roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    })
    

    mongod.conf wieder ändern und neustarten. Danach hat man wieder eine DB mit Authentifizierung und einen neuen Admin. Ich bin diesmal, man lernt ja, anders vorgegangen. Es gibt nun einen Admin für die DB und einen User zum Benutzen der Datenbanken! So wie man es auch auf einem produktiven System auch machen würde. Wenn ich jetzt mal was an den Benutzerrechten des Users ändere, kann mir das mit dem Admin nicht mehr passieren. Hoffe ich 🙂

  • FrankMF FrankM hat am auf dieses Thema verwiesen

  • NodeBB - ActivityPub

    NodeBB
    1
    0 Stimmen
    1 Beiträge
    53 Aufrufe
    Niemand hat geantwortet
  • Debian 13 - Trixie

    Linux
    1
    0 Stimmen
    1 Beiträge
    158 Aufrufe
    Niemand hat geantwortet
  • NAS 2023 - Software Teil 1

    Angeheftet Verschoben Linux
    1
    +3
    0 Stimmen
    1 Beiträge
    229 Aufrufe
    Niemand hat geantwortet
  • Armbian Images

    Armbian
    1
    +2
    0 Stimmen
    1 Beiträge
    310 Aufrufe
    Niemand hat geantwortet
  • Kopia - HTTP/S Server aufsetzen

    Angeheftet Kopia
    1
    0 Stimmen
    1 Beiträge
    448 Aufrufe
    Niemand hat geantwortet
  • Kopia - Policies

    Kopia
    1
    +3
    0 Stimmen
    1 Beiträge
    303 Aufrufe
    Niemand hat geantwortet
  • Restic - forget --keep-last 3 --prune

    Restic
    2
    0 Stimmen
    2 Beiträge
    621 Aufrufe
    FrankMF
    Ich habe mich damit noch ein wenig beschäftigt, die letzten drei zu behalten, ist nicht so optimal. Da es viele Optionen bei dem Befehl gibt, hier ein Ausschnitt Flags: -l, --keep-last n keep the last n snapshots -H, --keep-hourly n keep the last n hourly snapshots -d, --keep-daily n keep the last n daily snapshots -w, --keep-weekly n keep the last n weekly snapshots -m, --keep-monthly n keep the last n monthly snapshots -y, --keep-yearly n keep the last n yearly snapshots habe ich das ein wenig so angepasst, das ich denke es passt für mich. restic --password-file /root/passwd -r /media/NAS_neu/Restic/Home/ forget --keep-last 3 --keep-monthly 3 --prune Damit behalte ich auch die jeweils eines pro Monat. Und die letzten drei. Das sieht dann so aus. root@debian:~# ./backup2.sh repository 2f3f6147 opened successfully, password is correct Files: 38 new, 100 changed, 13268 unmodified Dirs: 0 new, 1 changed, 0 unmodified Added to the repo: 10.166 GiB processed 13406 files, 50.324 GiB in 3:24 snapshot 849f614c saved repository 2f3f6147 opened successfully, password is correct Applying Policy: keep the last 3 snapshots, 3 monthly snapshots snapshots for (host [debian], paths [/home/frank]): keep 5 snapshots: ID Time Host Tags Reasons Paths ------------------------------------------------------------------------------------ a7251cfd 2019-11-28 17:00:01 debian monthly snapshot /home/frank 283d4027 2019-12-31 17:00:01 debian monthly snapshot /home/frank ae2b96ec 2020-01-01 21:47:46 debian last snapshot /home/frank 079e00a6 2020-01-02 17:00:01 debian last snapshot /home/frank 849f614c 2020-01-03 21:08:45 debian last snapshot /home/frank monthly snapshot ------------------------------------------------------------------------------------ 5 snapshots remove 26 snapshots: ID Time Host Tags Paths ------------------------------------------------------------------ 896f16c2 2019-11-07 22:23:40 debian /home/frank b21bcf6d 2019-11-11 17:00:01 debian /home/frank f89248fb 2019-11-12 17:00:01 debian /home/frank 123ab546 2019-11-13 17:00:01 debian /home/frank b82d87d0 2019-11-18 17:00:01 debian /home/frank 040b0ab7 2019-11-19 17:00:01 debian /home/frank 7221d8ef 2019-11-20 17:00:01 debian /home/frank 84132a25 2019-11-21 17:00:01 debian /home/frank b558a52c 2019-11-25 17:00:01 debian /home/frank e5cc0c3e 2019-12-02 17:00:01 debian /home/frank 22423fa5 2019-12-03 17:00:01 debian /home/frank 39df1ab9 2019-12-04 17:00:01 debian /home/frank 98843457 2019-12-05 17:00:01 debian /home/frank b0cdd4b6 2019-12-09 17:00:01 debian /home/frank 828414f9 2019-12-10 17:00:01 debian /home/frank e34a27c3 2019-12-11 17:00:01 debian /home/frank 6e488c3b 2019-12-12 17:00:01 debian /home/frank 17898403 2019-12-16 17:00:01 debian /home/frank 1973305a 2019-12-17 17:00:01 debian /home/frank 9553bedd 2019-12-18 17:00:01 debian /home/frank fedf749d 2019-12-19 17:00:01 debian /home/frank 8e7cb876 2019-12-23 17:00:01 debian /home/frank 0bd0d102 2019-12-25 17:00:01 debian /home/frank 13d348b0 2019-12-26 17:00:01 debian /home/frank c7d960aa 2019-12-30 17:00:01 debian /home/frank f6ea9118 2020-01-01 17:00:01 debian /home/frank ------------------------------------------------------------------ 26 snapshots 26 snapshots have been removed, running prune counting files in repo building new index for repo [0:35] 100.00% 7806 / 7806 packs repository contains 7806 packs (46537 blobs) with 41.110 GiB processed 46537 blobs: 0 duplicate blobs, 0 B duplicate load all snapshots find data that is still in use for 5 snapshots [0:01] 100.00% 5 / 5 snapshots found 32654 of 46537 data blobs still in use, removing 13883 blobs will remove 0 invalid files will delete 715 packs and rewrite 752 packs, this frees 5.027 GiB [2:28] 100.00% 752 / 752 packs rewritten counting files in repo [0:01] 100.00% 6571 / 6571 packs finding old index files saved new indexes as [d137b425 f7caee99 a6e9711a] remove 35 old index files [1:13] 100.00% 1467 / 1467 packs deleted done using temporary cache in /tmp/restic-check-cache-916655151 repository 2f3f6147 opened successfully, password is correct created new cache in /tmp/restic-check-cache-916655151 create exclusive lock for repository load indexes check all packs check snapshots, trees and blobs read all data [7:47] 100.00% 6571 / 6571 items duration: 7:47 no errors were found root@debian:~# Am Ende seht ihr noch, wie Restic alle Files testet. Mein Script sieht jetzt so aus. #!/bin/bash # Script um mit Restic Daten automatisiert zu sichern! # Dient zum Sichern der Homepartition auf dem ROCKPro64 NAS! # Was soll gesichert werden? backup_pfad=/home/frank # Programm Start restic --password-file /root/passwd -r /media/NAS_neu/Restic/Home/ backup $backup_pfad --exclude-file=excludes.txt restic --password-file /root/passwd -r /media/NAS_neu/Restic/Home/ forget --keep-last 3 --keep-monthly 3 --prune # Testen restic --password-file /root/passwd -r /media/NAS_neu/Restic/Home/ check --read-data Das dann schön mit einem Cronjob laufen lassen und die Datensicherung ist erledigt
  • Kernel-Log 4.20

    Linux
    1
    0 Stimmen
    1 Beiträge
    323 Aufrufe
    Niemand hat geantwortet