Uwierzytelnianie MongoDB
Skonfiguruj uwierzytelnianie w swojej bazie danych mongodb w Docker za pomocą pliku docker-compose.override.yml
Ten przewodnik pokaże, jak użyć pliku docker-compose.override.yml, aby umożliwić nam włączenie jawnego uwierzytelniania dla MongoDB.
Aby uzyskać więcej informacji na temat pliku override, zapoznaj się z: Docker Compose Override
Uwagi:
- Domyślna konfiguracja jest bezpieczna dzięki blokowaniu dostępu do portów zewnętrznych, ale możemy pójść o krok dalej, stosując dane uwierzytelniające.
- Jak zauważyli sami twórcy MongoDB, uwierzytelnianie w MongoDB jest dość złożone. Zastosujemy proste podejście, które będzie wystarczające w większości przypadków, zwłaszcza w istniejących konfiguracjach LibreChat. Aby dowiedzieć się więcej o tym, jak działa uwierzytelnianie mongodb z Docker, zobacz tutaj: https://hub.docker.com/_/mongo/
- Ten przewodnik koncentruje się wyłącznie na procedurach konfiguracji opartych na terminalu.
- Chociaż opisane kroki mogą mieć również zastosowanie w środowiskach Docker Desktop lub w przypadku konfiguracji bez użycia Docker, lokalnej bazy MongoDB czy innych kontenerów, szczegóły dotyczące tych scenariuszy nie zostały uwzględnione.
Istnieją 3 podstawowe kroki:
- Utwórz użytkownika administratora wewnątrz swojego kontenera mongodb
- Włącz uwierzytelnianie i utwórz użytkownika "readWrite" dla "LibreChat"
- Skonfiguruj MONGO_URI z nowo utworzonym użytkownikiem
TL;DR
Oto wszystkie niezbędne polecenia, jeśli chcesz szybko przez nie przejść lub zachować je jako odniesienie:
Przykład
Przykładowy plik docker-compose.override.yml wykorzystujący plik konfiguracyjny librechat.yaml, uwierzytelnianie MongoDB oraz mongo-express do zarządzania bazą danych MongoDB:
Tworzenie użytkownika administratora
Najpierw musimy zatrzymać działanie domyślnych kontenerów i uruchomić tylko kontener mongodb.
docker compose downdocker compose up -d mongodbUwaga: Flaga
-dodłącza bieżącą instancję terminala, podczas gdy kontener działa w tle. Jeśli chcesz zobaczyć logi mongodb, pomiń ją i kontynuuj w oddzielnym terminalu.
Gdy uruchomiony, wejdziemy do terminala kontenera i wykonamy mongosh:
docker exec -it chat-mongodb mongoshPowinieneś zobaczyć następujący wynik:
~/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> Opcjonalnie: Będąc tutaj, możemy wyłączyć telemetrię dla mongodb, jeśli jest to pożądane; są to anonimowe dane o użytkowaniu, zbierane i okresowo wysyłane do MongoDB:
Wykonaj poniższe polecenie.
Uwagi:
- Wszystkie kolejne polecenia należy uruchamiać w bieżącej sesji terminala, niezależnie od środowiska (Docker, Linux,
mongoshitp.)- Będę przedstawiał rzeczywisty widok terminala za pomocą # przykładowego wejścia/wyjścia lub w niektórych przypadkach po prostu pokazując wyjście.
Polecenie:
disableTelemetry()Przykładowe dane wejściowe/wyjściowe:
test> disableTelemetry()
Telemetry is now disabled.Teraz musimy uzyskać dostęp do bazy danych admin, którą mongodb tworzy domyślnie, aby utworzyć naszego użytkownika administratora:
use adminprzełączono na db admin
Zastąp dane uwierzytelniające zgodnie z własnymi preferencjami i zachowaj je w bezpiecznym miejscu na potrzeby dalszej części przewodnika.
Uruchom polecenie, aby utworzyć użytkownika administratora:
db.createUser({ user: "adminUser", pwd: "securePassword", roles: ["userAdminAnyDatabase", "readWriteAnyDatabase"] })Powinieneś zobaczyć wynik "ok".
Możesz również potwierdzić, że administrator został utworzony, uruchamiając 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: Ważne: jeśli używasz mongo-express do zarządzania swoją bazą danych, potrzebujesz dodatkowych uprawnień, aby usługa mongo-express działała poprawnie:
db.grantRolesToUser("adminUser", ["clusterAdmin", "readAnyDatabase"])Wyjdź z terminala Mongosh/kontenera, uruchamiając exit:
admin> exitA następnie zatrzymaj działający kontener:
docker compose downWłączanie uwierzytelniania i tworzenie użytkownika z dostępem readWrite
Musimy teraz utworzyć/edytować plik docker-compose.override.yml, aby włączyć uwierzytelnianie dla naszego kontenera mongodb. Możesz użyć tej konfiguracji, aby rozpocząć lub się do niej odwołać:
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 authenticationPo skonfigurowaniu pliku zastępczego (override) zgodnie z powyższym opisem, uruchom ponownie kontener mongodb:
docker compose up -d mongodbI uzyskaj dostęp do mongosh jako użytkownik admin:
docker exec -it chat-mongodb mongosh -u adminUser -p securePassword --authenticationDatabase adminPotwierdź, że jesteś uwierzytelniony:
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>Przełącz na bazę danych "LibreChat"
Uwaga: Jest to domyślna baza danych, chyba że zmieniono ją za pomocą MONGO_URI; domyślny URI:
MONGO_URI=mongodb://mongodb:27017/LibreChat
use LibreChatTeraz utworzymy właściwe dane uwierzytelniające, które zostaną użyte w naszym ciągu połączenia z Mongo, ograniczone do uprawnień odczytu/zapisu bazy danych "LibreChat". Podobnie jak poprzednio, zastąp przykład własnymi danymi uwierzytelniającymi:
db.createUser({ user: 'user', pwd: 'userpasswd', roles: [ { role: "readWrite", db: "LibreChat" } ] });
Powinieneś ponownie zobaczyć wynik "ok".
Możesz zweryfikować utworzenie użytkownika za pomocą polecenia show users.
Wyjdź ponownie z terminala Mongosh/kontenera za pomocą exit i zatrzymaj kontener:
exitdocker compose downMiałem problem, w którym nowo utworzony użytkownik nie był zapisywany po jego utworzeniu. Aby to rozwiązać, po prostu powtórzyłem kroki, aby upewnić się, że został utworzony. Oto one dla Twojej wygody:
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" } ] });Jeśli zmiany nadal się nie zapisują, możesz spróbować uruchomić polecenia przy wszystkich działających kontenerach, ale pamiętaj, że kontener LibreChat będzie w stanie błędu/ponawiania prób.
Zaktualizuj MONGO_URI, aby użyć nowych danych uwierzytelniających
Na koniec dodajemy nowy ciąg połączeniowy z naszymi nowo utworzonymi danymi uwierzytelniającymi do pliku docker-compose.override.yml w sekcji usługi api:
environment:
- MONGO_URI=mongodb://user:userpasswd@mongodb:27017/LibreChatWięc nasz plik zastępujący (override) wygląda teraz tak:
version: '3.4'
services:
api:
volumes:
- ./librechat.yaml:/app/librechat.yaml
environment:
- MONGO_URI=mongodb://user:userpasswd@mongodb:27017/LibreChat
mongodb:
command: mongod --authPowinieneś teraz uruchomić docker compose up z pomyślnym uwierzytelnieniem z dostępem do odczytu/zapisu do bazy danych LibreChat
Przykład udanego połączenia:
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}}Jeśli napotykasz błędy uwierzytelniania (Authentication errors), uruchom ponownie ostatnią część Kroku 2. Nie jestem pewien, dlaczego bywa to kapryśne, ale po kilku próbach zadziała.
Jaka jest ta instrukcja?