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 downdocker compose up -d mongodbNota: La bandera
-dsepara la instancia de terminal actual mientras el contenedor se ejecuta en segundo plano. Si desea ver las salidas de 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 mongoshDeberí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 lo deseamos, 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 admincambiado 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, 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> exitY detenga el contenedor en ejecución:
docker compose downHabilitació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 comenzar 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 authenticationDespués de configurar el archivo de anulación como se indicó anteriormente, ejecute el contenedor de mongodb nuevamente:
docker compose up -d mongodbY accede a mongosh como el usuario administrador:
docker exec -it chat-mongodb mongosh -u adminUser -p securePassword --authenticationDatabase adminConfirma que estás 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 haya cambiado a través de MONGO_URI; URI predeterminada:
MONGO_URI=mongodb://mongodb:27017/LibreChat
use LibreChatAhora 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". Como 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:
exitdocker compose downTuve un problema en el que el usuario recién creado no persistía después de su creación. Para resolverlo, simplemente repetí los pasos para asegurarme de que se creara. Aquí los tienes para tu comodidad:
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" } ] });Si aún así 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/LibreChatAsí 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 --authAhora debería ejecutar docker compose up con autenticación exitosa 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 de nuevo. No estoy seguro de por qué es tan caprichoso, pero funcionará después de algunos intentos.
¿Qué te parece esta guía?