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

Autenticação do MongoDB

Configure a autenticação no seu mongodb docker com o arquivo docker-compose.override.yml

Este guia demonstrará como usar o arquivo docker-compose.override.yml para nos permitir habilitar a autenticação explícita para o MongoDB.

Para mais informações sobre o arquivo de substituição, consulte: Docker Compose Override

Notas:

  • A configuração padrão é segura ao bloquear o acesso a portas externas, mas podemos ir um passo além com credenciais de acesso.
  • Como observado pelos próprios desenvolvedores do MongoDB, a autenticação no MongoDB é bastante complexa. Adotaremos uma abordagem simples que será suficiente para a maioria dos casos, especialmente para configurações existentes do LibreChat. Para saber mais sobre como a autenticação do mongodb funciona com o Docker, veja aqui: https://hub.docker.com/_/mongo/
  • Este guia foca exclusivamente em procedimentos de configuração baseados em terminal.
  • Embora as etapas descritas também possam ser aplicáveis a ambientes Docker Desktop, ou com configurações locais de MongoDB sem Docker ou outros tipos de containers, detalhes específicos para esses cenários não são fornecidos.

Existem 3 passos básicos:

  • Crie um usuário administrador dentro do seu container mongodb
  • Habilite a autenticação e crie um usuário "readWrite" para o "LibreChat"
  • Configure a MONGO_URI com o usuário recém-criado

TL;DR

Estes são todos os comandos necessários caso você queira executá-los rapidamente ou para referência:

Exemplo

Exemplo de arquivo docker-compose.override.yml usando o arquivo de configuração librechat.yaml, Autenticação do MongoDB e mongo-express para gerenciar seu banco de dados MongoDB:

Criando um Usuário Administrador

Primeiro, devemos parar os containers padrão e executar apenas o container mongodb.

docker compose down
docker compose up -d mongodb

Nota: A flag -d desvincula a instância do terminal atual enquanto o container é executado em segundo plano. Se você quiser ver as saídas de log do mongodb, omita-a e continue em um terminal separado.

Assim que estiver em execução, entraremos no terminal do container e executaremos o mongosh:

docker exec -it chat-mongodb mongosh

Você deverá ver a seguinte saída:

~/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: Enquanto estamos aqui, podemos desativar a telemetria para o mongodb, se desejado, que consiste em dados de uso anônimos coletados e enviados ao MongoDB periodicamente:

Execute o comando abaixo.

Notas:

  • Todos os comandos subsequentes devem ser executados na sessão atual do terminal, independentemente do ambiente (Docker, Linux, mongosh, etc.)
  • Representarei a visualização real do terminal com # exemplo de entrada/saída ou simplesmente mostrando a saída em alguns casos

Comando:

disableTelemetry()

Exemplo de entrada/saída:

test> disableTelemetry()
Telemetry is now disabled.

Agora, devemos acessar o banco de dados admin, que o mongodb cria por padrão para criar nosso usuário administrador:

use admin

mudou para db admin

Substitua as credenciais conforme desejado e mantenha-as em seus registros seguros para o restante do guia.

Execute o comando para criar o usuário administrador:

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

Você deverá ver uma saída "ok".

Você também pode confirmar que o administrador foi criado executando 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: se você estiver usando o mongo-express para gerenciar seu banco de dados, você precisará de permissões adicionais para que o serviço mongo-express funcione corretamente:

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

Saia do terminal do Mongosh/Container executando exit:

admin> exit

E encerre o container em execução:

docker compose down

Habilitando a Autenticação e Criando um Usuário com Acesso readWrite

Agora devemos criar/editar o arquivo docker-compose.override.yml para habilitar a autenticação para nosso container mongodb. Você pode usar esta configuração para iniciar ou como referência:

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

Após configurar o arquivo de substituição como acima, execute o contêiner mongodb novamente:

docker compose up -d mongodb

E acesse o mongosh como usuário administrador:

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

Confirme que você 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>

Mude para o banco de dados "LibreChat"

Nota: Este é o banco de dados padrão, a menos que você o tenha alterado via MONGO_URI; URI padrão: MONGO_URI=mongodb://mongodb:27017/LibreChat

use LibreChat

Agora criaremos as credenciais reais a serem usadas pela nossa string de conexão do Mongo, que serão limitadas ao acesso de leitura/gravação do banco de dados "LibreChat". Como antes, substitua o exemplo pelas suas credenciais desejadas:

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

Você deverá ver uma saída "ok" novamente.

Você pode verificar a criação do usuário com o comando show users.

Saia do terminal do Mongosh/Container novamente com exit e encerre o container:

exit
docker compose down

Tive um problema em que o usuário recém-criado não persistia após a criação. Para resolver isso, simplesmente repeti os passos para garantir que ele fosse criado. Aqui estão eles para sua conveniência:

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

Se ainda assim não persistir, você pode tentar executar os comandos com todos os containers em execução, mas observe que o container LibreChat estará em um estado de erro/tentativa de reconexão.

Atualize a MONGO_URI para Usar as Novas Credenciais

Por fim, adicionamos a nova string de conexão com nossas credenciais recém-criadas ao nosso arquivo docker-compose.override.yml sob o serviço api:

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

Então nosso arquivo de substituição agora está assim:

version: '3.4'

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

Agora você deve executar docker compose up autenticado com sucesso com acesso de leitura/gravação ao banco de dados do LibreChat

Exemplo de conexão bem-sucedida:

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

Se você estiver enfrentando erros de Authentication, execute a última parte do Passo 2 novamente. Não tenho certeza do porquê de ser instável, mas funcionará após algumas tentativas.

Como está este guia?