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

Authentification MongoDB

Configurer l'authentification sur votre mongodb Docker avec le fichier docker-compose.override.yml

Ce guide démontrera comment utiliser le fichier docker-compose.override.yml pour nous permettre d'activer une authentification explicite pour MongoDB.

Pour plus d'informations sur le fichier de remplacement, veuillez consulter : Docker Compose Override

Notes :

  • La configuration par défaut est sécurisée en bloquant l'accès aux ports externes, mais nous pouvons aller encore plus loin avec des identifiants d'accès.
  • Comme noté par les développeurs de MongoDB eux-mêmes, l'authentification dans MongoDB est assez complexe. Nous adopterons une approche simple qui sera suffisante pour la plupart des cas, en particulier pour les configurations existantes de LibreChat. Pour en savoir plus sur le fonctionnement de l'authentification mongodb avec Docker, consultez ceci : https://hub.docker.com/_/mongo/
  • Ce guide se concentre exclusivement sur les procédures de configuration basées sur le terminal.
  • Bien que les étapes décrites puissent également être applicables aux environnements Docker Desktop, ou avec des configurations locales sans Docker, MongoDB, ou d'autres configurations de conteneurs, les détails spécifiques à ces scénarios ne sont pas fournis.

Il y a 3 étapes fondamentales :

  • Créez un utilisateur administrateur dans votre conteneur mongodb
  • Activez l'authentification et créez un utilisateur « readWrite » pour « LibreChat »
  • Configurez le MONGO_URI avec l'utilisateur nouvellement créé

TL;DR

Voici toutes les commandes nécessaires si vous souhaitez les parcourir rapidement ou pour référence :

Exemple

Exemple de fichier docker-compose.override.yml utilisant le fichier de configuration librechat.yaml, l'authentification MongoDB et mongo-express pour gérer votre base de données MongoDB :

Création d'un utilisateur administrateur

Tout d'abord, nous devons arrêter les conteneurs par défaut et ne faire fonctionner que le conteneur mongodb.

docker compose down
docker compose up -d mongodb

Remarque : Le flag -d détache l'instance de terminal actuelle pendant que le conteneur s'exécute en arrière-plan. Si vous souhaitez voir les sorties de journal de mongodb, omettez-le et continuez dans un terminal séparé.

Une fois en cours d'exécution, nous entrerons dans le terminal du conteneur et exécuterons mongosh :

docker exec -it chat-mongodb mongosh

Vous devriez voir la sortie suivante :

~/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> 

Optionnel : Tant que nous y sommes, nous pouvons désactiver la télémétrie pour mongodb si vous le souhaitez, il s'agit de données d'utilisation anonymes collectées et envoyées périodiquement à MongoDB :

Exécutez la commande ci-dessous.

Notes :

  • Toutes les commandes suivantes doivent être exécutées dans la session de terminal actuelle, quel que soit l'environnement (Docker, Linux, mongosh, etc.)
  • Je représenterai la vue réelle du terminal avec # exemple d'entrée/sortie ou simplement en affichant la sortie dans certains cas

Commande :

disableTelemetry()

Exemple d'entrée/sortie :

test> disableTelemetry()
Telemetry is now disabled.

Maintenant, nous devons accéder à la base de données admin, que mongodb crée par défaut pour créer notre utilisateur administrateur :

use admin

passé en mode db admin

Remplacez les identifiants comme vous le souhaitez et conservez-les dans vos dossiers sécurisés pour le reste du guide.

Exécutez la commande pour créer l'utilisateur administrateur :

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

Vous devriez voir une sortie "ok".

Vous pouvez également confirmer que l'administrateur a été créé en exécutant show users :

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: Important : si vous utilisez mongo-express pour gérer votre base de données (guide ici), vous avez besoin d'autorisations supplémentaires pour que le service mongo-express s'exécute correctement :

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

Quittez le terminal Mongosh/Container en exécutant exit :

admin> exit

Et arrêtez le conteneur en cours d'exécution :

docker compose down

Activation de l'authentification et création d'un utilisateur avec accès readWrite

Nous devons maintenant créer/modifier le fichier docker-compose.override.yml pour activer l'authentification pour notre conteneur mongodb. Vous pouvez utiliser cette configuration pour démarrer ou comme référence :

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

Après avoir configuré le fichier de remplacement comme ci-dessus, exécutez à nouveau le conteneur mongodb :

docker compose up -d mongodb

Et accédez à mongosh en tant qu'utilisateur administrateur :

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

Confirmez que vous êtes authentifié :

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>

Passez à la base de données "LibreChat"

Remarque : Il s'agit de la base de données par défaut, sauf si vous l'avez modifiée via la MONGO_URI ; URI par défaut : MONGO_URI=mongodb://mongodb:27017/LibreChat

use LibreChat

Nous allons maintenant créer les identifiants réels qui seront utilisés par notre chaîne de connexion Mongo, lesquels seront limités à un accès en lecture/écriture à la base de données "LibreChat". Comme précédemment, remplacez l'exemple par les identifiants de votre choix :

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

Vous devriez voir à nouveau une sortie "ok".

Vous pouvez vérifier la création de l'utilisateur avec la commande show users.

Quittez à nouveau le terminal Mongosh/Container avec exit, et arrêtez le conteneur :

exit
docker compose down

J'ai rencontré un problème où l'utilisateur nouvellement créé ne persistait pas après sa création. Pour résoudre ce problème, j'ai simplement répété les étapes pour m'assurer qu'il était bien créé. Les voici pour votre commodité :

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" } ] });

Si cela ne persiste toujours pas, vous pouvez essayer d'exécuter les commandes avec tous les conteneurs en cours d'exécution, mais notez que le conteneur LibreChat sera dans un état d'erreur/de nouvelle tentative.

Mettre à jour MONGO_URI pour utiliser les nouveaux identifiants

Enfin, nous ajoutons la nouvelle chaîne de connexion avec nos identifiants nouvellement créés à notre fichier docker-compose.override.yml sous le service api :

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

Notre fichier de remplacement ressemble donc maintenant à ceci :

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

Vous devriez maintenant exécuter docker compose up avec une authentification réussie et un accès en lecture/écriture à la base de données LibreChat

Exemple de connexion réussie :

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

Si vous rencontrez des erreurs d'authentification, exécutez à nouveau la dernière partie de l'étape 2. Je ne sais pas pourquoi c'est capricieux, mais cela fonctionnera après quelques essais.

Que pensez-vous de ce guide ?