Skip to main content
LibreChat is joining ClickHouse to power the open-source Agentic Data Stack 🎉 Learn more
LibreChat

MongoDB-Authentifizierung

Einrichtung der Authentifizierung für Ihre Docker-MongoDB mit der Datei docker-compose.override.yml

Dieser Leitfaden zeigt, wie die Datei docker-compose.override.yml verwendet wird, um eine explizite Authentifizierung für MongoDB zu aktivieren.

Weitere Informationen zur Override-Datei finden Sie unter: Docker Compose Override

Hinweise:

  • Die Standardkonfiguration ist durch das Blockieren externer Portzugriffe sicher, aber wir können mit Zugangsberechtigungen noch einen Schritt weiter gehen.
  • Wie von den Entwicklern von MongoDB selbst angemerkt, ist die Authentifizierung in MongoDB ziemlich komplex. Wir werden einen einfachen Ansatz verfolgen, der für die meisten Fälle ausreicht, insbesondere für bestehende Konfigurationen von LibreChat. Um mehr darüber zu erfahren, wie die MongoDB-Authentifizierung mit Docker funktioniert, siehe hier: https://hub.docker.com/_/mongo/
  • Dieser Leitfaden konzentriert sich ausschließlich auf terminalbasierte Einrichtungsvorgänge.
  • Während die beschriebenen Schritte möglicherweise auch auf Docker Desktop-Umgebungen oder auf Nicht-Docker-, lokale MongoDB- oder andere Container-Setups anwendbar sind, werden Details, die spezifisch für diese Szenarien sind, nicht bereitgestellt.

Es gibt 3 grundlegende Schritte:

  • Erstellen Sie einen Admin-Benutzer innerhalb Ihres mongodb-Containers
  • Aktiviere die Authentifizierung und erstelle einen "readWrite"-Benutzer für "LibreChat"
  • Konfigurieren Sie die MONGO_URI mit dem neu erstellten Benutzer

TL;DR

Dies sind alle notwendigen Befehle, falls Sie diese schnell durchgehen möchten oder als Referenz:

Beispiel

Beispiel einer docker-compose.override.yml-Datei unter Verwendung der librechat.yaml-Konfigurationsdatei, MongoDB-Authentifizierung und mongo-express zur Verwaltung Ihrer MongoDB-Datenbank:

Erstellen eines Admin-Benutzers

Zuerst müssen wir die Standard-Container stoppen und nur den mongodb-Container ausführen.

docker compose down
docker compose up -d mongodb

Hinweis: Das -d Flag trennt die aktuelle Terminal-Instanz, während der Container im Hintergrund ausgeführt wird. Wenn Sie die mongodb-Protokollausgaben sehen möchten, lassen Sie es weg und fahren Sie in einem separaten Terminal fort.

Sobald es läuft, öffnen wir das Terminal des Containers und führen mongosh aus:

docker exec -it chat-mongodb mongosh

Sie sollten die folgende Ausgabe sehen:

~/LibreChat$ docker exec -it chat-mongodb mongosh
Current Mongosh Log ID: 65bfed36f7d7e3c2b01bcc3d
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.1.1
Using MongoDB:          7.0.4
Using Mongosh:          2.1.1
 
For mongosh info see: https://docs.mongodb.com/mongodb-shell/
 
test> 

Optional: Während wir hier sind, können wir bei Bedarf die Telemetrie für mongodb deaktivieren. Dabei handelt es sich um anonyme Nutzungsdaten, die regelmäßig gesammelt und an MongoDB gesendet werden:

Führen Sie den folgenden Befehl aus.

Hinweise:

  • Alle nachfolgenden Befehle sollten in der aktuellen Terminalsitzung ausgeführt werden, unabhängig von der Umgebung (Docker, Linux, mongosh usw.)
  • Ich werde die tatsächliche Terminalansicht mit # Beispiel-Eingabe/Ausgabe darstellen oder in einigen Fällen einfach die Ausgabe anzeigen

Befehl:

disableTelemetry()

Beispiel-Eingabe/-Ausgabe:

test> disableTelemetry()
Telemetry is now disabled.

Jetzt müssen wir auf die Admin-Datenbank zugreifen, die mongodb standardmäßig erstellt, um unseren Admin-Benutzer anzulegen:

use admin

zu db admin gewechselt

Ersetzen Sie die Anmeldedaten wie gewünscht und bewahren Sie diese für den Rest der Anleitung sicher auf.

Führen Sie den Befehl aus, um den Admin-Benutzer zu erstellen:

db.createUser({ user: "adminUser", pwd: "securePassword", roles: ["userAdminAnyDatabase", "readWriteAnyDatabase"] })

Sie sollten eine "ok"-Ausgabe sehen.

Sie können auch bestätigen, dass der Admin erstellt wurde, indem Sie show users ausführen:

admin> show users
[
  {
    _id: 'admin.adminUser',
    userId: UUID('86e90441-b5b7-4043-9662-305540dfa6cf'),
    user: 'adminUser',
    db: 'admin',
    roles: [
      { role: 'userAdminAnyDatabase', db: 'admin' },
      { role: 'readWriteAnyDatabase', db: 'admin' }
    ],
    mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
  }
]

:warning: Wichtig: Wenn Sie mongo-express verwenden, um Ihre Datenbank zu verwalten (Anleitung hier), benötigen Sie die zusätzlichen Berechtigungen, damit der mongo-express-Dienst korrekt ausgeführt werden kann:

db.grantRolesToUser("adminUser", ["clusterAdmin", "readAnyDatabase"])

Verlassen Sie das Mongosh/Container-Terminal durch Ausführen von exit:

admin> exit

Und den laufenden Container herunterfahren:

docker compose down

Aktivieren der Authentifizierung und Erstellen eines Benutzers mit readWrite-Zugriff

Wir müssen nun die Datei docker-compose.override.yml erstellen/bearbeiten, um die Authentifizierung für unseren mongodb-Container zu aktivieren. Sie können diese Konfiguration zum Starten oder als Referenz verwenden:

version: '3.4'
 
services:
  api:
    volumes:
      - ./librechat.yaml:/app/librechat.yaml # Optional for using the librechat config file.
  mongodb:
    command: mongod --auth # <--- Add this to enable authentication

Nachdem Sie die Override-Datei wie oben konfiguriert haben, führen Sie den mongodb-Container erneut aus:

docker compose up -d mongodb

Und greifen Sie als Admin-Benutzer auf mongosh zu:

docker exec -it chat-mongodb mongosh -u adminUser -p securePassword --authenticationDatabase admin

Bestätigen Sie, dass Sie authentifiziert sind:

db.runCommand({ connectionStatus: 1 })
test> db.runCommand({ connectionStatus: 1 })
{
  authInfo: {
    authenticatedUsers: [ { user: 'adminUser', db: 'admin' } ],
    authenticatedUserRoles: [
      { role: 'readWriteAnyDatabase', db: 'admin' },
      { role: 'userAdminAnyDatabase', db: 'admin' }
    ]
  },
  ok: 1
}
test>

Wechseln Sie zur "LibreChat"-Datenbank

Hinweis: Dies ist die Standarddatenbank, sofern Sie diese nicht über die MONGO_URI geändert haben; Standard-URI: MONGO_URI=mongodb://mongodb:27017/LibreChat

use LibreChat

Jetzt erstellen wir die tatsächlichen Anmeldedaten, die für unseren Mongo-Verbindungs-String verwendet werden sollen. Diese werden auf Lese-/Schreibzugriff für die "LibreChat"-Datenbank beschränkt sein. Ersetzen Sie wie zuvor das Beispiel durch Ihre gewünschten Anmeldedaten:

db.createUser({ user: 'user', pwd: 'userpasswd', roles: [ { role: "readWrite", db: "LibreChat" } ] });

Du solltest wieder eine "ok"-Ausgabe sehen.

Sie können die Benutzererstellung mit dem Befehl show users überprüfen.

Verlassen Sie das Mongosh/Container-Terminal erneut mit exit und fahren Sie den Container herunter:

exit
docker compose down

Ich hatte ein Problem, bei dem der neu erstellte Benutzer nach der Erstellung nicht dauerhaft gespeichert wurde. Um dies zu beheben, habe ich die Schritte einfach wiederholt, um sicherzustellen, dass er erstellt wurde. Hier sind sie der Einfachheit halber für Sie:

docker compose down
docker compose up -d mongodb
docker exec -it chat-mongodb mongosh -u adminUser -p securePassword --authenticationDatabase admin
use LibreChat
show users
db.createUser({ user: 'user', pwd: 'userpasswd', roles: [ { role: "readWrite", db: "LibreChat" } ] });

Falls es immer noch nicht dauerhaft gespeichert wird, kannst du versuchen, die Befehle auszuführen, während alle Container laufen. Beachte jedoch, dass sich der LibreChat-Container in einem Fehler- bzw. Wiederholungszustand befinden wird.

Aktualisieren Sie die MONGO_URI, um die neuen Anmeldedaten zu verwenden

Schließlich fügen wir den neuen Verbindungs-String mit unseren neu erstellten Anmeldedaten zu unserer docker-compose.override.yml Datei unter dem api Service hinzu:

    environment:
      - MONGO_URI=mongodb://user:userpasswd@mongodb:27017/LibreChat

Also sieht unsere Override-Datei jetzt so aus:

version: '3.4'
 
services:
  api:
    volumes:
      - ./librechat.yaml:/app/librechat.yaml
    environment:
      - MONGO_URI=mongodb://user:userpasswd@mongodb:27017/LibreChat
  mongodb:
    command: mongod --auth

Sie sollten nun docker compose up erfolgreich mit Lese-/Schreibzugriff auf die LibreChat-Datenbank ausführen können.

Beispiel für eine erfolgreiche Verbindung:

LibreChat         | 2024-02-04 20:59:43 info: Server listening on all interfaces at port 3080. Use http://localhost:3080 to access it
chat-mongodb      | {"t":{"$date":"2024-02-04T20:59:53.880+00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"192.168.160.4:58114","uuid":{"uuid":{"$uuid":"027bdc7b-a3f4-429a-80ee-36cd172058ec"}},"connectionId":17,"connectionCount":10}}

Wenn bei dir Authentifizierungsfehler auftreten, führe den letzten Teil von Schritt 2 erneut aus. Ich bin mir nicht sicher, warum es so empfindlich ist, aber nach ein paar Versuchen wird es funktionieren.

Wie finden Sie diese Anleitung?