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

Xác thực MongoDB

Thiết lập xác thực cho mongodb trong Docker của bạn bằng tệp docker-compose.override.yml

Hướng dẫn này sẽ minh họa cách sử dụng tệp docker-compose.override.yml để cho phép chúng ta bật xác thực tường minh cho MongoDB.

Để biết thêm thông tin về tệp ghi đè, vui lòng tham khảo: Docker Compose Override

Ghi chú:

  • Cấu hình mặc định đã an toàn nhờ việc chặn quyền truy cập cổng bên ngoài, nhưng chúng ta có thể tăng cường bảo mật hơn nữa với thông tin xác thực truy cập.
  • Như chính các nhà phát triển MongoDB đã lưu ý, xác thực trong MongoDB khá phức tạp. Chúng ta sẽ áp dụng một cách tiếp cận đơn giản, đủ dùng cho hầu hết các trường hợp, đặc biệt là đối với các cấu hình hiện có của LibreChat. Để tìm hiểu thêm về cách thức hoạt động của xác thực mongodb với Docker, hãy xem tại đây: https://hub.docker.com/_/mongo/
  • Hướng dẫn này tập trung hoàn toàn vào các quy trình thiết lập dựa trên terminal.
  • Mặc dù các bước được nêu cũng có thể áp dụng cho các môi trường Docker Desktop, hoặc với các thiết lập không dùng Docker, MongoDB cục bộ, hoặc các thiết lập container khác, các chi tiết cụ thể cho những trường hợp đó không được cung cấp.

Có 3 bước cơ bản:

  • Tạo một người dùng quản trị viên bên trong container mongodb của bạn
  • Bật xác thực và tạo người dùng "readWrite" cho "LibreChat"
  • Cấu hình MONGO_URI với người dùng vừa được tạo

Tóm tắt (TL;DR)

Dưới đây là tất cả các lệnh cần thiết nếu bạn muốn thực hiện nhanh hoặc để tham khảo:

Ví dụ

Ví dụ tệp docker-compose.override.yml sử dụng tệp cấu hình librechat.yaml, Xác thực MongoDB, và mongo-express để quản lý cơ sở dữ liệu MongoDB của bạn:

Tạo người dùng quản trị (Admin)

Trước tiên, chúng ta phải dừng các container mặc định đang chạy và chỉ chạy container mongodb.

docker compose down
docker compose up -d mongodb

Lưu ý: Cờ -d sẽ tách phiên terminal hiện tại khi container chạy ở chế độ nền. Nếu bạn muốn xem các đầu ra nhật ký của mongodb, hãy bỏ cờ này và tiếp tục trong một terminal riêng.

Sau khi chạy, chúng ta sẽ truy cập vào terminal của container và thực thi mongosh:

docker exec -it chat-mongodb mongosh

Bạn sẽ thấy kết quả đầu ra sau đây:

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

Tùy chọn: Trong khi ở đây, chúng ta có thể tắt tính năng đo từ xa (telemetry) cho mongodb nếu muốn, đây là dữ liệu sử dụng ẩn danh được thu thập và gửi định kỳ tới MongoDB:

Thực thi lệnh dưới đây.

Ghi chú:

  • Tất cả các lệnh tiếp theo cần được chạy trong phiên terminal hiện tại, bất kể môi trường nào (Docker, Linux, mongosh, v.v.)
  • Tôi sẽ đại diện cho giao diện terminal thực tế bằng # ví dụ đầu vào/đầu ra hoặc đơn giản là hiển thị đầu ra trong một số trường hợp

Lệnh:

disableTelemetry()

Ví dụ đầu vào/đầu ra:

test> disableTelemetry()
Telemetry is now disabled.

Bây giờ, chúng ta phải truy cập vào cơ sở dữ liệu admin, cơ sở dữ liệu mà mongodb tạo theo mặc định để tạo người dùng quản trị của chúng ta:

use admin

đã chuyển sang db admin

Thay thế các thông tin xác thực theo ý muốn và lưu giữ trong hồ sơ bảo mật của bạn cho phần còn lại của hướng dẫn này.

Chạy lệnh để tạo người dùng quản trị:

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

Bạn sẽ thấy kết quả đầu ra là "ok".

Bạn cũng có thể xác nhận quản trị viên đã được tạo bằng cách chạy 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: Quan trọng: nếu bạn đang sử dụng mongo-express để quản lý cơ sở dữ liệu của mình, bạn cần các quyền bổ sung để dịch vụ mongo-express chạy chính xác:

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

Thoát khỏi Mongosh/Container Terminal bằng cách chạy lệnh exit:

admin> exit

Và tắt container đang chạy:

docker compose down

Kích hoạt xác thực và tạo người dùng với quyền readWrite

Bây giờ chúng ta phải tạo/chỉnh sửa tệp docker-compose.override.yml để bật xác thực cho container mongodb của chúng ta. Bạn có thể sử dụng cấu hình này để bắt đầu hoặc tham khảo:

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

Sau khi định cấu hình tệp ghi đè như trên, hãy chạy lại container mongodb:

docker compose up -d mongodb

Và truy cập mongosh với tư cách là người dùng admin:

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

Xác nhận bạn đã được xác thực:

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>

Chuyển sang cơ sở dữ liệu "LibreChat"

Lưu ý: Đây là cơ sở dữ liệu mặc định trừ khi bạn đã thay đổi nó thông qua MONGO_URI; URI mặc định: MONGO_URI=mongodb://mongodb:27017/LibreChat

use LibreChat

Bây giờ chúng ta sẽ tạo thông tin xác thực thực tế để sử dụng cho chuỗi kết nối Mongo của mình, thông tin này sẽ bị giới hạn quyền đọc/ghi đối với cơ sở dữ liệu "LibreChat". Như trước đây, hãy thay thế ví dụ bằng thông tin xác thực mong muốn của bạn:

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

Bạn sẽ thấy kết quả đầu ra là "ok" một lần nữa.

Bạn có thể xác minh việc tạo người dùng bằng lệnh show users.

Thoát khỏi Mongosh/Container Terminal một lần nữa bằng lệnh exit, và tắt container:

exit
docker compose down

Tôi đã gặp sự cố trong đó người dùng mới tạo không được lưu lại sau khi tạo. Để giải quyết vấn đề này, tôi chỉ cần lặp lại các bước để đảm bảo nó đã được tạo thành công. Dưới đây là các bước đó để bạn tiện tham khảo:

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

Nếu nó vẫn không được lưu, bạn có thể thử chạy các lệnh trong khi tất cả các container đang chạy, nhưng lưu ý rằng container LibreChat sẽ ở trạng thái lỗi/đang thử lại.

Cập nhật MONGO_URI để sử dụng thông tin xác thực mới

Cuối cùng, chúng ta thêm chuỗi kết nối mới với thông tin xác thực vừa tạo vào tệp docker-compose.override.yml của chúng ta bên dưới dịch vụ api:

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

Vì vậy, tệp ghi đè của chúng ta bây giờ trông như thế này:

version: '3.4'

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

Bây giờ bạn sẽ chạy docker compose up và xác thực thành công với quyền đọc/ghi vào cơ sở dữ liệu LibreChat

Ví dụ về kết nối thành công:

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

Nếu bạn gặp lỗi xác thực (Authentication errors), hãy chạy lại phần cuối của Bước 2. Tôi không chắc tại sao nó lại hoạt động chập chờn như vậy, nhưng nó sẽ hoạt động sau vài lần thử.

Hướng dẫn này thế nào?