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 downdocker compose up -d mongodbHinweis: Das
-dFlag 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, rufen wir das Terminal des Containers auf und führen mongosh aus:
docker exec -it chat-mongodb mongoshSie 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, bei der es sich um anonyme Nutzungsdaten handelt, 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,
mongoshusw.)- 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 adminzu 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 zur Verwaltung Ihrer Datenbank verwenden, 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> exitUnd beenden Sie den laufenden Container:
docker compose downAktivieren 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 authenticationNachdem Sie die Override-Datei wie oben konfiguriert haben, führen Sie den mongodb-Container erneut aus:
docker compose up -d mongodbUnd greifen Sie als Admin-Benutzer auf mongosh zu:
docker exec -it chat-mongodb mongosh -u adminUser -p securePassword --authenticationDatabase adminBestä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 LibreChatJetzt 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:
exitdocker compose downIch hatte ein Problem, bei dem der neu erstellte Benutzer nach der Erstellung nicht 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 dich:
docker compose downdocker compose up -d mongodbdocker exec -it chat-mongodb mongosh -u adminUser -p securePassword --authenticationDatabase adminuse LibreChatshow usersdb.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/LibreChatAlso 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 --authSie 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}}Falls bei dir Authentifizierungsfehler auftreten, führe den letzten Teil von Schritt 2 erneut aus. Ich bin mir nicht sicher, warum es manchmal hakt, aber nach ein paar Versuchen wird es funktionieren.
Wie finden Sie diese Anleitung?