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

Autenticación de MongoDB

Configure la autenticación en su mongodb de Docker con el archivo docker-compose.override.yml

Esta guía demostrará cómo utilizar el archivo docker-compose.override.yml para permitirnos habilitar la autenticación explícita para MongoDB.

Para más información sobre el archivo de anulación, por favor consulte: Docker Compose Override

Notas:

  • La configuración predeterminada es segura al bloquear el acceso a puertos externos, pero podemos ir un paso más allá con credenciales de acceso.
  • Como señalan los propios desarrolladores de MongoDB, la autenticación en MongoDB es bastante compleja. Adoptaremos un enfoque sencillo que será suficiente para la mayoría de los casos, especialmente para las configuraciones existentes de LibreChat. Para obtener más información sobre cómo funciona la autenticación de mongodb con Docker, consulte aquí: https://hub.docker.com/_/mongo/
  • Esta guía se centra exclusivamente en los procedimientos de configuración basados en terminal.
  • Aunque los pasos descritos también pueden ser aplicables a entornos de Docker Desktop, o con configuraciones locales de MongoDB sin Docker u otras configuraciones de contenedores, no se proporcionan detalles específicos para esos escenarios.

Hay 3 pasos básicos:

  • Cree un usuario administrador dentro de su contenedor mongodb
  • Habilite la autenticación y cree un usuario "readWrite" para "LibreChat"
  • Configure el MONGO_URI con el usuario recién creado

TL;DR

Estos son todos los comandos necesarios si deseas ejecutarlos rápidamente o como referencia:

Ejemplo

Ejemplo de archivo docker-compose.override.yml usando el archivo de configuración librechat.yaml, Autenticación de MongoDB y mongo-express para administrar su base de datos MongoDB:

Creación de un usuario administrador

Primero, debemos detener los contenedores predeterminados y ejecutar únicamente el contenedor de mongodb.

docker compose down
docker compose up -d mongodb

Nota: La bandera -d separa la instancia de terminal actual mientras el contenedor se ejecuta en segundo plano. Si desea ver los resultados del registro de mongodb, omítala y continúe en una terminal separada.

Una vez en ejecución, entraremos en la terminal del contenedor y ejecutaremos mongosh:

docker exec -it chat-mongodb mongosh

Deberías ver la siguiente salida:

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

Opcional: Ya que estamos aquí, podemos deshabilitar la telemetría para mongodb si se desea, la cual consiste en datos de uso anónimos recopilados y enviados a MongoDB periódicamente:

Ejecute el siguiente comando.

Notas:

  • Todos los comandos subsiguientes deben ejecutarse en la sesión de terminal actual, independientemente del entorno (Docker, Linux, mongosh, etc.)
  • Representaré la vista real de la terminal con # entrada/salida de ejemplo o simplemente mostrando la salida en algunos casos

Comando:

disableTelemetry()

Ejemplo de entrada/salida:

test> disableTelemetry()
Telemetry is now disabled.

Ahora, debemos acceder a la base de datos admin, la cual mongodb crea de forma predeterminada para crear nuestro usuario administrador:

use admin

cambiado a db admin

Reemplace las credenciales como desee y guárdelas en sus registros seguros para el resto de la guía.

Ejecute el comando para crear el usuario administrador:

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

Deberías ver una salida "ok".

También puedes confirmar que el administrador fue creado ejecutando 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: Importante: si está utilizando mongo-express para gestionar su base de datos (guía aquí), necesita permisos adicionales para que el servicio mongo-express se ejecute correctamente:

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

Salga de la terminal de Mongosh/Container ejecutando exit:

admin> exit

Y detenga el contenedor en ejecución:

docker compose down

Habilitación de la autenticación y creación de un usuario con acceso readWrite

Ahora debemos crear/editar el archivo docker-compose.override.yml para habilitar la autenticación para nuestro contenedor de mongodb. Puede utilizar esta configuración para iniciar o como referencia:

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

Después de configurar el archivo de anulación como se indicó anteriormente, ejecute el contenedor de mongodb nuevamente:

docker compose up -d mongodb

Y accede a mongosh como el usuario administrador:

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

Confirme que está autenticado:

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>

Cambiar a la base de datos "LibreChat"

Nota: Esta es la base de datos predeterminada a menos que la hayas cambiado a través de MONGO_URI; URI predeterminada: MONGO_URI=mongodb://mongodb:27017/LibreChat

use LibreChat

Ahora crearemos las credenciales reales que utilizará nuestra cadena de conexión de Mongo, las cuales estarán limitadas al acceso de lectura/escritura de la base de datos "LibreChat". Al igual que antes, reemplace el ejemplo con sus credenciales deseadas:

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

Deberías ver una salida "ok" de nuevo.

Puedes verificar la creación del usuario con el comando show users.

Salga de nuevo de la terminal de Mongosh/Container con exit y detenga el contenedor:

exit
docker compose down

Tuve un problema en el que el usuario recién creado no persistía después de su creación. Para resolver esto, simplemente repetí los pasos para asegurar que se creara correctamente. Aquí los tienes para tu comodidad:

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 aún no persiste, puedes intentar ejecutar los comandos con todos los contenedores en funcionamiento, pero ten en cuenta que el contenedor LibreChat estará en un estado de error/reintento.

Actualice la MONGO_URI para usar las nuevas credenciales

Finalmente, añadimos la nueva cadena de conexión con nuestras credenciales recién creadas a nuestro archivo docker-compose.override.yml bajo el servicio api:

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

Así que nuestro archivo de anulación se ve así ahora:

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

Ahora debería ejecutar docker compose up con la autenticación correcta y acceso de lectura/escritura a la base de datos de LibreChat

Ejemplo de conexión exitosa:

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 tienes errores de Authentication, ejecuta la última parte del Paso 2 nuevamente. No estoy seguro de por qué es tan caprichoso, pero funcionará después de algunos intentos.

¿Qué te parece esta guía?