Проблемы аутентификации MongoDB с Node.js и Mongo-Express в настройке Docker Compose

Я пытался использовать Docker в проекте, который создал некоторое время назад, и у меня возникли проблемы с аутентификацией MongoDB при использовании Docker Compose. Вот мой docker-compose.yml:

services:
  web:
    build: .
    ports:
      - "${PORT}:${PORT}"
    environment:
      - PORT=${PORT}
      - CONNECTION_STRING=${CONNECTION_STRING}
      - ACCESS_TOKEN_SECRET=${ACCESS_TOKEN_SECRET}
    depends_on:
      - mongo
  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - ./data:/data/db
    environment:
      - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME}
      - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}

  mongo-express:
    image: mongo-express
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongo
      - ME_CONFIG_MONGODB_ADMINUSERNAME=${MONGO_INITDB_ROOT_USERNAME}
      - ME_CONFIG_MONGODB_ADMINPASSWORD=${MONGO_INITDB_ROOT_PASSWORD}

Dockerfile для создания образа веб-приложения:

FROM node:20-alpine3.19

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 5001

CMD ["npm", "run", "start"]

Используемый файл .env:

PORT=5001

CONNECTION_STRING=mongodb://admin:adminpassword@mongo:27017/key_ring_backend_3

MONGO_INITDB_ROOT_USERNAME=admin
MONGO_INITDB_ROOT_PASSWORD=adminpassword

Монго работает без проблем, но веб-приложение и mongo-express не могут подключиться к монго.

Веб-приложение выдает следующую ошибку:

2024-06-27 06:34:30 
2024-06-27 06:34:30 > [email protected] start
2024-06-27 06:34:30 > node ./src/server.js
2024-06-27 06:34:30 
2024-06-27 06:34:30 Server running on port 5001
2024-06-27 06:34:43 Error: MongoServerError: Authentication failed.

Mongo-express выдает следующую ошибку

2024-06-27 06:34:40 Welcome to mongo-express 1.0.2
2024-06-27 06:34:40 ------------------------
2024-06-27 06:34:30 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:30 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:31 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:31 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:32 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:32 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:33 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:33 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:34 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:34 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:35 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:35 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:36 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:36 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:37 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:37 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:38 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:38 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:39 /docker-entrypoint.sh: connect: Connection refused
2024-06-27 06:34:39 /docker-entrypoint.sh: line 15: /dev/tcp/mongo/27017: Connection refused
2024-06-27 06:34:43 Could not connect to database using connectionString: mongodb://admin:****@mongo:27017/"
2024-06-27 06:34:43 /app/node_modules/mongodb/lib/cmap/connection.js:227
2024-06-27 06:34:43                     callback(new error_1.MongoServerError(document));
2024-06-27 06:34:43                              ^
2024-06-27 06:34:43 
2024-06-27 06:34:43 MongoServerError: Authentication failed.
2024-06-27 06:34:43     at Connection.onMessage (/app/node_modules/mongodb/lib/cmap/connection.js:227:30)
2024-06-27 06:34:43     at MessageStream.<anonymous> (/app/node_modules/mongodb/lib/cmap/connection.js:60:60)
2024-06-27 06:34:43     at MessageStream.emit (node:events:517:28)
2024-06-27 06:34:43     at processIncomingData (/app/node_modules/mongodb/lib/cmap/message_stream.js:125:16)
2024-06-27 06:34:43     at MessageStream._write (/app/node_modules/mongodb/lib/cmap/message_stream.js:33:9)
2024-06-27 06:34:43     at writeOrBuffer (node:internal/streams/writable:392:12)
2024-06-27 06:34:43     at _write (node:internal/streams/writable:333:10)
2024-06-27 06:34:43     at Writable.write (node:internal/streams/writable:337:10)
2024-06-27 06:34:43     at Socket.ondata (node:internal/streams/readable:809:22)
2024-06-27 06:34:43     at Socket.emit (node:events:517:28) {
2024-06-27 06:34:43   ok: 0,
2024-06-27 06:34:43   code: 18,
2024-06-27 06:34:43   codeName: 'AuthenticationFailed',
2024-06-27 06:34:43   connectionGeneration: 7,
2024-06-27 06:34:43   [Symbol(errorLabels)]: Set(2) { 'HandshakeError', 'ResetPool' }
2024-06-27 06:34:43 }
2024-06-27 06:34:43 
2024-06-27 06:34:43 Node.js v18.20.3
2024-06-27 06:34:40 
2024-06-27 06:34:40

Все работало нормально, когда я не передал данные пользователя и пароля, как показано ниже:

services:
  web:
    build: .
    ports:
      - "${PORT}:${PORT}"
    environment:
      - PORT=${PORT}
      - CONNECTION_STRING=${CONNECTION_STRING}
      - ACCESS_TOKEN_SECRET=${ACCESS_TOKEN_SECRET}
    depends_on:
      - mongo
  mongo:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - ./data:/data/db

  mongo-express:
    image: mongo-express
    ports:
      - 8081:8081

.env также был таким:

CONNECTION_STRING=mongodb://mongo:27017/key_ring_backend_3

У меня нет никаких проблем при такой работе во время разработки. Но можно ли создать сервер mongo без установки пользователя root и пароля во время производства? Или мне не следует создавать таким образом сервер mongo с помощью Docker, а вместо этого использовать что-то вроде онлайн-сервиса mongodb.

должна ли строка подключения быть в кавычках?

ewokx 27.06.2024 04:17

«Все работало нормально, пока я не передал пользователя и пароль» — да, но тогда ваша MongoDB работает без аутентификации. Я бы не рекомендовал этого. В MongoDB Atlas (облачный сервис) аутентификацию отключить невозможно.

Wernfried Domscheit 27.06.2024 10:31

Может быть, этот: stackoverflow.com/questions/63754742/…

Wernfried Domscheit 27.06.2024 10:32

@ewokx, можешь объяснить попонятнее?

weaver 27.06.2024 23:32

@WernfriedDomscheit Я все еще растерян, что мне делать.

weaver 27.06.2024 23:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте эту строку подключения:

mongodb://admin:adminpassword@mongo:27017/key_ring_backend_3?authSource=admin

Я предполагаю, что пользователь создан в базе данных admin. Без authSource драйвер пытается пройти аутентификацию в базе данных key_ring_backend_3, но это не та база данных, в которой создан пользователь.

Все еще не работает, я обнаружил ошибку "Пользователь не найден" в журналах монго: "user": "admin", "db": "admin", "error": "UserNotFound: не удалось найти пользователя \"admin\" для db \" админ\""

weaver 28.06.2024 15:16

Проверьте существующих пользователей с помощью db.getUsers() — я понятия не имею о Docker и не знаю, как он создает пользователей.

Wernfried Domscheit 28.06.2024 15:31

Я получил неавторизованную ошибку: MongoServerError[Unauthorized]: администратор не авторизован для выполнения команды {usersInfo: 1, lsid: { id: UUID("2ec6e4ca-88fa-45f3-8e62-306d2e847392") }, $db: "admin" }

weaver 28.06.2024 18:55

Как уже было сказано, я понятия не имею, как Docker создает пользователя-администратора. Извини.

Wernfried Domscheit 28.06.2024 18:58

вам нужно сначала войти в систему в Монго, чтобы проверить пользователей. сначала войдите в базу данных администратора use admin, а затем введите db.auth('username') и введите свой пароль. если вы можете войти в систему, вы можете выполнить db.getUsers(). если вы успешно вошли в систему, то права вашего пользователя не позволяют вам выполнить эту команду. обратитесь к этому: mongodb.com/docs/manual/reference/built-in-roles

Furkan YIlmaZ 01.07.2024 10:20
Ответ принят как подходящий

Итак, я нашел проблему. Для соединения mongo я добавил громкость как

volumes:
  - ./data:/data/db

При использовании docker-compose и создании контейнеров mongo инициализирует своего администратора, используя значения, предоставленные при первом запуске команды docker-compose up.

В моем случае я изначально запустил файл docker-compose.yml без установки каких-либо MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD. Это привело к тому, что база данных администратора оказалась пустой без пользователей. Это означало, что я даже не смогу запускать такие команды, как db.getUsers(), даже в mongosh.

Теперь, даже если я добавлю MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD в docker-compose.yml и запущу его, он не будет добавлен в базу данных администратора, поскольку установленный мной том принял только те значения, которые использовались при первой его инициализации.

Исправить:

Я удалил каталог data из своей локальной системы, удалил работающие контейнеры и запустил файл docker-compose.yml после установки значений MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD. Это исправило ситуацию.

Другие вопросы по теме