MongoDB 身份验证
使用 docker-compose.override.yml 文件为您的 Docker MongoDB 设置身份验证
本指南将演示如何使用 docker-compose.override.yml 文件来为 MongoDB 启用显式身份验证。
有关覆盖文件的更多信息,请参阅:Docker Compose Override
注意:
- 默认配置通过阻止外部端口访问来确保安全,但我们可以通过访问凭据进一步加强安全性。
- 正如 MongoDB 开发人员所指出的,MongoDB 中的身份验证相当复杂。我们将采用一种简单的方法,这对大多数情况(尤其是 LibreChat 的现有配置)来说已经足够了。要了解有关 mongodb 身份验证如何与 Docker 配合使用的更多信息,请参阅此处:https://hub.docker.com/_/mongo/
- 本指南仅专注于基于终端的设置流程。
- 虽然所概述的步骤也可能适用于 Docker Desktop 环境,或非 Docker、本地 MongoDB 或其他容器设置,但并未提供针对这些场景的具体细节。
共有 3 个基本步骤:
- 在您的 mongodb 容器内创建一个管理员用户
- 启用身份验证并为 "LibreChat" 创建一个 "readWrite" 用户
- 使用新创建的用户配置 MONGO_URI
简而言之
如果您想快速执行这些操作或作为参考,以下是所有必要的命令:
示例
使用 librechat.yaml 配置文件、MongoDB 身份验证 以及用于管理 MongoDB 数据库的 mongo-express 的 docker-compose.override.yml 示例文件:
创建管理员用户
首先,我们必须停止默认容器的运行,并仅运行 mongodb 容器。
docker compose downdocker compose up -d mongodb注意:
-d标志会在容器于后台运行时分离当前的终端实例。如果您希望查看 mongodb 的日志输出,请省略该标志并在另一个终端中继续操作。
运行后,我们将进入容器的终端并执行 mongosh:
docker exec -it chat-mongodb mongosh你应该看到以下输出:
~/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> 可选:如果需要,我们可以在此禁用 mongodb 的遥测功能,该功能会定期收集匿名使用数据并发送给 MongoDB:
执行以下命令。
注意:
- 后续所有命令都应在当前终端会话中运行,无论环境如何(Docker、Linux、
mongosh等)。- 我将用 # 示例输入/输出或在某些情况下仅显示输出来表示实际的终端视图。
命令:
disableTelemetry()示例输入/输出:
test> disableTelemetry()
Telemetry is now disabled.现在,我们必须访问 mongodb 默认创建的 admin 数据库,以创建我们的管理员用户:
use admin已切换至 db admin
根据需要替换凭据,并将其保存在您的安全记录中,以供本指南后续步骤使用。
运行命令以创建管理员用户:
db.createUser({ user: "adminUser", pwd: "securePassword", roles: ["userAdminAnyDatabase", "readWriteAnyDatabase"] })你应该会看到一个 "ok" 输出。
您也可以通过运行 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: 重要: 如果您正在使用 mongo-express 来管理您的数据库,您需要额外的权限才能使 mongo-express 服务正常运行:
db.grantRolesToUser("adminUser", ["clusterAdmin", "readAnyDatabase"])通过运行 exit 退出 Mongosh/容器终端:
admin> exit并停止正在运行的容器:
docker compose down启用身份验证并创建具有 readWrite 访问权限的用户
我们现在必须创建/编辑 docker-compose.override.yml 文件,以便为我们的 mongodb 容器启用身份验证。你可以使用此配置来启动或参考:
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按照上述方法配置覆盖文件后,再次运行 mongodb 容器:
docker compose up -d mongodb并以管理员用户身份访问 mongosh:
docker exec -it chat-mongodb mongosh -u adminUser -p securePassword --authenticationDatabase admin确认您已通过身份验证:
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>切换到 "LibreChat" 数据库
注意:除非您通过 MONGO_URI 进行了更改,否则这是默认数据库;默认 URI 为:
MONGO_URI=mongodb://mongodb:27017/LibreChat
use LibreChat现在我们将创建用于 MongoDB 连接字符串的实际凭据,该凭据将仅限于对 "LibreChat" 数据库的读/写访问权限。与之前一样,请将示例替换为您所需的凭据:
db.createUser({ user: 'user', pwd: 'userpasswd', roles: [ { role: "readWrite", db: "LibreChat" } ] });
你应该会再次看到 "ok" 输出。
您可以使用 show users 命令来验证用户创建情况。
再次使用 exit 退出 Mongosh/容器终端,并关闭容器:
exitdocker compose down我之前遇到了一个问题,即新创建的用户在创建后无法持久化。为了解决这个问题,我简单地重复了这些步骤以确保其创建成功。为了方便起见,步骤如下:
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" } ] });如果问题仍然无法解决,您可以尝试在所有容器运行的情况下执行这些命令,但请注意 LibreChat 容器将处于错误/重试状态。
更新 MONGO_URI 以使用新凭据
最后,我们将新创建的凭据及其连接字符串添加到 docker-compose.override.yml 文件中 api 服务下:
environment:
- MONGO_URI=mongodb://user:userpasswd@mongodb:27017/LibreChat所以我们的覆盖文件现在看起来是这样的:
version: '3.4'
services:
api:
volumes:
- ./librechat.yaml:/app/librechat.yaml
environment:
- MONGO_URI=mongodb://user:userpasswd@mongodb:27017/LibreChat
mongodb:
command: mongod --auth现在你应该可以成功运行 docker compose up,并获得对 LibreChat 数据库的读/写访问权限。
连接成功的示例:
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}}如果您遇到身份验证错误,请再次运行第 2 步的最后一部分。我不确定为什么它会不稳定,但尝试几次后它就能正常工作了。
这篇指南怎么样?