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

MongoDB-authenticatie

Stel authenticatie in op je Docker MongoDB met het docker-compose.override.yml bestand

Deze handleiding laat zien hoe je het docker-compose.override.yml bestand gebruikt om expliciete authenticatie voor MongoDB in te schakelen.

Voor meer informatie over het override-bestand, raadpleeg: Docker Compose Override

Opmerkingen:

  • De standaardconfiguratie is veilig door externe poorttoegang te blokkeren, maar we kunnen nog een stap verder gaan met toegangsgegevens.
  • Zoals opgemerkt door de ontwikkelaars van MongoDB zelf, is authenticatie in MongoDB vrij complex. We zullen een eenvoudige aanpak hanteren die voor de meeste gevallen volstaat, vooral voor bestaande configuraties van LibreChat. Voor meer informatie over hoe mongodb-authenticatie werkt met Docker, zie hier: https://hub.docker.com/_/mongo/
  • Deze handleiding richt zich uitsluitend op installatieprocedures via de terminal.
  • Hoewel de beschreven stappen mogelijk ook van toepassing zijn op Docker Desktop-omgevingen, of op niet-Docker, lokale MongoDB- of andere container-opstellingen, worden details die specifiek zijn voor die scenario's niet verstrekt.

Er zijn 3 basisstappen:

  • Maak een admin-gebruiker aan binnen je mongodb container
  • Schakel authenticatie in en maak een "readWrite" gebruiker aan voor "LibreChat"
  • Configureer de MONGO_URI met de zojuist aangemaakte gebruiker

TL;DR

Dit zijn alle benodigde commando's als je deze snel wilt doorlopen of als naslagwerk:

Voorbeeld

Voorbeeld docker-compose.override.yml bestand dat gebruikmaakt van het librechat.yaml config file, MongoDB Authentication, en mongo-express voor het beheren van je MongoDB database:

Een admin-gebruiker aanmaken

Eerst moeten we de standaard containers stoppen met draaien en alleen de mongodb container uitvoeren.

docker compose down
docker compose up -d mongodb

Let op: De -d vlag ontkoppelt de huidige terminalinstantie terwijl de container op de achtergrond draait. Als je de log-uitvoer van mongodb wilt zien, laat deze dan weg en ga verder in een aparte terminal.

Zodra het draait, gaan we naar de terminal van de container en voeren we mongosh uit:

docker exec -it chat-mongodb mongosh

Je zou de volgende output moeten zien:

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

Optioneel: Nu we hier toch zijn, kunnen we indien gewenst telemetrie voor mongodb uitschakelen. Dit zijn anonieme gebruiksgegevens die periodiek worden verzameld en naar MongoDB worden verzonden:

Voer het onderstaande commando uit.

Opmerkingen:

  • Alle daaropvolgende commando's moeten worden uitgevoerd in de huidige terminalsessie, ongeacht de omgeving (Docker, Linux, mongosh, enz.)
  • Ik zal de werkelijke terminalweergave weergeven met # voorbeeldinvoer/uitvoer of in sommige gevallen simpelweg de uitvoer tonen

Commando:

disableTelemetry()

Voorbeeld invoer/uitvoer:

test> disableTelemetry()
Telemetry is now disabled.

Nu moeten we toegang krijgen tot de admin-database, die mongodb standaard aanmaakt, om onze admin-gebruiker aan te maken:

use admin

overschakeld naar db admin

Vervang de inloggegevens naar wens en bewaar ze in je beveiligde bestanden voor de rest van de handleiding.

Voer het commando uit om de admin-gebruiker aan te maken:

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

Je zou een "ok" output moeten zien.

Je kunt ook bevestigen dat de admin is aangemaakt door show users uit te voeren:

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: Belangrijk: als je mongo-express gebruikt om je database te beheren, heb je extra rechten nodig om de mongo-express service correct te laten draaien:

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

Verlaat de Mongosh/Container Terminal door exit uit te voeren:

admin> exit

En sluit de actieve container af:

docker compose down

Authenticatie inschakelen en een gebruiker met readWrite toegang aanmaken

We moeten nu het bestand docker-compose.override.yml aanmaken/bewerken om authenticatie voor onze mongodb-container in te schakelen. Je kunt deze configuratie gebruiken om te starten of als referentie:

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

Nadat je het override-bestand zoals hierboven hebt geconfigureerd, voer je de mongodb container opnieuw uit:

docker compose up -d mongodb

En krijg toegang tot mongosh als de admin gebruiker:

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

Bevestig dat je bent geauthenticeerd:

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>

Schakel over naar de "LibreChat" database

Let op: Dit is de standaarddatabase tenzij je deze hebt gewijzigd via de MONGO_URI; standaard URI: MONGO_URI=mongodb://mongodb:27017/LibreChat

use LibreChat

Nu gaan we de daadwerkelijke inloggegevens aanmaken die door onze Mongo-verbindingsreeks worden gebruikt, welke beperkt zullen zijn tot lees-/schrijftoegang van de "LibreChat"-database. Vervang, net als voorheen, het voorbeeld door de gewenste inloggegevens:

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

Je zou opnieuw een "ok" output moeten zien.

Je kunt de aanmaak van de gebruiker verifiëren met het show users commando.

Verlaat de Mongosh/Container Terminal opnieuw met exit en haal de container neer:

exit
docker compose down

Ik had een probleem waarbij de nieuw aangemaakte gebruiker niet behouden bleef na het aanmaken. Om dit op te lossen, heb ik de stappen simpelweg herhaald om er zeker van te zijn dat deze werd aangemaakt. Hier zijn ze voor uw gemak:

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

Als het nog steeds niet wordt opgeslagen, kun je proberen de commando's uit te voeren terwijl alle containers actief zijn, maar let op: de LibreChat container zal zich in een fout-/opnieuw-proberen-status bevinden.

Update de MONGO_URI om de nieuwe inloggegevens te gebruiken

Ten slotte voegen we de nieuwe connection string met onze zojuist aangemaakte inloggegevens toe aan ons docker-compose.override.yml bestand onder de api service:

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

Dus ons override-bestand ziet er nu als volgt uit:

version: '3.4'

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

Je zou nu docker compose up moeten kunnen uitvoeren, succesvol geauthenticeerd met lees-/schrijftoegang tot de LibreChat database.

Voorbeeld van een geslaagde verbinding:

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

Als je last hebt van authenticatiefouten, voer dan het laatste deel van Stap 2 opnieuw uit. Ik weet niet zeker waarom het zo gevoelig is, maar na een paar pogingen zal het werken.

Hoe is deze gids?