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 🙂

  • 0 Stimmen
    3 Beiträge
    2k Aufrufe
    FrankMF

    Das mit den Namen der btrfs Subvolumes ist bekannt bei Timeshift. Im Readme steht dazu folgendes.

    BTRFS volumes

    BTRFS volumes must have an Ubuntu-type layout with @ and @home subvolumes. Other layouts are not supported. Systems having the @ subvolume and having /home on a non-BTRFS partition are also supported.

    Text file busy / btrfs returned an error: 256 / Failed to create snapshot can occur if you have a Linux swapfile mounted within the @ or @home subvolumes which prevents snapshot from succeeding. Relocate the swapfile out of @ or *@home, for example into it's own subvolume like @swap.

  • Star64 - Model A 8GB

    Hardware
    2
    0 Stimmen
    2 Beiträge
    109 Aufrufe
    FrankMF

    Der Stromanschluss ist derselbe wie beim Quartz64, somit kann ich alle meine Netzteile weiter benutzen.

  • ZFS - Wichtige Befehle

    Linux
    2
    0 Stimmen
    2 Beiträge
    395 Aufrufe
    FrankMF

    Unter dem Beitrag sammel ich mal ein paar Beispiele, für mich zum Nachlesen 🙂

    Den Anfang macht die

    ZFS-Replication

    Ich hatte Am Anfang ein wenig Verständnisprobleme, bis es klar war, das diese Replication von Pool zu Pool funktioniert. Also brauchen wir zwei vorhandene ZFS-Pools.

    root@pbs:/mnt/datastore/datapool/test# zfs list NAME USED AVAIL REFER MOUNTPOINT Backup_Home 222G 677G 222G /mnt/datastore/Backup_Home datapool 2.36G 1.75T 2.36G /mnt/datastore/datapool

    Wir erzeugen ein Dataset im datapool

    zfs create datapool/docs -o mountpoint=/docs

    Wir erzeugen eine Datei mit Inhalt

    echo "version 1" > /docs/data.txt

    Wir erzeugen einen Snapshot

    zfs snapshot datapool/docs@today

    Kontrolle

    root@pbs:/mnt/datastore/datapool/test# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@today 0B - 96K -

    Wir replizieren den vorhandenen Snapshot zum ZFS-Pool Backup_Home und speichern ihn da im Dataset test.

    zfs send datapool/docs@today | zfs receive Backup_Home/test

    Nun befinden sich die Daten in dem anderen ZFS-Pool

    root@pbs:/mnt/datastore/datapool/test# ls /mnt/datastore/Backup_Home/test/ data.txt

    Und was mich am meisten interessiert, ist wie man das zu einem anderen Server schickt 😉

    zfs send datapool/docs@today | ssh otherserver zfs receive backuppool/backup

    Den Test reiche ich dann später nach.

    Quelle: https://www.howtoforge.com/tutorial/how-to-use-snapshots-clones-and-replication-in-zfs-on-linux/

    ZFS inkrementelle Replication

    Als, nur die geänderten Daten senden!

    Wir erzeugen ein paar Dateien

    root@pbs:/mnt/datastore/datapool/test# echo "data" > /docs/data1.txt root@pbs:/mnt/datastore/datapool/test# echo "data" > /docs/data2.txt root@pbs:/mnt/datastore/datapool/test# echo "data" > /docs/data3.txt root@pbs:/mnt/datastore/datapool/test# echo "data" > /docs/data4.txt

    Neuer Snapshot

    zfs snapshot datapool/docs@17:02

    Liste der Snapshots

    root@pbs:/mnt/datastore/datapool/test# zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT datapool/docs@today 56K - 96K - datapool/docs@17:02 0B - 112K -

    Wir senden dieinkrementelle Replication

    zfs send -vi datapool/docs@today datapool/docs@17:02 | zfs receive Backup_Home/test send from datapool/docs@today to datapool/docs@17:02 estimated size is 38.6K total estimated size is 38.6K cannot receive incremental stream: destination Backup_Home/test has been modified since most recent snapshot

    Dazu schreibt die Anleitung, die ich unten verlinkt habe, das die Daten verändert wurden. Warum, verstehe ich aktuell noch nicht. Mit -F im send Befehl erzwingt man einen Rollback zum letzten Snapshot.

    zfs send -vi datapool/docs@today datapool/docs@17:02 | zfs receive -F Backup_Home/test send from datapool/docs@today to datapool/docs@17:02 estimated size is 38.6K total estimated size is 38.6K

    Und Kontrolle

    ls /mnt/datastore/Backup_Home/test/ data1.txt data2.txt data3.txt data4.txt data.txt

    Quelle: https://klarasystems.com/articles/introduction-to-zfs-replication/

  • Ubiquiti ER-X - iperf

    Verschoben OpenWRT & Ubiquiti ER-X
    2
    0 Stimmen
    2 Beiträge
    252 Aufrufe
    FrankMF

    Hier noch ein Test von DMZ / LAN und andersrum.

    frank@frank-MS-7C37:~$ iperf3 -c 192.168.5.15 Connecting to host 192.168.5.15, port 5201 [ 5] local 192.168.3.213 port 44052 connected to 192.168.5.15 port 5201 [ ID] Interval Transfer Bitrate Retr Cwnd [ 5] 0.00-1.00 sec 114 MBytes 952 Mbits/sec 314 153 KBytes [ 5] 1.00-2.00 sec 112 MBytes 937 Mbits/sec 259 205 KBytes [ 5] 2.00-3.00 sec 111 MBytes 929 Mbits/sec 210 212 KBytes [ 5] 3.00-4.00 sec 111 MBytes 934 Mbits/sec 235 202 KBytes [ 5] 4.00-5.00 sec 112 MBytes 936 Mbits/sec 263 153 KBytes [ 5] 5.00-6.00 sec 111 MBytes 935 Mbits/sec 255 209 KBytes [ 5] 6.00-7.00 sec 112 MBytes 937 Mbits/sec 313 129 KBytes [ 5] 7.00-8.00 sec 111 MBytes 932 Mbits/sec 296 209 KBytes [ 5] 8.00-9.00 sec 111 MBytes 934 Mbits/sec 258 208 KBytes [ 5] 9.00-10.00 sec 111 MBytes 934 Mbits/sec 292 201 KBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 1.09 GBytes 936 Mbits/sec 2695 sender [ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec receiver iperf Done. frank@frank-MS-7C37:~$ iperf3 -R -c 192.168.5.15 Connecting to host 192.168.5.15, port 5201 Reverse mode, remote host 192.168.5.15 is sending [ 5] local 192.168.3.213 port 44058 connected to 192.168.5.15 port 5201 [ ID] Interval Transfer Bitrate [ 5] 0.00-1.00 sec 109 MBytes 911 Mbits/sec [ 5] 1.00-2.00 sec 109 MBytes 912 Mbits/sec [ 5] 2.00-3.00 sec 109 MBytes 912 Mbits/sec [ 5] 3.00-4.00 sec 109 MBytes 912 Mbits/sec [ 5] 4.00-5.00 sec 109 MBytes 912 Mbits/sec [ 5] 5.00-6.00 sec 108 MBytes 903 Mbits/sec [ 5] 6.00-7.00 sec 109 MBytes 912 Mbits/sec [ 5] 7.00-8.00 sec 109 MBytes 912 Mbits/sec [ 5] 8.00-9.00 sec 109 MBytes 912 Mbits/sec [ 5] 9.00-10.00 sec 109 MBytes 912 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bitrate Retr [ 5] 0.00-10.00 sec 1.06 GBytes 913 Mbits/sec 114 sender [ 5] 0.00-10.00 sec 1.06 GBytes 911 Mbits/sec receiver iperf Done.
  • NanoPi R2S - OpenWRT

    Verschoben NanoPi R2S
    6
    0 Stimmen
    6 Beiträge
    527 Aufrufe
    FrankMF

    @thrakath1980 Ich wollte noch auf ein Thema zurück kommen. Das Original OpenWRT auf dem R2S ist ja ein Snapshot. Den kann man ohne Probleme aktualisieren. Unten ist dann ein Haken mit "Keep settings...."

    Gerade probiert, ging einwandfrei. Netzwerkeinstellungen und Firewall Settings blieben erhalten.

  • Kopia 0.6.x released

    Kopia
    3
    0 Stimmen
    3 Beiträge
    232 Aufrufe
    FrankMF

    0.6.3 released

    c142598 Disable blob deletion in 0.6 unless KOPIA_ENABLE_BLOB_DELETION is set to true (#552)

    Aufpassen, es gibt da wohl ein Problem, was zu Datenverlust führen könnte!

  • 0 Stimmen
    2 Beiträge
    1k Aufrufe
    FrankMF

    Nachdem ich jetzt ja wieder auf Linux Mint Cinnamon in Version 20.2 unterwegs bin, hatte ich wieder das Problem das der Drucker ohne Probleme druckt aber nicht scannt.

    Ich habe dann mal dieses Tool installiert

    apt install hplip-gui

    0918fea1-0edf-43c1-aa29-9d79efda177c-grafik.png

    Dann auf Scan geklickt, dann meckerte er über ein fehlendes Plugin. Ok, installiert, danach kamen Verbindungsfehler beim Scannen.

    Einmal den USB-Stecker entfernt, danach ging alles. Bitte nicht fragen warum, hplip hasse ich noch mehr als WLAN 😁

    Ok, nicht mehr anfassen....

    79d636b7-2b49-4152-b158-e65cebabf148-grafik.png

    In der Linux Mint Hilfe findet man dazu folgendes -> Klick

  • tmate - Instant terminal sharing

    Linux
    2
    0 Stimmen
    2 Beiträge
    524 Aufrufe
    FrankMF

    Heute mal wieder benutzt, um bei meinem Bruder auf der Kiste nach dem Rechten zu schauen. Absolut genial.

    Sollte man evt. nicht zu "geheime" Sachen drüber schicken (meine die Leitung), aber für ein wenig Service ist das Tool wirklich super zu gebrauchen. 👍